From 8d6c39fbfe804fa26ad6d911ab4ba0f51254ac58 Mon Sep 17 00:00:00 2001 From: Raymond Shiau Date: Fri, 9 Aug 2013 10:33:44 -0700 Subject: [PATCH] Created reusable library that displays arcs/spikes with arbitrary latitudes/longitudes --- categories/.DS_Store | Bin 6148 -> 0 bytes categories/All.json | 1 - close.png | Bin 1003 -> 0 bytes graphIcon.png | Bin 1565 -> 0 bytes images/ajax-loader.gif | Bin 3208 -> 0 bytes images/closebutton.png | Bin 1314 -> 0 bytes images/crosshair.svg | 13 - images/map.png | Bin 93259 -> 0 bytes images/map_bak.png | Bin 82682 -> 0 bytes images/map_indexed_corrected_offset.png | Bin 0 -> 158234 bytes images/map_mask.png | Bin 9977 -> 0 bytes images/map_outline_corrected_offset.png | Bin 0 -> 701409 bytes images/particleA.png | Bin 37672 -> 0 bytes images/play-pause.png | Bin 1617 -> 0 bytes images/play-pause_large.png | Bin 8933 -> 0 bytes importExportIcons.png | Bin 3062 -> 0 bytes index.html | 226 - js/ShaderExtras.js | 1779 -- js/Stats.js | 7 - js/Three.js | 729 - js/ThreeDebug.js | 34360 ---------------------- js/Tween.js | 530 - js/camerastates.js | 5 - js/canvg.js | 2620 -- js/d3.v2.min.js | 4 - js/dat.gui.min.js | 94 - js/dataloading.js | 128 +- js/datguicontrol.js | 49 +- js/geopins.js | 51 +- js/innersvg.js | 97 - js/jquery-1.7.1.min.js | 4 - js/jquery-ui-1.8.21.custom.min.js | 25 - js/jquery.preventMacBackScroll.js | 59 - js/main.js | 507 +- js/markers.js | 168 - js/mousekeyboard.js | 90 +- js/perlin.js | 56 - js/rgbcolor.js | 288 - js/shaders.js | 52 + js/shadow_transparent.png | Bin 6633 -> 0 bytes js/svgtoy.js | 352 - js/ui.controls.js | 805 - js/ui.controls_test.js | 531 - js/util.js | 226 +- js/visualize.js | 552 +- js/visualize_lines.js | 190 +- roboto/roboto-bold-webfont.eot | Bin 32652 -> 0 bytes roboto/roboto-bold-webfont.svg | 255 - roboto/roboto-bold-webfont.ttf | Bin 32468 -> 0 bytes roboto/roboto-bold-webfont.woff | Bin 20792 -> 0 bytes roboto/roboto-bolditalic-webfont.eot | Bin 38600 -> 0 bytes roboto/roboto-bolditalic-webfont.svg | 255 - roboto/roboto-bolditalic-webfont.ttf | Bin 38388 -> 0 bytes roboto/roboto-bolditalic-webfont.woff | Bin 24732 -> 0 bytes roboto/roboto-italic-webfont.eot | Bin 38672 -> 0 bytes roboto/roboto-italic-webfont.svg | 255 - roboto/roboto-italic-webfont.ttf | Bin 38480 -> 0 bytes roboto/roboto-italic-webfont.woff | Bin 24848 -> 0 bytes roboto/roboto-regular-webfont.eot | Bin 33140 -> 0 bytes roboto/roboto-regular-webfont.svg | 255 - roboto/roboto-regular-webfont.ttf | Bin 32944 -> 0 bytes roboto/roboto-regular-webfont.woff | Bin 21236 -> 0 bytes ropasans/RopaSans-Italic.ttf | Bin 42396 -> 0 bytes ropasans/RopaSans-Regular.ttf | Bin 41796 -> 0 bytes style.css | 616 - timelineBG.png | Bin 4383 -> 0 bytes yearHandle.png | Bin 1996 -> 0 bytes 67 files changed, 805 insertions(+), 45429 deletions(-) delete mode 100755 categories/.DS_Store delete mode 100644 categories/All.json delete mode 100644 close.png delete mode 100644 graphIcon.png delete mode 100755 images/ajax-loader.gif delete mode 100755 images/closebutton.png delete mode 100755 images/crosshair.svg delete mode 100644 images/map.png delete mode 100644 images/map_bak.png create mode 100644 images/map_indexed_corrected_offset.png delete mode 100644 images/map_mask.png create mode 100644 images/map_outline_corrected_offset.png delete mode 100755 images/particleA.png delete mode 100755 images/play-pause.png delete mode 100755 images/play-pause_large.png delete mode 100644 importExportIcons.png delete mode 100755 index.html delete mode 100755 js/ShaderExtras.js delete mode 100755 js/Stats.js delete mode 100755 js/Three.js delete mode 100755 js/ThreeDebug.js delete mode 100755 js/Tween.js delete mode 100644 js/camerastates.js delete mode 100755 js/canvg.js delete mode 100644 js/d3.v2.min.js delete mode 100755 js/dat.gui.min.js delete mode 100644 js/innersvg.js delete mode 100755 js/jquery-1.7.1.min.js delete mode 100755 js/jquery-ui-1.8.21.custom.min.js delete mode 100755 js/jquery.preventMacBackScroll.js delete mode 100644 js/markers.js delete mode 100644 js/perlin.js delete mode 100755 js/rgbcolor.js create mode 100644 js/shaders.js delete mode 100755 js/shadow_transparent.png delete mode 100755 js/svgtoy.js delete mode 100644 js/ui.controls.js delete mode 100644 js/ui.controls_test.js delete mode 100755 roboto/roboto-bold-webfont.eot delete mode 100755 roboto/roboto-bold-webfont.svg delete mode 100755 roboto/roboto-bold-webfont.ttf delete mode 100755 roboto/roboto-bold-webfont.woff delete mode 100755 roboto/roboto-bolditalic-webfont.eot delete mode 100755 roboto/roboto-bolditalic-webfont.svg delete mode 100755 roboto/roboto-bolditalic-webfont.ttf delete mode 100755 roboto/roboto-bolditalic-webfont.woff delete mode 100755 roboto/roboto-italic-webfont.eot delete mode 100755 roboto/roboto-italic-webfont.svg delete mode 100755 roboto/roboto-italic-webfont.ttf delete mode 100755 roboto/roboto-italic-webfont.woff delete mode 100755 roboto/roboto-regular-webfont.eot delete mode 100755 roboto/roboto-regular-webfont.svg delete mode 100755 roboto/roboto-regular-webfont.ttf delete mode 100755 roboto/roboto-regular-webfont.woff delete mode 100755 ropasans/RopaSans-Italic.ttf delete mode 100755 ropasans/RopaSans-Regular.ttf delete mode 100755 style.css delete mode 100644 timelineBG.png delete mode 100644 yearHandle.png diff --git a/categories/.DS_Store b/categories/.DS_Store deleted file mode 100755 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0P~f z=X(5Qeq6a)gX3!hpQFR?_YUi8_RZ!r*R*e4`>{GSap$`C k>*A~ZV^4jdHO7~l0}Oj0J$s$pKZ>7UF~6?8R3AL~1DBII3;+NC diff --git a/graphIcon.png b/graphIcon.png deleted file mode 100644 index 463a2c8cd38f12720afdc530796f17bfdcae4d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1565 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591|*LjJ{b+9BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWfo`&anSp|tp`M|! ziMhGCj)IYap@F`Ek-njkuA#Y=v5}R5fdUjL0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HT7t|lGSUUA&@HaaD@m--%_~-hnc$LIoLrPyP?DLSrvNfBF)6>a z#8wIDQivCF3*g4)6+?pw7-0Gpi3R$GdIlgb!4&%X;#ZoR3s+rS5|oN?FIIz#Ln;eW z^@CE2^Gl18ff1Lc46>@g%DE^tu_V7JBtJg~7K#BG`6cryA&s6|>*(wvaTU>CO2i2Q` z(=Dd1IQ8lS9itD5Sfq%C2?0|NhzU=&Kn^_Nr{)1udl4{M-~RmAnSp_6qNj^vNX4x? zGv5|A8Au$zEHgjWVP*qs7xM+a1$qwR2Uu;yC$Ju2v|tYqJHR@lp_oxE&Mojl^q5p!sDF=rg}Pffmy4HJ6q$zF_k>v-}? zqlB^9o`k-JXE}Uc{6Bp5|Imt9XYgHOg6oa*UKgAm^yu1c)G&RO{pqBd-RtR1lk#m` zzUOUEUVXJo)zgS=P3)KJi`=&RtGX~8D?GDF=k-(tU+M6RZ<#eF&bGQD(xzA}(_T66 z`jfKYtkA44-r_0@i3`QTPTjO{oxYS?Xw%J{2muyf`K<>s0#=)?U=Ua!bm@C^`T_ob zS+ed26s=7f@4WvWtMHj8VULhYgUhd`{SW_?SZ%!dMxFPu)W3!n7KJT01AXpYwP$>^ z>s@|;La%2A&z$cpGk?q_27b{>skM({)pT5-dwZLF z!qfa6ZT6SiKj;a@uql~#FV38`*U72J%v{+*Z+dr7w2;|*t+c=2%+{K4#W!!8kQQ=_ zDdGNvpv9h-Pq5#4TPD4DvX_N!^m0ATFRRe637g{97yl1GarMBV z_!9N0bz0hI7QEea;waYzmL4Np+0$aB9iN^StvtG|`>4~`%O4ZH-7~%}TYWlT*u`n~ z`})r>5}O=LD!hJdS#7qIM?k#%*S|2eHKLn19ny{j#W`iZK0lk`#bvW6!E43MW8B)l zb}Zbdsd)c`TN6)ossERT)hE*p+oQMo#@&22k#kPtX2yGOr_9`~@&9>pGgHN``T1TA fTk8aVizP5z@^*Nm;niCKDzH6W{an^LB{Ts5B-T%B diff --git a/images/ajax-loader.gif b/images/ajax-loader.gif deleted file mode 100755 index 1e3b0f38df519dc1461e7dc740e079981d6ccd15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 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 diff --git a/images/crosshair.svg b/images/crosshair.svg deleted file mode 100755 index 0b89a7c..0000000 --- a/images/crosshair.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/images/map.png b/images/map.png deleted file mode 100644 index 46096250f3f71543ebcba87f56125467ea202f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93259 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 diff --git a/images/map_indexed_corrected_offset.png b/images/map_indexed_corrected_offset.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6de32727ac2c78ee5b5c58f6ee31c568cd8c98 GIT binary patch literal 158234 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Ü`QGeDg8q*PRiy- zJ!C4C>G6?%$Is`+U51vvzJDg}D@Gfth67slK?l!~4V1@i)POGM<6{6SFRwUP4_Xo^ zZYA{2fgn2nYVo$%P2Vu!7E1sdIqMxo4Z8lG3YApkSF~@XvCN{U=s;isUaVf~5fZZO0Gy@$m<8BFbNwthW3QF0bw5)r#CgE}?dRn)S<@O?HHE-kVt zAIytR)ulE*SA2ezgACwp+ynkb6yrUba!uyggbs7@d=AG4@quL+Y?Hs+^Agcit6dP+ zP3JWozXG1!nIttWtVnGI0kKyHphU>}`^yD#YVq~UE)Ki!HdS&$(QL#oLb8MK!lTE( zQjXU=!!q0X5kv*1#HpHc5t$x-0s=GvKI9h(01v&;|1T4u%^Y zyAMKCb=0p4(fLqa5@0!y$Bd*g3FtZ;Gce`Nmu(m{e#^Wo;4ypg86+SZwkh+=cDTL9 zw6V%WO=R7%grmHBD??*~f}WocjQik2IVz!erjea0nu8lJCI^rz^~vf2y_+MPpBz;b z7&bI|(*S@I{{TL!JHXa5TAsC8E5w30?i&)(#jvc)=yyM>;V$d-X@B$)TnxtpB}kw+ z8>BsV%C&|Dx}rzE(1sS1q?yLUsHd9)efTPZECt|B@}f{#XRrzw9r_y1;TAmbXLW# zNE}rP5 zO^E=IB$EZ1LMwye&4bI=AvgVv8c4;)CDhXlQ!-=GF}{eU{1qsTow_5ZVApC4ib!(# zmL}ZEm0&EUXjNb=n>1N*n6+9B~P5yy|Vc#qQMmo%Ydwor$^xifAUThP)?u>r_>G2C#b!mW;3gkNJ&?GD=Qa{BR zZ?D9~rF;(Xpt!xx1;4oqvBc^L)Zf-aN@^BE=gh{?@ytoTTf51C(8$OOF@jc2E2w=4^Q3zB)jah$i@6w1OiT$rH8S&l(?^5Dx>gue?d5NVhT#sztol(bXtrKZkSPbjFZp!E5aL|R(KPJxr1;<4PGQR{Q=R&p0fXtA3v+t8LCZlN0AYQH=2usSI{$tb@5FXw` zb00sQ-F$WQWHioiDkX*CSB$1YcXherinFo6zY#WzjYU4(9a_i^Wj#;uu~=yF{7;kCaG8LFbKZki|o z*xpDZwF?M`z|(;!dm<-7%WRiIMQrDuv7QSS-O9g1-R3j^)RGl3@2CDCtoC3w_&zGt zM7NT#A}vl?<}bkmz<*&^2&hvaQ+F1WcOXynmuSzl(~BWv$3X+Q6c`Y{D+Zxc6kW^& z^bdd^XJ|&Mo1~9`;N)0l1wZMd938^-R)yn6@7|8OrP1?^fWt^&Z-vC*c~$9^85 zRqV#PBUcqDR|CSx>m|%1@r`t?VR>^R=JH`AaVp{>Xl8~CQ#21lf8N&etV&2K5@H{u z{kby>Q8j$_I4I0FsAqEgAL*PL2P;Mc5UJeaX5b%x$j%tKgv>3$@@wdx`$XpmwEv#o zqB%h_(bGV10=$y?@R147I$ED9ulf-NiDNId9)#4x_&@YP3!S9c4~FFlBFr3n`B8PF zHZfh`4Pdw6KD0*!stFyFVW^NPBL(BQR>XOoG$KtS|>|*KK%D z5!#xTjwx@;1℞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 AsQ>@~ diff --git a/images/map_outline_corrected_offset.png b/images/map_outline_corrected_offset.png new file mode 100644 index 0000000000000000000000000000000000000000..02198e298b51ef7b8043cafd24accc015d972c98 GIT binary patch literal 701409 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%0DL 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%0Ax!6;euA&PC<)6n7@-3Hpdt5h8)9J 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�c8} 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%0AM^X(dY7SFhb4)Dc*gs^m! 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 Cr;8{6 literal 0 HcmV?d00001 diff --git a/images/particleA.png b/images/particleA.png deleted file mode 100755 index b9a18be90a9e75ee2c0cddcf27abfa3c19f27c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37672 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 diff --git a/images/play-pause.png b/images/play-pause.png deleted file mode 100755 index 935461ea98a5ac1130e75983646be120c69470ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1617 zcmeAS@N?(olHy`uVBq!ia0vp^8bDmZ!2~4vh1AaiDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49ppsArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}mUbW};_k zVqj@vsiRh+i#(Mch>H3D2mX`VkM*2oZxz*Q}aqZU2K(rGI}YQDOPUI z=5B_D<|YQ_Mh0dUhK81g29}lN)9aa6T#}fVoC>oy6J#$$uOnW)R?bDKi6!|(A^G_^uoMuGkzbNu zoRMFk;2dnKXQ<$tn4Fmh5&=aJ#J?`7MVV!(DQ-pixeDMAw#vlj0vAF)hv-cqC)D(T zj?o7t52WM*69T3|5EGvGfgE`DNzDW1nId53kZ_OP%)r1@@9E+gQgQ3eO@Du3M-he( z=iWH|kD0wq{vgZV$sFNAdnyb+I#&n?^-k=bbKv~~aeWctW^q%km{#ua2M@ky?6$sp zcjB%sn#M~{S8vYm{&qI=*QAHn&F?1Od(%<1H*S`zFpu$>4O5&v77EW*xy3r|0^>Y= zzIr*`X-}V;Ylw&?J*fR%^&-Rji-&vkE}!Y$y^V)Ae*5`=``obu2ftps_q%0-VZrgN z_xEcB9B#NDxSMyqBPYl1@`2Re#_GNIejL9ZtsgQ&h4p~f%E13;zlk}O#`~%}tm#{u;wc~M{%9VP4HsL#>);b;6 zS$o8r|8aNn`ivj{ye55me*8z&#nmBN78Y+8zZ~fCscew4(U6K)+U-R!r*eyq{A5pjOiw2msx4&NBmARs)UHR5-RhM-Y5!2Zs zx0QF*ZZ4nty6^R5MSn%(G_8!#w9Db(Vhkn1Jv=}EEeGeG z4I1?|_PgG!v5$JaIwh%P$rn$3vE}7lTKV02-|k5N_@&Ns_zVZ942xr03(LC_tC@mA zH}*wrQC8VdxY5GUiK#zc=bp&J(l>nl=e7h}{lEV1h$zQl9{=W_%X$-yX1o`BuQum# z9nbFQFXBfYKR>wl>5K0x<&Re-J=s>z^{?&Tx>AFy{5*2&H(c5$tJu7iHCu$IR%)?^ zwbP`+E7#qQxwUYGHF8P|YVBBm=KhV23BFr5EsJ`oB)87uRG&bK&9C@Csk9u|7uPm! zyJncSs&VEdW4dV7+2>SSqSZ}A#oxhl;@V`66I zwr2e-Haq_hw=%=TrJ!97!$cwXR5Cx-=kO$zNP5MRXpL{y-;2}=)Z_?1qrIUi77INk zrhJ}qtGVuIS!jdQ2*cW;&!+(=uz}w&_zk@Cgt)lRI&cMM_-~bn2HkO#+4xN`aYchM zx4Ji}-cs4^Y#3v_7_oE$5CI$M9YOZ?gpX7GM1@U=SQ)vJ-F-0dAYVZRCKnCg22$=t(Y}pM_2zr?g zdMqUZ0H`yAL`Hsl>nlMqTam(mHN-F+6Bchqu&I3ThAaf z_@7?eU9o2fE|f3tJ&QEv3(#^#~qi(43mQZN9}`{|sD?Khlg zDGq?-K4BjOKfQw`I`^2sAP1ip3%^Q$rC?6`^rsd8;G>4am<}fXCQ4W&N~s}=;NF8f z-c5SkgCy940#Ack@D;9|8cB@?p?-sKN1P)o!nFl{ArG50A8C1$=BiiS8@tAYT)3Aw zEtF1M9QRwW3Lf@1VmzsSJRJ$7na@{vT>V5Yp9S$mXbGdl@DmAlaFfDzs0W56i_lx6 zR>hVRhlZ&y@Y6*tzx$ZK8OS3{2}du$|M{*wj5MF;Cq^3rmgM%dkTt(AK8wWIbcHp- za{Nuf)Qrm&Mq4BtCP`lyUeB;uBRlWP9d&W`5@H!V-zh?PtSBMKlay7E3Tz zK4+lCXSM3iCwTT{}yU~NTvI&8esNIQi}g)Iesg&PGi zh4%FN^p9y7>BwoqoK=a7GD);TNf?YFDRLia=abrG%!-gW(>uZ{6+LMql5vtSMtFx4 zh6#3z2tA`Q2fl47$`)l6X{arKU}MD4_^26TD|1~yucEA0@e}8#QyJ4Z`8fKx*0|U> zN}7BcSz1IIq>jBVvf*vr-`ZmnM&s52&Th`J(f*G;w!KGFZMooY*Vr&r*gGR%9etb`qrZsL+2`23|BH26gR5v>Rrk$!@bRY zjvchUk)77b%Pgx@(4^fU*@$08bK)%))eq(HsYEB@bzm23mrfulgf)mdh(3tog$YhW zRH|FnxJI;9G`G7T?|WXDaiwwM211Vx4J(a!K5D*TzE(bo3ARbVrt_xY=0k7pVV3)Q zU&7Aszh!d?@Nnx0WeHn9%(B%tNxH_sel)TyGxhg>-P&a! zSk(jDL*V-T5ycT1X$C1~oNgS6B8Q^LgxUliOU92-s7safGM|Il3BoeVGQ^$R9pC-P zy$d!9lRDCZDLJLCl6HViVMV`*gn~L_e7Eo214N!M?zfTOAwMHqAfI7LVufO|ktvbL zl1aWb_;hbsX+F+g&1=Xr!?9#FYZ=V}W}o0b;WguR`^3cKXV*0#_^V^kfAaI1X^mti z-Q?`xMdNN{YMy4EX6k$vxa3+GrbHGU*PvK8;ipHU7w*tNVQb|8vg2)1^w%42lJcu< zuAc%2ZBrlO?mI8wogHjwZ~YySU1A(4TS@O*T4-JN85vllTiFFyq}UbMMUcg0HtVIX z)VG)U#Xqz}6buO`7%B@-IZx5Eg@7^_ENTW$ELSd@gRZo0C(i@x#9gH?;)jI&g;j-b z{dN4G0-WwPA6K8spP)}CPh*e72$k@12z&5~@KcC^Xq=d%7#V0#j7hW{^cjp1v~=uw zj0vo4G%i#o)J!a1G&bxPJQETZVN>9&a6P9h*Qn5uFE__B+r1K|pMtrG{ z6kvb*i}F$kbYpspe0m~-Co8L%zG&5WwiRd|)cqWfP=GRv<1c9KaxV9g@e}8@Y=)Yy z((;t}X+*{x(i~2SGG!B=esWJ%&+uDdf#1%f>ha8Z;nR>t!W)W*Y?73v~@8Cee zbMGm%U4k$M9_8??<0(J{`GF#DLh^0yo+&tg}g1Y^(;-SWBC)*?KBOS^V z%tSuZUO%*kI#fd{oSW+EYqwN~Lbg7Ymw%NKw3N+iq@2WaeT|+7t{JYMNT09}G7uD%!MQv* zjuiG3oNsM|EbosuYv-NME*+*&j9R+hQv9JLp~51~4kWq07^*1xVpoF`zd6XcUfad! z&2-*$oPE^}+a}$@b~lG zHfWK}u7Sj8sq05z^1bIn`{r#IFrhU;-ud@~)sNWDJeA4{x7RT|FAfJnf`rTG2&gXB1>JU0yGhB}@t>#IJ2pjd~~ z-3cP;H^eZKE6YS5RTBO&uP1UU|{Sb)k^)=SY#-c9+MZ=-dA$;Yq5YdqdLmwH_kV*D~3+~55xFS&<~CN;mg zSGSK!5>u)xIwLkGPA7VxzmBVa8%#isFP?mJ!k?|*+U}$L@;fT!?kNqS66H?q(54`w zsb~%d!~C2)pTYttHQI0KXwE|M5@>qABXP4>HZwQnma~h!i?xeGgqh`|wy1vfv!$V^ zs&UtTuJ!)1nT^}fp2bf?SpU!S?CluY7a2|c`GQaAU%)l#P{;ODm%cMgYlAD6!4rdP zKe8L%5}x99;H>|#qt;lIAA?@Q*?!}0GqG1zkjjkCn&!i~rPoto$&i=d>2=c$Sjgtg ziK^x0>eTpYdfv*S&nky1D3L#joAi(C5Yx~?iCKn|`ET@&!mbCQXOFGbD7D(Ma-iDJ zA?@+U`p)v|<3f;`Ij&HMOK|yrz1Y+P(T@zIYeY)*IKFi}3SK z!f9e=!u!u(2+&rNSaj*M*nZQ_eDF~}ioWtmhhJiDeY$W#hl{S3BN}b{cv0SKYkw4Z z-!b@YPrXX(#5Nm#EmZIQwf;30ra9(aY+791AQ`=U$@)ae1Ou}a%R?1^Ri=IQvSIDm z(hn2J3JsKFm9ZZU-Vb`!@cM7@8k`Lo(}0TknOsjnNSL^H;m6u7&!E#&)2`5IA^w8pgq!^A!h~ROzJ}75p;NG`(Ss*k;^OWXlRLU-OCa`RjFGO~RST zwZgn2@l;VD_JgTN#UIUcvb`11S)bd9h~qejh44|ZE3GZ1k-T;5cFbemS24)INBoiZ zjD8n#EkaTlMz;;XK{P2Km{V1wlFY~$eTSSlzi$a*Nj>+afK`fj=&hF&^e z23~q@FS~U+z_V+IhuGT)iZg%1hxq%>b1F1%lE3uU@4Pv8%nmdb-Tx}|E9|)c(zwzX zznZM6lgH%F5fWooeLrHmaIbvu6 zrf(>T>wSYKd9#R#yV@tciI^|aD%HRmHY6Nt)$g|D6mz_wi=v?r%r7{ZgFWlctZtKyTa)OixEwC@~&0pP3 zF6_0oU$Tgtu{5!+8#(GZ8Xao;)Xuiff*+mB{Qk`JZc_=Z`$2930x!yfT#X+O7dH;3 z8?2uC5^}sctVznKsseQGjvisXb;rEYzfb*$MJV|_)`6sI;47cWo(k3&o_F?$$q2YxnIP3O0#zLNUibjWPnmS z1<2~sX%1;CI_}y>I+{984K}rF7QB{cyUx3BO9!R{-Ey|@_iZ;lw+%N&HZ`{cM!dco zWdz9>*W~>)u2Bi8{qBqt&>R^%oXOH!&}52Or}W1ijY~FU$E=LmMu0>s-Kt*F_4&f} zf(bo=FearSRZ$aBQ%iH`7v<0O=?`1#m^3*N_}{RIs}zvdFdss z$&#@aKQzG}xf3`7za2_$Fe6-t@T@F}?DQ7*+viT?x;rMgZ9LmQ zTADxe6!}QR1M=5ehSKsXIXS`uuzz-=^-^P%=ixv%kl|_x)TjxfH_*9z-g~3vnoyXC zN#H5=6QN1mPy>fGi^%SR3l4~WVaAEN&1hYbg~z)LWOcinacIA{CvC!z9t3X6xu|=4 zJeoYBip4ueo`?TbWTvg=yyFz2WlWSCp>^fFBN&Lg_+GA9WkF;mJoTub%o^{gPVje@+;jgo1sO#nY}r!uWs zOyY;grWgvM=EOYNj^xV3WjY61@g$NYmLC}3LCHp{2U^S;(HcBzo0@lJ{6Doy1Esd} z_LQnb9h@j|3=*mgeFN`JkkP_zq*@14>8ncKTV4`r$dfS1!<;jjS28`>PU^5f#(!0^ z%6c$}aB~_I{TP zwtz2+eudqJ_ZbrlwVjHFJe~BKX3%wio=D?*VFZH&jaoyh;Vpr?ehBC)6>vX~G|G}%}WFP^wRnz&~ywfi2 zZT90`6hF(KC2Q!d-qC9D9fQc1A9R5}l@#j-tE-5SII5bj3x;o|n8AMSt*z8>qQh{D ze4VYWT1~C3s@TCK2-Y$8TKj=JF%9qKpfs0wp^4ujviskumv6co5QlKyhj8>+kj7(%dnorh3fP+#B(3gOp8 zjmigO3o+Rj^|Mi^$ajyD|MYNQEsaIE9cgGT05$i?+cLowkOb0M_v?45>;9DiWy=rS ziHUe2KMavk0i<~}!N}IZ;r|u#tKlXT#@7(q^1eIGCn0wqNer?(Ve@v;|jy9e#Mj=bfh ztTS;<2hT(`})prjA8%}HSAI#TPolyXH(e38*o|H&e z1U+}oT^O{P94UBGc@nzrW5kC>=}s!wJl*qVzVJ}_-gYKAzD9Z=X|$O;n8K!HO^qI` z-L#gE-aOEVZ_?quA3f+nI3tpmyy^8qo93TwvKA@iaUg#>6cAw}iW!t}gofySI=DMt zZgH6t5CO8YtNh}DeK{5vrbk zmQGO45)uiFmuL)tFRCC9*xYK3igJO)yeUtFe%9x(w&VKR#SL`%v*q0)ZW<-AFqF}T zc(rpCHX={#&jcm5lkJ7(|NQzB*`Z4DGFg3&xTJ)2o>9*uMKhF0cK0BCbmywkb99t~ zg@VGMOle|V;i$B7b%sLp%X)6LMoCs)C8;}i0i9~KR;fY0LVOnxMsC3%)-JOoG##(z ziP_km0uCWcI&WspuXKgtsW|R^sZ!Eh&vgOS&mLx@MpZeXX_l+cAH_OJR#v3Uex>dNin$gl}6+B{&VA}tJ? zwI9Gw7A{xkmHg9+RJhjOUh_7i{3w0F^e7HRzg3(M0$ou0GP3C`vuJ}2SEHnP(Rrr< z+@j(DtZ4ui;_De#6ye{O{~s`E=Bs=NhA02;)_?rvt3upi`FMQ)Rtst#2TZ1PqtbO@ zJnFkUB70ixlf@{=GUsny-l6@2K&h zUvo=wpNBjTCMaRzU}2Fa#En&IzIOga{nZ@k`SNEoe^WEZYSp5O`!G-}MSHz%iHe*; zSBU$7)vg8tF)~Zw>3CqWdsuiZ6vmb-UdO_O}L#vnI=Qm z-PVmVN+CO^z}xShP+z~RNnWF)r*V-!zkLCrj@j)Kqs8+P&6kl?{gceL)3SvujGS^0 zi3DQk>iuL-eos&RpR{z$q*D-T+9#|(G%?}F{x-3n5Dt_=^A(kS&UUCA?=GRa#C8Mk4uxY18H)?443`8vZalN=-_#Yc9vWID zV1MqJMJ%B;s&aR_NbVOinKMYRLv+q z8C#EV)`8<{V4L#>sZj!_YEXerf--e~XNxZukMY-Zi|nq6oQ#;aSg0{r+W}`mjdpvF z4tVvf>h#&0U8W;Rk<*apdbhpDDrdc=q&Hs}2@)6P<_h=ce_^}e6TF;>JT0)jtRd&x zresX4DYkv_n5<>zx)T%!C87M|!fgOYw_UD&^##lROk`7C=oO1;udRYoL&prgE`dMdl zBd{1i?zSzvzK37!r}NFO`KL2X5{-$_U1%c*h>9EqpVlkzqf)yaaNdh=_Sp?(qF1+` z)*NWO_6V^GYmV1_9PR&Gj5L+Q@3y5(wNX@D^ai%?4Y^_H{K9_Vrt6D z!`%)|bl;^htdQevfiwa)c^uMMG!-U`DBD;_@pcJ55%a-}BTEmO{Q0g81)!7g29eN?WA_h51n8kkmDPC}y&3g2cR!-;~@P@nR> z?UzO2&}0usGt_D?R~U;!emN<)F0ugGl+cAJ+F(mZ9(;98zvv)$q-iU2IXoO0;^VRf z6er8!qOHUC2-Voftct9<%W$5o^|Tfc+_GIts>NN%vfjQIx07|h5Fkei(@@m{FQ^KH z+Y{#?;iL`G#4y?X)OGeJ&npb}!$W(%;{`*t4Nv4rE1cWKn22rNtOZPbK~;!(mxV67 zG8i}f|0#=*;s5Il{7``&_8E?FhS2Bq02A;l-oGiGjTbT2atx+Aorav!y^6Asd$55QvrAHb9>MqmBIbk-H>X` zPK#Inncl>_0WH)7iqDrJ@mbKNq1iaD8I=xTpr_2x`1SAjJ^3rgRDoK;a{Db`2h%5h z%e3xqmXTOrzSuTi<~eM+Ewn%SI&=1yTZ%Dz}jI{J?4F5{Q zQl2{fT8yANn&<*CvFv`+ia*yY@0W%a`N{0!lV{5PQ&Ify57__oOuzfd&dv@%cYduU eNUmSt07twv@Pr<;-(FV>09i>TiR#bBA^#5<)n3~G diff --git a/importExportIcons.png b/importExportIcons.png deleted file mode 100644 index b4df79273e879173acf02e3ef1deba27e41309bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3062 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 diff --git a/index.html b/index.html deleted file mode 100755 index e944ac8..0000000 --- a/index.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - Interactive Globe: Small Arms Imports & Exports - - - - - - - - - - diff --git a/js/ShaderExtras.js b/js/ShaderExtras.js deleted file mode 100755 index 0fcda20..0000000 --- a/js/ShaderExtras.js +++ /dev/null @@ -1,1779 +0,0 @@ -/** - * @author alteredq / http://alteredqualia.com/ - * @author zz85 / http://www.lab4games.net/zz85/blog - * - * ShaderExtras currently contains: - * - * screen - * convolution - * film - * bokeh - * sepia - * dotscreen - * vignette - * bleachbypass - * basic - * dofmipmap - * focus - * triangleBlur - * horizontalBlur + verticalBlur - * horizontalTiltShift + verticalTiltShift - * blend - * fxaa - * luminosity - * colorCorrection - * normalmap - * ssao - * colorify - * unpackDepthRGBA - */ - -THREE.ShaderExtras = { - - /* ------------------------------------------------------------------------- - // Full-screen textured quad shader - ------------------------------------------------------------------------- */ - - 'screen': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - opacity: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 texel = texture2D( tDiffuse, vUv );", - "gl_FragColor = opacity * texel;", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------ - // Convolution shader - // - ported from o3d sample to WebGL / GLSL - // http://o3d.googlecode.com/svn/trunk/samples/convolution.html - ------------------------------------------------------------------------ */ - - 'convolution': { - - uniforms: { - - "tDiffuse" : { type: "t", value: 0, texture: null }, - "uImageIncrement" : { type: "v2", value: new THREE.Vector2( 0.001953125, 0.0 ) }, - "cKernel" : { type: "fv1", value: [] } - - }, - - vertexShader: [ - - //"#define KERNEL_SIZE 25.0", - - "uniform vec2 uImageIncrement;", - - "varying vec2 vUv;", - - "void main() {", - - "vUv = uv - ( ( KERNEL_SIZE - 1.0 ) / 2.0 ) * uImageIncrement;", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - //"#define KERNEL_SIZE 25", - "uniform float cKernel[ KERNEL_SIZE ];", - - "uniform sampler2D tDiffuse;", - "uniform vec2 uImageIncrement;", - - "varying vec2 vUv;", - - "void main() {", - - "vec2 imageCoord = vUv;", - "vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );", - - "for( int i = 0; i < KERNEL_SIZE; i ++ ) {", - - "sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];", - "imageCoord += uImageIncrement;", - - "}", - - "gl_FragColor = sum;", - - "}" - - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - - // Film grain & scanlines shader - - // - ported from HLSL to WebGL / GLSL - // http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html - - // Screen Space Static Postprocessor - // - // Produces an analogue noise overlay similar to a film grain / TV static - // - // Original implementation and noise algorithm - // Pat 'Hawthorne' Shearon - // - // Optimized scanlines + noise version with intensity scaling - // Georg 'Leviathan' Steinrohder - - // This version is provided under a Creative Commons Attribution 3.0 License - // http://creativecommons.org/licenses/by/3.0/ - ------------------------------------------------------------------------- */ - - 'film': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - time: { type: "f", value: 0.0 }, - nIntensity: { type: "f", value: 0.5 }, - sIntensity: { type: "f", value: 0.05 }, - sCount: { type: "f", value: 4096 }, - grayscale: { type: "i", value: 1 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - // control parameter - "uniform float time;", - - "uniform bool grayscale;", - - // noise effect intensity value (0 = no effect, 1 = full effect) - "uniform float nIntensity;", - - // scanlines effect intensity value (0 = no effect, 1 = full effect) - "uniform float sIntensity;", - - // scanlines effect count value (0 = no effect, 4096 = full effect) - "uniform float sCount;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - // sample the source - "vec4 cTextureScreen = texture2D( tDiffuse, vUv );", - - // make some noise - "float x = vUv.x * vUv.y * time * 1000.0;", - "x = mod( x, 13.0 ) * mod( x, 123.0 );", - "float dx = mod( x, 0.01 );", - - // add noise - "vec3 cResult = cTextureScreen.rgb + cTextureScreen.rgb * clamp( 0.1 + dx * 100.0, 0.0, 1.0 );", - - // get us a sine and cosine - "vec2 sc = vec2( sin( vUv.y * sCount ), cos( vUv.y * sCount ) );", - - // add scanlines - "cResult += cTextureScreen.rgb * vec3( sc.x, sc.y, sc.x ) * sIntensity;", - - // interpolate between source and result by intensity - "cResult = cTextureScreen.rgb + clamp( nIntensity, 0.0,1.0 ) * ( cResult - cTextureScreen.rgb );", - - // convert to grayscale if desired - "if( grayscale ) {", - - "cResult = vec3( cResult.r * 0.3 + cResult.g * 0.59 + cResult.b * 0.11 );", - - "}", - - "gl_FragColor = vec4( cResult, cTextureScreen.a );", - - "}" - - ].join("\n") - - }, - - - /* ------------------------------------------------------------------------- - // Depth-of-field shader with bokeh - // ported from GLSL shader by Martins Upitis - // http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html - ------------------------------------------------------------------------- */ - - 'bokeh' : { - - uniforms: { tColor: { type: "t", value: 0, texture: null }, - tDepth: { type: "t", value: 1, texture: null }, - focus: { type: "f", value: 1.0 }, - aspect: { type: "f", value: 1.0 }, - aperture: { type: "f", value: 0.025 }, - maxblur: { type: "f", value: 1.0 }, - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "varying vec2 vUv;", - - "uniform sampler2D tColor;", - "uniform sampler2D tDepth;", - - "uniform float maxblur;", // max blur amount - "uniform float aperture;", // aperture - bigger values for shallower depth of field - - "uniform float focus;", - "uniform float aspect;", - - "void main() {", - - "vec2 aspectcorrect = vec2( 1.0, aspect );", - - "vec4 depth1 = texture2D( tDepth, vUv );", - - "float factor = depth1.x - focus;", - - "vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );", - - "vec2 dofblur9 = dofblur * 0.9;", - "vec2 dofblur7 = dofblur * 0.7;", - "vec2 dofblur4 = dofblur * 0.4;", - - "vec4 col = vec4( 0.0 );", - - "col += texture2D( tColor, vUv.xy );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.15, 0.37 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.37, 0.15 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.40, 0.0 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.37, -0.15 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.15, 0.37 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.37, 0.15 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.15, -0.37 ) * aspectcorrect ) * dofblur );", - - "col += texture2D( tColor, vUv.xy + ( vec2( 0.15, 0.37 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.37, 0.15 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.37, -0.15 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.15, 0.37 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.37, 0.15 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.15, -0.37 ) * aspectcorrect ) * dofblur9 );", - - "col += texture2D( tColor, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.40, 0.0 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur7 );", - - "col += texture2D( tColor, vUv.xy + ( vec2( 0.29, 0.29 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.4, 0.0 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.29, -0.29 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.0, -0.4 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.29, 0.29 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.4, 0.0 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );", - "col += texture2D( tColor, vUv.xy + ( vec2( 0.0, 0.4 ) * aspectcorrect ) * dofblur4 );", - - "gl_FragColor = col / 41.0;", - "gl_FragColor.a = 1.0;", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Depth-of-field shader using mipmaps - // - from Matt Handley @applmak - // - requires power-of-2 sized render target with enabled mipmaps - ------------------------------------------------------------------------- */ - - 'dofmipmap': { - - uniforms: { - - tColor: { type: "t", value: 0, texture: null }, - tDepth: { type: "t", value: 1, texture: null }, - focus: { type: "f", value: 1.0 }, - maxblur: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float focus;", - "uniform float maxblur;", - - "uniform sampler2D tColor;", - "uniform sampler2D tDepth;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 depth = texture2D( tDepth, vUv );", - - "float factor = depth.x - focus;", - - "vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );", - - "gl_FragColor = col;", - "gl_FragColor.a = 1.0;", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Sepia tone shader - // - based on glfx.js sepia shader - // https://github.com/evanw/glfx.js - ------------------------------------------------------------------------- */ - - 'sepia': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - amount: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float amount;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 color = texture2D( tDiffuse, vUv );", - "vec3 c = color.rgb;", - - "color.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );", - "color.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );", - "color.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );", - - "gl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Dot screen shader - // - based on glfx.js sepia shader - // https://github.com/evanw/glfx.js - ------------------------------------------------------------------------- */ - - 'dotscreen': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - tSize: { type: "v2", value: new THREE.Vector2( 256, 256 ) }, - center: { type: "v2", value: new THREE.Vector2( 0.5, 0.5 ) }, - angle: { type: "f", value: 1.57 }, - scale: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec2 center;", - "uniform float angle;", - "uniform float scale;", - "uniform vec2 tSize;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "float pattern() {", - - "float s = sin( angle ), c = cos( angle );", - - "vec2 tex = vUv * tSize - center;", - "vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;", - - "return ( sin( point.x ) * sin( point.y ) ) * 4.0;", - - "}", - - "void main() {", - - "vec4 color = texture2D( tDiffuse, vUv );", - - "float average = ( color.r + color.g + color.b ) / 3.0;", - - "gl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------------------------------ - // Vignette shader - // - based on PaintEffect postprocess from ro.me - // http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js - ------------------------------------------------------------------------------------------------ */ - - 'vignette': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - offset: { type: "f", value: 1.0 }, - darkness: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float offset;", - "uniform float darkness;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - // Eskil's vignette - - "vec4 texel = texture2D( tDiffuse, vUv );", - "vec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );", - "gl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );", - - /* - // alternative version from glfx.js - // this one makes more "dusty" look (as opposed to "burned") - - "vec4 color = texture2D( tDiffuse, vUv );", - "float dist = distance( vUv, vec2( 0.5 ) );", - "color.rgb *= smoothstep( 0.8, offset * 0.799, dist *( darkness + offset ) );", - "gl_FragColor = color;", - */ - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Bleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass] - // - based on Nvidia example - // http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass - ------------------------------------------------------------------------- */ - - 'bleachbypass': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - opacity: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 base = texture2D( tDiffuse, vUv );", - - "vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );", - "float lum = dot( lumCoeff, base.rgb );", - "vec3 blend = vec3( lum );", - - "float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );", - - "vec3 result1 = 2.0 * base.rgb * blend;", - "vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );", - - "vec3 newColor = mix( result1, result2, L );", - - "float A2 = opacity * base.a;", - "vec3 mixRGB = A2 * newColor.rgb;", - "mixRGB += ( ( 1.0 - A2 ) * base.rgb );", - - "gl_FragColor = vec4( mixRGB, base.a );", - - "}" - - ].join("\n") - - }, - - /* -------------------------------------------------------------------------------------------------- - // Focus shader - // - based on PaintEffect postprocess from ro.me - // http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js - -------------------------------------------------------------------------------------------------- */ - - 'focus': { - - uniforms : { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "screenWidth": { type: "f", value: 1024 }, - "screenHeight": { type: "f", value: 1024 }, - "sampleDistance": { type: "f", value: 0.94 }, - "waveFactor": { type: "f", value: 0.00125 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float screenWidth;", - "uniform float screenHeight;", - "uniform float sampleDistance;", - "uniform float waveFactor;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 color, org, tmp, add;", - "float sample_dist, f;", - "vec2 vin;", - "vec2 uv = vUv;", - - "add += color = org = texture2D( tDiffuse, uv );", - - "vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );", - "sample_dist = dot( vin, vin ) * 2.0;", - - "f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;", - - "vec2 sampleSize = vec2( 1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );", - - "add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );", - "if( tmp.b < color.b ) color = tmp;", - - "color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );", - "color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );", - - "gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );", - - "}" - - - ].join("\n") - }, - - /* ------------------------------------------------------------------------- - // Triangle blur shader - // - based on glfx.js triangle blur shader - // https://github.com/evanw/glfx.js - - // A basic blur filter, which convolves the image with a - // pyramid filter. The pyramid filter is separable and is applied as two - // perpendicular triangle filters. - ------------------------------------------------------------------------- */ - - 'triangleBlur': { - - - uniforms : { - - "texture": { type: "t", value: 0, texture: null }, - "delta": { type: "v2", value:new THREE.Vector2( 1, 1 ) } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "#define ITERATIONS 10.0", - - "uniform sampler2D texture;", - "uniform vec2 delta;", - - "varying vec2 vUv;", - - "float random( vec3 scale, float seed ) {", - - // use the fragment position for a different seed per-pixel - - "return fract( sin( dot( gl_FragCoord.xyz + seed, scale ) ) * 43758.5453 + seed );", - - "}", - - "void main() {", - - "vec4 color = vec4( 0.0 );", - - "float total = 0.0;", - - // randomize the lookup values to hide the fixed number of samples - - "float offset = random( vec3( 12.9898, 78.233, 151.7182 ), 0.0 );", - - "for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {", - - "float percent = ( t + offset - 0.5 ) / ITERATIONS;", - "float weight = 1.0 - abs( percent );", - - "color += texture2D( texture, vUv + delta * percent ) * weight;", - "total += weight;", - - "}", - - "gl_FragColor = color / total;", - - "}", - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Simple test shader - ------------------------------------------------------------------------- */ - - 'basic': { - - uniforms: {}, - - vertexShader: [ - - "void main() {", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "void main() {", - - "gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );", - - "}" - - ].join("\n") - - }, - - /* -------------------------------------------------------------------------------------------------- - // Two pass Gaussian blur filter (horizontal and vertical blur shaders) - // - described in http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ - // and used in 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" - -------------------------------------------------------------------------------------------------- */ - - 'horizontalBlur': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "h": { type: "f", value: 1.0 / 512.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "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;", - - "}" - - - ].join("\n") - - }, - - 'verticalBlur': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "v": { type: "f", value: 1.0 / 512.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "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;", - - "}" - - - ].join("\n") - - }, - - /* -------------------------------------------------------------------------------------------------- - // Simple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position - // - // - 9 samples per pass - // - standard deviation 2.7 - // - "h" and "v" parameters should be set to "1 / width" and "1 / height" - // - "r" parameter control where "focused" horizontal line lies - -------------------------------------------------------------------------------------------------- */ - - 'horizontalTiltShift': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "h": { type: "f", value: 1.0 / 512.0 }, - "r": { type: "f", value: 0.35 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform sampler2D tDiffuse;", - "uniform float h;", - "uniform float r;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 sum = vec4( 0.0 );", - - "float hh = h * abs( r - vUv.y );", - - "sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;", - "sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;", - "sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;", - "sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;", - "sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;", - "sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;", - "sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;", - "sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;", - - "gl_FragColor = sum;", - - "}" - - - ].join("\n") - - }, - - 'verticalTiltShift': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "v": { type: "f", value: 1.0 / 512.0 }, - "r": { type: "f", value: 0.35 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform sampler2D tDiffuse;", - "uniform float v;", - "uniform float r;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 sum = vec4( 0.0 );", - - "float vv = v * abs( r - vUv.y );", - - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;", - "sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;", - - "gl_FragColor = sum;", - - "}" - - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Blend two textures - ------------------------------------------------------------------------- */ - - 'blend': { - - uniforms: { - - tDiffuse1: { type: "t", value: 0, texture: null }, - tDiffuse2: { type: "t", value: 1, texture: null }, - mixRatio: { type: "f", value: 0.5 }, - opacity: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - "uniform float mixRatio;", - - "uniform sampler2D tDiffuse1;", - "uniform sampler2D tDiffuse2;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 texel1 = texture2D( tDiffuse1, vUv );", - "vec4 texel2 = texture2D( tDiffuse2, vUv );", - "gl_FragColor = opacity * mix( texel1, texel2, mixRatio );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // NVIDIA FXAA by Timothy Lottes - // http://timothylottes.blogspot.com/2011/06/fxaa3-source-released.html - // - WebGL port by @supereggbert - // http://www.glge.org/demos/fxaa/ - ------------------------------------------------------------------------- */ - - 'fxaa': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "resolution": { type: "v2", value: new THREE.Vector2( 1 / 1024, 1 / 512 ) } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform sampler2D tDiffuse;", - "uniform vec2 resolution;", - - "varying vec2 vUv;", - - "#define FXAA_REDUCE_MIN (1.0/128.0)", - "#define FXAA_REDUCE_MUL (1.0/8.0)", - "#define FXAA_SPAN_MAX 8.0", - - "void main() {", - - "vec3 rgbNW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ).xyz;", - "vec3 rgbNE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ).xyz;", - "vec3 rgbSW = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ).xyz;", - "vec3 rgbSE = texture2D( tDiffuse, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ).xyz;", - "vec3 rgbM = texture2D( tDiffuse, gl_FragCoord.xy * resolution ).xyz;", - - "vec3 luma = vec3( 0.299, 0.587, 0.114 );", - - "float lumaNW = dot( rgbNW, luma );", - "float lumaNE = dot( rgbNE, luma );", - "float lumaSW = dot( rgbSW, luma );", - "float lumaSE = dot( rgbSE, luma );", - "float lumaM = dot( rgbM, luma );", - "float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );", - "float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );", - - "vec2 dir;", - "dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));", - "dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));", - - "float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );", - - "float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );", - "dir = min( vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX),", - "max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),", - "dir * rcpDirMin)) * resolution;", - - "vec3 rgbA = 0.5 * (", - "texture2D( tDiffuse, gl_FragCoord.xy * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ).xyz +", - "texture2D( tDiffuse, gl_FragCoord.xy * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ).xyz );", - - "vec3 rgbB = rgbA * 0.5 + 0.25 * (", - "texture2D( tDiffuse, gl_FragCoord.xy * resolution + dir * -0.5 ).xyz +", - "texture2D( tDiffuse, gl_FragCoord.xy * resolution + dir * 0.5 ).xyz );", - - "float lumaB = dot( rgbB, luma );", - - "if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) ) {", - - "gl_FragColor = vec4( rgbA, 1.0 );", - - "} else {", - - "gl_FragColor = vec4( rgbB, 1.0 );", - - "}", - - "}", - - ].join("\n"), - - }, - - /* ------------------------------------------------------------------------- - // Luminosity - // http://en.wikipedia.org/wiki/Luminosity - ------------------------------------------------------------------------- */ - - 'luminosity': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 texel = texture2D( tDiffuse, vUv );", - - "vec3 luma = vec3( 0.299, 0.587, 0.114 );", - - "float v = dot( texel.xyz, luma );", - - "gl_FragColor = vec4( v, v, v, texel.w );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Color correction - ------------------------------------------------------------------------- */ - - 'colorCorrection': { - - uniforms: { - - "tDiffuse" : { type: "t", value: 0, texture: null }, - "powRGB" : { type: "v3", value: new THREE.Vector3( 2, 2, 2 ) }, - "mulRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform sampler2D tDiffuse;", - "uniform vec3 powRGB;", - "uniform vec3 mulRGB;", - - "varying vec2 vUv;", - - "void main() {", - - "gl_FragColor = texture2D( tDiffuse, vUv );", - "gl_FragColor.rgb = mulRGB * pow( gl_FragColor.rgb, powRGB );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Normal map shader - // - compute normals from heightmap - ------------------------------------------------------------------------- */ - - 'normalmap': { - - uniforms: { - - "heightMap" : { type: "t", value: 0, texture: null }, - "resolution": { type: "v2", value: new THREE.Vector2( 512, 512 ) }, - "scale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) }, - "height" : { type: "f", value: 0.05 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float height;", - "uniform vec2 resolution;", - "uniform sampler2D heightMap;", - - "varying vec2 vUv;", - - "void main() {", - - "float val = texture2D( heightMap, vUv ).x;", - - "float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;", - "float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;", - - "gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height ) ) + 0.5 ), 1.0 );", - - "}", - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Screen-space ambient occlusion shader - // - ported from - // SSAO GLSL shader v1.2 - // assembled by Martins Upitis (martinsh) (http://devlog-martinsh.blogspot.com) - // original technique is made by ArKano22 (http://www.gamedev.net/topic/550699-ssao-no-halo-artifacts/) - // - modifications - // - modified to use RGBA packed depth texture (use clear color 1,1,1,1 for depth pass) - // - made fog more compatible with three.js linear fog - // - refactoring and optimizations - ------------------------------------------------------------------------- */ - - 'ssao': { - - uniforms: { - - "tDiffuse": { type: "t", value: 0, texture: null }, - "tDepth": { type: "t", value: 1, texture: null }, - "size": { type: "v2", value: new THREE.Vector2( 512, 512 ) }, - "cameraNear": { type: "f", value: 1 }, - "cameraFar": { type: "f", value: 100 }, - "fogNear": { type: "f", value: 5 }, - "fogFar": { type: "f", value: 100 }, - "fogEnabled": { type: "i", value: 0 }, - "aoClamp": { type: "f", value: 0.3 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float cameraNear;", - "uniform float cameraFar;", - - "uniform float fogNear;", - "uniform float fogFar;", - - "uniform bool fogEnabled;", - - "uniform vec2 size;", // texture width, height - "uniform float aoClamp;", // depth clamp - reduces haloing at screen edges - - "uniform sampler2D tDiffuse;", - "uniform sampler2D tDepth;", - - "varying vec2 vUv;", - - //"#define PI 3.14159265", - "#define DL 2.399963229728653", // PI * ( 3.0 - sqrt( 5.0 ) ) - "#define EULER 2.718281828459045", - - // helpers - - "float width = size.x;", // texture width - "float height = size.y;", // texture height - - "float cameraFarPlusNear = cameraFar + cameraNear;", - "float cameraFarMinusNear = cameraFar - cameraNear;", - "float cameraCoef = 2.0 * cameraNear;", - - // user variables - - "const int samples = 8;", // ao sample count - "const float radius = 5.0;", // ao radius - - "const bool useNoise = false;", // use noise instead of pattern for sample dithering - "const float noiseAmount = 0.0002;", // dithering amount - - "const float diffArea = 0.4;", // self-shadowing reduction - "const float gDisplace = 0.4;", // gauss bell center - - "const bool onlyAO = false;", // use only ambient occlusion pass? - "const float lumInfluence = 0.3;", // how much luminance affects occlusion - - // RGBA depth - - "float unpackDepth( const in vec4 rgba_depth ) {", - - "const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );", - "float depth = dot( rgba_depth, bit_shift );", - "return depth;", - - "}", - - // generating noise / pattern texture for dithering - - "vec2 rand( const vec2 coord ) {", - - "vec2 noise;", - - "if ( useNoise ) {", - - "float nx = dot ( coord, vec2( 12.9898, 78.233 ) );", - "float ny = dot ( coord, vec2( 12.9898, 78.233 ) * 2.0 );", - - "noise = clamp( fract ( 43758.5453 * sin( vec2( nx, ny ) ) ), 0.0, 1.0 );", - - "} else {", - - "float ff = fract( 1.0 - coord.s * ( width / 2.0 ) );", - "float gg = fract( coord.t * ( height / 2.0 ) );", - - "noise = vec2( 0.25, 0.75 ) * vec2( ff ) + vec2( 0.75, 0.25 ) * gg;", - - "}", - - "return ( noise * 2.0 - 1.0 ) * noiseAmount;", - - "}", - - "float doFog() {", - - "float zdepth = unpackDepth( texture2D( tDepth, vUv ) );", - "float depth = -cameraFar * cameraNear / ( zdepth * cameraFarMinusNear - cameraFar );", - - "return smoothstep( fogNear, fogFar, depth );", - - "}", - - "float readDepth( const in vec2 coord ) {", - - //"return ( 2.0 * cameraNear ) / ( cameraFar + cameraNear - unpackDepth( texture2D( tDepth, coord ) ) * ( cameraFar - cameraNear ) );", - "return cameraCoef / ( cameraFarPlusNear - unpackDepth( texture2D( tDepth, coord ) ) * cameraFarMinusNear );", - - - "}", - - "float compareDepths( const in float depth1, const in float depth2, inout int far ) {", - - "float garea = 2.0;", // gauss bell width - "float diff = ( depth1 - depth2 ) * 100.0;", // depth difference (0-100) - - // reduce left bell width to avoid self-shadowing - - "if ( diff < gDisplace ) {", - - "garea = diffArea;", - - "} else {", - - "far = 1;", - - "}", - - "float dd = diff - gDisplace;", - "float gauss = pow( EULER, -2.0 * dd * dd / ( garea * garea ) );", - "return gauss;", - - "}", - - "float calcAO( float depth, float dw, float dh ) {", - - "float dd = radius - depth * radius;", - "vec2 vv = vec2( dw, dh );", - - "vec2 coord1 = vUv + dd * vv;", - "vec2 coord2 = vUv - dd * vv;", - - "float temp1 = 0.0;", - "float temp2 = 0.0;", - - "int far = 0;", - "temp1 = compareDepths( depth, readDepth( coord1 ), far );", - - // DEPTH EXTRAPOLATION - - "if ( far > 0 ) {", - - "temp2 = compareDepths( readDepth( coord2 ), depth, far );", - "temp1 += ( 1.0 - temp1 ) * temp2;", - - "}", - - "return temp1;", - - "}", - - "void main() {", - - "vec2 noise = rand( vUv );", - "float depth = readDepth( vUv );", - - "float tt = clamp( depth, aoClamp, 1.0 );", - - "float w = ( 1.0 / width ) / tt + ( noise.x * ( 1.0 - noise.x ) );", - "float h = ( 1.0 / height ) / tt + ( noise.y * ( 1.0 - noise.y ) );", - - "float pw;", - "float ph;", - - "float ao;", - - "float dz = 1.0 / float( samples );", - "float z = 1.0 - dz / 2.0;", - "float l = 0.0;", - - "for ( int i = 0; i <= samples; i ++ ) {", - - "float r = sqrt( 1.0 - z );", - - "pw = cos( l ) * r;", - "ph = sin( l ) * r;", - "ao += calcAO( depth, pw * w, ph * h );", - "z = z - dz;", - "l = l + DL;", - - "}", - - "ao /= float( samples );", - "ao = 1.0 - ao;", - - "if ( fogEnabled ) {", - - "ao = mix( ao, 1.0, doFog() );", - - "}", - - "vec3 color = texture2D( tDiffuse, vUv ).rgb;", - - "vec3 lumcoeff = vec3( 0.299, 0.587, 0.114 );", - "float lum = dot( color.rgb, lumcoeff );", - "vec3 luminance = vec3( lum );", - - "vec3 final = vec3( color * mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );", // mix( color * ao, white, luminance ) - - "if ( onlyAO ) {", - - "final = vec3( mix( vec3( ao ), vec3( 1.0 ), luminance * lumInfluence ) );", // ambient occlusion only - - "}", - - "gl_FragColor = vec4( final, 1.0 );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Colorify shader - ------------------------------------------------------------------------- */ - - 'colorify': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - color: { type: "c", value: new THREE.Color( 0xffffff ) } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 color;", - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - "void main() {", - - "vec4 texel = texture2D( tDiffuse, vUv );", - - "vec3 luma = vec3( 0.299, 0.587, 0.114 );", - "float v = dot( texel.xyz, luma );", - - "gl_FragColor = vec4( v * color, texel.w );", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Unpack RGBA depth shader - // - show RGBA encoded depth as monochrome color - ------------------------------------------------------------------------- */ - - 'unpackDepthRGBA': { - - uniforms: { - - tDiffuse: { type: "t", value: 0, texture: null }, - opacity: { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - - "uniform sampler2D tDiffuse;", - - "varying vec2 vUv;", - - // RGBA depth - - "float unpackDepth( const in vec4 rgba_depth ) {", - - "const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );", - "float depth = dot( rgba_depth, bit_shift );", - "return depth;", - - "}", - - "void main() {", - - "float depth = 1.0 - unpackDepth( texture2D( tDiffuse, vUv ) );", - "gl_FragColor = opacity * vec4( vec3( depth ), 1.0 );", - - "}" - - ].join("\n") - - }, - - // METHODS - - buildKernel: function( sigma ) { - - // We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway. - - function gauss( x, sigma ) { - - return Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) ); - - } - - var i, values, sum, halfWidth, kMaxKernelSize = 25, kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1; - - if ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize; - halfWidth = ( kernelSize - 1 ) * 0.5 - - values = new Array( kernelSize ); - sum = 0.0; - for ( i = 0; i < kernelSize; ++i ) { - - values[ i ] = gauss( i - halfWidth, sigma ); - sum += values[ i ]; - - } - - // normalize the kernel - - for ( i = 0; i < kernelSize; ++i ) values[ i ] /= sum; - - return values; - - } - -}; diff --git a/js/Stats.js b/js/Stats.js deleted file mode 100755 index 31c054a..0000000 --- a/js/Stats.js +++ /dev/null @@ -1,7 +0,0 @@ -// stats.js r9 - http://github.com/mrdoob/stats.js -var Stats=function(){var h,a,r=0,s=0,i=Date.now(),u=i,t=i,l=0,n=1E3,o=0,e,j,f,b=[[16,16,48],[0,255,255]],m=0,p=1E3,q=0,d,k,g,c=[[16,48,16],[0,255,0]];h=document.createElement("div");h.style.cursor="pointer";h.style.width="80px";h.style.opacity="0.9";h.style.zIndex="10001";h.addEventListener("mousedown",function(a){a.preventDefault();r=(r+1)%2;0==r?(e.style.display="block",d.style.display="none"):(e.style.display="none",d.style.display="block")},!1);e=document.createElement("div");e.style.textAlign= -"left";e.style.lineHeight="1.2em";e.style.backgroundColor="rgb("+Math.floor(b[0][0]/2)+","+Math.floor(b[0][1]/2)+","+Math.floor(b[0][2]/2)+")";e.style.padding="0 0 3px 3px";h.appendChild(e);j=document.createElement("div");j.style.fontFamily="Helvetica, Arial, sans-serif";j.style.fontSize="9px";j.style.color="rgb("+b[1][0]+","+b[1][1]+","+b[1][2]+")";j.style.fontWeight="bold";j.innerHTML="FPS";e.appendChild(j);f=document.createElement("div");f.style.position="relative";f.style.width="74px";f.style.height= -"30px";f.style.backgroundColor="rgb("+b[1][0]+","+b[1][1]+","+b[1][2]+")";for(e.appendChild(f);74>f.children.length;)a=document.createElement("span"),a.style.width="1px",a.style.height="30px",a.style.cssFloat="left",a.style.backgroundColor="rgb("+b[0][0]+","+b[0][1]+","+b[0][2]+")",f.appendChild(a);d=document.createElement("div");d.style.textAlign="left";d.style.lineHeight="1.2em";d.style.backgroundColor="rgb("+Math.floor(c[0][0]/2)+","+Math.floor(c[0][1]/2)+","+Math.floor(c[0][2]/2)+")";d.style.padding= -"0 0 3px 3px";d.style.display="none";h.appendChild(d);k=document.createElement("div");k.style.fontFamily="Helvetica, Arial, sans-serif";k.style.fontSize="9px";k.style.color="rgb("+c[1][0]+","+c[1][1]+","+c[1][2]+")";k.style.fontWeight="bold";k.innerHTML="MS";d.appendChild(k);g=document.createElement("div");g.style.position="relative";g.style.width="74px";g.style.height="30px";g.style.backgroundColor="rgb("+c[1][0]+","+c[1][1]+","+c[1][2]+")";for(d.appendChild(g);74>g.children.length;)a=document.createElement("span"), -a.style.width="1px",a.style.height=30*Math.random()+"px",a.style.cssFloat="left",a.style.backgroundColor="rgb("+c[0][0]+","+c[0][1]+","+c[0][2]+")",g.appendChild(a);return{getDomElement:function(){return h},getFps:function(){return l},getFpsMin:function(){return n},getFpsMax:function(){return o},getMs:function(){return m},getMsMin:function(){return p},getMsMax:function(){return q},update:function(){i=Date.now();m=i-u;p=Math.min(p,m);q=Math.max(q,m);k.textContent=m+" MS ("+p+"-"+q+")";var a=Math.min(30, -30-30*(m/200));g.appendChild(g.firstChild).style.height=a+"px";u=i;s++;if(i>t+1E3)l=Math.round(1E3*s/(i-t)),n=Math.min(n,l),o=Math.max(o,l),j.textContent=l+" FPS ("+n+"-"+o+")",a=Math.min(30,30-30*(l/100)),f.appendChild(f.firstChild).style.height=a+"px",t=i,s=0}}}; diff --git a/js/Three.js b/js/Three.js deleted file mode 100755 index c043be7..0000000 --- a/js/Three.js +++ /dev/null @@ -1,729 +0,0 @@ -// Three.js - http://github.com/mrdoob/three.js -'use strict';var THREE=THREE||{REVISION:"49"};self.Int32Array||(self.Int32Array=Array,self.Float32Array=Array); -(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},lerpSelf:function(a,b){this.r=this.r+(a.r-this.r)*b;this.g=this.g+(a.g-this.g)*b;this.b=this.b+(a.b-this.b)*b;return this},getHex:function(){return Math.floor(this.r*255)<<16^Math.floor(this.g*255)<<8^Math.floor(this.b*255)},getContextStyle:function(){return"rgb("+Math.floor(this.r*255)+","+Math.floor(this.g*255)+","+Math.floor(this.b*255)+")"},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}}; -THREE.Vector2=function(a,b){this.x=a||0;this.y=b||0}; -THREE.Vector2.prototype={constructor:THREE.Vector2,set:function(a,b){this.x=a;this.y=b;return this},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;return this},divideScalar:function(a){if(a){this.x= -this.x/a;this.y=this.y/a}else this.set(0,0);return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.lengthSq())},normalize:function(){return this.divideScalar(this.length())},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,a=this.y-a.y;return b*b+a*a},setLength:function(a){return this.normalize().multiplyScalar(a)}, -lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;return this},equals:function(a){return a.x===this.x&&a.y===this.y},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector2(this.x,this.y)}};THREE.Vector3=function(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}; -THREE.Vector3.prototype={constructor:THREE.Vector3,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;return this},addScalar:function(a){this.x=this.x+a;this.y=this.y+ -a;this.z=this.z+a;return this},sub:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},subSelf:function(a){this.x=this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;return this},multiply:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},multiplySelf:function(a){this.x=this.x*a.x;this.y=this.y*a.y;this.z=this.z*a.z;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;return this},divideSelf:function(a){this.x=this.x/a.x;this.y= -this.y/a.y;this.z=this.z/a.z;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a}else this.z=this.y=this.x=0;return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.lengthSq())},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())}, -setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;return this},cross:function(a,b){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},crossSelf:function(a){var b=this.x,c=this.y,d=this.z;this.x=c*a.z-d*a.y;this.y=d*a.x-b*a.z;this.z=b*a.y-c*a.x;return this},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){return(new THREE.Vector3).sub(this, -a).lengthSq()},getPositionFromMatrix:function(a){this.x=a.elements[12];this.y=a.elements[13];this.z=a.elements[14];return this},getRotationFromMatrix:function(a,b){var c=b?b.x:1,d=b?b.y:1,e=b?b.z:1,f=a.elements[0]/c,g=a.elements[4]/d,c=a.elements[1]/c,d=a.elements[5]/d,h=a.elements[9]/e,j=a.elements[10]/e;this.y=Math.asin(a.elements[8]/e);e=Math.cos(this.y);if(Math.abs(e)>1.0E-5){this.x=Math.atan2(-h/e,j/e);this.z=Math.atan2(-g/e,f/e)}else{this.x=0;this.z=Math.atan2(c,d)}return this},getScaleFromMatrix:function(a){var b= -this.set(a.elements[0],a.elements[1],a.elements[2]).length(),c=this.set(a.elements[4],a.elements[5],a.elements[6]).length(),a=this.set(a.elements[8],a.elements[9],a.elements[10]).length();this.x=b;this.y=c;this.z=a},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},isZero:function(){return this.lengthSq()<1.0E-4},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}};THREE.Vector4=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1}; -THREE.Vector4.prototype={constructor:THREE.Vector4,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w!==void 0?a.w:1;return this},add:function(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},addSelf:function(a){this.x=this.x+a.x;this.y=this.y+a.y;this.z=this.z+a.z;this.w=this.w+a.w;return this},sub:function(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},subSelf:function(a){this.x= -this.x-a.x;this.y=this.y-a.y;this.z=this.z-a.z;this.w=this.w-a.w;return this},multiplyScalar:function(a){this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a;return this},divideScalar:function(a){if(a){this.x=this.x/a;this.y=this.y/a;this.z=this.z/a;this.w=this.w/a}else{this.z=this.y=this.x=0;this.w=1}return this},negate:function(){return this.multiplyScalar(-1)},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.dot(this)},length:function(){return Math.sqrt(this.lengthSq())}, -normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.normalize().multiplyScalar(a)},lerpSelf:function(a,b){this.x=this.x+(a.x-this.x)*b;this.y=this.y+(a.y-this.y)*b;this.z=this.z+(a.z-this.z)*b;this.w=this.w+(a.w-this.w)*b;return this},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}};THREE.Frustum=function(){this.planes=[new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4,new THREE.Vector4]}; -THREE.Frustum.prototype.setFromMatrix=function(a){var b,c=this.planes,d=a.elements,a=d[0];b=d[1];var e=d[2],f=d[3],g=d[4],h=d[5],j=d[6],l=d[7],k=d[8],p=d[9],m=d[10],o=d[11],q=d[12],n=d[13],r=d[14],d=d[15];c[0].set(f-a,l-g,o-k,d-q);c[1].set(f+a,l+g,o+k,d+q);c[2].set(f+b,l+h,o+p,d+n);c[3].set(f-b,l-h,o-p,d-n);c[4].set(f-e,l-j,o-m,d-r);c[5].set(f+e,l+j,o+m,d+r);for(a=0;a<6;a++){b=c[a];b.divideScalar(Math.sqrt(b.x*b.x+b.y*b.y+b.z*b.z))}}; -THREE.Frustum.prototype.contains=function(a){for(var b=this.planes,c=a.matrixWorld,d=c.elements,c=-a.geometry.boundingSphere.radius*c.getMaxScaleOnAxis(),e=0;e<6;e++){a=b[e].x*d[12]+b[e].y*d[13]+b[e].z*d[14]+b[e].w;if(a<=c)return false}return true};THREE.Frustum.__v1=new THREE.Vector3; -THREE.Ray=function(a,b){function c(a,b,c){q.sub(c,a);u=q.dot(b);t=n.add(a,r.copy(b).multiplyScalar(u));return y=c.distanceTo(t)}function d(a,b,c,d){q.sub(d,b);n.sub(c,b);r.sub(a,b);s=q.dot(q);w=q.dot(n);H=q.dot(r);E=n.dot(n);z=n.dot(r);v=1/(s*E-w*w);A=(E*H-w*z)*v;J=(s*z-w*H)*v;return A>=0&&J>=0&&A+J<1}this.origin=a||new THREE.Vector3;this.direction=b||new THREE.Vector3;var e=1.0E-4;this.setPrecision=function(a){e=a};var f=new THREE.Vector3,g=new THREE.Vector3,h=new THREE.Vector3,j=new THREE.Vector3, -l=new THREE.Vector3,k=new THREE.Vector3,p=new THREE.Vector3,m=new THREE.Vector3,o=new THREE.Vector3;this.intersectObject=function(a){var b,n=[];if(a instanceof THREE.Particle){var q=c(this.origin,this.direction,a.matrixWorld.getPosition());if(q>a.scale.x)return[];b={distance:q,point:a.position,face:null,object:a};n.push(b)}else if(a instanceof THREE.Mesh){var q=c(this.origin,this.direction,a.matrixWorld.getPosition()),r=THREE.Frustum.__v1.set(a.matrixWorld.getColumnX().length(),a.matrixWorld.getColumnY().length(), -a.matrixWorld.getColumnZ().length());if(q>a.geometry.boundingSphere.radius*Math.max(r.x,Math.max(r.y,r.z)))return n;var s,i,t=a.geometry,u=t.vertices,C;a.matrixRotationWorld.extractRotation(a.matrixWorld);q=0;for(r=t.faces.length;q0:s<0))){o.add(l,k.multiplyScalar(i));if(b instanceof THREE.Face3){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));if(d(o,f,g,h)){b={distance:l.distanceTo(o),point:o.clone(),face:b,object:a};n.push(b)}}else if(b instanceof THREE.Face4){f=C.multiplyVector3(f.copy(u[b.a]));g=C.multiplyVector3(g.copy(u[b.b]));h=C.multiplyVector3(h.copy(u[b.c]));j=C.multiplyVector3(j.copy(u[b.d]));if(d(o,f,g,j)||d(o,g,h,j)){b={distance:l.distanceTo(o),point:o.clone(), -face:b,object:a};n.push(b)}}}}}}return n};this.intersectObjects=function(a){for(var b=[],c=0,d=a.length;cf?d:f;e=e>g? -e:g}a()};this.add3Points=function(f,g,k,p,m,o){if(h){h=false;b=fk?f>m?f:m:k>m?k:m;e=g>p?g>o?g:o:p>o?p:o}else{b=fk?f>m?f>d?f:d:m>d?m:d:k>m?k>d?k:d:m>d?m:d;e=g>p?g>o?g>e?g:e:o>e?o:e:p>o?p>e?p:e:o>e?o:e}a()};this.addRectangle=function(f){if(h){h=false;b=f.getLeft();c=f.getTop();d=f.getRight();e=f.getBottom()}else{b=bf.getRight()?d:f.getRight();e=e>f.getBottom()?e:f.getBottom()}a()};this.inflate=function(f){b=b-f;c=c-f;d=d+f;e=e+f;a()};this.minSelf=function(f){b=b>f.getLeft()?b:f.getLeft();c=c>f.getTop()?c:f.getTop();d=da.getRight()||ea.getBottom()?false:true};this.empty=function(){h=true;e=d=c=b=0;a()};this.isEmpty=function(){return h}}; -THREE.Math={clamp:function(a,b,c){return ac?c:a},clampBottom:function(a,b){return a0?1:0}};THREE.Matrix3=function(){this.elements=new Float32Array(9)}; -THREE.Matrix3.prototype={constructor:THREE.Matrix3,getInverse:function(a){var b=a.elements,a=b[10]*b[5]-b[6]*b[9],c=-b[10]*b[1]+b[2]*b[9],d=b[6]*b[1]-b[2]*b[5],e=-b[10]*b[4]+b[6]*b[8],f=b[10]*b[0]-b[2]*b[8],g=-b[6]*b[0]+b[2]*b[4],h=b[9]*b[4]-b[5]*b[8],j=-b[9]*b[0]+b[1]*b[8],l=b[5]*b[0]-b[1]*b[4],b=b[0]*a+b[1]*e+b[2]*h;b===0&&console.warn("Matrix3.getInverse(): determinant == 0");var b=1/b,k=this.elements;k[0]=b*a;k[1]=b*c;k[2]=b*d;k[3]=b*e;k[4]=b*f;k[5]=b*g;k[6]=b*h;k[7]=b*j;k[8]=b*l;return this}, -transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;return this},transposeIntoArray:function(a){var b=this.m;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this}};THREE.Matrix4=function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){this.elements=new Float32Array(16);this.set(a!==void 0?a:1,b||0,c||0,d||0,e||0,f!==void 0?f:1,g||0,h||0,j||0,l||0,k!==void 0?k:1,p||0,m||0,o||0,q||0,n!==void 0?n:1)}; -THREE.Matrix4.prototype={constructor:THREE.Matrix4,set:function(a,b,c,d,e,f,g,h,j,l,k,p,m,o,q,n){var r=this.elements;r[0]=a;r[4]=b;r[8]=c;r[12]=d;r[1]=e;r[5]=f;r[9]=g;r[13]=h;r[2]=j;r[6]=l;r[10]=k;r[14]=p;r[3]=m;r[7]=o;r[11]=q;r[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},copy:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15]);return this},lookAt:function(a,b,c){var d=this.elements, -e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;g.sub(a,b).normalize();if(g.length()===0)g.z=1;e.cross(c,g).normalize();if(e.length()===0){g.x=g.x+1.0E-4;e.cross(c,g).normalize()}f.cross(g,e);d[0]=e.x;d[4]=f.x;d[8]=g.x;d[1]=e.y;d[5]=f.y;d[9]=g.y;d[2]=e.z;d[6]=f.z;d[10]=g.z;return this},multiply:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],j=c[12],l=c[1],k=c[5],p=c[9],m=c[13],o=c[2],q=c[6],n=c[10],r=c[14],u=c[3],t=c[7],y=c[11],c=c[15],s=d[0],w=d[4], -H=d[8],E=d[12],z=d[1],v=d[5],A=d[9],J=d[13],K=d[2],R=d[6],P=d[10],D=d[14],M=d[3],G=d[7],i=d[11],d=d[15];e[0]=f*s+g*z+h*K+j*M;e[4]=f*w+g*v+h*R+j*G;e[8]=f*H+g*A+h*P+j*i;e[12]=f*E+g*J+h*D+j*d;e[1]=l*s+k*z+p*K+m*M;e[5]=l*w+k*v+p*R+m*G;e[9]=l*H+k*A+p*P+m*i;e[13]=l*E+k*J+p*D+m*d;e[2]=o*s+q*z+n*K+r*M;e[6]=o*w+q*v+n*R+r*G;e[10]=o*H+q*A+n*P+r*i;e[14]=o*E+q*J+n*D+r*d;e[3]=u*s+t*z+y*K+c*M;e[7]=u*w+t*v+y*R+c*G;e[11]=u*H+t*A+y*P+c*i;e[15]=u*E+t*J+y*D+c*d;return this},multiplySelf:function(a){return this.multiply(this, -a)},multiplyToArray:function(a,b,c){var d=this.elements;this.multiply(a,b);c[0]=d[0];c[1]=d[1];c[2]=d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];return this},multiplyScalar:function(a){var b=this.elements;b[0]=b[0]*a;b[4]=b[4]*a;b[8]=b[8]*a;b[12]=b[12]*a;b[1]=b[1]*a;b[5]=b[5]*a;b[9]=b[9]*a;b[13]=b[13]*a;b[2]=b[2]*a;b[6]=b[6]*a;b[10]=b[10]*a;b[14]=b[14]*a;b[3]=b[3]*a;b[7]=b[7]*a;b[11]=b[11]*a;b[15]= -b[15]*a;return this},multiplyVector3:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=1/(b[3]*c+b[7]*d+b[11]*e+b[15]);a.x=(b[0]*c+b[4]*d+b[8]*e+b[12])*f;a.y=(b[1]*c+b[5]*d+b[9]*e+b[13])*f;a.z=(b[2]*c+b[6]*d+b[10]*e+b[14])*f;return a},multiplyVector4:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w;a.x=b[0]*c+b[4]*d+b[8]*e+b[12]*f;a.y=b[1]*c+b[5]*d+b[9]*e+b[13]*f;a.z=b[2]*c+b[6]*d+b[10]*e+b[14]*f;a.w=b[3]*c+b[7]*d+b[11]*e+b[15]*f;return a},rotateAxis:function(a){var b=this.elements,c=a.x, -d=a.y,e=a.z;a.x=c*b[0]+d*b[4]+e*b[8];a.y=c*b[1]+d*b[5]+e*b[9];a.z=c*b[2]+d*b[6]+e*b[10];a.normalize();return a},crossVector:function(a){var b=this.elements,c=new THREE.Vector4;c.x=b[0]*a.x+b[4]*a.y+b[8]*a.z+b[12]*a.w;c.y=b[1]*a.x+b[5]*a.y+b[9]*a.z+b[13]*a.w;c.z=b[2]*a.x+b[6]*a.y+b[10]*a.z+b[14]*a.w;c.w=a.w?b[3]*a.x+b[7]*a.y+b[11]*a.z+b[15]*a.w:1;return c},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],j=a[13],l=a[2],k=a[6],p=a[10],m=a[14],o=a[3],q=a[7], -n=a[11],a=a[15];return e*h*k*o-d*j*k*o-e*g*p*o+c*j*p*o+d*g*m*o-c*h*m*o-e*h*l*q+d*j*l*q+e*f*p*q-b*j*p*q-d*f*m*q+b*h*m*q+e*g*l*n-c*j*l*n-e*f*k*n+b*j*k*n+c*f*m*n-b*g*m*n-d*g*l*a+c*h*l*a+d*f*k*a-b*h*k*a-c*f*p*a+b*g*p*a},transpose:function(){var a=this.elements,b;b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},flattenToArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[1];a[2]=b[2]; -a[3]=b[3];a[4]=b[4];a[5]=b[5];a[6]=b[6];a[7]=b[7];a[8]=b[8];a[9]=b[9];a[10]=b[10];a[11]=b[11];a[12]=b[12];a[13]=b[13];a[14]=b[14];a[15]=b[15];return a},flattenToArrayOffset:function(a,b){var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a},getPosition:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[12],a[13], -a[14])},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getColumnX:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[0],a[1],a[2])},getColumnY:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[4],a[5],a[6])},getColumnZ:function(){var a=this.elements;return THREE.Matrix4.__v1.set(a[8],a[9],a[10])},getInverse:function(a){var b=this.elements,c=a.elements,d=c[0],e=c[4],f=c[8],g=c[12],h=c[1],j=c[5],l=c[9],k=c[13],p=c[2],m=c[6],o=c[10],q= -c[14],n=c[3],r=c[7],u=c[11],c=c[15];b[0]=l*q*r-k*o*r+k*m*u-j*q*u-l*m*c+j*o*c;b[4]=g*o*r-f*q*r-g*m*u+e*q*u+f*m*c-e*o*c;b[8]=f*k*r-g*l*r+g*j*u-e*k*u-f*j*c+e*l*c;b[12]=g*l*m-f*k*m-g*j*o+e*k*o+f*j*q-e*l*q;b[1]=k*o*n-l*q*n-k*p*u+h*q*u+l*p*c-h*o*c;b[5]=f*q*n-g*o*n+g*p*u-d*q*u-f*p*c+d*o*c;b[9]=g*l*n-f*k*n-g*h*u+d*k*u+f*h*c-d*l*c;b[13]=f*k*p-g*l*p+g*h*o-d*k*o-f*h*q+d*l*q;b[2]=j*q*n-k*m*n+k*p*r-h*q*r-j*p*c+h*m*c;b[6]=g*m*n-e*q*n-g*p*r+d*q*r+e*p*c-d*m*c;b[10]=e*k*n-g*j*n+g*h*r-d*k*r-e*h*c+d*j*c;b[14]=g*j*p- -e*k*p-g*h*m+d*k*m+e*h*q-d*j*q;b[3]=l*m*n-j*o*n-l*p*r+h*o*r+j*p*u-h*m*u;b[7]=e*o*n-f*m*n+f*p*r-d*o*r-e*p*u+d*m*u;b[11]=f*j*n-e*l*n-f*h*r+d*l*r+e*h*u-d*j*u;b[15]=e*l*p-f*j*p+f*h*m-d*l*m-e*h*o+d*j*o;this.multiplyScalar(1/a.determinant());return this},setRotationFromEuler:function(a,b){var c=this.elements,d=a.x,e=a.y,f=a.z,g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e),j=Math.cos(f),f=Math.sin(f);switch(b){case "YXZ":var l=h*j,k=h*f,p=e*j,m=e*f;c[0]=l+m*d;c[4]=p*d-k;c[8]=g*e;c[1]=g*f;c[5]=g* -j;c[9]=-d;c[2]=k*d-p;c[6]=m+l*d;c[10]=g*h;break;case "ZXY":l=h*j;k=h*f;p=e*j;m=e*f;c[0]=l-m*d;c[4]=-g*f;c[8]=p+k*d;c[1]=k+p*d;c[5]=g*j;c[9]=m-l*d;c[2]=-g*e;c[6]=d;c[10]=g*h;break;case "ZYX":l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=p*e-k;c[8]=l*e+m;c[1]=h*f;c[5]=m*e+l;c[9]=k*e-p;c[2]=-e;c[6]=d*h;c[10]=g*h;break;case "YZX":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=m-l*f;c[8]=p*f+k;c[1]=f;c[5]=g*j;c[9]=-d*j;c[2]=-e*j;c[6]=k*f+p;c[10]=l-m*f;break;case "XZY":l=g*h;k=g*e;p=d*h;m=d*e;c[0]=h*j;c[4]=-f;c[8]=e*j; -c[1]=l*f+m;c[5]=g*j;c[9]=k*f-p;c[2]=p*f-k;c[6]=d*j;c[10]=m*f+l;break;default:l=g*j;k=g*f;p=d*j;m=d*f;c[0]=h*j;c[4]=-h*f;c[8]=e;c[1]=k+p*e;c[5]=l-m*e;c[9]=-d*h;c[2]=m-l*e;c[6]=p+k*e;c[10]=g*h}return this},setRotationFromQuaternion:function(a){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,j=e+e,a=c*g,l=c*h,c=c*j,k=d*h,d=d*j,e=e*j,g=f*g,h=f*h,f=f*j;b[0]=1-(k+e);b[4]=l-f;b[8]=c+h;b[1]=l+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);return this},compose:function(a,b,c){var d=this.elements, -e=THREE.Matrix4.__m1,f=THREE.Matrix4.__m2;e.identity();e.setRotationFromQuaternion(b);f.makeScale(c.x,c.y,c.z);this.multiply(e,f);d[12]=a.x;d[13]=a.y;d[14]=a.z;return this},decompose:function(a,b,c){var d=this.elements,e=THREE.Matrix4.__v1,f=THREE.Matrix4.__v2,g=THREE.Matrix4.__v3;e.set(d[0],d[1],d[2]);f.set(d[4],d[5],d[6]);g.set(d[8],d[9],d[10]);a=a instanceof THREE.Vector3?a:new THREE.Vector3;b=b instanceof THREE.Quaternion?b:new THREE.Quaternion;c=c instanceof THREE.Vector3?c:new THREE.Vector3; -c.x=e.length();c.y=f.length();c.z=g.length();a.x=d[12];a.y=d[13];a.z=d[14];d=THREE.Matrix4.__m1;d.copy(this);d.elements[0]=d.elements[0]/c.x;d.elements[1]=d.elements[1]/c.x;d.elements[2]=d.elements[2]/c.x;d.elements[4]=d.elements[4]/c.y;d.elements[5]=d.elements[5]/c.y;d.elements[6]=d.elements[6]/c.y;d.elements[8]=d.elements[8]/c.z;d.elements[9]=d.elements[9]/c.z;d.elements[10]=d.elements[10]/c.z;b.setFromRotationMatrix(d);return[a,b,c]},extractPosition:function(a){var b=this.elements,a=a.elements; -b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractRotation:function(a){var b=this.elements,a=a.elements,c=THREE.Matrix4.__v1,d=1/c.set(a[0],a[1],a[2]).length(),e=1/c.set(a[4],a[5],a[6]).length(),c=1/c.set(a[8],a[9],a[10]).length();b[0]=a[0]*d;b[1]=a[1]*d;b[2]=a[2]*d;b[4]=a[4]*e;b[5]=a[5]*e;b[6]=a[6]*e;b[8]=a[8]*c;b[9]=a[9]*c;b[10]=a[10]*c;return this},translate:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[12]=b[0]*c+b[4]*d+b[8]*a+b[12];b[13]=b[1]*c+b[5]*d+b[9]*a+b[13];b[14]=b[2]*c+b[6]* -d+b[10]*a+b[14];b[15]=b[3]*c+b[7]*d+b[11]*a+b[15];return this},rotateX:function(a){var b=this.elements,c=b[4],d=b[5],e=b[6],f=b[7],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[4]=k*c+a*g;b[5]=k*d+a*h;b[6]=k*e+a*j;b[7]=k*f+a*l;b[8]=k*g-a*c;b[9]=k*h-a*d;b[10]=k*j-a*e;b[11]=k*l-a*f;return this},rotateY:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[8],h=b[9],j=b[10],l=b[11],k=Math.cos(a),a=Math.sin(a);b[0]=k*c-a*g;b[1]=k*d-a*h;b[2]=k*e-a*j;b[3]=k*f-a*l;b[8]=k*g+a*c;b[9]= -k*h+a*d;b[10]=k*j+a*e;b[11]=k*l+a*f;return this},rotateZ:function(a){var b=this.elements,c=b[0],d=b[1],e=b[2],f=b[3],g=b[4],h=b[5],j=b[6],l=b[7],k=Math.cos(a),a=Math.sin(a);b[0]=k*c+a*g;b[1]=k*d+a*h;b[2]=k*e+a*j;b[3]=k*f+a*l;b[4]=k*g-a*c;b[5]=k*h-a*d;b[6]=k*j-a*e;b[7]=k*l-a*f;return this},rotateByAxis:function(a,b){var c=this.elements;if(a.x===1&&a.y===0&&a.z===0)return this.rotateX(b);if(a.x===0&&a.y===1&&a.z===0)return this.rotateY(b);if(a.x===0&&a.y===0&&a.z===1)return this.rotateZ(b);var d=a.x, -e=a.y,f=a.z,g=Math.sqrt(d*d+e*e+f*f),d=d/g,e=e/g,f=f/g,g=d*d,h=e*e,j=f*f,l=Math.cos(b),k=Math.sin(b),p=1-l,m=d*e*p,o=d*f*p,p=e*f*p,d=d*k,q=e*k,k=f*k,f=g+(1-g)*l,g=m+k,e=o-q,m=m-k,h=h+(1-h)*l,k=p+d,o=o+q,p=p-d,j=j+(1-j)*l,l=c[0],d=c[1],q=c[2],n=c[3],r=c[4],u=c[5],t=c[6],y=c[7],s=c[8],w=c[9],H=c[10],E=c[11];c[0]=f*l+g*r+e*s;c[1]=f*d+g*u+e*w;c[2]=f*q+g*t+e*H;c[3]=f*n+g*y+e*E;c[4]=m*l+h*r+k*s;c[5]=m*d+h*u+k*w;c[6]=m*q+h*t+k*H;c[7]=m*n+h*y+k*E;c[8]=o*l+p*r+j*s;c[9]=o*d+p*u+j*w;c[10]=o*q+p*t+j*H;c[11]= -o*n+p*y+j*E;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y,a=a.z;b[0]=b[0]*c;b[4]=b[4]*d;b[8]=b[8]*a;b[1]=b[1]*c;b[5]=b[5]*d;b[9]=b[9]*a;b[2]=b[2]*c;b[6]=b[6]*d;b[10]=b[10]*a;b[3]=b[3]*c;b[7]=b[7]*d;b[11]=b[11]*a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],Math.max(a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10])))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this}, -makeRotationX:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a),a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,j=e*f,l=e*g;this.set(j*f+c,j*g-d*h,j*h+d*g,0,j*g+d*h,l*g+c,l*h-d*f,0,j*h- -d*g,l*h+d*f,e*h*h+c,0,0,0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeFrustum:function(a,b,c,d,e,f){var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(d-c);g[9]=(d+c)/(d-c);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makePerspective:function(a,b,c,d){var a=c*Math.tan(a*Math.PI/360),e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a, -b,c,d,e,f){var g=this.elements,h=b-a,j=c-d,l=f-e;g[0]=2/h;g[4]=0;g[8]=0;g[12]=-((b+a)/h);g[1]=0;g[5]=2/j;g[9]=0;g[13]=-((c+d)/j);g[2]=0;g[6]=0;g[10]=-2/l;g[14]=-((f+e)/l);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},clone:function(){var a=this.elements;return new THREE.Matrix4(a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15])}};THREE.Matrix4.__v1=new THREE.Vector3;THREE.Matrix4.__v2=new THREE.Vector3;THREE.Matrix4.__v3=new THREE.Vector3;THREE.Matrix4.__m1=new THREE.Matrix4; -THREE.Matrix4.__m2=new THREE.Matrix4; -THREE.Object3D=function(){this.id=THREE.Object3DCount++;this.name="";this.parent=void 0;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder="XYZ";this.scale=new THREE.Vector3(1,1,1);this.flipSided=this.doubleSided=false;this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixWorldNeedsUpdate=this.matrixAutoUpdate= -true;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.boundRadius=0;this.boundRadiusScale=1;this.visible=true;this.receiveShadow=this.castShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3}; -THREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(a){this.matrix.multiply(a,this.matrix);this.scale.getScaleFromMatrix(this.matrix);this.rotation.getRotationFromMatrix(this.matrix,this.scale);this.position.getPositionFromMatrix(this.matrix)},translate:function(a,b){this.matrix.rotateAxis(b);this.position.addSelf(b.multiplyScalar(a))},translateX:function(a){this.translate(a,this._vector.set(1,0,0))},translateY:function(a){this.translate(a,this._vector.set(0,1,0))},translateZ:function(a){this.translate(a, -this._vector.set(0,0,1))},lookAt:function(a){this.matrix.lookAt(a,this.position,this.up);this.rotationAutoUpdate&&this.rotation.getRotationFromMatrix(this.matrix)},add:function(a){if(a===this)console.warn("THREE.Object3D.add: An object can't be added as a child of itself.");else if(a instanceof THREE.Object3D){a.parent!==void 0&&a.parent.remove(a);a.parent=this;this.children.push(a);for(var b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__addObject(a)}},remove:function(a){var b= -this.children.indexOf(a);if(b!==-1){a.parent=void 0;this.children.splice(b,1);for(b=this;b.parent!==void 0;)b=b.parent;b!==void 0&&b instanceof THREE.Scene&&b.__removeObject(a)}},getChildByName:function(a,b){var c,d,e;c=0;for(d=this.children.length;c=0&&f>=0&&g>=0&&h>=0)return true;if(e<0&&f<0||g<0&&h<0)return false;e<0?c=Math.max(c,e/(e-f)):f<0&&(d=Math.min(d,e/(e-f)));g<0?c=Math.max(c,g/(g-h)):h<0&&(d=Math.min(d,g/(g-h)));if(dg&&h.positionScreen.z0)){ea=l[j-2];J.copy(F.positionScreen);K.copy(ea.positionScreen);if(d(J,K)){J.multiplyScalar(1/J.w);K.multiplyScalar(1/K.w);$=u[r]=u[r]||new THREE.RenderableLine;r++;n=$;n.v1.positionScreen.copy(J); -n.v2.positionScreen.copy(K);n.z=Math.max(J.z,K.z);n.material=O.material;w.elements.push(n)}}}}}a=0;for(H=w.sprites.length;a0&&E.z<1){g=s[y]=s[y]||new THREE.RenderableParticle;y++;t=g;t.x=E.x/E.w;t.y=E.y/E.w;t.z=E.z;t.rotation=O.rotation.z;t.scale.x=O.scale.x*Math.abs(t.x-(E.x+e.projectionMatrix.elements[0])/(E.w+e.projectionMatrix.elements[12])); -t.scale.y=O.scale.y*Math.abs(t.y-(E.y+e.projectionMatrix.elements[5])/(E.w+e.projectionMatrix.elements[13]));t.material=O.material;w.elements.push(t)}}}f&&w.elements.sort(c);return w}};THREE.Quaternion=function(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=d!==void 0?d:1}; -THREE.Quaternion.prototype={constructor:THREE.Quaternion,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=a.w;return this},setFromEuler:function(a){var b=Math.PI/360,c=a.x*b,d=a.y*b,e=a.z*b,a=Math.cos(d),d=Math.sin(d),b=Math.cos(-e),e=Math.sin(-e),f=Math.cos(c),c=Math.sin(c),g=a*b,h=d*e;this.w=g*f-h*c;this.x=g*c+h*f;this.y=d*b*f+a*e*c;this.z=a*e*f-d*b*c;return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c); -this.x=a.x*d;this.y=a.y*d;this.z=a.z*d;this.w=Math.cos(c);return this},setFromRotationMatrix:function(a){var b=Math.pow(a.determinant(),1/3);this.w=Math.sqrt(Math.max(0,b+a.elements[0]+a.elements[5]+a.elements[10]))/2;this.x=Math.sqrt(Math.max(0,b+a.elements[0]-a.elements[5]-a.elements[10]))/2;this.y=Math.sqrt(Math.max(0,b-a.elements[0]+a.elements[5]-a.elements[10]))/2;this.z=Math.sqrt(Math.max(0,b-a.elements[0]-a.elements[5]+a.elements[10]))/2;this.x=a.elements[6]-a.elements[9]<0?-Math.abs(this.x): -Math.abs(this.x);this.y=a.elements[8]-a.elements[2]<0?-Math.abs(this.y):Math.abs(this.y);this.z=a.elements[1]-a.elements[4]<0?-Math.abs(this.z):Math.abs(this.z);this.normalize();return this},calculateW:function(){this.w=-Math.sqrt(Math.abs(1-this.x*this.x-this.y*this.y-this.z*this.z));return this},inverse:function(){this.x=this.x*-1;this.y=this.y*-1;this.z=this.z*-1;return this},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var a= -Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);if(a===0)this.w=this.z=this.y=this.x=0;else{a=1/a;this.x=this.x*a;this.y=this.y*a;this.z=this.z*a;this.w=this.w*a}return this},multiply:function(a,b){this.x=a.x*b.w+a.y*b.z-a.z*b.y+a.w*b.x;this.y=-a.x*b.z+a.y*b.w+a.z*b.x+a.w*b.y;this.z=a.x*b.y-a.y*b.x+a.z*b.w+a.w*b.z;this.w=-a.x*b.x-a.y*b.y-a.z*b.z+a.w*b.w;return this},multiplySelf:function(a){var b=this.x,c=this.y,d=this.z,e=this.w,f=a.x,g=a.y,h=a.z,a=a.w;this.x=b*a+e*f+c*h-d*g;this.y= -c*a+e*g+d*f-b*h;this.z=d*a+e*h+b*g-c*f;this.w=e*a-b*f-c*g-d*h;return this},multiplyVector3:function(a,b){b||(b=a);var c=a.x,d=a.y,e=a.z,f=this.x,g=this.y,h=this.z,j=this.w,l=j*c+g*e-h*d,k=j*d+h*c-f*e,p=j*e+f*d-g*c,c=-f*c-g*d-h*e;b.x=l*j+c*-f+k*-h-p*-g;b.y=k*j+c*-g+p*-f-l*-h;b.z=p*j+c*-h+l*-g-k*-f;return b},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w)}}; -THREE.Quaternion.slerp=function(a,b,c,d){var e=a.w*b.w+a.x*b.x+a.y*b.y+a.z*b.z;if(e<0){c.w=-b.w;c.x=-b.x;c.y=-b.y;c.z=-b.z;e=-e}else c.copy(b);if(Math.abs(e)>=1){c.w=a.w;c.x=a.x;c.y=a.y;c.z=a.z;return c}var f=Math.acos(e),e=Math.sqrt(1-e*e);if(Math.abs(e)<0.001){c.w=0.5*(a.w+b.w);c.x=0.5*(a.x+b.x);c.y=0.5*(a.y+b.y);c.z=0.5*(a.z+b.z);return c}b=Math.sin((1-d)*f)/e;d=Math.sin(d*f)/e;c.w=a.w*b+c.w*d;c.x=a.x*b+c.x*d;c.y=a.y*b+c.y*d;c.z=a.z*b+c.z*d;return c};THREE.Vertex=function(){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.")}; -THREE.Face3=function(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d instanceof THREE.Vector3?d:new THREE.Vector3;this.vertexNormals=d instanceof Array?d:[];this.color=e instanceof THREE.Color?e:new THREE.Color;this.vertexColors=e instanceof Array?e:[];this.vertexTangents=[];this.materialIndex=f;this.centroid=new THREE.Vector3}; -THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var a=new THREE.Face3(this.a,this.b,this.c);a.normal.copy(this.normal);a.color.copy(this.color);a.centroid.copy(this.centroid);a.materialIndex=this.materialIndex;var b,c;b=0;for(c=this.vertexNormals.length;b0){var a;a=this.vertices[0];this.boundingBox.min.copy(a);this.boundingBox.max.copy(a);for(var b=this.boundingBox.min,c=this.boundingBox.max,d=1,e=this.vertices.length;dc.x)c.x= -a.x;if(a.yc.y)c.y=a.y;if(a.zc.z)c.z=a.z}}else{this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(!this.boundingSphere)this.boundingSphere={radius:0};for(var a,b=0,c=0,d=this.vertices.length;cb&&(b=a)}this.boundingSphere.radius=b},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g,h;f=0;for(g=this.vertices.length;f0;a--)if(d.indexOf(e["abcd"[a]])!=a){d.splice(a,1);this.faces[f]=new THREE.Face3(d[0],d[1],d[2]);e=0;for(d=this.faceVertexUvs.length;ethis.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1: -f+2;l=this.points[c[0]];k=this.points[c[1]];p=this.points[c[2]];m=this.points[c[3]];h=g*g;j=g*h;d.x=b(l.x,k.x,p.x,m.x,g,h,j);d.y=b(l.y,k.y,p.y,m.y,g,h,j);d.z=b(l.z,k.z,p.z,m.z,g,h,j);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a1&&(K=new THREE.MeshFaceMaterial); -a=new THREE.Mesh(J,K);a.name=m;if(t){a.matrixAutoUpdate=false;a.matrix.set(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}else{a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2])}a.visible=u.visible;a.doubleSided=u.doubleSided;a.castShadow=u.castShadow;a.receiveShadow=u.receiveShadow;C.scene.add(a);C.objects[m]=a}}else{w=u.position;H=u.rotation;E=u.quaternion; -z=u.scale;E=0;a=new THREE.Object3D;a.name=m;a.position.set(w[0],w[1],w[2]);if(E){a.quaternion.set(E[0],E[1],E[2],E[3]);a.useQuaternion=true}else a.rotation.set(H[0],H[1],H[2]);a.scale.set(z[0],z[1],z[2]);a.visible=u.visible!==void 0?u.visible:false;C.scene.add(a);C.objects[m]=a;C.empties[m]=a}}}function f(a){return function(b){C.geometries[a]=b;e();G=G-1;j.onLoadComplete();h()}}function g(a){return function(b){C.geometries[a]=b}}function h(){j.callbackProgress({totalModels:T,totalTextures:U,loadedModels:T- -G,loadedTextures:U-i},C);j.onLoadProgress();G==0&&i==0&&b(C)}var j=this,l=THREE.Loader.prototype.extractUrlBase(c),k,p,m,o,q,n,r,u,t,y,s,w,H,E,z,v,A,J,K,R,P,D,M,G,i,T,U,C;D=a;c=new THREE.BinaryLoader;M=new THREE.JSONLoader;i=G=0;C={scene:new THREE.Scene,geometries:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{}};if(D.transform){a=D.transform.position;y=D.transform.rotation;v=D.transform.scale;a&&C.scene.position.set(a[0],a[1],a[2]);y&&C.scene.rotation.set(y[0],y[1], -y[2]);v&&C.scene.scale.set(v[0],v[1],v[2]);if(a||y||v){C.scene.updateMatrix();C.scene.updateMatrixWorld()}}a=function(){i=i-1;h();j.onLoadComplete()};for(q in D.cameras){v=D.cameras[q];v.type=="perspective"?R=new THREE.PerspectiveCamera(v.fov,v.aspect,v.near,v.far):v.type=="ortho"&&(R=new THREE.OrthographicCamera(v.left,v.right,v.top,v.bottom,v.near,v.far));w=v.position;y=v.target;v=v.up;R.position.set(w[0],w[1],w[2]);R.target=new THREE.Vector3(y[0],y[1],y[2]);v&&R.up.set(v[0],v[1],v[2]);C.cameras[q]= -R}for(o in D.lights){y=D.lights[o];q=y.color!==void 0?y.color:16777215;R=y.intensity!==void 0?y.intensity:1;if(y.type=="directional"){w=y.direction;s=new THREE.DirectionalLight(q,R);s.position.set(w[0],w[1],w[2]);s.position.normalize()}else if(y.type=="point"){w=y.position;s=y.distance;s=new THREE.PointLight(q,R,s);s.position.set(w[0],w[1],w[2])}else y.type=="ambient"&&(s=new THREE.AmbientLight(q));C.scene.add(s);C.lights[o]=s}for(n in D.fogs){o=D.fogs[n];o.type=="linear"?P=new THREE.Fog(0,o.near, -o.far):o.type=="exp2"&&(P=new THREE.FogExp2(0,o.density));v=o.color;P.color.setRGB(v[0],v[1],v[2]);C.fogs[n]=P}if(C.cameras&&D.defaults.camera)C.currentCamera=C.cameras[D.defaults.camera];if(C.fogs&&D.defaults.fog)C.scene.fog=C.fogs[D.defaults.fog];v=D.defaults.bgcolor;C.bgColor=new THREE.Color;C.bgColor.setRGB(v[0],v[1],v[2]);C.bgColorAlpha=D.defaults.bgalpha;for(k in D.geometries){n=D.geometries[k];if(n.type=="bin_mesh"||n.type=="ascii_mesh"){G=G+1;j.onLoadStart()}}T=G;for(k in D.geometries){n= -D.geometries[k];if(n.type=="cube"){J=new THREE.CubeGeometry(n.width,n.height,n.depth,n.segmentsWidth,n.segmentsHeight,n.segmentsDepth,null,n.flipped,n.sides);C.geometries[k]=J}else if(n.type=="plane"){J=new THREE.PlaneGeometry(n.width,n.height,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type=="sphere"){J=new THREE.SphereGeometry(n.radius,n.segmentsWidth,n.segmentsHeight);C.geometries[k]=J}else if(n.type=="cylinder"){J=new THREE.CylinderGeometry(n.topRad,n.botRad,n.height,n.radSegs, -n.heightSegs);C.geometries[k]=J}else if(n.type=="torus"){J=new THREE.TorusGeometry(n.radius,n.tube,n.segmentsR,n.segmentsT);C.geometries[k]=J}else if(n.type=="icosahedron"){J=new THREE.IcosahedronGeometry(n.radius,n.subdivisions);C.geometries[k]=J}else if(n.type=="bin_mesh")c.load(d(n.url,D.urlBaseType),f(k));else if(n.type=="ascii_mesh")M.load(d(n.url,D.urlBaseType),f(k));else if(n.type=="embedded_mesh"){n=D.embeds[n.id];n.metadata=D.metadata;n&&M.createModel(n,g(k),"")}}for(r in D.textures){k=D.textures[r]; -if(k.url instanceof Array){i=i+k.url.length;for(n=0;n1){g=g[1];c[g]||(c[g]={start:Infinity,end:-Infinity});var h=c[g];if(eh.end)h.end=e;b||(b=g)}}a.firstAnimation=b}; -THREE.MorphAnimMesh.prototype.setAnimationLabel=function(a,b,c){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[a]={start:b,end:c}};THREE.MorphAnimMesh.prototype.playAnimation=function(a,b){var c=this.geometry.animations[a];if(c){this.setFrameRange(c.start,c.end);this.duration=1E3*((c.end-c.start)/b);this.time=0}else console.warn("animation["+a+"] undefined")}; -THREE.MorphAnimMesh.prototype.updateAnimation=function(a){var b=this.duration/this.length;this.time=this.time+this.direction*a;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction=this.direction*-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time=this.time+this.duration}a=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/ -b),0,this.length-1);if(a!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[a]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=a}b=this.time%b/b;this.directionBackwards&&(b=1-b);this.morphTargetInfluences[this.currentKeyframe]=b;this.morphTargetInfluences[this.lastKeyframe]=1-b};THREE.Ribbon=function(a,b){THREE.Object3D.call(this);this.geometry=a;this.material=b}; -THREE.Ribbon.prototype=new THREE.Object3D;THREE.Ribbon.prototype.constructor=THREE.Ribbon;THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=new THREE.Object3D;THREE.LOD.prototype.constructor=THREE.LOD;THREE.LOD.prototype.supr=THREE.Object3D.prototype;THREE.LOD.prototype.addLevel=function(a,b){b===void 0&&(b=0);for(var b=Math.abs(b),c=0;c1){a.matrixWorldInverse.getInverse(a.matrixWorld);a=a.matrixWorldInverse;a=-(a.elements[2]*this.matrixWorld.elements[12]+a.elements[6]*this.matrixWorld.elements[13]+a.elements[10]*this.matrixWorld.elements[14]+a.elements[14]);this.LODs[0].object3D.visible=true;for(var b=1;b=this.LODs[b].visibleAtDistance){this.LODs[b-1].object3D.visible=false;this.LODs[b].object3D.visible=true}else break;for(;b>1);n=m.y*f+f-(o.offsetHeight>>1);o.style.left=q+"px";o.style.top=n+"px";o.style.zIndex=Math.abs(Math.floor((1-m.z)*d.far/d.near));g&&(o.style[g]="scale("+m.scale.x*e+","+m.scale.y*f+")")}}}}; -THREE.CanvasRenderer=function(a){function b(a){if(t!=a)n.globalAlpha=t=a}function c(a){if(y!=a){switch(a){case THREE.NormalBlending:n.globalCompositeOperation="source-over";break;case THREE.AdditiveBlending:n.globalCompositeOperation="lighter"}y=a}}function d(a){if(s!=a)n.strokeStyle=s=a}function e(a){if(w!=a)n.fillStyle=w=a}console.log("THREE.CanvasRenderer",THREE.REVISION);var a=a||{},f=this,g,h,j,l=new THREE.Projector,k=a.canvas!==void 0?a.canvas:document.createElement("canvas"),p,m,o,q,n=k.getContext("2d"), -r=new THREE.Color(0),u=0,t=1,y=0,s=null,w=null,H=null,E=null,z=null,v,A,J,K,R=new THREE.RenderableVertex,P=new THREE.RenderableVertex,D,M,G,i,T,U,C,Y,F,ea,fa,ia,O=new THREE.Color,Q=new THREE.Color,Z=new THREE.Color,$=new THREE.Color,ha=new THREE.Color,Ma=[],Ka=[],Ra,La,Sa,Na,Kb,lb,gb,Lb,hb,Cb,Wa=new THREE.Rectangle,Ba=new THREE.Rectangle,xa=new THREE.Rectangle,$a=false,aa=new THREE.Color,Ta=new THREE.Color,Qa=new THREE.Color,oa=new THREE.Vector3,ib,Db,Sc,ab,pc,Bc,a=16;ib=document.createElement("canvas"); -ib.width=ib.height=2;Db=ib.getContext("2d");Db.fillStyle="rgba(0,0,0,1)";Db.fillRect(0,0,2,2);Sc=Db.getImageData(0,0,2,2);ab=Sc.data;pc=document.createElement("canvas");pc.width=pc.height=a;Bc=pc.getContext("2d");Bc.translate(-a/2,-a/2);Bc.scale(a,a);a--;this.domElement=k;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setSize=function(a,b){p=a;m=b;o=Math.floor(p/2);q=Math.floor(m/2);k.width=p;k.height=m;Wa.set(-o,-q,o,q);Ba.set(-o,-q,o,q);t=1;y= -0;z=E=H=w=s=null};this.setClearColor=function(a,b){r.copy(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.setClearColorHex=function(a,b){r.setHex(a);u=b!==void 0?b:1;Ba.set(-o,-q,o,q)};this.clear=function(){n.setTransform(1,0,0,-1,o,q);if(!Ba.isEmpty()){Ba.minSelf(Wa);Ba.inflate(2);u<1&&n.clearRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()));if(u>0){c(THREE.NormalBlending);b(1);e("rgba("+Math.floor(r.r*255)+","+Math.floor(r.g*255)+","+Math.floor(r.b* -255)+","+u+")");n.fillRect(Math.floor(Ba.getX()),Math.floor(Ba.getY()),Math.floor(Ba.getWidth()),Math.floor(Ba.getHeight()))}Ba.empty()}};this.render=function(a,k){function m(a){var b,c,d,e;aa.setRGB(0,0,0);Ta.setRGB(0,0,0);Qa.setRGB(0,0,0);b=0;for(c=a.length;b>1;m=k.height>>1;g=f.scale.x*o;j=f.scale.y*q;i=g*l;h=j*m;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(g,-j);n.translate(-l,-m);n.drawImage(k,0,0);n.restore()}}}else if(g instanceof THREE.ParticleCanvasMaterial){i=f.scale.x*o;h=f.scale.y*q;xa.set(a.x-i,a.y-h,a.x+i,a.y+h);if(Wa.intersects(xa)){d(g.color.getContextStyle()); -e(g.color.getContextStyle());n.save();n.translate(a.x,a.y);n.rotate(-f.rotation);n.scale(i,h);g.program(n);n.restore()}}}function s(a,e,f,g){b(g.opacity);c(g.blending);n.beginPath();n.moveTo(a.positionScreen.x,a.positionScreen.y);n.lineTo(e.positionScreen.x,e.positionScreen.y);n.closePath();if(g instanceof THREE.LineBasicMaterial){a=g.linewidth;if(H!=a)n.lineWidth=H=a;a=g.linecap;if(E!=a)n.lineCap=E=a;a=g.linejoin;if(z!=a)n.lineJoin=z=a;d(g.color.getContextStyle());n.stroke();xa.inflate(g.linewidth* -2)}}function t(a,d,e,g,h,l,m,n){f.info.render.vertices=f.info.render.vertices+3;f.info.render.faces++;b(n.opacity);c(n.blending);D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;w(D,M,G,i,T,U);if(n instanceof THREE.MeshBasicMaterial)if(n.map){if(n.map.mapping instanceof THREE.UVMapping){Na=m.uvs[0];ad(D,M,G,i,T,U,Na[g].u,Na[g].v,Na[h].u,Na[h].v,Na[l].u,Na[l].v,n.map)}}else if(n.envMap){if(n.envMap.mapping instanceof THREE.SphericalReflectionMapping){a= -k.matrixWorldInverse;oa.copy(m.vertexNormalsWorld[g]);Kb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[h]);gb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Lb=-(oa.x*a.elements[1]+oa.y*a.elements[5]+oa.z*a.elements[9])*0.5+0.5;oa.copy(m.vertexNormalsWorld[l]);hb=(oa.x*a.elements[0]+oa.y*a.elements[4]+oa.z*a.elements[8])*0.5+0.5;Cb=-(oa.x*a.elements[1]+oa.y* -a.elements[5]+oa.z*a.elements[9])*0.5+0.5;ad(D,M,G,i,T,U,Kb,lb,gb,Lb,hb,Cb,n.envMap)}}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshLambertMaterial)if($a)if(!n.wireframe&&n.shading==THREE.SmoothShading&&m.vertexNormalsWorld.length==3){Q.r=Z.r=$.r=aa.r;Q.g=Z.g=$.g=aa.g;Q.b=Z.b=$.b=aa.b;p(j,m.v1.positionWorld,m.vertexNormalsWorld[0],Q);p(j,m.v2.positionWorld,m.vertexNormalsWorld[1],Z);p(j,m.v3.positionWorld,m.vertexNormalsWorld[2], -$);Q.r=Math.max(0,Math.min(n.color.r*Q.r,1));Q.g=Math.max(0,Math.min(n.color.g*Q.g,1));Q.b=Math.max(0,Math.min(n.color.b*Q.b,1));Z.r=Math.max(0,Math.min(n.color.r*Z.r,1));Z.g=Math.max(0,Math.min(n.color.g*Z.g,1));Z.b=Math.max(0,Math.min(n.color.b*Z.b,1));$.r=Math.max(0,Math.min(n.color.r*$.r,1));$.g=Math.max(0,Math.min(n.color.g*$.g,1));$.b=Math.max(0,Math.min(n.color.b*$.b,1));ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else{O.r=aa.r;O.g= -aa.g;O.b=aa.b;p(j,m.centroidWorld,m.normalWorld,O);O.r=Math.max(0,Math.min(n.color.r*O.r,1));O.g=Math.max(0,Math.min(n.color.g*O.g,1));O.b=Math.max(0,Math.min(n.color.b*O.b,1));n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}else n.wireframe?Mb(n.color,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(n.color);else if(n instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z, -Ra,La);$.r=$.g=$.b=1-ac(e.positionScreen.z,Ra,La);ha.r=(Z.r+$.r)*0.5;ha.g=(Z.g+$.g)*0.5;ha.b=(Z.b+$.b)*0.5;Sa=Cc(Q,Z,$,ha);gc(D,M,G,i,T,U,0,0,1,0,0,1,Sa)}else if(n instanceof THREE.MeshNormalMaterial){O.r=hc(m.normalWorld.x);O.g=hc(m.normalWorld.y);O.b=hc(m.normalWorld.z);n.wireframe?Mb(O,n.wireframeLinewidth,n.wireframeLinecap,n.wireframeLinejoin):Eb(O)}}function u(a,d,e,g,h,l,n,m,o){f.info.render.vertices=f.info.render.vertices+4;f.info.render.faces++;b(m.opacity);c(m.blending);if(m.map||m.envMap){t(a, -d,g,0,1,3,n,m,o);t(h,e,l,1,2,3,n,m,o)}else{D=a.positionScreen.x;M=a.positionScreen.y;G=d.positionScreen.x;i=d.positionScreen.y;T=e.positionScreen.x;U=e.positionScreen.y;C=g.positionScreen.x;Y=g.positionScreen.y;F=h.positionScreen.x;ea=h.positionScreen.y;fa=l.positionScreen.x;ia=l.positionScreen.y;if(m instanceof THREE.MeshBasicMaterial){y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshLambertMaterial)if($a)if(!m.wireframe&& -m.shading==THREE.SmoothShading&&n.vertexNormalsWorld.length==4){Q.r=Z.r=$.r=ha.r=aa.r;Q.g=Z.g=$.g=ha.g=aa.g;Q.b=Z.b=$.b=ha.b=aa.b;p(j,n.v1.positionWorld,n.vertexNormalsWorld[0],Q);p(j,n.v2.positionWorld,n.vertexNormalsWorld[1],Z);p(j,n.v4.positionWorld,n.vertexNormalsWorld[3],$);p(j,n.v3.positionWorld,n.vertexNormalsWorld[2],ha);Q.r=Math.max(0,Math.min(m.color.r*Q.r,1));Q.g=Math.max(0,Math.min(m.color.g*Q.g,1));Q.b=Math.max(0,Math.min(m.color.b*Q.b,1));Z.r=Math.max(0,Math.min(m.color.r*Z.r,1));Z.g= -Math.max(0,Math.min(m.color.g*Z.g,1));Z.b=Math.max(0,Math.min(m.color.b*Z.b,1));$.r=Math.max(0,Math.min(m.color.r*$.r,1));$.g=Math.max(0,Math.min(m.color.g*$.g,1));$.b=Math.max(0,Math.min(m.color.b*$.b,1));ha.r=Math.max(0,Math.min(m.color.r*ha.r,1));ha.g=Math.max(0,Math.min(m.color.g*ha.g,1));ha.b=Math.max(0,Math.min(m.color.b*ha.b,1));Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}else{O.r=aa.r;O.g=aa.g;O.b=aa.b;p(j,n.centroidWorld, -n.normalWorld,O);O.r=Math.max(0,Math.min(m.color.r*O.r,1));O.g=Math.max(0,Math.min(m.color.g*O.g,1));O.b=Math.max(0,Math.min(m.color.b*O.b,1));y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else{y(D,M,G,i,T,U,C,Y);m.wireframe?Mb(m.color,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(m.color)}else if(m instanceof THREE.MeshNormalMaterial){O.r=hc(n.normalWorld.x);O.g=hc(n.normalWorld.y);O.b=hc(n.normalWorld.z);y(D,M,G,i,T,U,C, -Y);m.wireframe?Mb(O,m.wireframeLinewidth,m.wireframeLinecap,m.wireframeLinejoin):Eb(O)}else if(m instanceof THREE.MeshDepthMaterial){Ra=k.near;La=k.far;Q.r=Q.g=Q.b=1-ac(a.positionScreen.z,Ra,La);Z.r=Z.g=Z.b=1-ac(d.positionScreen.z,Ra,La);$.r=$.g=$.b=1-ac(g.positionScreen.z,Ra,La);ha.r=ha.g=ha.b=1-ac(e.positionScreen.z,Ra,La);Sa=Cc(Q,Z,$,ha);w(D,M,G,i,C,Y);gc(D,M,G,i,C,Y,0,0,1,0,0,1,Sa);w(F,ea,T,U,fa,ia);gc(F,ea,T,U,fa,ia,1,0,1,1,0,1,Sa)}}}function w(a,b,c,d,e,f){n.beginPath();n.moveTo(a,b);n.lineTo(c, -d);n.lineTo(e,f);n.lineTo(a,b);n.closePath()}function y(a,b,c,d,e,f,g,i){n.beginPath();n.moveTo(a,b);n.lineTo(c,d);n.lineTo(e,f);n.lineTo(g,i);n.lineTo(a,b);n.closePath()}function Mb(a,b,c,e){if(H!=b)n.lineWidth=H=b;if(E!=c)n.lineCap=E=c;if(z!=e)n.lineJoin=z=e;d(a.getContextStyle());n.stroke();xa.inflate(b*2)}function Eb(a){e(a.getContextStyle());n.fill()}function ad(a,b,c,d,f,g,i,h,j,k,l,m,p){if(p.image.width!=0){if(p.needsUpdate==true||Ma[p.id]==void 0){var o=p.wrapS==THREE.RepeatWrapping,q=p.wrapT== -THREE.RepeatWrapping;Ma[p.id]=n.createPattern(p.image,o&&q?"repeat":o&&!q?"repeat-x":!o&&q?"repeat-y":"no-repeat");p.needsUpdate=false}e(Ma[p.id]);var o=p.offset.x/p.repeat.x,q=p.offset.y/p.repeat.y,Db=p.image.width*p.repeat.x,r=p.image.height*p.repeat.y,i=(i+o)*Db,h=(h+q)*r,c=c-a,d=d-b,f=f-a,g=g-b,j=(j+o)*Db-i,k=(k+q)*r-h,l=(l+o)*Db-i,m=(m+q)*r-h,o=j*m-l*k;if(o==0){if(Ka[p.id]===void 0){b=document.createElement("canvas");b.width=p.image.width;b.height=p.image.height;b=b.getContext("2d");b.drawImage(p.image, -0,0);Ka[p.id]=b.getImageData(0,0,p.image.width,p.image.height).data}b=Ka[p.id];i=(Math.floor(i)+Math.floor(h)*p.image.width)*4;O.setRGB(b[i]/255,b[i+1]/255,b[i+2]/255);Eb(O)}else{o=1/o;p=(m*c-k*f)*o;k=(m*d-k*g)*o;c=(j*f-l*c)*o;d=(j*g-l*d)*o;a=a-p*i-c*h;i=b-k*i-d*h;n.save();n.transform(p,k,c,d,a,i);n.fill();n.restore()}}}function gc(a,b,c,d,e,f,g,i,h,j,k,l,m){var p,o;p=m.width-1;o=m.height-1;g=g*p;i=i*o;c=c-a;d=d-b;e=e-a;f=f-b;h=h*p-g;j=j*o-i;k=k*p-g;l=l*o-i;o=1/(h*l-k*j);p=(l*c-j*e)*o;j=(l*d-j*f)* -o;c=(h*e-k*c)*o;d=(h*f-k*d)*o;a=a-p*g-c*i;b=b-j*g-d*i;n.save();n.transform(p,j,c,d,a,b);n.clip();n.drawImage(m,0,0);n.restore()}function Cc(a,b,c,d){var e=~~(a.r*255),f=~~(a.g*255),a=~~(a.b*255),g=~~(b.r*255),i=~~(b.g*255),b=~~(b.b*255),h=~~(c.r*255),j=~~(c.g*255),c=~~(c.b*255),k=~~(d.r*255),l=~~(d.g*255),d=~~(d.b*255);ab[0]=e<0?0:e>255?255:e;ab[1]=f<0?0:f>255?255:f;ab[2]=a<0?0:a>255?255:a;ab[4]=g<0?0:g>255?255:g;ab[5]=i<0?0:i>255?255:i;ab[6]=b<0?0:b>255?255:b;ab[8]=h<0?0:h>255?255:h;ab[9]=j<0?0: -j>255?255:j;ab[10]=c<0?0:c>255?255:c;ab[12]=k<0?0:k>255?255:k;ab[13]=l<0?0:l>255?255:l;ab[14]=d<0?0:d>255?255:d;Db.putImageData(Sc,0,0);Bc.drawImage(ib,0,0);return pc}function ac(a,b,c){a=(a-b)/(c-b);return a*a*(3-2*a)}function hc(a){a=(a+1)*0.5;return a<0?0:a>1?1:a}function Nb(a,b){var c=b.x-a.x,d=b.y-a.y,e=c*c+d*d;if(e!=0){e=1/Math.sqrt(e);c=c*e;d=d*e;b.x=b.x+c;b.y=b.y+d;a.x=a.x-c;a.y=a.y-d}}var Dc,bd,Ha,eb;this.autoClear?this.clear():n.setTransform(1,0,0,-1,o,q);f.info.render.vertices=0;f.info.render.faces= -0;g=l.projectScene(a,k,this.sortElements);h=g.elements;j=g.lights;($a=j.length>0)&&m(j);Dc=0;for(bd=h.length;Dc1?1:a}console.log("THREE.SVGRenderer",THREE.REVISION);var d=this,e,f,g,h=new THREE.Projector,j=document.createElementNS("http://www.w3.org/2000/svg","svg"),l,k,p,m,o,q,n,r,u=new THREE.Rectangle,t=new THREE.Rectangle,y=false,s=new THREE.Color,w=new THREE.Color,H=new THREE.Color,E=new THREE.Color, -z,v=new THREE.Vector3,A=[],J=[],K,R,P,D=1;this.domElement=j;this.sortElements=this.sortObjects=this.autoClear=true;this.info={render:{vertices:0,faces:0}};this.setQuality=function(a){switch(a){case "high":D=1;break;case "low":D=0}};this.setSize=function(a,b){l=a;k=b;p=l/2;m=k/2;j.setAttribute("viewBox",-p+" "+-m+" "+l+" "+k);j.setAttribute("width",l);j.setAttribute("height",k);u.set(-p,-m,p,m)};this.clear=function(){for(;j.childNodes.length>0;)j.removeChild(j.childNodes[0])};this.render=function(k, -l){var i,v,A,C;this.autoClear&&this.clear();d.info.render.vertices=0;d.info.render.faces=0;e=h.projectScene(k,l,this.sortElements);f=e.elements;g=e.lights;P=R=0;if(y=g.length>0){w.setRGB(0,0,0);H.setRGB(0,0,0);E.setRGB(0,0,0);i=0;for(v=g.length;i 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif", -lights_lambert_vertex:"vLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\nvLightBack = vec3( 0.0 );\n#endif\ntransformedNormal = normalize( transformedNormal );\n#if MAX_DIR_LIGHTS > 0\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( transformedNormal, dirVector );\nvec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\ndirectionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\ndirectionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += directionalLightColor[ i ] * directionalLightWeighting;\n#ifdef DOUBLE_SIDED\nvLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\n#endif\n}\n#endif\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\npointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\npointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\n#ifdef DOUBLE_SIDED\nvLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nlVector = normalize( lVector );\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - mPosition.xyz ) );\nif ( spotEffect > spotLightAngle[ i ] ) {\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nfloat dotProduct = dot( transformedNormal, lVector );\nvec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\n#ifdef DOUBLE_SIDED\nvec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\n#endif\n#endif\n#ifdef WRAP_AROUND\nvec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\nspotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\n#ifdef DOUBLE_SIDED\nspotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\n#endif\n#endif\nvLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\n#ifdef DOUBLE_SIDED\nvLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\n#endif\n}\n}\n#endif\nvLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\n#ifdef DOUBLE_SIDED\nvLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\n#endif", -lights_phong_pars_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvarying vec3 vWorldPosition;\n#endif",lights_phong_vertex:"#ifndef PHONG_PER_PIXEL\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nfor( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nvSpotLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvWorldPosition = mPosition.xyz;\n#endif", -lights_phong_pars_fragment:"uniform vec3 ambientLightColor;\n#if MAX_DIR_LIGHTS > 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\n#else\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#endif\n#if MAX_SPOT_LIGHTS > 0\nuniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\nuniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\nuniform float spotLightAngle[ MAX_SPOT_LIGHTS ];\nuniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\n#ifdef PHONG_PER_PIXEL\nuniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\n#else\nvarying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\n#endif\nvarying vec3 vWorldPosition;\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;\nvarying vec3 vNormal;", -lights_phong_fragment:"vec3 normal = normalize( vNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#ifdef DOUBLE_SIDED\nnormal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\n#endif\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vPointLight[ i ].xyz );\nfloat lDistance = vPointLight[ i ].w;\n#endif\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dotProduct, 0.0 );\n#endif\npointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\nvec3 pointHalfVector = normalize( lVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\n#else\npointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\n#endif\n}\n#endif\n#if MAX_SPOT_LIGHTS > 0\nvec3 spotDiffuse = vec3( 0.0 );\nvec3 spotSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\n#ifdef PHONG_PER_PIXEL\nvec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz + vViewPosition.xyz;\nfloat lDistance = 1.0;\nif ( spotLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\n#else\nvec3 lVector = normalize( vSpotLight[ i ].xyz );\nfloat lDistance = vSpotLight[ i ].w;\n#endif\nfloat spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\nif ( spotEffect > spotLightAngle[ i ] ) {\nspotEffect = pow( spotEffect, spotLightExponent[ i ] );\nfloat dotProduct = dot( normal, lVector );\n#ifdef WRAP_AROUND\nfloat spotDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\n#else\nfloat spotDiffuseWeight = max( dotProduct, 0.0 );\n#endif\nspotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\nvec3 spotHalfVector = normalize( lVector + viewPosition );\nfloat spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\nfloat spotSpecularWeight = max( pow( spotDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\nspotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\n#else\nspotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\n#endif\n}\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\nfloat dotProduct = dot( normal, dirVector );\n#ifdef WRAP_AROUND\nfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\nfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dotProduct, 0.0 );\n#endif\ndirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( shininess + 2.0001 ) / 8.0;\nvec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\n#if MAX_SPOT_LIGHTS > 0\ntotalDiffuse += spotDiffuse;\ntotalSpecular += spotSpecular;\n#endif\n#ifdef METAL\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\n#endif", -color_pars_fragment:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_fragment:"#ifdef USE_COLOR\ngl_FragColor = gl_FragColor * vec4( vColor, opacity );\n#endif",color_pars_vertex:"#ifdef USE_COLOR\nvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n#ifdef GAMMA_INPUT\nvColor = color * color;\n#else\nvColor = color;\n#endif\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\nuniform mat4 boneGlobalMatrices[ MAX_BONES ];\n#endif",skinning_vertex:"#ifdef USE_SKINNING\ngl_Position = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;\ngl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;\ngl_Position = projectionMatrix * modelViewMatrix * gl_Position;\n#endif", -morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n#ifndef USE_MORPHNORMALS\nuniform float morphTargetInfluences[ 8 ];\n#else\nuniform float morphTargetInfluences[ 4 ];\n#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\nvec3 morphed = vec3( 0.0 );\nmorphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\nmorphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\nmorphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\nmorphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n#ifndef USE_MORPHNORMALS\nmorphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\nmorphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\nmorphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\nmorphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n#endif\nmorphed += position;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );\n#endif", -default_vertex:"#ifndef USE_MORPHTARGETS\n#ifndef USE_SKINNING\ngl_Position = projectionMatrix * mvPosition;\n#endif\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\nvec3 morphedNormal = vec3( 0.0 );\nmorphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\nmorphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\nmorphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\nmorphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\nmorphedNormal += normal;\nvec3 transformedNormal = normalMatrix * morphedNormal;\n#else\nvec3 transformedNormal = normalMatrix * normal;\n#endif", -shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\nuniform sampler2D shadowMap[ MAX_SHADOWS ];\nuniform vec2 shadowMapSize[ MAX_SHADOWS ];\nuniform float shadowDarkness[ MAX_SHADOWS ];\nuniform float shadowBias[ MAX_SHADOWS ];\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nfloat unpackDepth( const in vec4 rgba_depth ) {\nconst vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );\nfloat depth = dot( rgba_depth, bit_shift );\nreturn depth;\n}\n#endif",shadowmap_fragment:"#ifdef USE_SHADOWMAP\n#ifdef SHADOWMAP_DEBUG\nvec3 frustumColors[3];\nfrustumColors[0] = vec3( 1.0, 0.5, 0.0 );\nfrustumColors[1] = vec3( 0.0, 1.0, 0.8 );\nfrustumColors[2] = vec3( 0.0, 0.5, 1.0 );\n#endif\n#ifdef SHADOWMAP_CASCADE\nint inFrustumCount = 0;\n#endif\nfloat fDepth;\nvec3 shadowColor = vec3( 1.0 );\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\nvec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\nbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\nbool inFrustum = all( inFrustumVec );\n#ifdef SHADOWMAP_CASCADE\ninFrustumCount += int( inFrustum );\nbvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\n#else\nbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n#endif\nbool frustumTest = all( frustumTestVec );\nif ( frustumTest ) {\nshadowCoord.z += shadowBias[ i ];\n#ifdef SHADOWMAP_SOFT\nfloat shadow = 0.0;\nconst float shadowDelta = 1.0 / 9.0;\nfloat xPixelOffset = 1.0 / shadowMapSize[ i ].x;\nfloat yPixelOffset = 1.0 / shadowMapSize[ i ].y;\nfloat dx0 = -1.25 * xPixelOffset;\nfloat dy0 = -1.25 * yPixelOffset;\nfloat dx1 = 1.25 * xPixelOffset;\nfloat dy1 = 1.25 * yPixelOffset;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nfDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\nif ( fDepth < shadowCoord.z ) shadow += shadowDelta;\nshadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\n#else\nvec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\nfloat fDepth = unpackDepth( rgbaDepth );\nif ( fDepth < shadowCoord.z )\nshadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\n#endif\n}\n#ifdef SHADOWMAP_DEBUG\n#ifdef SHADOWMAP_CASCADE\nif ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\n#else\nif ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\n#endif\n#endif\n}\n#ifdef GAMMA_OUTPUT\nshadowColor *= shadowColor;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\n#endif", -shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\nvarying vec4 vShadowCoord[ MAX_SHADOWS ];\nuniform mat4 shadowMatrix[ MAX_SHADOWS ];\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\nfor( int i = 0; i < MAX_SHADOWS; i ++ ) {\n#ifdef USE_MORPHTARGETS\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );\n#else\nvShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );\n#endif\n}\n#endif",alphatest_fragment:"#ifdef ALPHATEST\nif ( gl_FragColor.a < ALPHATEST ) discard;\n#endif", -linear_to_gamma_fragment:"#ifdef GAMMA_OUTPUT\ngl_FragColor.xyz = sqrt( gl_FragColor.xyz );\n#endif"}; -THREE.UniformsUtils={merge:function(a){var b,c,d,e={};for(b=0;b=0)return a.geometry.materials[b.materialIndex]}function d(a){return a instanceof THREE.MeshBasicMaterial&&!a.envMap||a instanceof THREE.MeshDepthMaterial?false:a&&a.shading!==void 0&&a.shading===THREE.SmoothShading?THREE.SmoothShading:THREE.FlatShading}function e(a){return a.map||a.lightMap||a instanceof THREE.ShaderMaterial?true:false}function f(a,b,c){var d,e,f,g,h=a.vertices;g=h.length; -var j=a.colors,k=j.length,l=a.__vertexArray,m=a.__colorArray,n=a.__sortArray,p=a.verticesNeedUpdate,o=a.colorsNeedUpdate,q=a.__webglCustomAttributesList;if(c.sortParticles){xa.copy(Ba);xa.multiplySelf(c.matrixWorld);for(d=0;d=0;c--)a[c].object=== -b&&a.splice(c,1)}function q(a,b){for(var c=a.length-1;c>=0;c--)a[c]===b&&a.splice(c,1)}function n(a,b,c,d,e){if(!d.program||d.needsUpdate){G.initMaterial(d,b,c,e);d.needsUpdate=false}if(d.morphTargets&&!e.__webglMorphTargetInfluences){e.__webglMorphTargetInfluences=new Float32Array(G.maxMorphTargets);for(var f=0,g=G.maxMorphTargets;f0};this.setSize=function(a,b){E.width=a;E.height=b;this.setViewport(0,0,E.width,E.height)};this.setViewport=function(a,b,c,d){Kb=a;lb=b;gb=c;Lb=d;i.viewport(Kb,lb,gb,Lb)};this.setScissor=function(a,b,c,d){i.scissor(a,b,c,d)};this.enableScissorTest=function(a){a?i.enable(i.SCISSOR_TEST):i.disable(i.SCISSOR_TEST)};this.setClearColorHex=function(a,b){P.setHex(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.setClearColor=function(a, -b){P.copy(a);D=b;i.clearColor(P.r,P.g,P.b,D)};this.getClearColor=function(){return P};this.getClearAlpha=function(){return D};this.clear=function(a,b,c){var d=0;if(a===void 0||a)d=d|i.COLOR_BUFFER_BIT;if(b===void 0||b)d=d|i.DEPTH_BUFFER_BIT;if(c===void 0||c)d=d|i.STENCIL_BUFFER_BIT;i.clear(d)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.addPostPlugin=function(a){a.init(this);this.renderPluginsPost.push(a)};this.addPrePlugin=function(a){a.init(this);this.renderPluginsPre.push(a)}; -this.deallocateObject=function(a){if(a.__webglInit){a.__webglInit=false;delete a._modelViewMatrix;delete a._normalMatrix;delete a._normalMatrixArray;delete a._modelViewMatrixArray;delete a._objectMatrixArray;if(a instanceof THREE.Mesh)for(var b in a.geometry.geometryGroups){var c=a.geometry.geometryGroups[b];i.deleteBuffer(c.__webglVertexBuffer);i.deleteBuffer(c.__webglNormalBuffer);i.deleteBuffer(c.__webglTangentBuffer);i.deleteBuffer(c.__webglColorBuffer);i.deleteBuffer(c.__webglUVBuffer);i.deleteBuffer(c.__webglUV2Buffer); -i.deleteBuffer(c.__webglSkinVertexABuffer);i.deleteBuffer(c.__webglSkinVertexBBuffer);i.deleteBuffer(c.__webglSkinIndicesBuffer);i.deleteBuffer(c.__webglSkinWeightsBuffer);i.deleteBuffer(c.__webglFaceBuffer);i.deleteBuffer(c.__webglLineBuffer);var d=void 0,e=void 0;if(c.numMorphTargets){d=0;for(e=c.numMorphTargets;d=0&&e.vertexNormalBuffer){i.bindBuffer(i.ARRAY_BUFFER, -e.vertexNormalBuffer);i.vertexAttribPointer(a.normal,e.vertexNormalBuffer.itemSize,i.FLOAT,false,0,f[d].index*12)}if(a.uv>=0&&e.vertexUvBuffer)if(e.vertexUvBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexUvBuffer);i.vertexAttribPointer(a.uv,e.vertexUvBuffer.itemSize,i.FLOAT,false,0,f[d].index*8);i.enableVertexAttribArray(a.uv)}else i.disableVertexAttribArray(a.uv);if(a.color>=0&&e.vertexColorBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.vertexColorBuffer);i.vertexAttribPointer(a.color,e.vertexColorBuffer.itemSize, -i.FLOAT,false,0,f[d].index*16)}i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.vertexIndexBuffer)}i.drawElements(i.TRIANGLES,f[d].count,i.UNSIGNED_SHORT,f[d].start*2);G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+f[d].count;G.info.render.faces=G.info.render.faces+f[d].count/3}}}};this.renderBuffer=function(a,b,c,d,e,f){if(d.visible!==false){var g,h,c=n(a,b,c,d,f),b=c.attributes,a=false,c=e.id*16777215+c.id*2+(d.wireframe?1:0);if(c!==F){F=c;a=true}if(!d.morphTargets&&b.position>=0){if(a){i.bindBuffer(i.ARRAY_BUFFER, -e.__webglVertexBuffer);i.vertexAttribPointer(b.position,3,i.FLOAT,false,0,0)}}else if(f.morphTargetBase){c=d.program.attributes;if(f.morphTargetBase!==-1){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[f.morphTargetBase]);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}else if(c.position>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglVertexBuffer);i.vertexAttribPointer(c.position,3,i.FLOAT,false,0,0)}if(f.morphTargetForcedOrder.length){g=0;var j=f.morphTargetForcedOrder;for(h=f.morphTargetInfluences;g< -d.numSupportedMorphTargets&&gk){l=m;k=h[l]}i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphTargetsBuffers[l]);i.vertexAttribPointer(c["morphTarget"+g],3,i.FLOAT,false,0,0);if(d.morphNormals){i.bindBuffer(i.ARRAY_BUFFER,e.__webglMorphNormalsBuffers[l]);i.vertexAttribPointer(c["morphNormal"+g],3,i.FLOAT,false,0,0)}f.__webglMorphTargetInfluences[g]=k;j[l]=1;k=-1;g++}}d.program.uniforms.morphTargetInfluences!==null&&i.uniform1fv(d.program.uniforms.morphTargetInfluences,f.__webglMorphTargetInfluences)}if(a){if(e.__webglCustomAttributesList){g= -0;for(h=e.__webglCustomAttributesList.length;g=0){i.bindBuffer(i.ARRAY_BUFFER,c.buffer);i.vertexAttribPointer(b[c.buffer.belongsToAttribute],c.size,i.FLOAT,false,0,0)}}}if(b.color>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglColorBuffer);i.vertexAttribPointer(b.color,3,i.FLOAT,false,0,0)}if(b.normal>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglNormalBuffer);i.vertexAttribPointer(b.normal,3,i.FLOAT,false,0,0)}if(b.tangent>=0){i.bindBuffer(i.ARRAY_BUFFER, -e.__webglTangentBuffer);i.vertexAttribPointer(b.tangent,4,i.FLOAT,false,0,0)}if(b.uv>=0)if(e.__webglUVBuffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUVBuffer);i.vertexAttribPointer(b.uv,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv)}else i.disableVertexAttribArray(b.uv);if(b.uv2>=0)if(e.__webglUV2Buffer){i.bindBuffer(i.ARRAY_BUFFER,e.__webglUV2Buffer);i.vertexAttribPointer(b.uv2,2,i.FLOAT,false,0,0);i.enableVertexAttribArray(b.uv2)}else i.disableVertexAttribArray(b.uv2);if(d.skinning&&b.skinVertexA>= -0&&b.skinVertexB>=0&&b.skinIndex>=0&&b.skinWeight>=0){i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexABuffer);i.vertexAttribPointer(b.skinVertexA,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinVertexBBuffer);i.vertexAttribPointer(b.skinVertexB,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinIndicesBuffer);i.vertexAttribPointer(b.skinIndex,4,i.FLOAT,false,0,0);i.bindBuffer(i.ARRAY_BUFFER,e.__webglSkinWeightsBuffer);i.vertexAttribPointer(b.skinWeight,4,i.FLOAT,false,0,0)}}if(f instanceof -THREE.Mesh){if(d.wireframe){d=d.wireframeLinewidth;if(d!==Na){i.lineWidth(d);Na=d}a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglLineBuffer);i.drawElements(i.LINES,e.__webglLineCount,i.UNSIGNED_SHORT,0)}else{a&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.__webglFaceBuffer);i.drawElements(i.TRIANGLES,e.__webglFaceCount,i.UNSIGNED_SHORT,0)}G.info.render.calls++;G.info.render.vertices=G.info.render.vertices+e.__webglFaceCount;G.info.render.faces=G.info.render.faces+e.__webglFaceCount/3}else if(f instanceof -THREE.Line){f=f.type===THREE.LineStrip?i.LINE_STRIP:i.LINES;d=d.linewidth;if(d!==Na){i.lineWidth(d);Na=d}i.drawArrays(f,0,e.__webglLineCount);G.info.render.calls++}else if(f instanceof THREE.ParticleSystem){i.drawArrays(i.POINTS,0,e.__webglParticleCount);G.info.render.calls++;G.info.render.points=G.info.render.points+e.__webglParticleCount}else if(f instanceof THREE.Ribbon){i.drawArrays(i.TRIANGLE_STRIP,0,e.__webglVertexCount);G.info.render.calls++}}};this.render=function(a,b,c,d){var e,f,k,m,n=a.__lights, -p=a.fog;Y=-1;Ta=true;if(b.parent===void 0){console.warn("DEPRECATED: Camera hasn't been added to a Scene. Adding it...");a.add(b)}this.autoUpdateScene&&a.updateMatrixWorld();if(!b._viewMatrixArray)b._viewMatrixArray=new Float32Array(16);if(!b._projectionMatrixArray)b._projectionMatrixArray=new Float32Array(16);b.matrixWorldInverse.getInverse(b.matrixWorld);b.matrixWorldInverse.flattenToArray(b._viewMatrixArray);b.projectionMatrix.flattenToArray(b._projectionMatrixArray);Ba.multiply(b.projectionMatrix, -b.matrixWorldInverse);Wa.setFromMatrix(Ba);this.autoUpdateObjects&&this.initWebGLObjects(a);h(this.renderPluginsPre,a,b);G.info.render.calls=0;G.info.render.vertices=0;G.info.render.faces=0;G.info.render.points=0;this.setRenderTarget(c);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);m=a.__webglObjects;d=0;for(e=m.length;d=0){t=q.geometry.materials[t];if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}}}else if(t)if(t.transparent){o.transparent=t;o.opaque=null}else{o.opaque=t;o.transparent=null}f.render=true;if(this.sortObjects)if(k.renderDepth)f.z=k.renderDepth;else{$a.copy(k.matrixWorld.getPosition());Ba.multiplyVector3($a);f.z=$a.z}}}this.sortObjects&& -m.sort(g);m=a.__webglObjectsImmediate;d=0;for(e=m.length;d65535){A[z].counter=A[z].counter+1;y=A[z].hash+"_"+A[z].counter;r.geometryGroups[y]===void 0&&(r.geometryGroups[y]={faces3:[],faces4:[],materialIndex:v,vertices:0,numMorphTargets:C, -numMorphNormals:D})}u instanceof THREE.Face3?r.geometryGroups[y].faces3.push(s):r.geometryGroups[y].faces4.push(s);r.geometryGroups[y].vertices=r.geometryGroups[y].vertices+w}r.geometryGroupsList=[];var E=void 0;for(E in r.geometryGroups){r.geometryGroups[E].id=fa++;r.geometryGroupsList.push(r.geometryGroups[E])}}for(j in l.geometryGroups){n=l.geometryGroups[j];if(!n.__webglVertexBuffer){var F=n;F.__webglVertexBuffer=i.createBuffer();F.__webglNormalBuffer=i.createBuffer();F.__webglTangentBuffer=i.createBuffer(); -F.__webglColorBuffer=i.createBuffer();F.__webglUVBuffer=i.createBuffer();F.__webglUV2Buffer=i.createBuffer();F.__webglSkinVertexABuffer=i.createBuffer();F.__webglSkinVertexBBuffer=i.createBuffer();F.__webglSkinIndicesBuffer=i.createBuffer();F.__webglSkinWeightsBuffer=i.createBuffer();F.__webglFaceBuffer=i.createBuffer();F.__webglLineBuffer=i.createBuffer();var H=void 0,K=void 0;if(F.numMorphTargets){F.__webglMorphTargetsBuffers=[];H=0;for(K=F.numMorphTargets;H -0||O.faceVertexUvs.length>0)Q.__uvArray=new Float32Array(P*2);if(O.faceUvs.length>1||O.faceVertexUvs.length>1)Q.__uv2Array=new Float32Array(P*2)}if(J.geometry.skinWeights.length&&J.geometry.skinIndices.length){Q.__skinVertexAArray=new Float32Array(P*4);Q.__skinVertexBArray=new Float32Array(P*4);Q.__skinIndexArray=new Float32Array(P*4);Q.__skinWeightArray=new Float32Array(P*4)}Q.__faceArray=new Uint16Array(Z*3);Q.__lineArray=new Uint16Array(Y*2);var U=void 0,ha=void 0;if(Q.numMorphTargets){Q.__morphTargetsArrays= -[];U=0;for(ha=Q.numMorphTargets;U0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexABuffer);i.bufferData(i.ARRAY_BUFFER,ra,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinVertexBBuffer);i.bufferData(i.ARRAY_BUFFER,sa,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinIndicesBuffer);i.bufferData(i.ARRAY_BUFFER,ta,Xa);i.bindBuffer(i.ARRAY_BUFFER,ca.__webglSkinWeightsBuffer);i.bufferData(i.ARRAY_BUFFER,ua,Xa)}}if(td&&Tc){I=0;for(S=ka.length;I0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglColorBuffer);i.bufferData(i.ARRAY_BUFFER,Ga,Xa)}}if(sd&&Pa.hasTangents){I=0;for(S=ka.length;I0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUVBuffer);i.bufferData(i.ARRAY_BUFFER,vc,Xa)}}if(gd&&Yc&&dd){I=0;for(S=ka.length;I0){i.bindBuffer(i.ARRAY_BUFFER,ca.__webglUV2Buffer);i.bufferData(i.ARRAY_BUFFER,wc,Xa)}}if(qd){I=0;for(S=ka.length;I0?"#define VERTEX_TEXTURES":"",G.gammaInput?"#define GAMMA_INPUT":"",G.gammaOutput?"#define GAMMA_OUTPUT":"",G.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_SHADOWS "+c.maxShadows,"#define MAX_BONES "+ -c.maxBones,c.map?"#define USE_MAP":"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.vertexColors?"#define USE_COLOR":"",c.skinning?"#define USE_SKINNING":"",c.morphTargets?"#define USE_MORPHTARGETS":"",c.morphNormals?"#define USE_MORPHNORMALS":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG": -"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",c.sizeAttenuation?"#define USE_SIZEATTENUATION":"","uniform mat4 objectMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute vec2 uv2;\n#ifdef USE_COLOR\nattribute vec3 color;\n#endif\n#ifdef USE_MORPHTARGETS\nattribute vec3 morphTarget0;\nattribute vec3 morphTarget1;\nattribute vec3 morphTarget2;\nattribute vec3 morphTarget3;\n#ifdef USE_MORPHNORMALS\nattribute vec3 morphNormal0;\nattribute vec3 morphNormal1;\nattribute vec3 morphNormal2;\nattribute vec3 morphNormal3;\n#else\nattribute vec3 morphTarget4;\nattribute vec3 morphTarget5;\nattribute vec3 morphTarget6;\nattribute vec3 morphTarget7;\n#endif\n#endif\n#ifdef USE_SKINNING\nattribute vec4 skinVertexA;\nattribute vec4 skinVertexB;\nattribute vec4 skinIndex;\nattribute vec4 skinWeight;\n#endif\n"].join("\n"); -k=["precision "+z+" float;","#define MAX_DIR_LIGHTS "+c.maxDirLights,"#define MAX_POINT_LIGHTS "+c.maxPointLights,"#define MAX_SPOT_LIGHTS "+c.maxSpotLights,"#define MAX_SHADOWS "+c.maxShadows,c.alphaTest?"#define ALPHATEST "+c.alphaTest:"",G.gammaInput?"#define GAMMA_INPUT":"",G.gammaOutput?"#define GAMMA_OUTPUT":"",G.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",c.useFog&&c.fog?"#define USE_FOG":"",c.useFog&&c.fog instanceof THREE.FogExp2?"#define FOG_EXP2":"",c.map?"#define USE_MAP": -"",c.envMap?"#define USE_ENVMAP":"",c.lightMap?"#define USE_LIGHTMAP":"",c.vertexColors?"#define USE_COLOR":"",c.metal?"#define METAL":"",c.perPixel?"#define PHONG_PER_PIXEL":"",c.wrapAround?"#define WRAP_AROUND":"",c.doubleSided?"#define DOUBLE_SIDED":"",c.shadowMapEnabled?"#define USE_SHADOWMAP":"",c.shadowMapSoft?"#define SHADOWMAP_SOFT":"",c.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",c.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n"].join("\n"); -i.attachShader(r,t("fragment",k+n));i.attachShader(r,t("vertex",d+j));i.linkProgram(r);i.getProgramParameter(r,i.LINK_STATUS)||console.error("Could not initialise shader\nVALIDATE_STATUS: "+i.getProgramParameter(r,i.VALIDATE_STATUS)+", gl error ["+i.getError()+"]");r.uniforms={};r.attributes={};var s,d=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","objectMatrix","cameraPosition","boneGlobalMatrices","morphTargetInfluences"];for(s in h)d.push(s);s=d;d=0;for(h=s.length;d=0&&i.enableVertexAttribArray(q.position); -q.color>=0&&i.enableVertexAttribArray(q.color);q.normal>=0&&i.enableVertexAttribArray(q.normal);q.tangent>=0&&i.enableVertexAttribArray(q.tangent);if(a.skinning&&q.skinVertexA>=0&&q.skinVertexB>=0&&q.skinIndex>=0&&q.skinWeight>=0){i.enableVertexAttribArray(q.skinVertexA);i.enableVertexAttribArray(q.skinVertexB);i.enableVertexAttribArray(q.skinIndex);i.enableVertexAttribArray(q.skinWeight)}if(a.attributes)for(f in a.attributes)q[f]!==void 0&&q[f]>=0&&i.enableVertexAttribArray(q[f]);if(a.morphTargets){a.numSupportedMorphTargets= -0;r="morphTarget";for(f=0;f=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphTargets++}}}if(a.morphNormals){a.numSupportedMorphNormals=0;r="morphNormal";for(f=0;f=0){i.enableVertexAttribArray(q[s]);a.numSupportedMorphNormals++}}}a.uniformsList=[];for(e in a.uniforms)a.uniformsList.push([a.uniforms[e],e])};this.setFaceCulling=function(a,b){if(a){!b||b==="ccw"?i.frontFace(i.CCW):i.frontFace(i.CW);a==="back"?i.cullFace(i.BACK): -a==="front"?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK);i.enable(i.CULL_FACE)}else i.disable(i.CULL_FACE)};this.setObjectFaces=function(a){if(ia!==a.doubleSided){a.doubleSided?i.disable(i.CULL_FACE):i.enable(i.CULL_FACE);ia=a.doubleSided}if(O!==a.flipSided){a.flipSided?i.frontFace(i.CW):i.frontFace(i.CCW);O=a.flipSided}};this.setDepthTest=function(a){if(Ma!==a){a?i.enable(i.DEPTH_TEST):i.disable(i.DEPTH_TEST);Ma=a}};this.setDepthWrite=function(a){if(Ka!==a){i.depthMask(a);Ka=a}};this.setBlending= -function(a,b,c,d){if(a!==Q){switch(a){case THREE.NoBlending:i.disable(i.BLEND);break;case THREE.AdditiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.SRC_ALPHA,i.ONE);break;case THREE.SubtractiveBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.ONE_MINUS_SRC_COLOR);break;case THREE.MultiplyBlending:i.enable(i.BLEND);i.blendEquation(i.FUNC_ADD);i.blendFunc(i.ZERO,i.SRC_COLOR);break;case THREE.CustomBlending:i.enable(i.BLEND);break;default:i.enable(i.BLEND); -i.blendEquationSeparate(i.FUNC_ADD,i.FUNC_ADD);i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}Q=a}if(a===THREE.CustomBlending){if(b!==Z){i.blendEquation(H(b));Z=b}if(c!==$||d!==ha){i.blendFunc(H(c),H(d));$=c;ha=d}}else ha=$=Z=null};this.setTexture=function(a,b){if(a.needsUpdate){if(!a.__webglInit){a.__webglInit=true;a.__webglTexture=i.createTexture();G.info.memory.textures++}i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture);i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL, -a.premultiplyAlpha);var c=a.image,d=(c.width&c.width-1)===0&&(c.height&c.height-1)===0,e=H(a.format),f=H(a.type);y(i.TEXTURE_2D,a,d);a instanceof THREE.DataTexture?i.texImage2D(i.TEXTURE_2D,0,e,c.width,c.height,0,e,f,c.data):i.texImage2D(i.TEXTURE_2D,0,e,e,f,a.image);a.generateMipmaps&&d&&i.generateMipmap(i.TEXTURE_2D);a.needsUpdate=false;if(a.onUpdate)a.onUpdate()}else{i.activeTexture(i.TEXTURE0+b);i.bindTexture(i.TEXTURE_2D,a.__webglTexture)}};this.setRenderTarget=function(a){var b=a instanceof -THREE.WebGLRenderTargetCube;if(a&&!a.__webglFramebuffer){if(a.depthBuffer===void 0)a.depthBuffer=true;if(a.stencilBuffer===void 0)a.stencilBuffer=true;a.__webglTexture=i.createTexture();var c=(a.width&a.width-1)===0&&(a.height&a.height-1)===0,d=H(a.format),e=H(a.type);if(b){a.__webglFramebuffer=[];a.__webglRenderbuffer=[];i.bindTexture(i.TEXTURE_CUBE_MAP,a.__webglTexture);y(i.TEXTURE_CUBE_MAP,a,c);for(var f=0;f<6;f++){a.__webglFramebuffer[f]=i.createFramebuffer();a.__webglRenderbuffer[f]=i.createRenderbuffer(); -i.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+f,0,d,a.width,a.height,0,d,e,null);var g=a,h=i.TEXTURE_CUBE_MAP_POSITIVE_X+f;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer[f]);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,h,g.__webglTexture,0);s(a.__webglRenderbuffer[f],a)}c&&i.generateMipmap(i.TEXTURE_CUBE_MAP)}else{a.__webglFramebuffer=i.createFramebuffer();a.__webglRenderbuffer=i.createRenderbuffer();i.bindTexture(i.TEXTURE_2D,a.__webglTexture);y(i.TEXTURE_2D,a,c);i.texImage2D(i.TEXTURE_2D, -0,d,a.width,a.height,0,d,e,null);d=i.TEXTURE_2D;i.bindFramebuffer(i.FRAMEBUFFER,a.__webglFramebuffer);i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,d,a.__webglTexture,0);s(a.__webglRenderbuffer,a);c&&i.generateMipmap(i.TEXTURE_2D)}b?i.bindTexture(i.TEXTURE_CUBE_MAP,null):i.bindTexture(i.TEXTURE_2D,null);i.bindRenderbuffer(i.RENDERBUFFER,null);i.bindFramebuffer(i.FRAMEBUFFER,null)}if(a){b=b?a.__webglFramebuffer[a.activeCubeFace]:a.__webglFramebuffer;c=a.width;a=a.height;e=d=0}else{b=null; -c=gb;a=Lb;d=Kb;e=lb}if(b!==C){i.bindFramebuffer(i.FRAMEBUFFER,b);i.viewport(d,e,c,a);C=b}hb=c;Cb=a};this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)}; -THREE.WebGLRenderTarget=function(a,b,c){this.width=a;this.height=b;c=c||{};this.wrapS=c.wrapS!==void 0?c.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=c.wrapT!==void 0?c.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=c.magFilter!==void 0?c.magFilter:THREE.LinearFilter;this.minFilter=c.minFilter!==void 0?c.minFilter:THREE.LinearMipMapLinearFilter;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=c.format!==void 0?c.format:THREE.RGBAFormat;this.type=c.type!==void 0?c.type: -THREE.UnsignedByteType;this.depthBuffer=c.depthBuffer!==void 0?c.depthBuffer:true;this.stencilBuffer=c.stencilBuffer!==void 0?c.stencilBuffer:true;this.generateMipmaps=true}; -THREE.WebGLRenderTarget.prototype.clone=function(){var a=new THREE.WebGLRenderTarget(this.width,this.height);a.wrapS=this.wrapS;a.wrapT=this.wrapT;a.magFilter=this.magFilter;a.minFilter=this.minFilter;a.offset.copy(this.offset);a.repeat.copy(this.repeat);a.format=this.format;a.type=this.type;a.depthBuffer=this.depthBuffer;a.stencilBuffer=this.stencilBuffer;return a};THREE.WebGLRenderTargetCube=function(a,b,c){THREE.WebGLRenderTarget.call(this,a,b,c);this.activeCubeFace=0}; -THREE.WebGLRenderTargetCube.prototype=new THREE.WebGLRenderTarget;THREE.WebGLRenderTargetCube.prototype.constructor=THREE.WebGLRenderTargetCube;THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(a){this.positionWorld.copy(a.positionWorld);this.positionScreen.copy(a.positionScreen)}; -THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null}; -THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidWorld=new THREE.Vector3;this.centroidScreen=new THREE.Vector3;this.normalWorld=new THREE.Vector3;this.vertexNormalsWorld=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.faceMaterial=this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.z=this.object=null}; -THREE.RenderableParticle=function(){this.rotation=this.z=this.y=this.x=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null}; -THREE.ColorUtils={adjustHSV:function(a,b,c,d){var e=THREE.ColorUtils.__hsv;THREE.ColorUtils.rgbToHsv(a,e);e.h=THREE.Math.clamp(e.h+b,0,1);e.s=THREE.Math.clamp(e.s+c,0,1);e.v=THREE.Math.clamp(e.v+d,0,1);a.setHSV(e.h,e.s,e.v)},rgbToHsv:function(a,b){var c=a.r,d=a.g,e=a.b,f=Math.max(Math.max(c,d),e),g=Math.min(Math.min(c,d),e);if(g===f)g=c=0;else{var h=f-g,g=h/f,c=(c===f?(d-e)/h:d===f?2+(e-c)/h:4+(c-d)/h)/6;c<0&&(c=c+1);c>1&&(c=c-1)}b===void 0&&(b={h:0,s:0,v:0});b.h=c;b.s=g;b.v=f;return b}}; -THREE.ColorUtils.__hsv={h:0,s:0,v:0}; -THREE.GeometryUtils={merge:function(a,b){for(var c,d,e=a.vertices.length,f=b instanceof THREE.Mesh?b.geometry:b,g=a.vertices,h=f.vertices,j=a.faces,l=f.faces,k=a.faceVertexUvs[0],p=f.faceVertexUvs[0],m={},o=0;o1){d=1-d;e=1-e}f=1-d-e;g.copy(a);g.multiplyScalar(d);h.copy(b);h.multiplyScalar(e);g.addSelf(h);h.copy(c);h.multiplyScalar(f);g.addSelf(h);return g},randomPointInFace:function(a,b,c){var d,e,f;if(a instanceof -THREE.Face3){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];return THREE.GeometryUtils.randomPointInTriangle(d,e,f)}if(a instanceof THREE.Face4){d=b.vertices[a.a];e=b.vertices[a.b];f=b.vertices[a.c];var b=b.vertices[a.d],g;if(c)if(a._area1&&a._area2){c=a._area1;g=a._area2}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b);a._area1=c;a._area2=g}else{c=THREE.GeometryUtils.triangleArea(d,e,b);g=THREE.GeometryUtils.triangleArea(e,f,b)}return THREE.GeometryUtils.random()* -(c+g)a?b(c,e-1):l[e] -b||q>b||m>b){j=a.vertices.length;y=e.clone();s=e.clone();if(o>=q&&o>=m){l=l.clone();l.lerpSelf(k,0.5);y.a=f;y.b=j;y.c=h;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);y.vertexNormals[1].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);y.vertexColors[1].copy(f);s.vertexColors[0].copy(f)}e=0}else if(q>=o&&q>=m){l=k.clone();l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c= -j;s.a=j;s.b=h;s.c=f;if(e.vertexNormals.length===3){f=e.vertexNormals[1].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f);s.vertexNormals[1].copy(e.vertexNormals[2]);s.vertexNormals[2].copy(e.vertexNormals[0])}if(e.vertexColors.length===3){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f);s.vertexColors[1].copy(e.vertexColors[2]);s.vertexColors[2].copy(e.vertexColors[0])}e=1}else{l=l.clone(); -l.lerpSelf(p,0.5);y.a=f;y.b=g;y.c=j;s.a=j;s.b=g;s.c=h;if(e.vertexNormals.length===3){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[2],0.5);y.vertexNormals[2].copy(f);s.vertexNormals[0].copy(f)}if(e.vertexColors.length===3){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[2],0.5);y.vertexColors[2].copy(f);s.vertexColors[0].copy(f)}e=2}w.push(y,s);a.vertices.push(l);f=0;for(g=a.faceVertexUvs.length;fb||q>b||n>b||r>b){u=a.vertices.length;t=a.vertices.length+1;y=e.clone();s=e.clone();if(o>=q&&o>=n&&o>=r||n>=q&&n>=o&&n>=r){o=l.clone();o.lerpSelf(k,0.5);k=p.clone();k.lerpSelf(m,0.5);y.a=f;y.b=u;y.c=t;y.d=j;s.a=u;s.b=g;s.c=h;s.d=t;if(e.vertexNormals.length===4){f=e.vertexNormals[0].clone();f.lerpSelf(e.vertexNormals[1],0.5);g=e.vertexNormals[2].clone();g.lerpSelf(e.vertexNormals[3],0.5);y.vertexNormals[1].copy(f); -y.vertexNormals[2].copy(g);s.vertexNormals[0].copy(f);s.vertexNormals[3].copy(g)}if(e.vertexColors.length===4){f=e.vertexColors[0].clone();f.lerpSelf(e.vertexColors[1],0.5);g=e.vertexColors[2].clone();g.lerpSelf(e.vertexColors[3],0.5);y.vertexColors[1].copy(f);y.vertexColors[2].copy(g);s.vertexColors[0].copy(f);s.vertexColors[3].copy(g)}e=0}else{o=k.clone();o.lerpSelf(p,0.5);k=m.clone();k.lerpSelf(l,0.5);y.a=f;y.b=g;y.c=u;y.d=t;s.a=t;s.b=u;s.c=h;s.d=j;if(e.vertexNormals.length===4){f=e.vertexNormals[1].clone(); -f.lerpSelf(e.vertexNormals[2],0.5);g=e.vertexNormals[3].clone();g.lerpSelf(e.vertexNormals[0],0.5);y.vertexNormals[2].copy(f);y.vertexNormals[3].copy(g);s.vertexNormals[0].copy(g);s.vertexNormals[1].copy(f)}if(e.vertexColors.length===4){f=e.vertexColors[1].clone();f.lerpSelf(e.vertexColors[2],0.5);g=e.vertexColors[3].clone();g.lerpSelf(e.vertexColors[0],0.5);y.vertexColors[2].copy(f);y.vertexColors[3].copy(g);s.vertexColors[0].copy(g);s.vertexColors[1].copy(f)}e=1}w.push(y,s);a.vertices.push(o,k); -f=0;for(g=a.faceVertexUvs.length;fe-1?e-1:p+1,q=k-1<0?0:k-1,n=k+1>d-1?d-1:k+1,r=[],u=[0,0,h[(p*d+k)*4]/255*b];r.push([-1,0,h[(p*d+q)*4]/255*b]);r.push([-1,-1,h[(m*d+q)*4]/255*b]);r.push([0, --1,h[(m*d+k)*4]/255*b]);r.push([1,-1,h[(m*d+n)*4]/255*b]);r.push([1,0,h[(p*d+n)*4]/255*b]);r.push([1,1,h[(o*d+n)*4]/255*b]);r.push([0,1,h[(o*d+k)*4]/255*b]);r.push([-1,1,h[(o*d+q)*4]/255*b]);m=[];q=r.length;for(o=0;o 0\nuniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\nuniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\n#endif\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\n#ifdef WRAP_AROUND\nuniform vec3 wrapRGB;\n#endif\nvarying vec3 vViewPosition;", -THREE.ShaderChunk.shadowmap_pars_fragment,THREE.ShaderChunk.fog_pars_fragment,"void main() {\ngl_FragColor = vec4( vec3( 1.0 ), uOpacity );\nvec3 specularTex = vec3( 1.0 );\nvec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\nnormalTex.xy *= uNormalScale;\nnormalTex = normalize( normalTex );\nif( enableDiffuse ) {\n#ifdef GAMMA_INPUT\nvec4 texelColor = texture2D( tDiffuse, vUv );\ntexelColor.xyz *= texelColor.xyz;\ngl_FragColor = gl_FragColor * texelColor;\n#else\ngl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\n#endif\n}\nif( enableAO ) {\n#ifdef GAMMA_INPUT\nvec4 aoColor = texture2D( tAO, vUv );\naoColor.xyz *= aoColor.xyz;\ngl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\n#else\ngl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\n#endif\n}\nif( enableSpecular )\nspecularTex = texture2D( tSpecular, vUv ).xyz;\nmat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\nvec3 finalNormal = tsb * normalTex;\nvec3 normal = normalize( finalNormal );\nvec3 viewPosition = normalize( vViewPosition );\n#if MAX_POINT_LIGHTS > 0\nvec3 pointDiffuse = vec3( 0.0 );\nvec3 pointSpecular = vec3( 0.0 );\nfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\nvec3 pointVector = normalize( vPointLight[ i ].xyz );\nfloat pointDistance = vPointLight[ i ].w;\n#ifdef WRAP_AROUND\nfloat pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\nfloat pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\nvec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\n#else\nfloat pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\n#endif\npointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\nvec3 pointHalfVector = normalize( pointVector + viewPosition );\nfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\nfloat pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\npointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\n#else\npointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\n#endif\n}\n#endif\n#if MAX_DIR_LIGHTS > 0\nvec3 dirDiffuse = vec3( 0.0 );\nvec3 dirSpecular = vec3( 0.0 );\nfor( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\nvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\nvec3 dirVector = normalize( lDirection.xyz );\n#ifdef WRAP_AROUND\nfloat directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\nfloat directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\nvec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\n#else\nfloat dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\n#endif\ndirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\nvec3 dirHalfVector = normalize( dirVector + viewPosition );\nfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\nfloat dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\n#ifdef PHYSICALLY_BASED_SHADING\nfloat specularNormalization = ( uShininess + 2.0001 ) / 8.0;\nvec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\ndirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\n#else\ndirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\n#endif\n}\n#endif\nvec3 totalDiffuse = vec3( 0.0 );\nvec3 totalSpecular = vec3( 0.0 );\n#if MAX_DIR_LIGHTS > 0\ntotalDiffuse += dirDiffuse;\ntotalSpecular += dirSpecular;\n#endif\n#if MAX_POINT_LIGHTS > 0\ntotalDiffuse += pointDiffuse;\ntotalSpecular += pointSpecular;\n#endif\ngl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;\nif ( enableReflection ) {\nvec3 wPos = cameraPosition - vViewPosition;\nvec3 vReflect = reflect( normalize( wPos ), normal );\nvec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\n#ifdef GAMMA_INPUT\ncubeColor.xyz *= cubeColor.xyz;\n#endif\ngl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\n}", -THREE.ShaderChunk.shadowmap_fragment,THREE.ShaderChunk.linear_to_gamma_fragment,THREE.ShaderChunk.fog_fragment,"}"].join("\n"),vertexShader:["attribute vec4 tangent;\nuniform vec2 uOffset;\nuniform vec2 uRepeat;\n#ifdef VERTEX_TEXTURES\nuniform sampler2D tDisplacement;\nuniform float uDisplacementScale;\nuniform float uDisplacementBias;\n#endif\nvarying vec3 vTangent;\nvarying vec3 vBinormal;\nvarying vec3 vNormal;\nvarying vec2 vUv;\n#if MAX_POINT_LIGHTS > 0\nuniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\nuniform float pointLightDistance[ MAX_POINT_LIGHTS ];\nvarying vec4 vPointLight[ MAX_POINT_LIGHTS ];\n#endif\nvarying vec3 vViewPosition;", -THREE.ShaderChunk.shadowmap_pars_vertex,"void main() {\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nvViewPosition = -mvPosition.xyz;\nvNormal = normalMatrix * normal;\nvTangent = normalMatrix * tangent.xyz;\nvBinormal = cross( vNormal, vTangent ) * tangent.w;\nvUv = uv * uRepeat + uOffset;\n#if MAX_POINT_LIGHTS > 0\nfor( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {\nvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\nvec3 lVector = lPosition.xyz - mvPosition.xyz;\nfloat lDistance = 1.0;\nif ( pointLightDistance[ i ] > 0.0 )\nlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\nlVector = normalize( lVector );\nvPointLight[ i ] = vec4( lVector, lDistance );\n}\n#endif\n#ifdef VERTEX_TEXTURES\nvec3 dv = texture2D( tDisplacement, uv ).xyz;\nfloat df = uDisplacementScale * dv.x + uDisplacementBias;\nvec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;\ngl_Position = projectionMatrix * displacedPosition;\n#else\ngl_Position = projectionMatrix * mvPosition;\n#endif", -THREE.ShaderChunk.shadowmap_vertex,"}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:1,texture:null},tFlip:{type:"f",value:-1}},vertexShader:"varying vec3 vViewPosition;\nvoid main() {\nvec4 mPosition = objectMatrix * vec4( position, 1.0 );\nvViewPosition = cameraPosition - mPosition.xyz;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",fragmentShader:"uniform samplerCube tCube;\nuniform float tFlip;\nvarying vec3 vViewPosition;\nvoid main() {\nvec3 wPos = cameraPosition - vViewPosition;\ngl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );\n}"}}}); -THREE.BufferGeometry=function(){this.id=THREE.GeometryCount++;this.vertexColorArray=this.vertexUvArray=this.vertexNormalArray=this.vertexPositionArray=this.vertexIndexArray=this.vertexColorBuffer=this.vertexUvBuffer=this.vertexNormalBuffer=this.vertexPositionBuffer=this.vertexIndexBuffer=null;this.dynamic=false;this.boundingSphere=this.boundingBox=null;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,computeBoundingBox:function(){},computeBoundingSphere:function(){}}; -THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(){console.log("Warning, getPoint() not implemented!");return null};THREE.Curve.prototype.getPointAt=function(a){return this.getPoint(this.getUtoTmapping(a))};THREE.Curve.prototype.getPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPoint(b/a));return c};THREE.Curve.prototype.getSpacedPoints=function(a){a||(a=5);var b,c=[];for(b=0;b<=a;b++)c.push(this.getPointAt(b/a));return c}; -THREE.Curve.prototype.getLength=function(){var a=this.getLengths();return a[a.length-1]};THREE.Curve.prototype.getLengths=function(a){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length==a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=false;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++){c=this.getPoint(e/a);f=f+c.distanceTo(d);b.push(f);d=c}return this.cacheArcLengths=b}; -THREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(a,b){var c=this.getLengths(),d=0,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,j;g<=h;){d=Math.floor(g+(h-g)/2);j=c[d]-f;if(j<0)g=d+1;else if(j>0)h=d-1;else{h=d;break}}d=h;if(c[d]==f)return d/(e-1);g=c[d];return c=(d+(f-g)/(c[d+1]-g))/(e-1)};THREE.Curve.prototype.getNormalVector=function(a){a=this.getTangent(a);return new THREE.Vector2(-a.y,a.x)}; -THREE.Curve.prototype.getTangent=function(a){var b=a-1.0E-4,a=a+1.0E-4;b<0&&(b=0);a>1&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().subSelf(b).normalize()};THREE.Curve.prototype.getTangentAt=function(a){return this.getTangent(this.getUtoTmapping(a))};THREE.LineCurve=function(a,b){this.v1=a;this.v2=b};THREE.LineCurve.prototype=new THREE.Curve;THREE.LineCurve.prototype.constructor=THREE.LineCurve; -THREE.LineCurve.prototype.getPoint=function(a){var b=this.v2.clone().subSelf(this.v1);b.multiplyScalar(a).addSelf(this.v1);return b};THREE.LineCurve.prototype.getPointAt=function(a){return this.getPoint(a)};THREE.LineCurve.prototype.getTangent=function(){return this.v2.clone().subSelf(this.v1).normalize()};THREE.QuadraticBezierCurve=function(a,b,c){this.v0=a;this.v1=b;this.v2=c};THREE.QuadraticBezierCurve.prototype=new THREE.Curve;THREE.QuadraticBezierCurve.prototype.constructor=THREE.QuadraticBezierCurve; -THREE.QuadraticBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(b,a)};THREE.QuadraticBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.x,this.v1.x,this.v2.x);a=THREE.Curve.Utils.tangentQuadraticBezier(a,this.v0.y,this.v1.y,this.v2.y);b=new THREE.Vector2(b,a);b.normalize();return b}; -THREE.CubicBezierCurve=function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d};THREE.CubicBezierCurve.prototype=new THREE.Curve;THREE.CubicBezierCurve.prototype.constructor=THREE.CubicBezierCurve;THREE.CubicBezierCurve.prototype.getPoint=function(a){var b;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);return new THREE.Vector2(b,a)}; -THREE.CubicBezierCurve.prototype.getTangent=function(a){var b;b=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);a=THREE.Curve.Utils.tangentCubicBezier(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);b=new THREE.Vector2(b,a);b.normalize();return b};THREE.SplineCurve=function(a){this.points=a==void 0?[]:a};THREE.SplineCurve.prototype=new THREE.Curve;THREE.SplineCurve.prototype.constructor=THREE.SplineCurve; -THREE.SplineCurve.prototype.getPoint=function(a){var b=new THREE.Vector2,c=[],d=this.points,e;e=(d.length-1)*a;a=Math.floor(e);e=e-a;c[0]=a==0?a:a-1;c[1]=a;c[2]=a>d.length-2?d.length-1:a+1;c[3]=a>d.length-3?d.length-1:a+2;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);return b}; -THREE.ArcCurve=function(a,b,c,d,e,f){this.aX=a;this.aY=b;this.aRadius=c;this.aStartAngle=d;this.aEndAngle=e;this.aClockwise=f};THREE.ArcCurve.prototype=new THREE.Curve;THREE.ArcCurve.prototype.constructor=THREE.ArcCurve;THREE.ArcCurve.prototype.getPoint=function(a){var b=this.aEndAngle-this.aStartAngle;this.aClockwise||(a=1-a);b=this.aStartAngle+a*b;a=this.aX+this.aRadius*Math.cos(b);b=this.aY+this.aRadius*Math.sin(b);return new THREE.Vector2(a,b)}; -THREE.Curve.Utils={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){var a=(c-a)*0.5,d=(d-b)*0.5,f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*f+a*e+b}}; -THREE.Curve.create=function(a,b){a.prototype=new THREE.Curve;a.prototype.constructor=a;a.prototype.getPoint=b;return a};THREE.LineCurve3=THREE.Curve.create(function(a,b){this.v1=a;this.v2=b},function(a){var b=new THREE.Vector3;b.sub(this.v2,this.v1);b.multiplyScalar(a);b.addSelf(this.v1);return b}); -THREE.QuadraticBezierCurve3=THREE.Curve.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b,c;b=THREE.Shape.Utils.b2(a,this.v0.x,this.v1.x,this.v2.x);c=THREE.Shape.Utils.b2(a,this.v0.y,this.v1.y,this.v2.y);a=THREE.Shape.Utils.b2(a,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(b,c,a)}); -THREE.CubicBezierCurve3=THREE.Curve.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b,c;b=THREE.Shape.Utils.b3(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x);c=THREE.Shape.Utils.b3(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y);a=THREE.Shape.Utils.b3(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(b,c,a)}); -THREE.SplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e,a=(d.length-1)*a;e=Math.floor(a);a=a-e;c[0]=e==0?e:e-1;c[1]=e;c[2]=e>d.length-2?d.length-1:e+1;c[3]=e>d.length-3?d.length-1:e+2;e=d[c[0]];var f=d[c[1]],g=d[c[2]],c=d[c[3]];b.x=THREE.Curve.Utils.interpolate(e.x,f.x,g.x,c.x,a);b.y=THREE.Curve.Utils.interpolate(e.y,f.y,g.y,c.y,a);b.z=THREE.Curve.Utils.interpolate(e.z,f.z,g.z,c.z,a);return b}); -THREE.ClosedSplineCurve3=THREE.Curve.create(function(a){this.points=a==void 0?[]:a},function(a){var b=new THREE.Vector3,c=[],d=this.points,e;e=(d.length-0)*a;a=Math.floor(e);e=e-a;a=a+(a>0?0:(Math.floor(Math.abs(a)/d.length)+1)*d.length);c[0]=(a-1)%d.length;c[1]=a%d.length;c[2]=(a+1)%d.length;c[3]=(a+2)%d.length;b.x=THREE.Curve.Utils.interpolate(d[c[0]].x,d[c[1]].x,d[c[2]].x,d[c[3]].x,e);b.y=THREE.Curve.Utils.interpolate(d[c[0]].y,d[c[1]].y,d[c[2]].y,d[c[3]].y,e);b.z=THREE.Curve.Utils.interpolate(d[c[0]].z, -d[c[1]].z,d[c[2]].z,d[c[3]].z,e);return b});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=new THREE.Curve;THREE.CurvePath.prototype.constructor=THREE.CurvePath;THREE.CurvePath.prototype.add=function(a){this.curves.push(a)};THREE.CurvePath.prototype.checkConnection=function(){}; -THREE.CurvePath.prototype.closePath=function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new THREE.LineCurve(b,a))};THREE.CurvePath.prototype.getPoint=function(a){for(var b=a*this.getLength(),c=this.getCurveLengths(),a=0;a=b){b=c[a]-b;a=this.curves[a];b=1-b/a.getLength();return a.getPointAt(b)}a++}return null};THREE.CurvePath.prototype.getLength=function(){var a=this.getCurveLengths();return a[a.length-1]}; -THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length)return this.cacheLengths;var a=[],b=0,c,d=this.curves.length;for(c=0;cb)b=f.x;else if(f.xc)c=f.y;else if(f.y0){g=c[c.length-1]; -o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b2(n,o,p,h);n=THREE.Shape.Utils.b2(n,q,m,j);c.push(new THREE.Vector2(g,n))}break;case THREE.PathActions.BEZIER_CURVE_TO:h=f[4];j=f[5];p=f[0];m=f[1];l=f[2];k=f[3];if(c.length>0){g=c[c.length-1];o=g.x;q=g.y}else{g=this.actions[d-1].args;o=g[g.length-2];q=g[g.length-1]}for(f=1;f<=a;f++){n=f/a;g=THREE.Shape.Utils.b3(n,o,p,l,h);n=THREE.Shape.Utils.b3(n,q,m,k,j);c.push(new THREE.Vector2(g, -n))}break;case THREE.PathActions.CSPLINE_THRU:g=this.actions[d-1].args;n=[new THREE.Vector2(g[g.length-2],g[g.length-1])];g=a*f[0].length;n=n.concat(f[0]);n=new THREE.SplineCurve(n);for(f=1;f<=g;f++)c.push(n.getPointAt(f/g));break;case THREE.PathActions.ARC:h=f[0];j=f[1];l=f[2];p=f[3];m=!!f[5];k=f[4]-p;o=a*2;for(f=1;f<=o;f++){n=f/o;m||(n=1-n);n=p+n*k;g=h+l*Math.cos(n);n=j+l*Math.sin(n);c.push(new THREE.Vector2(g,n))}}}d=c[c.length-1];Math.abs(d.x-c[0].x)<1.0E-10&&Math.abs(d.y-c[0].y)<1.0E-10&&c.splice(c.length- -1,1);b&&c.push(c[0]);return c};THREE.Path.prototype.transform=function(a,b){this.getBoundingBox();return this.getWrapPoints(this.getPoints(b),a)};THREE.Path.prototype.nltransform=function(a,b,c,d,e,f){var g=this.getPoints(),h,j,l,k,p;h=0;for(j=g.length;h=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;var n=[l[g],c[h],c[e]];p=THREE.FontUtils.Triangulate.area(n);var r=[l[g],l[f],c[h]];m=THREE.FontUtils.Triangulate.area(r);o=h;k=g;h=h+1;g=g+ --1;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1;n=[l[g],c[h],c[e]];n=THREE.FontUtils.Triangulate.area(n);r=[l[g],l[f],c[h]];r=THREE.FontUtils.Triangulate.area(r);if(p+m>n+r){h=o;g=k;h<0&&(h=h+c.length);h=h%c.length;g<0&&(g=g+l.length);g=g%l.length;e=h-1>=0?h-1:c.length-1;f=g-1>=0?g-1:l.length-1}p=c.slice(0,h);m=c.slice(h);o=l.slice(g);k=l.slice(0,g);f=[l[g],l[f],c[h]];q.push([l[g],c[h],c[e]]);q.push(f);c=p.concat(o).concat(k).concat(m)}return{shape:c, -isolatedPts:q,allpoints:d}},triangulateShape:function(a,b){var c=THREE.Shape.Utils.removeHoles(a,b),d=c.allpoints,e=c.isolatedPts,c=THREE.FontUtils.Triangulate(c.shape,false),f,g,h,j,l={};f=0;for(g=d.length;f1){console.log("THREE.Animation.update: Warning! Scale out of bounds:"+d+" on bone "+o);d=d<0?0:1}if(c==="pos"){c=a.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType=== -THREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith("pos",o,g.index-1).pos;this.points[1]=e;this.points[2]=f;this.points[3]=this.getNextKeyWith("pos",o,h.index+1).pos;d=d*0.33+0.33;e=this.interpolateCatmullRom(this.points,d);c.x=e[0];c.y=e[1];c.z=e[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){d=this.interpolateCatmullRom(this.points,d*1.01);this.target.set(d[0],d[1],d[2]);this.target.subSelf(c);this.target.y=0;this.target.normalize();d=Math.atan2(this.target.x, -this.target.z);a.rotation.set(0,d,0)}}}else if(c==="rot")THREE.Quaternion.slerp(e,f,a.quaternion,d);else if(c==="scl"){c=a.scale;c.x=e[0]+(f[0]-e[0])*d;c.y=e[1]+(f[1]-e[1])*d;c.z=e[2]+(f[2]-e[2])*d}}}}if(this.JITCompile&&k[0][l]===void 0){this.hierarchy[0].updateMatrixWorld(true);for(o=0;oa.length-2?f:f+1;c[3]=f>a.length-3?f:f+2;f=a[c[0]];h=a[c[1]];j=a[c[2]];l=a[c[3]];c=e*e;g=e*c;d[0]=this.interpolate(f[0],h[0],j[0],l[0],e,c,g);d[1]=this.interpolate(f[1],h[1],j[1],l[1],e,c,g);d[2]=this.interpolate(f[2],h[2],j[2],l[2],e,c,g);return d}; -THREE.Animation.prototype.interpolate=function(a,b,c,d,e,f,g){a=(c-a)*0.5;d=(d-b)*0.5;return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b};THREE.Animation.prototype.getNextKeyWith=function(a,b,c){for(var d=this.data.hierarchy[b].keys,c=this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD?c0?c:0:c>=0?c:c+d.length;c>=0;c--)if(d[c][a]!==void 0)return d[c];return this.data.hierarchy[b].keys[d.length-1]}; -THREE.KeyFrameAnimation=function(a,b,c){this.root=a;this.data=THREE.AnimationHandler.get(b);this.hierarchy=THREE.AnimationHandler.parse(a);this.currentTime=0;this.timeScale=0.001;this.isPlaying=false;this.loop=this.isPaused=true;this.JITCompile=c!==void 0?c:true;a=0;for(b=this.hierarchy.length;a=g?b.interpolate(c,g):b.interpolate(c,c.time)}this.data.hierarchy[a].node.updateMatrix();d.matrixWorldNeedsUpdate=true}}if(this.JITCompile&&f[0][e]===void 0){this.hierarchy[0].updateMatrixWorld(true); -for(a=0;a=0?c:c+b.length;c>=0;c--)if(b[c].hasTarget(a))return b[c];return b[b.length-1]}; -THREE.CubeCamera=function(a,b,c){THREE.Object3D.call(this);var d=new THREE.PerspectiveCamera(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new THREE.Vector3(1,0,0));this.add(d);var e=new THREE.PerspectiveCamera(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new THREE.Vector3(-1,0,0));this.add(e);var f=new THREE.PerspectiveCamera(90,1,a,b);f.up.set(0,0,1);f.lookAt(new THREE.Vector3(0,1,0));this.add(f);var g=new THREE.PerspectiveCamera(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new THREE.Vector3(0,-1,0));this.add(g);var h=new THREE.PerspectiveCamera(90, -1,a,b);h.up.set(0,-1,0);h.lookAt(new THREE.Vector3(0,0,1));this.add(h);var j=new THREE.PerspectiveCamera(90,1,a,b);j.up.set(0,-1,0);j.lookAt(new THREE.Vector3(0,0,-1));this.add(j);this.renderTarget=new THREE.WebGLRenderTargetCube(c,c,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(a,b){var c=this.renderTarget,m=c.generateMipmaps;c.generateMipmaps=false;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace= -2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.generateMipmaps=m;c.activeCubeFace=5;a.render(b,j,c)}};THREE.CubeCamera.prototype=new THREE.Object3D;THREE.CubeCamera.prototype.constructor=THREE.CubeCamera; -THREE.CombinedCamera=function(a,b,c,d,e,f,g){THREE.Camera.call(this);this.fov=c;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2;this.cameraO=new THREE.OrthographicCamera(a/-2,a/2,b/2,b/-2,f,g);this.cameraP=new THREE.PerspectiveCamera(c,a/b,d,e);this.zoom=1;this.toPerspective()};THREE.CombinedCamera.prototype=new THREE.Camera;THREE.CombinedCamera.prototype.constructor=THREE.CombinedCamera; -THREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPersepectiveMode=true;this.inOrthographicMode=false}; -THREE.CombinedCamera.prototype.toOrthographic=function(){var a=this.cameraP.aspect,b=(this.cameraP.near+this.cameraP.far)/2,b=Math.tan(this.fov/2)*b,a=2*b*a/2,b=b/this.zoom,a=a/this.zoom;this.cameraO.left=-a;this.cameraO.right=a;this.cameraO.top=b;this.cameraO.bottom=-b;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPersepectiveMode=false;this.inOrthographicMode=true}; -THREE.CombinedCamera.prototype.setSize=function(a,b){this.cameraP.aspect=a/b;this.left=-a/2;this.right=a/2;this.top=b/2;this.bottom=-b/2};THREE.CombinedCamera.prototype.setFov=function(a){this.fov=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPersepectiveMode)this.toPerspective();else{this.toPerspective();this.toOrthographic()}}; -THREE.CombinedCamera.prototype.setLens=function(a,b){var c=2*Math.atan((b!==void 0?b:24)/(a*2))*(180/Math.PI);this.setFov(c);return c};THREE.CombinedCamera.prototype.setZoom=function(a){this.zoom=a;this.inPersepectiveMode?this.toPerspective():this.toOrthographic()};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false}; -THREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false}; -THREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false}; -THREE.FirstPersonControls=function(a,b){function c(a,b){return function(){b.apply(a,arguments)}}this.object=a;this.target=new THREE.Vector3(0,0,0);this.domElement=b!==void 0?b:document;this.movementSpeed=1;this.lookSpeed=0.005;this.noFly=false;this.lookVertical=true;this.autoForward=false;this.activeLook=true;this.heightSpeed=false;this.heightCoef=1;this.heightMin=0;this.constrainVertical=false;this.verticalMin=0;this.verticalMax=Math.PI;this.theta=this.phi=this.lon=this.lat=this.mouseY=this.mouseX= -this.autoSpeedFactor=0;this.mouseDragOn=this.freeze=this.moveRight=this.moveLeft=this.moveBackward=this.moveForward=false;if(this.domElement===document){this.viewHalfX=window.innerWidth/2;this.viewHalfY=window.innerHeight/2}else{this.viewHalfX=this.domElement.offsetWidth/2;this.viewHalfY=this.domElement.offsetHeight/2;this.domElement.setAttribute("tabindex",-1)}this.onMouseDown=function(a){this.domElement!==document&&this.domElement.focus();a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward= -true;break;case 2:this.moveBackward=true}this.mouseDragOn=true};this.onMouseUp=function(a){a.preventDefault();a.stopPropagation();if(this.activeLook)switch(a.button){case 0:this.moveForward=false;break;case 2:this.moveBackward=false}this.mouseDragOn=false};this.onMouseMove=function(a){if(this.domElement===document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}}; -this.onKeyDown=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=true;break;case 37:case 65:this.moveLeft=true;break;case 40:case 83:this.moveBackward=true;break;case 39:case 68:this.moveRight=true;break;case 82:this.moveUp=true;break;case 70:this.moveDown=true;break;case 81:this.freeze=!this.freeze}};this.onKeyUp=function(a){switch(a.keyCode){case 38:case 87:this.moveForward=false;break;case 37:case 65:this.moveLeft=false;break;case 40:case 83:this.moveBackward=false;break;case 39:case 68:this.moveRight= -false;break;case 82:this.moveUp=false;break;case 70:this.moveDown=false}};this.update=function(a){var b=0;if(!this.freeze){if(this.heightSpeed){b=THREE.Math.clamp(this.object.position.y,this.heightMin,this.heightMax)-this.heightMin;this.autoSpeedFactor=a*b*this.heightCoef}else this.autoSpeedFactor=0;b=a*this.movementSpeed;(this.moveForward||this.autoForward&&!this.moveBackward)&&this.object.translateZ(-(b+this.autoSpeedFactor));this.moveBackward&&this.object.translateZ(b);this.moveLeft&&this.object.translateX(-b); -this.moveRight&&this.object.translateX(b);this.moveUp&&this.object.translateY(b);this.moveDown&&this.object.translateY(-b);a=a*this.lookSpeed;this.activeLook||(a=0);this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;var b=this.target,c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)* -Math.sin(this.theta);b=1;this.constrainVertical&&(b=Math.PI/(this.verticalMax-this.verticalMin));this.lon=this.lon+this.mouseX*a;if(this.lookVertical)this.lat=this.lat-this.mouseY*a*b;this.lat=Math.max(-85,Math.min(85,this.lat));this.phi=(90-this.lat)*Math.PI/180;this.theta=this.lon*Math.PI/180;if(this.constrainVertical)this.phi=THREE.Math.mapLinear(this.phi,0,Math.PI,this.verticalMin,this.verticalMax);b=this.target;c=this.object.position;b.x=c.x+100*Math.sin(this.phi)*Math.cos(this.theta);b.y=c.y+ -100*Math.cos(this.phi);b.z=c.z+100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(b)}};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},false);this.domElement.addEventListener("mousemove",c(this,this.onMouseMove),false);this.domElement.addEventListener("mousedown",c(this,this.onMouseDown),false);this.domElement.addEventListener("mouseup",c(this,this.onMouseUp),false);this.domElement.addEventListener("keydown",c(this,this.onKeyDown),false);this.domElement.addEventListener("keyup", -c(this,this.onKeyUp),false)}; -THREE.PathControls=function(a,b){function c(a){return(a=a*2)<1?0.5*a*a:-0.5*(--a*(a-2)-1)}function d(a,b){return function(){b.apply(a,arguments)}}function e(a,b,c,d){var e={name:c,fps:0.6,length:d,hierarchy:[]},f,g=b.getControlPointsArray(),h=b.getLength(),r=g.length,u=0;f=r-1;b={parent:-1,keys:[]};b.keys[0]={time:0,pos:g[0],rot:[0,0,0,1],scl:[1,1,1]};b.keys[f]={time:d,pos:g[f],rot:[0,0,0,1],scl:[1,1,1]};for(f=1;f=0?a:a+g;b=this.verticalAngleMap.srcRange;a=this.verticalAngleMap.dstRange; -b=THREE.Math.mapLinear(this.phi,b[0],b[1],a[0],a[1]);var d=a[1]-a[0];this.phi=c((b-a[0])/d)*d+a[0];b=this.horizontalAngleMap.srcRange;a=this.horizontalAngleMap.dstRange;b=THREE.Math.mapLinear(this.theta,b[0],b[1],a[0],a[1]);d=a[1]-a[0];this.theta=c((b-a[0])/d)*d+a[0];a=this.target.position;a.x=100*Math.sin(this.phi)*Math.cos(this.theta);a.y=100*Math.cos(this.phi);a.z=100*Math.sin(this.phi)*Math.sin(this.theta);this.object.lookAt(this.target.position)};this.onMouseMove=function(a){if(this.domElement=== -document){this.mouseX=a.pageX-this.viewHalfX;this.mouseY=a.pageY-this.viewHalfY}else{this.mouseX=a.pageX-this.domElement.offsetLeft-this.viewHalfX;this.mouseY=a.pageY-this.domElement.offsetTop-this.viewHalfY}};this.init=function(){this.spline=new THREE.Spline;this.spline.initFromArray(this.waypoints);this.useConstantSpeed&&this.spline.reparametrizeByArcLength(this.resamplingCoef);if(this.createDebugDummy){var a=new THREE.MeshLambertMaterial({color:30719}),b=new THREE.MeshLambertMaterial({color:65280}), -c=new THREE.CubeGeometry(10,10,20),g=new THREE.CubeGeometry(2,2,10);this.animationParent=new THREE.Mesh(c,a);a=new THREE.Mesh(g,b);a.position.set(0,10,0);this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.object);this.animationParent.add(this.target);this.animationParent.add(a)}else{this.animation=e(this.animationParent,this.spline,this.id,this.duration);this.animationParent.add(this.target);this.animationParent.add(this.object)}if(this.createDebugPath){var a= -this.debugPath,b=this.spline,g=f(b,10),c=f(b,10),h=new THREE.LineBasicMaterial({color:16711680,linewidth:3}),g=new THREE.Line(g,h),c=new THREE.ParticleSystem(c,new THREE.ParticleBasicMaterial({color:16755200,size:3}));g.scale.set(1,1,1);a.add(g);c.scale.set(1,1,1);a.add(c);for(var g=new THREE.SphereGeometry(1,16,8),h=new THREE.MeshBasicMaterial({color:65280}),o=0;o0){var b=this.getContainerDimensions(),c=b.size[0]/2,g=b.size[1]/2;this.moveState.yawLeft=-(a.pageX-b.offset[0]-c)/c;this.moveState.pitchDown=(a.pageY-b.offset[1]-g)/g;this.updateRotationVector()}};this.mouseup=function(a){a.preventDefault();a.stopPropagation();if(this.dragToLook){this.mouseStatus--;this.moveState.yawLeft=this.moveState.pitchDown=0}else switch(a.button){case 0:this.moveForward= -false;break;case 2:this.moveBackward=false}this.updateRotationVector()};this.update=function(a){var b=a*this.movementSpeed,a=a*this.rollSpeed;this.object.translateX(this.moveVector.x*b);this.object.translateY(this.moveVector.y*b);this.object.translateZ(this.moveVector.z*b);this.tmpQuaternion.set(this.rotationVector.x*a,this.rotationVector.y*a,this.rotationVector.z*a,1).normalize();this.object.quaternion.multiplySelf(this.tmpQuaternion);this.object.matrix.setPosition(this.object.position);this.object.matrix.setRotationFromQuaternion(this.object.quaternion); -this.object.matrixWorldNeedsUpdate=true};this.updateMovementVector=function(){var a=this.moveState.forward||this.autoForward&&!this.moveState.back?1:0;this.moveVector.x=-this.moveState.left+this.moveState.right;this.moveVector.y=-this.moveState.down+this.moveState.up;this.moveVector.z=-a+this.moveState.back};this.updateRotationVector=function(){this.rotationVector.x=-this.moveState.pitchDown+this.moveState.pitchUp;this.rotationVector.y=-this.moveState.yawRight+this.moveState.yawLeft;this.rotationVector.z= --this.moveState.rollRight+this.moveState.rollLeft};this.getContainerDimensions=function(){return this.domElement!=document?{size:[this.domElement.offsetWidth,this.domElement.offsetHeight],offset:[this.domElement.offsetLeft,this.domElement.offsetTop]}:{size:[window.innerWidth,window.innerHeight],offset:[0,0]}};this.domElement.addEventListener("mousemove",c(this,this.mousemove),false);this.domElement.addEventListener("mousedown",c(this,this.mousedown),false);this.domElement.addEventListener("mouseup", -c(this,this.mouseup),false);this.domElement.addEventListener("keydown",c(this,this.keydown),false);this.domElement.addEventListener("keyup",c(this,this.keyup),false);this.updateMovementVector();this.updateRotationVector()}; -THREE.RollControls=function(a,b){this.object=a;this.domElement=b!==void 0?b:document;this.mouseLook=true;this.autoForward=false;this.rollSpeed=this.movementSpeed=this.lookSpeed=1;this.constrainVertical=[-0.9,0.9];this.object.matrixAutoUpdate=false;this.forward=new THREE.Vector3(0,0,1);this.roll=0;var c=new THREE.Vector3,d=new THREE.Vector3,e=new THREE.Vector3,f=new THREE.Matrix4,g=false,h=1,j=0,l=0,k=0,p=0,m=0,o=window.innerWidth/2,q=window.innerHeight/2;this.update=function(a){if(this.mouseLook){var b= -a*this.lookSpeed;this.rotateHorizontally(b*p);this.rotateVertically(b*m)}b=a*this.movementSpeed;this.object.translateZ(-b*(j>0||this.autoForward&&!(j<0)?1:j));this.object.translateX(b*l);this.object.translateY(b*k);if(g)this.roll=this.roll+this.rollSpeed*a*h;if(this.forward.y>this.constrainVertical[1]){this.forward.y=this.constrainVertical[1];this.forward.normalize()}else if(this.forward.y1?d.normalize():d.z=Math.sqrt(1-e*e);g.copy(c.object.position).subSelf(c.target);e=c.object.up.clone().setLength(d.y);e.addSelf(c.object.up.clone().crossSelf(g).setLength(d.x));e.addSelf(g.setLength(d.z));return e};this.rotateCamera=function(){var a=Math.acos(h.dot(j)/h.length()/j.length());if(a){var b=(new THREE.Vector3).cross(h,j).normalize(),d=new THREE.Quaternion,a=a*c.rotateSpeed; -d.setFromAxisAngle(b,-a);d.multiplyVector3(g);d.multiplyVector3(c.object.up);d.multiplyVector3(j);if(c.staticMoving)h=j;else{d.setFromAxisAngle(b,a*(c.dynamicDampingFactor-1));d.multiplyVector3(h)}}};this.zoomCamera=function(){var a=1+(k.y-l.y)*c.zoomSpeed;if(a!==1&&a>0){g.multiplyScalar(a);c.staticMoving?l=k:l.y=l.y+(k.y-l.y)*this.dynamicDampingFactor}};this.panCamera=function(){var a=m.clone().subSelf(p);if(a.lengthSq()){a.multiplyScalar(g.length()*c.panSpeed);var b=g.clone().crossSelf(c.object.up).setLength(a.x); -b.addSelf(c.object.up.clone().setLength(a.y));c.object.position.addSelf(b);c.target.addSelf(b);c.staticMoving?p=m:p.addSelf(a.sub(m,p).multiplyScalar(c.dynamicDampingFactor))}};this.checkDistances=function(){if(!c.noZoom||!c.noPan){c.object.position.lengthSq()>c.maxDistance*c.maxDistance&&c.object.position.setLength(c.maxDistance);g.lengthSq()0){c.dispatchEvent(o);d.copy(c.object.position)}};this.domElement.addEventListener("contextmenu",function(a){a.preventDefault()},false);this.domElement.addEventListener("mousemove",function(a){if(c.enabled){if(e){h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY);l=k=c.getMouseOnScreen(a.clientX,a.clientY);p= -m=c.getMouseOnScreen(a.clientX,a.clientY);e=false}f!==-1&&(f===0&&!c.noRotate?j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?k=c.getMouseOnScreen(a.clientX,a.clientY):f===2&&!c.noPan&&(m=c.getMouseOnScreen(a.clientX,a.clientY)))}},false);this.domElement.addEventListener("mousedown",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();if(f===-1){f=a.button;f===0&&!c.noRotate?h=j=c.getMouseProjectionOnBall(a.clientX,a.clientY):f===1&&!c.noZoom?l=k=c.getMouseOnScreen(a.clientX, -a.clientY):this.noPan||(p=m=c.getMouseOnScreen(a.clientX,a.clientY))}}},false);this.domElement.addEventListener("mouseup",function(a){if(c.enabled){a.preventDefault();a.stopPropagation();f=-1}},false);window.addEventListener("keydown",function(a){if(c.enabled&&f===-1){a.keyCode===c.keys[0]&&!c.noRotate?f=0:a.keyCode===c.keys[1]&&!c.noZoom?f=1:a.keyCode===c.keys[2]&&!c.noPan&&(f=2);f!==-1&&(e=true)}},false);window.addEventListener("keyup",function(){c.enabled&&f!==-1&&(f=-1)},false)}; -THREE.CubeGeometry=function(a,b,c,d,e,f,g,h){function j(a,b,c,g,h,j,k,m){var n,p=d||1,o=e||1,q=h/2,r=j/2,t=l.vertices.length;if(a==="x"&&b==="y"||a==="y"&&b==="x")n="z";else if(a==="x"&&b==="z"||a==="z"&&b==="x"){n="y";o=f||1}else if(a==="z"&&b==="y"||a==="y"&&b==="z"){n="x";p=f||1}var i=p+1,u=o+1,y=h/p,C=j/o,Y=new THREE.Vector3;Y[n]=k>0?1:-1;for(h=0;h0){this.vertices.push(new THREE.Vector3(0, -g,0));for(h=0;h0){this.vertices.push(new THREE.Vector3(0,-g,0));for(h=0;ha&&(a=a+Math.PI*2);c=(b+a)/2;a=-Math.cos(c);c=-Math.sin(c);return new THREE.Vector2(a,c)}return d.multiplyScalar(g).addSelf(h).subSelf(a).clone()}function e(c,d){var e,f;for(F=c.length;--F>=0;){e=F;f=F-1;f<0&&(f= -c.length-1);for(var g=0,h=m+k*2,g=0;g=0;D--){G=D/k;i=j*(1-G);M=l*Math.sin(G*Math.PI/2);F=0;for(G=P.length;F0)for(l=0;l2;){if(p--<=0){console.log("Warning, unable to triangulate polygon!");break}j=l;e<=j&&(j=0);l=j+1;e<=l&&(l=0);k=l+1;e<=k&&(k=0);var m;a:{m=a;var o=j,q=l,n=k,r=e,u=g,t=void 0,y=void 0,s=void 0,w=void 0,H=void 0, -E=void 0,z=void 0,v=void 0,A=void 0,y=m[u[o]].x,s=m[u[o]].y,w=m[u[q]].x,H=m[u[q]].y,E=m[u[n]].x,z=m[u[n]].y;if(1.0E-10>(w-y)*(z-s)-(H-s)*(E-y))m=false;else{for(t=0;t=0&&R>=0&&D>=0){m=false;break a}}m=true}}if(m){f.push([a[g[j]], -a[g[l]],a[g[k]]]);h.push([g[j],g[l],g[k]]);j=l;for(k=l+1;k1.0E-4){h.normalize();d=Math.acos(e[l-1].dot(e[l]));j.makeRotationAxis(h,d).multiplyVector3(f[l])}g[l].cross(e[l],f[l])}if(c){d=Math.acos(f[0].dot(f[b-1]));d=d/(b-1);e[0].dot(h.cross(f[0],f[b-1]))>0&&(d=-d);for(l=1;l0;)this.smooth(a)}; -THREE.SubdivisionModifier.prototype.smooth=function(a){function b(){m.debug&&console.log.apply(console,arguments)}function c(){console&&console.log.apply(console,arguments)}function d(a,c,d,e,g,h,i){var j=new THREE.Face4(a,c,d,e,null,g.color,g.material);if(m.useOldVertexColors){j.vertexColors=[];for(var l,n,o,q=0;q<4;q++){o=h[q];l=new THREE.Color;l.setRGB(0,0,0);for(var r=0;r=y&&a1){var j=h[1];d[j]||(d[j]={start:Infinity,end:-Infinity});h=d[j];if(fh.end)h.end=f;c||(c=j)}}for(j in d){h=d[j];this.createAnimation(j,h.start,h.end,a)}this.firstAnimation=c}; -THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a]){a.direction=1;a.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a]){a.direction=-1;a.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];if(c){c.fps=b;c.duration=(c.end-c.start)/c.fps}}; -THREE.MorphBlendMesh.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];if(c){c.duration=b;c.fps=(c.end-c.start)/c.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];if(c)c.weight=b};THREE.MorphBlendMesh.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];if(c)c.time=b};THREE.MorphBlendMesh.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b}; -THREE.MorphBlendMesh.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};THREE.MorphBlendMesh.prototype.playAnimation=function(a){var b=this.animationsMap[a];if(b){b.time=0;b.active=true}else console.warn("animation["+a+"] undefined")};THREE.MorphBlendMesh.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=false}; -THREE.MorphBlendMesh.prototype.update=function(a){for(var b=0,c=this.animationsList.length;bd.duration||d.time<0){d.direction=d.direction*-1;if(d.time>d.duration){d.time=d.duration;d.directionBackwards=true}if(d.time<0){d.time=0;d.directionBackwards=false}}}else{d.time=d.time%d.duration;if(d.time<0)d.time=d.time+d.duration}var f=d.startFrame+THREE.Math.clamp(Math.floor(d.time/ -e),0,d.length-1),g=d.weight;if(f!==d.currentFrame){this.morphTargetInfluences[d.lastFrame]=0;this.morphTargetInfluences[d.currentFrame]=1*g;this.morphTargetInfluences[f]=0;d.lastFrame=d.currentFrame;d.currentFrame=f}e=d.time%e/e;d.directionBackwards&&(e=1-e);this.morphTargetInfluences[d.currentFrame]=e*g;this.morphTargetInfluences[d.lastFrame]=(1-e)*g}}}; -THREE.LensFlarePlugin=function(){function a(a){var c=b.createProgram(),d=b.createShader(b.FRAGMENT_SHADER),e=b.createShader(b.VERTEX_SHADER);b.shaderSource(d,a.fragmentShader);b.shaderSource(e,a.vertexShader);b.compileShader(d);b.compileShader(e);b.attachShader(c,d);b.attachShader(c,e);b.linkProgram(c);return c}var b,c,d,e,f,g,h,j,l,k,p,m,o;this.init=function(q){b=q.context;c=q;d=new Float32Array(16);e=new Uint16Array(6);q=0;d[q++]=-1;d[q++]=-1;d[q++]=0;d[q++]=0;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]= -0;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=1;d[q++]=-1;d[q++]=1;d[q++]=0;d[q++]=1;q=0;e[q++]=0;e[q++]=1;e[q++]=2;e[q++]=0;e[q++]=2;e[q++]=3;f=b.createBuffer();g=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,f);b.bufferData(b.ARRAY_BUFFER,d,b.STATIC_DRAW);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.bufferData(b.ELEMENT_ARRAY_BUFFER,e,b.STATIC_DRAW);h=b.createTexture();j=b.createTexture();b.bindTexture(b.TEXTURE_2D,h);b.texImage2D(b.TEXTURE_2D,0,b.RGB,16,16,0,b.RGB,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D, -b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);b.bindTexture(b.TEXTURE_2D,j);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,16,16,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.NEAREST); -b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.NEAREST);if(b.getParameter(b.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){l=false;k=a(THREE.ShaderFlares.lensFlare)}else{l=true;k=a(THREE.ShaderFlares.lensFlareVertexTexture)}p={};m={};p.vertex=b.getAttribLocation(k,"position");p.uv=b.getAttribLocation(k,"uv");m.renderType=b.getUniformLocation(k,"renderType");m.map=b.getUniformLocation(k,"map");m.occlusionMap=b.getUniformLocation(k,"occlusionMap");m.opacity=b.getUniformLocation(k,"opacity");m.color=b.getUniformLocation(k, -"color");m.scale=b.getUniformLocation(k,"scale");m.rotation=b.getUniformLocation(k,"rotation");m.screenPosition=b.getUniformLocation(k,"screenPosition");o=false};this.render=function(a,d,e,u){var a=a.__webglFlares,t=a.length;if(t){var y=new THREE.Vector3,s=u/e,w=e*0.5,H=u*0.5,E=16/u,z=new THREE.Vector2(E*s,E),v=new THREE.Vector3(1,1,0),A=new THREE.Vector2(1,1),J=m,E=p;b.useProgram(k);if(!o){b.enableVertexAttribArray(p.vertex);b.enableVertexAttribArray(p.uv);o=true}b.uniform1i(J.occlusionMap,0);b.uniform1i(J.map, -1);b.bindBuffer(b.ARRAY_BUFFER,f);b.vertexAttribPointer(E.vertex,2,b.FLOAT,false,16,0);b.vertexAttribPointer(E.uv,2,b.FLOAT,false,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,g);b.disable(b.CULL_FACE);b.depthMask(false);var K,R,P,D,M;for(K=0;K0&&A.x0&& -A.y0.001&&M.scale>0.001){v.x=M.x;v.y=M.y;v.z=M.z;E=M.size*M.scale/u;z.x=E*s;z.y=E;b.uniform3f(J.screenPosition,v.x,v.y,v.z);b.uniform2f(J.scale,z.x,z.y);b.uniform1f(J.rotation,M.rotation);b.uniform1f(J.opacity,M.opacity); -b.uniform3f(J.color,M.color.r,M.color.g,M.color.b);c.setBlending(M.blending,M.blendEquation,M.blendSrc,M.blendDst);c.setTexture(M.texture,1);b.drawElements(b.TRIANGLES,6,b.UNSIGNED_SHORT,0)}}}}b.enable(b.CULL_FACE);b.enable(b.DEPTH_TEST);b.depthMask(true)}}}; -THREE.ShadowMapPlugin=function(){var a,b,c,d,e=new THREE.Frustum,f=new THREE.Matrix4,g=new THREE.Vector3,h=new THREE.Vector3;this.init=function(e){a=e.context;b=e;var e=THREE.ShaderLib.depthRGBA,f=THREE.UniformsUtils.clone(e.uniforms);c=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f});d=new THREE.ShaderMaterial({fragmentShader:e.fragmentShader,vertexShader:e.vertexShader,uniforms:f,morphTargets:true});c._shadowPass=true;d._shadowPass=true};this.render= -function(a,c){b.shadowMapEnabled&&b.shadowMapAutoUpdate&&this.update(a,c)};this.update=function(j,l){var k,p,m,o,q,n,r,u,t,y=[];o=0;a.clearColor(1,1,1,1);a.disable(a.BLEND);a.enable(a.CULL_FACE);b.shadowMapCullFrontFaces?a.cullFace(a.FRONT):a.cullFace(a.BACK);b.setDepthTest(true);k=0;for(p=j.__lights.length;kh.x)h.x=u.x;if(u.yh.y)h.y=u.y;if(u.zh.z)h.z=u.z}o.left=g.x;o.right=h.x;o.top=h.y;o.bottom=g.y;o.updateProjectionMatrix()}o=m.shadowMap;n=m.shadowMatrix;q=m.shadowCamera;q.position.copy(m.matrixWorld.getPosition());q.lookAt(m.target.matrixWorld.getPosition());q.updateMatrixWorld();q.matrixWorldInverse.getInverse(q.matrixWorld); -if(m.cameraHelper)m.cameraHelper.lines.visible=m.shadowCameraVisible;m.shadowCameraVisible&&m.cameraHelper.update();n.set(0.5,0,0,0.5,0,0.5,0,0.5,0,0,0.5,0.5,0,0,0,1);n.multiplySelf(q.projectionMatrix);n.multiplySelf(q.matrixWorldInverse);if(!q._viewMatrixArray)q._viewMatrixArray=new Float32Array(16);if(!q._projectionMatrixArray)q._projectionMatrixArray=new Float32Array(16);q.matrixWorldInverse.flattenToArray(q._viewMatrixArray);q.projectionMatrix.flattenToArray(q._projectionMatrixArray);f.multiply(q.projectionMatrix, -q.matrixWorldInverse);e.setFromMatrix(f);b.setRenderTarget(o);b.clear();t=j.__webglObjects;m=0;for(o=t.length;m - - var i, f, p, q, t; - - if ( v === 0 ) { - - this.r = this.g = this.b = 0; - - } else { - - i = Math.floor( h * 6 ); - f = ( h * 6 ) - i; - p = v * ( 1 - s ); - q = v * ( 1 - ( s * f ) ); - t = v * ( 1 - ( s * ( 1 - f ) ) ); - - switch ( i ) { - - case 1: this.r = q; this.g = v; this.b = p; break; - case 2: this.r = p; this.g = v; this.b = t; break; - case 3: this.r = p; this.g = q; this.b = v; break; - case 4: this.r = t; this.g = p; this.b = v; break; - case 5: this.r = v; this.g = p; this.b = q; break; - case 6: // fall through - case 0: this.r = v; this.g = t; this.b = p; break; - - } - - } - - return this; - - }, - - setHex: function ( hex ) { - - hex = Math.floor( hex ); - - this.r = ( hex >> 16 & 255 ) / 255; - this.g = ( hex >> 8 & 255 ) / 255; - this.b = ( hex & 255 ) / 255; - - return this; - - }, - - getHex: function () { - - return Math.floor( this.r * 255 ) << 16 ^ Math.floor( this.g * 255 ) << 8 ^ Math.floor( this.b * 255 ); - - }, - - getContextStyle: function () { - - return 'rgb(' + Math.floor( this.r * 255 ) + ',' + Math.floor( this.g * 255 ) + ',' + Math.floor( this.b * 255 ) + ')'; - - }, - - clone: function () { - - return new THREE.Color().setRGB( this.r, this.g, this.b ); - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author philogb / http://blog.thejit.org/ - * @author egraether / http://egraether.com/ - * @author zz85 / http://www.lab4games.net/zz85/blog - */ - -THREE.Vector2 = function ( x, y ) { - - this.x = x || 0; - this.y = y || 0; - -}; - -THREE.Vector2.prototype = { - - constructor: THREE.Vector2, - - set: function ( x, y ) { - - this.x = x; - this.y = y; - - return this; - - }, - - copy: function ( v ) { - - this.x = v.x; - this.y = v.y; - - return this; - - }, - - clone: function () { - - return new THREE.Vector2( this.x, this.y ); - - }, - - - add: function ( v1, v2 ) { - - this.x = v1.x + v2.x; - this.y = v1.y + v2.y; - - return this; - - }, - - addSelf: function ( v ) { - - this.x += v.x; - this.y += v.y; - - return this; - - }, - - sub: function ( v1, v2 ) { - - this.x = v1.x - v2.x; - this.y = v1.y - v2.y; - - return this; - - }, - - subSelf: function ( v ) { - - this.x -= v.x; - this.y -= v.y; - - return this; - - }, - - multiplyScalar: function ( s ) { - - this.x *= s; - this.y *= s; - - return this; - - }, - - divideScalar: function ( s ) { - - if ( s ) { - - this.x /= s; - this.y /= s; - - } else { - - this.set( 0, 0 ); - - } - - return this; - - }, - - - negate: function() { - - return this.multiplyScalar( -1 ); - - }, - - dot: function ( v ) { - - return this.x * v.x + this.y * v.y; - - }, - - lengthSq: function () { - - return this.x * this.x + this.y * this.y; - - }, - - length: function () { - - return Math.sqrt( this.lengthSq() ); - - }, - - normalize: function () { - - return this.divideScalar( this.length() ); - - }, - - distanceTo: function ( v ) { - - return Math.sqrt( this.distanceToSquared( v ) ); - - }, - - distanceToSquared: function ( v ) { - - var dx = this.x - v.x, dy = this.y - v.y; - return dx * dx + dy * dy; - - }, - - - setLength: function ( l ) { - - return this.normalize().multiplyScalar( l ); - - }, - - equals: function( v ) { - - return ( ( v.x === this.x ) && ( v.y === this.y ) ); - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author kile / http://kile.stravaganza.org/ - * @author philogb / http://blog.thejit.org/ - * @author mikael emtinger / http://gomo.se/ - * @author egraether / http://egraether.com/ - */ - -THREE.Vector3 = function ( x, y, z ) { - - this.x = x || 0; - this.y = y || 0; - this.z = z || 0; - -}; - - -THREE.Vector3.prototype = { - - constructor: THREE.Vector3, - - set: function ( x, y, z ) { - - this.x = x; - this.y = y; - this.z = z; - - return this; - - }, - - setX: function ( x ) { - - this.x = x; - - return this; - - }, - - setY: function ( y ) { - - this.y = y; - - return this; - - }, - - setZ: function ( z ) { - - this.z = z; - - return this; - - }, - - copy: function ( v ) { - - this.x = v.x; - this.y = v.y; - this.z = v.z; - - return this; - - }, - - clone: function () { - - return new THREE.Vector3( this.x, this.y, this.z ); - - }, - - - add: function ( v1, v2 ) { - - this.x = v1.x + v2.x; - this.y = v1.y + v2.y; - this.z = v1.z + v2.z; - - return this; - - }, - - addSelf: function ( v ) { - - this.x += v.x; - this.y += v.y; - this.z += v.z; - - return this; - - }, - - addScalar: function ( s ) { - - this.x += s; - this.y += s; - this.z += s; - - return this; - - }, - - sub: function ( v1, v2 ) { - - this.x = v1.x - v2.x; - this.y = v1.y - v2.y; - this.z = v1.z - v2.z; - - return this; - - }, - - subSelf: function ( v ) { - - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - - return this; - - }, - - multiply: function ( a, b ) { - - this.x = a.x * b.x; - this.y = a.y * b.y; - this.z = a.z * b.z; - - return this; - - }, - - multiplySelf: function ( v ) { - - this.x *= v.x; - this.y *= v.y; - this.z *= v.z; - - return this; - - }, - - multiplyScalar: function ( s ) { - - this.x *= s; - this.y *= s; - this.z *= s; - - return this; - - }, - - divideSelf: function ( v ) { - - this.x /= v.x; - this.y /= v.y; - this.z /= v.z; - - return this; - - }, - - divideScalar: function ( s ) { - - if ( s ) { - - this.x /= s; - this.y /= s; - this.z /= s; - - } else { - - this.x = 0; - this.y = 0; - this.z = 0; - - } - - return this; - - }, - - - negate: function() { - - return this.multiplyScalar( -1 ); - - }, - - dot: function ( v ) { - - return this.x * v.x + this.y * v.y + this.z * v.z; - - }, - - lengthSq: function () { - - return this.x * this.x + this.y * this.y + this.z * this.z; - - }, - - length: function () { - - return Math.sqrt( this.lengthSq() ); - - }, - - lengthManhattan: function () { - - // correct version - // return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); - - return this.x + this.y + this.z; - - }, - - normalize: function () { - - return this.divideScalar( this.length() ); - - }, - - setLength: function ( l ) { - - return this.normalize().multiplyScalar( l ); - - }, - - - cross: function ( a, b ) { - - this.x = a.y * b.z - a.z * b.y; - this.y = a.z * b.x - a.x * b.z; - this.z = a.x * b.y - a.y * b.x; - - return this; - - }, - - crossSelf: function ( v ) { - - var x = this.x, y = this.y, z = this.z; - - this.x = y * v.z - z * v.y; - this.y = z * v.x - x * v.z; - this.z = x * v.y - y * v.x; - - return this; - - }, - - - distanceTo: function ( v ) { - - return Math.sqrt( this.distanceToSquared( v ) ); - - }, - - distanceToSquared: function ( v ) { - - return new THREE.Vector3().sub( this, v ).lengthSq(); - - }, - - - setPositionFromMatrix: function ( m ) { - - this.x = m.n14; - this.y = m.n24; - this.z = m.n34; - - }, - - setRotationFromMatrix: function ( m ) { - - var cosY = Math.cos( this.y ); - - this.y = Math.asin( m.n13 ); - - if ( Math.abs( cosY ) > 0.00001 ) { - - this.x = Math.atan2( - m.n23 / cosY, m.n33 / cosY ); - this.z = Math.atan2( - m.n12 / cosY, m.n11 / cosY ); - - } else { - - this.x = 0; - this.z = Math.atan2( m.n21, m.n22 ); - - } - - }, - - isZero: function () { - - return ( this.lengthSq() < 0.0001 /* almostZero */ ); - - } - -}; -/** - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author philogb / http://blog.thejit.org/ - * @author mikael emtinger / http://gomo.se/ - * @author egraether / http://egraether.com/ - */ - -THREE.Vector4 = function ( x, y, z, w ) { - - this.x = x || 0; - this.y = y || 0; - this.z = z || 0; - this.w = ( w !== undefined ) ? w : 1; - -}; - -THREE.Vector4.prototype = { - - constructor: THREE.Vector4, - - set: function ( x, y, z, w ) { - - this.x = x; - this.y = y; - this.z = z; - this.w = w; - - return this; - - }, - - copy: function ( v ) { - - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.w = ( v.w !== undefined ) ? v.w : 1; - - }, - - clone: function () { - - return new THREE.Vector4( this.x, this.y, this.z, this.w ); - - }, - - - add: function ( v1, v2 ) { - - this.x = v1.x + v2.x; - this.y = v1.y + v2.y; - this.z = v1.z + v2.z; - this.w = v1.w + v2.w; - - return this; - - }, - - addSelf: function ( v ) { - - this.x += v.x; - this.y += v.y; - this.z += v.z; - this.w += v.w; - - return this; - - }, - - sub: function ( v1, v2 ) { - - this.x = v1.x - v2.x; - this.y = v1.y - v2.y; - this.z = v1.z - v2.z; - this.w = v1.w - v2.w; - - return this; - - }, - - subSelf: function ( v ) { - - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - this.w -= v.w; - - return this; - - }, - - multiplyScalar: function ( s ) { - - this.x *= s; - this.y *= s; - this.z *= s; - this.w *= s; - - return this; - - }, - - divideScalar: function ( s ) { - - if ( s ) { - - this.x /= s; - this.y /= s; - this.z /= s; - this.w /= s; - - } else { - - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 1; - - } - - return this; - - }, - - - negate: function() { - - return this.multiplyScalar( -1 ); - - }, - - dot: function ( v ) { - - return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w; - - }, - - lengthSq: function () { - - return this.dot( this ); - - }, - - length: function () { - - return Math.sqrt( this.lengthSq() ); - - }, - - normalize: function () { - - return this.divideScalar( this.length() ); - - }, - - setLength: function ( l ) { - - return this.normalize().multiplyScalar( l ); - - }, - - - lerpSelf: function ( 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; - - } - -}; -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Frustum = function ( ) { - - this.planes = [ - - new THREE.Vector4(), - new THREE.Vector4(), - new THREE.Vector4(), - new THREE.Vector4(), - new THREE.Vector4(), - new THREE.Vector4() - - ]; - -}; - -THREE.Frustum.prototype.setFromMatrix = function ( m ) { - - var i, plane, - planes = this.planes; - - planes[ 0 ].set( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 ); - planes[ 1 ].set( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 ); - planes[ 2 ].set( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 ); - planes[ 3 ].set( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 ); - planes[ 4 ].set( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 ); - planes[ 5 ].set( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 ); - - for ( i = 0; i < 6; i ++ ) { - - plane = planes[ i ]; - plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) ); - - } - -}; - -THREE.Frustum.prototype.contains = function ( object ) { - - var distance, - planes = this.planes, - matrix = object.matrixWorld, - scale = THREE.Frustum.__v1.set( matrix.getColumnX().length(), matrix.getColumnY().length(), matrix.getColumnZ().length() ), - radius = - object.geometry.boundingSphere.radius * Math.max( scale.x, Math.max( scale.y, scale.z ) ); - - for ( var i = 0; i < 6; i ++ ) { - - distance = planes[ i ].x * matrix.n14 + planes[ i ].y * matrix.n24 + planes[ i ].z * matrix.n34 + planes[ i ].w; - if ( distance <= radius ) return false; - - } - - return true; - -}; - -THREE.Frustum.__v1 = new THREE.Vector3(); -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Ray = function ( origin, direction ) { - - this.origin = origin || new THREE.Vector3(); - this.direction = direction || new THREE.Vector3(); - - this.intersectScene = function ( scene ) { - - return this.intersectObjects( scene.children ); - - }; - - this.intersectObjects = function ( objects ) { - - var i, l, object, - intersects = []; - - for ( i = 0, l = objects.length; i < l; i ++ ) { - - Array.prototype.push.apply( intersects, this.intersectObject( objects[ i ] ) ); - - } - - intersects.sort( function ( a, b ) { return a.distance - b.distance; } ); - - return intersects; - - }; - - var a = new THREE.Vector3(); - var b = new THREE.Vector3(); - var c = new THREE.Vector3(); - var d = new THREE.Vector3(); - - var originCopy = new THREE.Vector3(); - var directionCopy = new THREE.Vector3(); - - var vector = new THREE.Vector3(); - var normal = new THREE.Vector3(); - var intersectPoint = new THREE.Vector3() - - this.intersectObject = function ( object ) { - - var intersect, intersects = []; - - for ( var i = 0, l = object.children.length; i < l; i ++ ) { - - Array.prototype.push.apply( intersects, this.intersectObject( object.children[ i ] ) ); - - } - - if ( object instanceof THREE.Particle ) { - - var distance = distanceFromIntersection( this.origin, this.direction, object.matrixWorld.getPosition() ); - - if ( distance > object.scale.x ) { - - return []; - - } - - intersect = { - - distance: distance, - point: object.position, - face: null, - object: object - - }; - - intersects.push( intersect ); - - } else if ( object instanceof THREE.Mesh ) { - - // Checking boundingSphere - - var distance = distanceFromIntersection( this.origin, this.direction, object.matrixWorld.getPosition() ); - var scale = THREE.Frustum.__v1.set( object.matrixWorld.getColumnX().length(), object.matrixWorld.getColumnY().length(), object.matrixWorld.getColumnZ().length() ); - - if ( distance > object.geometry.boundingSphere.radius * Math.max( scale.x, Math.max( scale.y, scale.z ) ) ) { - - return intersects; - - } - - // Checking faces - - var f, fl, face, dot, scalar, - geometry = object.geometry, - vertices = geometry.vertices, - objMatrix; - - object.matrixRotationWorld.extractRotation( object.matrixWorld ); - - for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) { - - face = geometry.faces[ f ]; - - originCopy.copy( this.origin ); - directionCopy.copy( this.direction ); - - objMatrix = object.matrixWorld; - - // determine if ray intersects the plane of the face - // note: this works regardless of the direction of the face normal - - vector = objMatrix.multiplyVector3( vector.copy( face.centroid ) ).subSelf( originCopy ); - normal = object.matrixRotationWorld.multiplyVector3( normal.copy( face.normal ) ); - dot = directionCopy.dot( normal ); - - // bail if ray and plane are parallel - - if ( Math.abs( dot ) < 0.0001 ) continue; - - // calc distance to plane - - scalar = normal.dot( vector ) / dot; - - // if negative distance, then plane is behind ray - - if ( scalar < 0 ) continue; - - if ( object.doubleSided || ( object.flipSided ? dot > 0 : dot < 0 ) ) { - - intersectPoint.add( originCopy, directionCopy.multiplyScalar( scalar ) ); - - if ( face instanceof THREE.Face3 ) { - - a = objMatrix.multiplyVector3( a.copy( vertices[ face.a ].position ) ); - b = objMatrix.multiplyVector3( b.copy( vertices[ face.b ].position ) ); - c = objMatrix.multiplyVector3( c.copy( vertices[ face.c ].position ) ); - - if ( pointInFace3( intersectPoint, a, b, c ) ) { - - intersect = { - - distance: originCopy.distanceTo( intersectPoint ), - point: intersectPoint.clone(), - face: face, - object: object - - }; - - intersects.push( intersect ); - - } - - } else if ( face instanceof THREE.Face4 ) { - - a = objMatrix.multiplyVector3( a.copy( vertices[ face.a ].position ) ); - b = objMatrix.multiplyVector3( b.copy( vertices[ face.b ].position ) ); - c = objMatrix.multiplyVector3( c.copy( vertices[ face.c ].position ) ); - d = objMatrix.multiplyVector3( d.copy( vertices[ face.d ].position ) ); - - if ( pointInFace3( intersectPoint, a, b, d ) || pointInFace3( intersectPoint, b, c, d ) ) { - - intersect = { - - distance: originCopy.distanceTo( intersectPoint ), - point: intersectPoint.clone(), - face: face, - object: object - - }; - - intersects.push( intersect ); - - } - - } - - } - - } - - } - - return intersects; - - } - - var v0 = new THREE.Vector3(), v1 = new THREE.Vector3(), v2 = new THREE.Vector3(); - var dot, intersect, distance; - - function distanceFromIntersection( origin, direction, position ) { - - v0.sub( position, origin ); - dot = v0.dot( direction ); - - intersect = v1.add( origin, v2.copy( direction ).multiplyScalar( dot ) ); - distance = position.distanceTo( intersect ); - - return distance; - - } - - // http://www.blackpawn.com/texts/pointinpoly/default.html - - var dot00, dot01, dot02, dot11, dot12, invDenom, u, v; - - function pointInFace3( p, a, b, c ) { - - v0.sub( c, a ); - v1.sub( b, a ); - v2.sub( p, a ); - - dot00 = v0.dot( v0 ); - dot01 = v0.dot( v1 ); - dot02 = v0.dot( v2 ); - dot11 = v1.dot( v1 ); - dot12 = v1.dot( v2 ); - - invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 ); - u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom; - v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom; - - return ( u >= 0 ) && ( v >= 0 ) && ( u + v < 1 ); - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Rectangle = function () { - - var _left, _top, _right, _bottom, - _width, _height, _isEmpty = true; - - function resize() { - - _width = _right - _left; - _height = _bottom - _top; - - } - - this.getX = function () { - - return _left; - - }; - - this.getY = function () { - - return _top; - - }; - - this.getWidth = function () { - - return _width; - - }; - - this.getHeight = function () { - - return _height; - - }; - - this.getLeft = function() { - - return _left; - - }; - - this.getTop = function() { - - return _top; - - }; - - this.getRight = function() { - - return _right; - - }; - - this.getBottom = function() { - - return _bottom; - - }; - - this.set = function ( left, top, right, bottom ) { - - _isEmpty = false; - - _left = left; _top = top; - _right = right; _bottom = bottom; - - resize(); - - }; - - this.addPoint = function ( x, y ) { - - if ( _isEmpty ) { - - _isEmpty = false; - _left = x; _top = y; - _right = x; _bottom = y; - - resize(); - - } else { - - _left = _left < x ? _left : x; // Math.min( _left, x ); - _top = _top < y ? _top : y; // Math.min( _top, y ); - _right = _right > x ? _right : x; // Math.max( _right, x ); - _bottom = _bottom > y ? _bottom : y; // Math.max( _bottom, y ); - - resize(); - } - - }; - - this.add3Points = function ( x1, y1, x2, y2, x3, y3 ) { - - if (_isEmpty) { - - _isEmpty = false; - _left = x1 < x2 ? ( x1 < x3 ? x1 : x3 ) : ( x2 < x3 ? x2 : x3 ); - _top = y1 < y2 ? ( y1 < y3 ? y1 : y3 ) : ( y2 < y3 ? y2 : y3 ); - _right = x1 > x2 ? ( x1 > x3 ? x1 : x3 ) : ( x2 > x3 ? x2 : x3 ); - _bottom = y1 > y2 ? ( y1 > y3 ? y1 : y3 ) : ( y2 > y3 ? y2 : y3 ); - - resize(); - - } else { - - _left = x1 < x2 ? ( x1 < x3 ? ( x1 < _left ? x1 : _left ) : ( x3 < _left ? x3 : _left ) ) : ( x2 < x3 ? ( x2 < _left ? x2 : _left ) : ( x3 < _left ? x3 : _left ) ); - _top = y1 < y2 ? ( y1 < y3 ? ( y1 < _top ? y1 : _top ) : ( y3 < _top ? y3 : _top ) ) : ( y2 < y3 ? ( y2 < _top ? y2 : _top ) : ( y3 < _top ? y3 : _top ) ); - _right = x1 > x2 ? ( x1 > x3 ? ( x1 > _right ? x1 : _right ) : ( x3 > _right ? x3 : _right ) ) : ( x2 > x3 ? ( x2 > _right ? x2 : _right ) : ( x3 > _right ? x3 : _right ) ); - _bottom = y1 > y2 ? ( y1 > y3 ? ( y1 > _bottom ? y1 : _bottom ) : ( y3 > _bottom ? y3 : _bottom ) ) : ( y2 > y3 ? ( y2 > _bottom ? y2 : _bottom ) : ( y3 > _bottom ? y3 : _bottom ) ); - - resize(); - - }; - - }; - - this.addRectangle = function ( r ) { - - if ( _isEmpty ) { - - _isEmpty = false; - _left = r.getLeft(); _top = r.getTop(); - _right = r.getRight(); _bottom = r.getBottom(); - - resize(); - - } else { - - _left = _left < r.getLeft() ? _left : r.getLeft(); // Math.min(_left, r.getLeft() ); - _top = _top < r.getTop() ? _top : r.getTop(); // Math.min(_top, r.getTop() ); - _right = _right > r.getRight() ? _right : r.getRight(); // Math.max(_right, r.getRight() ); - _bottom = _bottom > r.getBottom() ? _bottom : r.getBottom(); // Math.max(_bottom, r.getBottom() ); - - resize(); - - } - - }; - - this.inflate = function ( v ) { - - _left -= v; _top -= v; - _right += v; _bottom += v; - - resize(); - - }; - - this.minSelf = function ( r ) { - - _left = _left > r.getLeft() ? _left : r.getLeft(); // Math.max( _left, r.getLeft() ); - _top = _top > r.getTop() ? _top : r.getTop(); // Math.max( _top, r.getTop() ); - _right = _right < r.getRight() ? _right : r.getRight(); // Math.min( _right, r.getRight() ); - _bottom = _bottom < r.getBottom() ? _bottom : r.getBottom(); // Math.min( _bottom, r.getBottom() ); - - resize(); - - }; - - this.intersects = function ( r ) { - - // http://gamemath.com/2011/09/detecting-whether-two-boxes-overlap/ - - if ( _right < r.getLeft() ) return false; - if ( _left > r.getRight() ) return false; - if ( _bottom < r.getTop() ) return false; - if ( _top > r.getBottom() ) return false; - - return true; - - }; - - this.empty = function () { - - _isEmpty = true; - - _left = 0; _top = 0; - _right = 0; _bottom = 0; - - resize(); - - }; - - this.isEmpty = function () { - - return _isEmpty; - - }; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Math = { - - // Clamp value to range - - clamp: function ( x, a, b ) { - - return ( x < a ) ? a : ( ( x > b ) ? b : x ); - - }, - - // Clamp value to range to range - - mapLinear: function ( x, a1, a2, b1, b2 ) { - - return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 ); - - }, - - // Random float from <0, 1> with 16 bits of randomness - // (standard Math.random() creates repetitive patterns when applied over larger space) - - random16: function () { - - return ( 65280 * Math.random() + 255 * Math.random() ) / 65535; - - }, - - // Random integer from interval - - randInt: function ( low, high ) { - - return low + Math.floor( Math.random() * ( high - low + 1 ) ); - - }, - - // Random float from interval - - randFloat: function ( low, high ) { - - return low + Math.random() * ( high - low ); - - }, - - // Random float from <-range/2, range/2> interval - - randFloatSpread: function ( range ) { - - return range * ( 0.5 - Math.random() ); - - } - -}; -THREE.Matrix3 = function () { - - this.m = []; - -}; - -THREE.Matrix3.prototype = { - - constructor: THREE.Matrix3, - - transpose: function () { - - var tmp, m = this.m; - - 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; - - }, - - transposeIntoArray: function ( r ) { - - var m = this.m; - - 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; - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author philogb / http://blog.thejit.org/ - * @author jordi_ros / http://plattsoft.com - * @author D1plo1d / http://github.com/D1plo1d - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - * @author timknip / http://www.floorplanner.com/ - */ - -THREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { - - this.set( - - ( n11 !== undefined ) ? n11 : 1, n12 || 0, n13 || 0, n14 || 0, - n21 || 0, ( n22 !== undefined ) ? n22 : 1, n23 || 0, n24 || 0, - n31 || 0, n32 || 0, ( n33 !== undefined ) ? n33 : 1, n34 || 0, - n41 || 0, n42 || 0, n43 || 0, ( n44 !== undefined ) ? n44 : 1 - - ); - - this.flat = new Array( 16 ); - this.m33 = new THREE.Matrix3(); - -}; - -THREE.Matrix4.prototype = { - - constructor: THREE.Matrix4, - - set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) { - - this.n11 = n11; this.n12 = n12; this.n13 = n13; this.n14 = n14; - this.n21 = n21; this.n22 = n22; this.n23 = n23; this.n24 = n24; - this.n31 = n31; this.n32 = n32; this.n33 = n33; this.n34 = n34; - this.n41 = n41; this.n42 = n42; this.n43 = n43; this.n44 = n44; - - return this; - - }, - - identity: function () { - - this.set( - - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - copy: function ( m ) { - - this.set( - - m.n11, m.n12, m.n13, m.n14, - m.n21, m.n22, m.n23, m.n24, - m.n31, m.n32, m.n33, m.n34, - m.n41, m.n42, m.n43, m.n44 - - ); - - return this; - - }, - - lookAt: function ( eye, center, up ) { - - var x = THREE.Matrix4.__v1, y = THREE.Matrix4.__v2, z = THREE.Matrix4.__v3; - - z.sub( eye, center ).normalize(); - - if ( z.length() === 0 ) { - - z.z = 1; - - } - - x.cross( up, z ).normalize(); - - if ( x.length() === 0 ) { - - z.x += 0.0001; - x.cross( up, z ).normalize(); - - } - - y.cross( z, x ).normalize(); - - - this.n11 = x.x; this.n12 = y.x; this.n13 = z.x; - this.n21 = x.y; this.n22 = y.y; this.n23 = z.y; - this.n31 = x.z; this.n32 = y.z; this.n33 = z.z; - - return this; - - }, - - multiply: function ( a, b ) { - - var a11 = a.n11, a12 = a.n12, a13 = a.n13, a14 = a.n14, - a21 = a.n21, a22 = a.n22, a23 = a.n23, a24 = a.n24, - a31 = a.n31, a32 = a.n32, a33 = a.n33, a34 = a.n34, - a41 = a.n41, a42 = a.n42, a43 = a.n43, a44 = a.n44, - - b11 = b.n11, b12 = b.n12, b13 = b.n13, b14 = b.n14, - b21 = b.n21, b22 = b.n22, b23 = b.n23, b24 = b.n24, - b31 = b.n31, b32 = b.n32, b33 = b.n33, b34 = b.n34, - b41 = b.n41, b42 = b.n42, b43 = b.n43, b44 = b.n44; - - this.n11 = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41; - this.n12 = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42; - this.n13 = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43; - this.n14 = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44; - - this.n21 = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41; - this.n22 = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42; - this.n23 = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43; - this.n24 = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44; - - this.n31 = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41; - this.n32 = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42; - this.n33 = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43; - this.n34 = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44; - - this.n41 = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41; - this.n42 = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42; - this.n43 = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43; - this.n44 = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44; - - return this; - - }, - - multiplySelf: function ( m ) { - - return this.multiply( this, m ); - - }, - - multiplyToArray: function ( a, b, r ) { - - this.multiply( a, b ); - - r[ 0 ] = this.n11; r[ 1 ] = this.n21; r[ 2 ] = this.n31; r[ 3 ] = this.n41; - r[ 4 ] = this.n12; r[ 5 ] = this.n22; r[ 6 ] = this.n32; r[ 7 ] = this.n42; - r[ 8 ] = this.n13; r[ 9 ] = this.n23; r[ 10 ] = this.n33; r[ 11 ] = this.n43; - r[ 12 ] = this.n14; r[ 13 ] = this.n24; r[ 14 ] = this.n34; r[ 15 ] = this.n44; - - return this; - - }, - - multiplyScalar: function ( s ) { - - this.n11 *= s; this.n12 *= s; this.n13 *= s; this.n14 *= s; - this.n21 *= s; this.n22 *= s; this.n23 *= s; this.n24 *= s; - this.n31 *= s; this.n32 *= s; this.n33 *= s; this.n34 *= s; - this.n41 *= s; this.n42 *= s; this.n43 *= s; this.n44 *= s; - - return this; - - }, - - multiplyVector3: function ( v ) { - - var vx = v.x, vy = v.y, vz = v.z, - d = 1 / ( this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 ); - - v.x = ( this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 ) * d; - v.y = ( this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 ) * d; - v.z = ( this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 ) * d; - - return v; - - }, - - multiplyVector4: function ( v ) { - - var vx = v.x, vy = v.y, vz = v.z, vw = v.w; - - v.x = this.n11 * vx + this.n12 * vy + this.n13 * vz + this.n14 * vw; - v.y = this.n21 * vx + this.n22 * vy + this.n23 * vz + this.n24 * vw; - v.z = this.n31 * vx + this.n32 * vy + this.n33 * vz + this.n34 * vw; - v.w = this.n41 * vx + this.n42 * vy + this.n43 * vz + this.n44 * vw; - - return v; - - }, - - rotateAxis: function ( v ) { - - var vx = v.x, vy = v.y, vz = v.z; - - v.x = vx * this.n11 + vy * this.n12 + vz * this.n13; - v.y = vx * this.n21 + vy * this.n22 + vz * this.n23; - v.z = vx * this.n31 + vy * this.n32 + vz * this.n33; - - v.normalize(); - - return v; - - }, - - crossVector: function ( a ) { - - var v = new THREE.Vector4(); - - v.x = this.n11 * a.x + this.n12 * a.y + this.n13 * a.z + this.n14 * a.w; - v.y = this.n21 * a.x + this.n22 * a.y + this.n23 * a.z + this.n24 * a.w; - v.z = this.n31 * a.x + this.n32 * a.y + this.n33 * a.z + this.n34 * a.w; - - v.w = ( a.w ) ? this.n41 * a.x + this.n42 * a.y + this.n43 * a.z + this.n44 * a.w : 1; - - return v; - - }, - - determinant: function () { - - var n11 = this.n11, n12 = this.n12, n13 = this.n13, n14 = this.n14, - n21 = this.n21, n22 = this.n22, n23 = this.n23, n24 = this.n24, - n31 = this.n31, n32 = this.n32, n33 = this.n33, n34 = this.n34, - n41 = this.n41, n42 = this.n42, n43 = this.n43, n44 = this.n44; - - //TODO: make this more efficient - //( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm ) - return ( - n14 * n23 * n32 * n41- - n13 * n24 * n32 * n41- - n14 * n22 * n33 * n41+ - n12 * n24 * n33 * n41+ - - n13 * n22 * n34 * n41- - n12 * n23 * n34 * n41- - n14 * n23 * n31 * n42+ - n13 * n24 * n31 * n42+ - - n14 * n21 * n33 * n42- - n11 * n24 * n33 * n42- - n13 * n21 * n34 * n42+ - n11 * n23 * n34 * n42+ - - n14 * n22 * n31 * n43- - n12 * n24 * n31 * n43- - n14 * n21 * n32 * n43+ - n11 * n24 * n32 * n43+ - - n12 * n21 * n34 * n43- - n11 * n22 * n34 * n43- - n13 * n22 * n31 * n44+ - n12 * n23 * n31 * n44+ - - n13 * n21 * n32 * n44- - n11 * n23 * n32 * n44- - n12 * n21 * n33 * n44+ - n11 * n22 * n33 * n44 - ); - - }, - - transpose: function () { - - var tmp; - - tmp = this.n21; this.n21 = this.n12; this.n12 = tmp; - tmp = this.n31; this.n31 = this.n13; this.n13 = tmp; - tmp = this.n32; this.n32 = this.n23; this.n23 = tmp; - - tmp = this.n41; this.n41 = this.n14; this.n14 = tmp; - tmp = this.n42; this.n42 = this.n24; this.n24 = tmp; - tmp = this.n43; this.n43 = this.n34; this.n34 = tmp; - - return this; - - }, - - clone: function () { - - var m = new THREE.Matrix4(); - - m.n11 = this.n11; m.n12 = this.n12; m.n13 = this.n13; m.n14 = this.n14; - m.n21 = this.n21; m.n22 = this.n22; m.n23 = this.n23; m.n24 = this.n24; - m.n31 = this.n31; m.n32 = this.n32; m.n33 = this.n33; m.n34 = this.n34; - m.n41 = this.n41; m.n42 = this.n42; m.n43 = this.n43; m.n44 = this.n44; - - return m; - - }, - - flatten: function () { - - this.flat[ 0 ] = this.n11; this.flat[ 1 ] = this.n21; this.flat[ 2 ] = this.n31; this.flat[ 3 ] = this.n41; - this.flat[ 4 ] = this.n12; this.flat[ 5 ] = this.n22; this.flat[ 6 ] = this.n32; this.flat[ 7 ] = this.n42; - this.flat[ 8 ] = this.n13; this.flat[ 9 ] = this.n23; this.flat[ 10 ] = this.n33; this.flat[ 11 ] = this.n43; - this.flat[ 12 ] = this.n14; this.flat[ 13 ] = this.n24; this.flat[ 14 ] = this.n34; this.flat[ 15 ] = this.n44; - - return this.flat; - - }, - - flattenToArray: function ( flat ) { - - flat[ 0 ] = this.n11; flat[ 1 ] = this.n21; flat[ 2 ] = this.n31; flat[ 3 ] = this.n41; - flat[ 4 ] = this.n12; flat[ 5 ] = this.n22; flat[ 6 ] = this.n32; flat[ 7 ] = this.n42; - flat[ 8 ] = this.n13; flat[ 9 ] = this.n23; flat[ 10 ] = this.n33; flat[ 11 ] = this.n43; - flat[ 12 ] = this.n14; flat[ 13 ] = this.n24; flat[ 14 ] = this.n34; flat[ 15 ] = this.n44; - - return flat; - - }, - - flattenToArrayOffset: function( flat, offset ) { - - flat[ offset ] = this.n11; - flat[ offset + 1 ] = this.n21; - flat[ offset + 2 ] = this.n31; - flat[ offset + 3 ] = this.n41; - - flat[ offset + 4 ] = this.n12; - flat[ offset + 5 ] = this.n22; - flat[ offset + 6 ] = this.n32; - flat[ offset + 7 ] = this.n42; - - flat[ offset + 8 ] = this.n13; - flat[ offset + 9 ] = this.n23; - flat[ offset + 10 ] = this.n33; - flat[ offset + 11 ] = this.n43; - - flat[ offset + 12 ] = this.n14; - flat[ offset + 13 ] = this.n24; - flat[ offset + 14 ] = this.n34; - flat[ offset + 15 ] = this.n44; - - return flat; - - }, - - setTranslation: function( x, y, z ) { - - this.set( - - 1, 0, 0, x, - 0, 1, 0, y, - 0, 0, 1, z, - 0, 0, 0, 1 - - ); - - return this; - - }, - - setScale: function ( x, y, z ) { - - this.set( - - x, 0, 0, 0, - 0, y, 0, 0, - 0, 0, z, 0, - 0, 0, 0, 1 - - ); - - return this; - - }, - - setRotationX: function ( theta ) { - - var 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; - - }, - - setRotationY: function( theta ) { - - var 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; - - }, - - setRotationZ: function( theta ) { - - var 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; - - }, - - setRotationAxis: function( axis, angle ) { - - // Based on http://www.gamedev.net/reference/articles/article1199.asp - - var c = Math.cos( angle ), - s = Math.sin( angle ), - t = 1 - c, - x = axis.x, y = axis.y, z = axis.z, - 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; - - }, - - setPosition: function ( v ) { - - this.n14 = v.x; - this.n24 = v.y; - this.n34 = v.z; - - return this; - - }, - - getPosition: function () { - - return THREE.Matrix4.__v1.set( this.n14, this.n24, this.n34 ); - - }, - - getColumnX: function () { - - return THREE.Matrix4.__v1.set( this.n11, this.n21, this.n31 ); - - }, - - getColumnY: function () { - - return THREE.Matrix4.__v1.set( this.n12, this.n22, this.n32 ); - - }, - - getColumnZ: function() { - - return THREE.Matrix4.__v1.set( this.n13, this.n23, this.n33 ); - - }, - - getInverse: function ( m ) { - - // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm - - var n11 = m.n11, n12 = m.n12, n13 = m.n13, n14 = m.n14, - n21 = m.n21, n22 = m.n22, n23 = m.n23, n24 = m.n24, - n31 = m.n31, n32 = m.n32, n33 = m.n33, n34 = m.n34, - n41 = m.n41, n42 = m.n42, n43 = m.n43, n44 = m.n44; - - this.n11 = n23*n34*n42 - n24*n33*n42 + n24*n32*n43 - n22*n34*n43 - n23*n32*n44 + n22*n33*n44; - this.n12 = n14*n33*n42 - n13*n34*n42 - n14*n32*n43 + n12*n34*n43 + n13*n32*n44 - n12*n33*n44; - this.n13 = n13*n24*n42 - n14*n23*n42 + n14*n22*n43 - n12*n24*n43 - n13*n22*n44 + n12*n23*n44; - this.n14 = n14*n23*n32 - n13*n24*n32 - n14*n22*n33 + n12*n24*n33 + n13*n22*n34 - n12*n23*n34; - this.n21 = n24*n33*n41 - n23*n34*n41 - n24*n31*n43 + n21*n34*n43 + n23*n31*n44 - n21*n33*n44; - this.n22 = n13*n34*n41 - n14*n33*n41 + n14*n31*n43 - n11*n34*n43 - n13*n31*n44 + n11*n33*n44; - this.n23 = n14*n23*n41 - n13*n24*n41 - n14*n21*n43 + n11*n24*n43 + n13*n21*n44 - n11*n23*n44; - this.n24 = n13*n24*n31 - n14*n23*n31 + n14*n21*n33 - n11*n24*n33 - n13*n21*n34 + n11*n23*n34; - this.n31 = n22*n34*n41 - n24*n32*n41 + n24*n31*n42 - n21*n34*n42 - n22*n31*n44 + n21*n32*n44; - this.n32 = n14*n32*n41 - n12*n34*n41 - n14*n31*n42 + n11*n34*n42 + n12*n31*n44 - n11*n32*n44; - this.n33 = n12*n24*n41 - n14*n22*n41 + n14*n21*n42 - n11*n24*n42 - n12*n21*n44 + n11*n22*n44; - this.n34 = n14*n22*n31 - n12*n24*n31 - n14*n21*n32 + n11*n24*n32 + n12*n21*n34 - n11*n22*n34; - this.n41 = n23*n32*n41 - n22*n33*n41 - n23*n31*n42 + n21*n33*n42 + n22*n31*n43 - n21*n32*n43; - this.n42 = n12*n33*n41 - n13*n32*n41 + n13*n31*n42 - n11*n33*n42 - n12*n31*n43 + n11*n32*n43; - this.n43 = n13*n22*n41 - n12*n23*n41 - n13*n21*n42 + n11*n23*n42 + n12*n21*n43 - n11*n22*n43; - this.n44 = n12*n23*n31 - n13*n22*n31 + n13*n21*n32 - n11*n23*n32 - n12*n21*n33 + n11*n22*n33; - this.multiplyScalar( 1 / m.determinant() ); - - return this; - - }, - - setRotationFromEuler: function( v, order ) { - - var x = v.x, y = v.y, z = v.z, - a = Math.cos( x ), b = Math.sin( x ), - c = Math.cos( y ), d = Math.sin( y ), - e = Math.cos( z ), f = Math.sin( z ); - - switch ( order ) { - - case 'YXZ': - - var ce = c * e, cf = c * f, de = d * e, df = d * f; - - this.n11 = ce + df * b; - this.n12 = de * b - cf; - this.n13 = a * d; - - this.n21 = a * f; - this.n22 = a * e; - this.n23 = - b; - - this.n31 = cf * b - de; - this.n32 = df + ce * b; - this.n33 = a * c; - break; - - case 'ZXY': - - var ce = c * e, cf = c * f, de = d * e, df = d * f; - - this.n11 = ce - df * b; - this.n12 = - a * f; - this.n13 = de + cf * b; - - this.n21 = cf + de * b; - this.n22 = a * e; - this.n23 = df - ce * b; - - this.n31 = - a * d; - this.n32 = b; - this.n33 = a * c; - break; - - case 'ZYX': - - var ae = a * e, af = a * f, be = b * e, bf = b * f; - - this.n11 = c * e; - this.n12 = be * d - af; - this.n13 = ae * d + bf; - - this.n21 = c * f; - this.n22 = bf * d + ae; - this.n23 = af * d - be; - - this.n31 = - d; - this.n32 = b * c; - this.n33 = a * c; - break; - - case 'YZX': - - var ac = a * c, ad = a * d, bc = b * c, bd = b * d; - - this.n11 = c * e; - this.n12 = bd - ac * f; - this.n13 = bc * f + ad; - - this.n21 = f; - this.n22 = a * e; - this.n23 = - b * e; - - this.n31 = - d * e; - this.n32 = ad * f + bc; - this.n33 = ac - bd * f; - break; - - case 'XZY': - - var ac = a * c, ad = a * d, bc = b * c, bd = b * d; - - this.n11 = c * e; - this.n12 = - f; - this.n13 = d * e; - - this.n21 = ac * f + bd; - this.n22 = a * e; - this.n23 = ad * f - bc; - - this.n31 = bc * f - ad; - this.n32 = b * e; - this.n33 = bd * f + ac; - break; - - default: // 'XYZ' - - var ae = a * e, af = a * f, be = b * e, bf = b * f; - - this.n11 = c * e; - this.n12 = - c * f; - this.n13 = d; - - this.n21 = af + be * d; - this.n22 = ae - bf * d; - this.n23 = - b * c; - - this.n31 = bf - ae * d; - this.n32 = be + af * d; - this.n33 = a * c; - break; - - } - - return this; - - }, - - - setRotationFromQuaternion: function( q ) { - - var x = q.x, y = q.y, z = q.z, w = q.w, - x2 = x + x, y2 = y + y, z2 = z + z, - xx = x * x2, xy = x * y2, xz = x * z2, - yy = y * y2, yz = y * z2, zz = z * z2, - wx = w * x2, wy = w * y2, wz = w * z2; - - this.n11 = 1 - ( yy + zz ); - this.n12 = xy - wz; - this.n13 = xz + wy; - - this.n21 = xy + wz; - this.n22 = 1 - ( xx + zz ); - this.n23 = yz - wx; - - this.n31 = xz - wy; - this.n32 = yz + wx; - this.n33 = 1 - ( xx + yy ); - - return this; - - }, - - scale: function ( v ) { - - var x = v.x, y = v.y, z = v.z; - - this.n11 *= x; this.n12 *= y; this.n13 *= z; - this.n21 *= x; this.n22 *= y; this.n23 *= z; - this.n31 *= x; this.n32 *= y; this.n33 *= z; - this.n41 *= x; this.n42 *= y; this.n43 *= z; - - return this; - - }, - - compose: function ( translation, rotation, scale ) { - - var mRotation = THREE.Matrix4.__m1; - var mScale = THREE.Matrix4.__m2; - - mRotation.identity(); - mRotation.setRotationFromQuaternion( rotation ); - - mScale.setScale( scale.x, scale.y, scale.z ); - - this.multiply( mRotation, mScale ); - - this.n14 = translation.x; - this.n24 = translation.y; - this.n34 = translation.z; - - return this; - - }, - - decompose: function ( translation, rotation, scale ) { - - // grab the axis vectors - - var x = THREE.Matrix4.__v1; - var y = THREE.Matrix4.__v2; - var z = THREE.Matrix4.__v3; - - x.set( this.n11, this.n21, this.n31 ); - y.set( this.n12, this.n22, this.n32 ); - z.set( this.n13, this.n23, this.n33 ); - - translation = ( translation instanceof THREE.Vector3 ) ? translation : new THREE.Vector3(); - rotation = ( rotation instanceof THREE.Quaternion ) ? rotation : new THREE.Quaternion(); - scale = ( scale instanceof THREE.Vector3 ) ? scale : new THREE.Vector3(); - - scale.x = x.length(); - scale.y = y.length(); - scale.z = z.length(); - - translation.x = this.n14; - translation.y = this.n24; - translation.z = this.n34; - - // scale the rotation part - - var matrix = THREE.Matrix4.__m1; - - matrix.copy( this ); - - matrix.n11 /= scale.x; - matrix.n21 /= scale.x; - matrix.n31 /= scale.x; - - matrix.n12 /= scale.y; - matrix.n22 /= scale.y; - matrix.n32 /= scale.y; - - matrix.n13 /= scale.z; - matrix.n23 /= scale.z; - matrix.n33 /= scale.z; - - rotation.setFromRotationMatrix( matrix ); - - return [ translation, rotation, scale ]; - - }, - - extractPosition: function ( m ) { - - this.n14 = m.n14; - this.n24 = m.n24; - this.n34 = m.n34; - - return this; - - }, - - extractRotation: function ( m ) { - - var vector = THREE.Matrix4.__v1; - - var scaleX = 1 / vector.set( m.n11, m.n21, m.n31 ).length(); - var scaleY = 1 / vector.set( m.n12, m.n22, m.n32 ).length(); - var scaleZ = 1 / vector.set( m.n13, m.n23, m.n33 ).length(); - - this.n11 = m.n11 * scaleX; - this.n21 = m.n21 * scaleX; - this.n31 = m.n31 * scaleX; - - this.n12 = m.n12 * scaleY; - this.n22 = m.n22 * scaleY; - this.n32 = m.n32 * scaleY; - - this.n13 = m.n13 * scaleZ; - this.n23 = m.n23 * scaleZ; - this.n33 = m.n33 * scaleZ; - - return this; - - }, - - rotateByAxis: function ( axis, angle ) { - - // optimize by checking axis - if ( axis.x === 1 && axis.y === 0 && axis.z === 0 ) { - - return this.rotateX( angle ); - - } else if ( axis.x === 0 && axis.y === 1 && axis.z === 0 ) { - - return this.rotateY( angle ); - - } else if ( axis.x === 0 && axis.y === 0 && axis.z === 1 ) { - - return this.rotateZ( angle ); - - } - - var x = axis.x, - y = axis.y, - z = axis.z, - n = Math.sqrt(x * x + y * y + z * z); - - x /= n; - y /= n; - z /= n; - - var xx = x * x, - yy = y * y, - zz = z * z, - c = Math.cos(angle), - s = Math.sin(angle), - oneMinusCosine = 1 - c, - xy = x * y * oneMinusCosine, - xz = x * z * oneMinusCosine, - yz = y * z * oneMinusCosine, - xs = x * s, - ys = y * s, - zs = z * s, - - r11 = xx + (1 - xx) * c, - r21 = xy + zs, - r31 = xz - ys, - r12 = xy - zs, - r22 = yy + (1 - yy) * c, - r32 = yz + xs, - r13 = xz + ys, - r23 = yz - xs, - r33 = zz + (1 - zz) * c, - - m11 = this.n11, - m21 = this.n21, - m31 = this.n31, - m41 = this.n41, - m12 = this.n12, - m22 = this.n22, - m32 = this.n32, - m42 = this.n42, - m13 = this.n13, - m23 = this.n23, - m33 = this.n33, - m43 = this.n43, - m14 = this.n14, - m24 = this.n24, - m34 = this.n34, - m44 = this.n44; - - this.n11 = r11 * m11 + r21 * m12 + r31 * m13; - this.n21 = r11 * m21 + r21 * m22 + r31 * m23; - this.n31 = r11 * m31 + r21 * m32 + r31 * m33; - this.n41 = r11 * m41 + r21 * m42 + r31 * m43; - - this.n12 = r12 * m11 + r22 * m12 + r32 * m13; - this.n22 = r12 * m21 + r22 * m22 + r32 * m23; - this.n32 = r12 * m31 + r22 * m32 + r32 * m33; - this.n42 = r12 * m41 + r22 * m42 + r32 * m43; - - this.n13 = r13 * m11 + r23 * m12 + r33 * m13; - this.n23 = r13 * m21 + r23 * m22 + r33 * m23; - this.n33 = r13 * m31 + r23 * m32 + r33 * m33; - this.n43 = r13 * m41 + r23 * m42 + r33 * m43; - - return this; - - }, - - rotateX: function ( angle ) { - - var m12 = this.n12, - m22 = this.n22, - m32 = this.n32, - m42 = this.n42, - m13 = this.n13, - m23 = this.n23, - m33 = this.n33, - m43 = this.n43, - c = Math.cos(angle), - s = Math.sin(angle); - - this.n12 = c * m12 + s * m13; - this.n22 = c * m22 + s * m23; - this.n32 = c * m32 + s * m33; - this.n42 = c * m42 + s * m43; - - this.n13 = c * m13 - s * m12; - this.n23 = c * m23 - s * m22; - this.n33 = c * m33 - s * m32; - this.n43 = c * m43 - s * m42; - - return this; - - }, - - rotateY: function ( angle ) { - - var m11 = this.n11, - m21 = this.n21, - m31 = this.n31, - m41 = this.n41, - m13 = this.n13, - m23 = this.n23, - m33 = this.n33, - m43 = this.n43, - c = Math.cos(angle), - s = Math.sin(angle); - - this.n11 = c * m11 - s * m13; - this.n21 = c * m21 - s * m23; - this.n31 = c * m31 - s * m33; - this.n41 = c * m41 - s * m43; - - this.n13 = c * m13 + s * m11; - this.n23 = c * m23 + s * m21; - this.n33 = c * m33 + s * m31; - this.n43 = c * m43 + s * m41; - - return this; - - }, - - rotateZ: function ( angle ) { - - var m11 = this.n11, - m21 = this.n21, - m31 = this.n31, - m41 = this.n41, - m12 = this.n12, - m22 = this.n22, - m32 = this.n32, - m42 = this.n42, - c = Math.cos(angle), - s = Math.sin(angle); - - this.n11 = c * m11 + s * m12; - this.n21 = c * m21 + s * m22; - this.n31 = c * m31 + s * m32; - this.n41 = c * m41 + s * m42; - - this.n12 = c * m12 - s * m11; - this.n22 = c * m22 - s * m21; - this.n32 = c * m32 - s * m31; - this.n42 = c * m42 - s * m41; - - return this; - - }, - - translate: function ( v ) { - - var x = v.x, y = v.y, z = v.z; - - this.n14 = this.n11 * x + this.n12 * y + this.n13 * z + this.n14; - this.n24 = this.n21 * x + this.n22 * y + this.n23 * z + this.n24; - this.n34 = this.n31 * x + this.n32 * y + this.n33 * z + this.n34; - this.n44 = this.n41 * x + this.n42 * y + this.n43 * z + this.n44; - - return this; - - } - -}; - -THREE.Matrix4.makeInvert3x3 = function ( m1 ) { - - // input: THREE.Matrix4, output: THREE.Matrix3 - // ( based on http://code.google.com/p/webgl-mjs/ ) - - var m33 = m1.m33, m33m = m33.m, - a11 = m1.n33 * m1.n22 - m1.n32 * m1.n23, - a21 = - m1.n33 * m1.n21 + m1.n31 * m1.n23, - a31 = m1.n32 * m1.n21 - m1.n31 * m1.n22, - a12 = - m1.n33 * m1.n12 + m1.n32 * m1.n13, - a22 = m1.n33 * m1.n11 - m1.n31 * m1.n13, - a32 = - m1.n32 * m1.n11 + m1.n31 * m1.n12, - a13 = m1.n23 * m1.n12 - m1.n22 * m1.n13, - a23 = - m1.n23 * m1.n11 + m1.n21 * m1.n13, - a33 = m1.n22 * m1.n11 - m1.n21 * m1.n12, - - det = m1.n11 * a11 + m1.n21 * a12 + m1.n31 * a13, - - idet; - - // no inverse - - if ( det === 0 ) { - - return null; - - } - - idet = 1.0 / det; - - m33m[ 0 ] = idet * a11; m33m[ 1 ] = idet * a21; m33m[ 2 ] = idet * a31; - m33m[ 3 ] = idet * a12; m33m[ 4 ] = idet * a22; m33m[ 5 ] = idet * a32; - m33m[ 6 ] = idet * a13; m33m[ 7 ] = idet * a23; m33m[ 8 ] = idet * a33; - - return m33; - -} - -THREE.Matrix4.makeFrustum = function ( left, right, bottom, top, near, far ) { - - var m, x, y, a, b, c, d; - - m = new THREE.Matrix4(); - - x = 2 * near / ( right - left ); - y = 2 * near / ( top - bottom ); - - a = ( right + left ) / ( right - left ); - b = ( top + bottom ) / ( top - bottom ); - c = - ( far + near ) / ( far - near ); - d = - 2 * far * near / ( far - near ); - - m.n11 = x; m.n12 = 0; m.n13 = a; m.n14 = 0; - m.n21 = 0; m.n22 = y; m.n23 = b; m.n24 = 0; - m.n31 = 0; m.n32 = 0; m.n33 = c; m.n34 = d; - m.n41 = 0; m.n42 = 0; m.n43 = - 1; m.n44 = 0; - - return m; - -}; - -THREE.Matrix4.makePerspective = function ( fov, aspect, near, far ) { - - var ymax, ymin, xmin, xmax; - - ymax = near * Math.tan( fov * Math.PI / 360 ); - ymin = - ymax; - xmin = ymin * aspect; - xmax = ymax * aspect; - - return THREE.Matrix4.makeFrustum( xmin, xmax, ymin, ymax, near, far ); - -}; - -THREE.Matrix4.makeOrtho = function ( left, right, top, bottom, near, far ) { - - var m, x, y, z, w, h, p; - - m = new THREE.Matrix4(); - - w = right - left; - h = top - bottom; - p = far - near; - - x = ( right + left ) / w; - y = ( top + bottom ) / h; - z = ( far + near ) / p; - - m.n11 = 2 / w; m.n12 = 0; m.n13 = 0; m.n14 = -x; - m.n21 = 0; m.n22 = 2 / h; m.n23 = 0; m.n24 = -y; - m.n31 = 0; m.n32 = 0; m.n33 = -2 / p; m.n34 = -z; - m.n41 = 0; m.n42 = 0; m.n43 = 0; m.n44 = 1; - - return m; - -}; - -THREE.Matrix4.__v1 = new THREE.Vector3(); -THREE.Matrix4.__v2 = new THREE.Vector3(); -THREE.Matrix4.__v3 = new THREE.Vector3(); - -THREE.Matrix4.__m1 = new THREE.Matrix4(); -THREE.Matrix4.__m2 = new THREE.Matrix4(); -/** - * @author mr.doob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Object3D = function () { - - this.name = ''; - - this.id = THREE.Object3DCount ++; - - this.parent = undefined; - this.children = []; - - this.up = new THREE.Vector3( 0, 1, 0 ); - - this.position = new THREE.Vector3(); - this.rotation = new THREE.Vector3(); - this.eulerOrder = 'XYZ'; - this.scale = new THREE.Vector3( 1, 1, 1 ); - - this.dynamic = false; // when true it retains arrays so they can be updated with __dirty* - - this.doubleSided = false; - this.flipSided = false; - - this.renderDepth = null; - - this.rotationAutoUpdate = true; - - this.matrix = new THREE.Matrix4(); - this.matrixWorld = new THREE.Matrix4(); - this.matrixRotationWorld = new THREE.Matrix4(); - - this.matrixAutoUpdate = true; - this.matrixWorldNeedsUpdate = true; - - this.quaternion = new THREE.Quaternion(); - this.useQuaternion = false; - - this.boundRadius = 0.0; - this.boundRadiusScale = 1.0; - - this.visible = true; - - this.castShadow = false; - this.receiveShadow = false; - - this.frustumCulled = true; - - this._vector = new THREE.Vector3(); - -}; - - -THREE.Object3D.prototype = { - - constructor: THREE.Object3D, - - translate: function ( distance, axis ) { - - this.matrix.rotateAxis( axis ); - this.position.addSelf( axis.multiplyScalar( distance ) ); - - }, - - translateX: function ( distance ) { - - this.translate( distance, this._vector.set( 1, 0, 0 ) ); - - }, - - translateY: function ( distance ) { - - this.translate( distance, this._vector.set( 0, 1, 0 ) ); - - }, - - translateZ: function ( distance ) { - - this.translate( distance, this._vector.set( 0, 0, 1 ) ); - - }, - - lookAt: function ( vector ) { - - // TODO: Add hierarchy support. - - this.matrix.lookAt( vector, this.position, this.up ); - - if ( this.rotationAutoUpdate ) { - - this.rotation.setRotationFromMatrix( this.matrix ); - - } - - }, - - add: function ( object ) { - - if ( this.children.indexOf( object ) === - 1 ) { - - if ( object.parent !== undefined ) { - - object.parent.remove( object ); - - } - - object.parent = this; - this.children.push( object ); - - // add to scene - - var scene = this; - - while ( scene.parent !== undefined ) { - - scene = scene.parent; - - } - - if ( scene !== undefined && scene instanceof THREE.Scene ) { - - scene.addObject( object ); - - } - - } - - }, - - remove: function ( object ) { - - var index = this.children.indexOf( object ); - - if ( index !== - 1 ) { - - object.parent = undefined; - this.children.splice( index, 1 ); - - // remove from scene - - var scene = this; - - while ( scene.parent !== undefined ) { - - scene = scene.parent; - - } - - if ( scene !== undefined && scene instanceof THREE.Scene ) { - - scene.removeObject( object ); - - } - - } - - }, - - getChildByName: function ( name, doRecurse ) { - - var c, cl, child, recurseResult; - - for ( c = 0, cl = this.children.length; c < cl; c ++ ) { - - child = this.children[ c ]; - - if ( child.name === name ) { - - return child; - - } - - if ( doRecurse ) { - - recurseResult = child.getChildByName( name, doRecurse ); - - if ( recurseResult !== undefined ) { - - return recurseResult; - - } - - } - - } - - return undefined; - - }, - - updateMatrix: function () { - - this.matrix.setPosition( this.position ); - - if ( this.useQuaternion ) { - - this.matrix.setRotationFromQuaternion( this.quaternion ); - - } else { - - this.matrix.setRotationFromEuler( this.rotation, this.eulerOrder ); - - } - - if ( this.scale.x !== 1 || this.scale.y !== 1 || this.scale.z !== 1 ) { - - this.matrix.scale( this.scale ); - this.boundRadiusScale = Math.max( this.scale.x, Math.max( this.scale.y, this.scale.z ) ); - - } - - this.matrixWorldNeedsUpdate = true; - - }, - - updateMatrixWorld: function ( force ) { - - this.matrixAutoUpdate && this.updateMatrix(); - - // update matrixWorld - - if ( this.matrixWorldNeedsUpdate || force ) { - - if ( this.parent ) { - - this.matrixWorld.multiply( this.parent.matrixWorld, this.matrix ); - - } else { - - this.matrixWorld.copy( this.matrix ); - - } - - this.matrixWorldNeedsUpdate = false; - - force = true; - - } - - // update children - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - this.children[ i ].updateMatrixWorld( force ); - - } - - } - -}; - -THREE.Object3DCount = 0; -/** - * @author mr.doob / http://mrdoob.com/ - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author julianwa / https://github.com/julianwa - */ - -THREE.Projector = function() { - - var _object, _objectCount, _objectPool = [], - _vertex, _vertexCount, _vertexPool = [], - _face, _face3Count, _face3Pool = [], _face4Count, _face4Pool = [], - _line, _lineCount, _linePool = [], - _particle, _particleCount, _particlePool = [], - - _renderData = { objects: [], sprites: [], lights: [], elements: [] }, - - _vector3 = new THREE.Vector3(), - _vector4 = new THREE.Vector4(), - - _projScreenMatrix = new THREE.Matrix4(), - _projScreenobjectMatrixWorld = new THREE.Matrix4(), - - _frustum = new THREE.Frustum(), - - _clippedVertex1PositionScreen = new THREE.Vector4(), - _clippedVertex2PositionScreen = new THREE.Vector4(), - - _face3VertexNormals; - - this.projectVector = function ( vector, camera ) { - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse ); - _projScreenMatrix.multiplyVector3( vector ); - - return vector; - - }; - - this.unprojectVector = function ( vector, camera ) { - - camera.projectionMatrixInverse.getInverse( camera.projectionMatrix ); - - _projScreenMatrix.multiply( camera.matrixWorld, camera.projectionMatrixInverse ); - _projScreenMatrix.multiplyVector3( vector ); - - return vector; - - }; - - /** - * Translates a 2D point from NDC to a THREE.Ray - * that can be used for picking. - * @vector - THREE.Vector3 that represents 2D point - * @camera - THREE.Camera - */ - this.pickingRay = function ( vector, camera ) { - - var end, ray, t; - - // set two vectors with opposing z values - vector.z = -1.0; - end = new THREE.Vector3( vector.x, vector.y, 1.0 ); - - this.unprojectVector( vector, camera ); - this.unprojectVector( end, camera ); - - // find direction from vector to end - end.subSelf( vector ).normalize(); - - return new THREE.Ray( vector, end ); - - }; - - this.projectGraph = function ( root, sort ) { - - _objectCount = 0; - - _renderData.objects.length = 0; - _renderData.sprites.length = 0; - _renderData.lights.length = 0; - - var projectObject = function ( object ) { - - if ( object.visible === false ) return; - - if ( ( object instanceof THREE.Mesh || object instanceof THREE.Line ) && - ( object.frustumCulled === false || _frustum.contains( object ) ) ) { - - _projScreenMatrix.multiplyVector3( _vector3.copy( object.position ) ); - - _object = getNextObjectInPool(); - _object.object = object; - _object.z = _vector3.z; - - _renderData.objects.push( _object ); - - } else if ( object instanceof THREE.Sprite || object instanceof THREE.Particle ) { - - _projScreenMatrix.multiplyVector3( _vector3.copy( object.position ) ); - - _object = getNextObjectInPool(); - _object.object = object; - _object.z = _vector3.z; - - _renderData.sprites.push( _object ); - - } else if ( object instanceof THREE.Light ) { - - _renderData.lights.push( object ); - - } - - for ( var c = 0, cl = object.children.length; c < cl; c ++ ) { - - projectObject( object.children[ c ] ); - - } - - }; - - projectObject( root ); - - sort && _renderData.objects.sort( painterSort ); - - return _renderData; - - }; - - this.projectScene = function ( scene, camera, sort ) { - - var near = camera.near, far = camera.far, - o, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object, - objectMatrixWorld, objectMatrixWorldRotation, objectMaterial, - geometry, geometryMaterials, vertices, vertex, vertexPositionScreen, - faces, face, faceVertexNormals, normal, faceVertexUvs, uvs, - v1, v2, v3, v4; - - _face3Count = 0; - _face4Count = 0; - _lineCount = 0; - _particleCount = 0; - - _renderData.elements.length = 0; - - if ( camera.parent === undefined ) { - - console.warn( 'DEPRECATED: Camera hasn\'t been added to a Scene. Adding it...' ); - scene.add( camera ); - - } - - scene.updateMatrixWorld(); - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse ); - - _frustum.setFromMatrix( _projScreenMatrix ); - - _renderData = this.projectGraph( scene, false ); - - for ( o = 0, ol = _renderData.objects.length; o < ol; o++ ) { - - object = _renderData.objects[ o ].object; - - objectMatrixWorld = object.matrixWorld; - objectMaterial = object.material; - - _vertexCount = 0; - - if ( object instanceof THREE.Mesh ) { - - geometry = object.geometry; - geometryMaterials = object.geometry.materials; - vertices = geometry.vertices; - faces = geometry.faces; - faceVertexUvs = geometry.faceVertexUvs; - - objectMatrixWorldRotation = object.matrixRotationWorld.extractRotation( objectMatrixWorld ); - - for ( v = 0, vl = vertices.length; v < vl; v ++ ) { - - _vertex = getNextVertexInPool(); - _vertex.positionWorld.copy( vertices[ v ].position ); - - objectMatrixWorld.multiplyVector3( _vertex.positionWorld ); - - _vertex.positionScreen.copy( _vertex.positionWorld ); - _projScreenMatrix.multiplyVector4( _vertex.positionScreen ); - - _vertex.positionScreen.x /= _vertex.positionScreen.w; - _vertex.positionScreen.y /= _vertex.positionScreen.w; - - _vertex.visible = _vertex.positionScreen.z > near && _vertex.positionScreen.z < far; - - } - - for ( f = 0, fl = faces.length; f < fl; f ++ ) { - - face = faces[ f ]; - - if ( face instanceof THREE.Face3 ) { - - v1 = _vertexPool[ face.a ]; - v2 = _vertexPool[ face.b ]; - v3 = _vertexPool[ face.c ]; - - if ( v1.visible && v2.visible && v3.visible && - ( object.doubleSided || ( object.flipSided != - ( v3.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) - - ( v3.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ) ) ) { - - _face = getNextFace3InPool(); - - _face.v1.copy( v1 ); - _face.v2.copy( v2 ); - _face.v3.copy( v3 ); - - } else { - - continue; - - } - - } else if ( face instanceof THREE.Face4 ) { - - v1 = _vertexPool[ face.a ]; - v2 = _vertexPool[ face.b ]; - v3 = _vertexPool[ face.c ]; - v4 = _vertexPool[ face.d ]; - - if ( v1.visible && v2.visible && v3.visible && v4.visible && - ( object.doubleSided || ( object.flipSided != - ( ( v4.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) - - ( v4.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 || - ( v2.positionScreen.x - v3.positionScreen.x ) * ( v4.positionScreen.y - v3.positionScreen.y ) - - ( v2.positionScreen.y - v3.positionScreen.y ) * ( v4.positionScreen.x - v3.positionScreen.x ) < 0 ) ) ) ) { - - _face = getNextFace4InPool(); - - _face.v1.copy( v1 ); - _face.v2.copy( v2 ); - _face.v3.copy( v3 ); - _face.v4.copy( v4 ); - - } else { - - continue; - - } - - } - - _face.normalWorld.copy( face.normal ); - objectMatrixWorldRotation.multiplyVector3( _face.normalWorld ); - - _face.centroidWorld.copy( face.centroid ); - objectMatrixWorld.multiplyVector3( _face.centroidWorld ); - - _face.centroidScreen.copy( _face.centroidWorld ); - _projScreenMatrix.multiplyVector3( _face.centroidScreen ); - - faceVertexNormals = face.vertexNormals; - - for ( n = 0, nl = faceVertexNormals.length; n < nl; n ++ ) { - - normal = _face.vertexNormalsWorld[ n ]; - normal.copy( faceVertexNormals[ n ] ); - objectMatrixWorldRotation.multiplyVector3( normal ); - - } - - for ( c = 0, cl = faceVertexUvs.length; c < cl; c ++ ) { - - uvs = faceVertexUvs[ c ][ f ]; - - if ( !uvs ) continue; - - for ( u = 0, ul = uvs.length; u < ul; u ++ ) { - - _face.uvs[ c ][ u ] = uvs[ u ]; - - } - - } - - _face.material = objectMaterial; - _face.faceMaterial = face.materialIndex !== null ? geometryMaterials[ face.materialIndex ] : null; - - _face.z = _face.centroidScreen.z; - - _renderData.elements.push( _face ); - - } - - } else if ( object instanceof THREE.Line ) { - - _projScreenobjectMatrixWorld.multiply( _projScreenMatrix, objectMatrixWorld ); - - vertices = object.geometry.vertices; - - v1 = getNextVertexInPool(); - v1.positionScreen.copy( vertices[ 0 ].position ); - _projScreenobjectMatrixWorld.multiplyVector4( v1.positionScreen ); - - for ( v = 1, vl = vertices.length; v < vl; v++ ) { - - v1 = getNextVertexInPool(); - v1.positionScreen.copy( vertices[ v ].position ); - _projScreenobjectMatrixWorld.multiplyVector4( v1.positionScreen ); - - v2 = _vertexPool[ _vertexCount - 2 ]; - - _clippedVertex1PositionScreen.copy( v1.positionScreen ); - _clippedVertex2PositionScreen.copy( v2.positionScreen ); - - if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) ) { - - // Perform the perspective divide - _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w ); - _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w ); - - _line = getNextLineInPool(); - _line.v1.positionScreen.copy( _clippedVertex1PositionScreen ); - _line.v2.positionScreen.copy( _clippedVertex2PositionScreen ); - - _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z ); - - _line.material = objectMaterial; - - _renderData.elements.push( _line ); - - } - - } - - } - - } - - for ( o = 0, ol = _renderData.sprites.length; o < ol; o++ ) { - - object = _renderData.sprites[ o ].object; - - objectMatrixWorld = object.matrixWorld; - - if ( object instanceof THREE.Particle ) { - - _vector4.set( objectMatrixWorld.n14, objectMatrixWorld.n24, objectMatrixWorld.n34, 1 ); - _projScreenMatrix.multiplyVector4( _vector4 ); - - _vector4.z /= _vector4.w; - - if ( _vector4.z > 0 && _vector4.z < 1 ) { - - _particle = getNextParticleInPool(); - _particle.x = _vector4.x / _vector4.w; - _particle.y = _vector4.y / _vector4.w; - _particle.z = _vector4.z; - - _particle.rotation = object.rotation.z; - - _particle.scale.x = object.scale.x * Math.abs( _particle.x - ( _vector4.x + camera.projectionMatrix.n11 ) / ( _vector4.w + camera.projectionMatrix.n14 ) ); - _particle.scale.y = object.scale.y * Math.abs( _particle.y - ( _vector4.y + camera.projectionMatrix.n22 ) / ( _vector4.w + camera.projectionMatrix.n24 ) ); - - _particle.material = object.material; - - _renderData.elements.push( _particle ); - - } - - } - - } - - sort && _renderData.elements.sort( painterSort ); - - return _renderData; - - }; - - // Pools - - function getNextObjectInPool() { - - var object = _objectPool[ _objectCount ] = _objectPool[ _objectCount ] || new THREE.RenderableObject(); - - _objectCount ++; - - return object; - - } - - function getNextVertexInPool() { - - var vertex = _vertexPool[ _vertexCount ] = _vertexPool[ _vertexCount ] || new THREE.RenderableVertex(); - - _vertexCount ++; - - return vertex; - - } - - function getNextFace3InPool() { - - var face = _face3Pool[ _face3Count ] = _face3Pool[ _face3Count ] || new THREE.RenderableFace3(); - - _face3Count ++; - - return face; - - } - - function getNextFace4InPool() { - - var face = _face4Pool[ _face4Count ] = _face4Pool[ _face4Count ] || new THREE.RenderableFace4(); - - _face4Count ++; - - return face; - - } - - function getNextLineInPool() { - - var line = _linePool[ _lineCount ] = _linePool[ _lineCount ] || new THREE.RenderableLine(); - - _lineCount ++; - - return line; - - } - - function getNextParticleInPool() { - - var particle = _particlePool[ _particleCount ] = _particlePool[ _particleCount ] || new THREE.RenderableParticle(); - _particleCount ++; - return particle; - - } - - // - - function painterSort( a, b ) { - - return b.z - a.z; - - } - - function clipLine( s1, s2 ) { - - var alpha1 = 0, alpha2 = 1, - - // Calculate the boundary coordinate of each vertex for the near and far clip planes, - // Z = -1 and Z = +1, respectively. - bc1near = s1.z + s1.w, - bc2near = s2.z + s2.w, - bc1far = - s1.z + s1.w, - bc2far = - s2.z + s2.w; - - if ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) { - - // Both vertices lie entirely within all clip planes. - return true; - - } else if ( ( bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0 ) ) { - - // Both vertices lie entirely outside one of the clip planes. - return false; - - } else { - - // The line segment spans at least one clip plane. - - if ( bc1near < 0 ) { - - // v1 lies outside the near plane, v2 inside - alpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) ); - - } else if ( bc2near < 0 ) { - - // v2 lies outside the near plane, v1 inside - alpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) ); - - } - - if ( bc1far < 0 ) { - - // v1 lies outside the far plane, v2 inside - alpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) ); - - } else if ( bc2far < 0 ) { - - // v2 lies outside the far plane, v2 inside - alpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) ); - - } - - if ( alpha2 < alpha1 ) { - - // The line segment spans two boundaries, but is outside both of them. - // (This can't happen when we're only clipping against just near/far but good - // to leave the check here for future usage if other clip planes are added.) - return false; - - } else { - - // Update the s1 and s2 vertices to match the clipped line segment. - s1.lerpSelf( s2, alpha1 ); - s2.lerpSelf( s1, 1 - alpha2 ); - - return true; - - } - - } - - } - -}; -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Quaternion = function( x, y, z, w ) { - - this.set( - - x || 0, - y || 0, - z || 0, - w !== undefined ? w : 1 - - ); - -}; - -THREE.Quaternion.prototype = { - - constructor: THREE.Quaternion, - - set: function ( x, y, z, w ) { - - this.x = x; - this.y = y; - this.z = z; - this.w = w; - - return this; - - }, - - copy: function ( q ) { - - this.x = q.x; - this.y = q.y; - this.z = q.z; - this.w = q.w; - - return this; - - }, - - setFromEuler: function ( vec3 ) { - - var c = Math.PI / 360, // 0.5 * Math.PI / 360, // 0.5 is an optimization - x = vec3.x * c, - y = vec3.y * c, - z = vec3.z * c, - - c1 = Math.cos( y ), - s1 = Math.sin( y ), - c2 = Math.cos( -z ), - s2 = Math.sin( -z ), - c3 = Math.cos( x ), - s3 = Math.sin( x ), - - c1c2 = c1 * c2, - s1s2 = s1 * s2; - - this.w = c1c2 * c3 - s1s2 * s3; - this.x = c1c2 * s3 + s1s2 * c3; - this.y = s1 * c2 * c3 + c1 * s2 * s3; - this.z = c1 * s2 * c3 - s1 * c2 * s3; - - return this; - - }, - - setFromAxisAngle: function ( axis, angle ) { - - // from http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm - // axis have to be normalized - - var 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 ); - - return this; - - }, - - setFromRotationMatrix: function ( m ) { - // Adapted from: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm - function copySign(a, b) { - return b < 0 ? -Math.abs(a) : Math.abs(a); - } - var absQ = Math.pow(m.determinant(), 1.0 / 3.0); - this.w = Math.sqrt( Math.max( 0, absQ + m.n11 + m.n22 + m.n33 ) ) / 2; - this.x = Math.sqrt( Math.max( 0, absQ + m.n11 - m.n22 - m.n33 ) ) / 2; - this.y = Math.sqrt( Math.max( 0, absQ - m.n11 + m.n22 - m.n33 ) ) / 2; - this.z = Math.sqrt( Math.max( 0, absQ - m.n11 - m.n22 + m.n33 ) ) / 2; - this.x = copySign( this.x, ( m.n32 - m.n23 ) ); - this.y = copySign( this.y, ( m.n13 - m.n31 ) ); - this.z = copySign( this.z, ( m.n21 - m.n12 ) ); - this.normalize(); - return this; - }, - - calculateW : function () { - - this.w = - Math.sqrt( Math.abs( 1.0 - this.x * this.x - this.y * this.y - this.z * this.z ) ); - - return this; - - }, - - inverse: function () { - - this.x *= -1; - this.y *= -1; - this.z *= -1; - - return this; - - }, - - length: function () { - - return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); - - }, - - normalize: function () { - - var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w ); - - if ( l === 0 ) { - - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 0; - - } else { - - l = 1 / l; - - this.x = this.x * l; - this.y = this.y * l; - this.z = this.z * l; - this.w = this.w * l; - - } - - return this; - - }, - - multiplySelf: function ( quat2 ) { - - var qax = this.x, qay = this.y, qaz = this.z, qaw = this.w, - qbx = quat2.x, qby = quat2.y, qbz = quat2.z, qbw = quat2.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; - - return this; - - }, - - multiply: function ( q1, q2 ) { - - // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm - - this.x = q1.x * q2.w + q1.y * q2.z - q1.z * q2.y + q1.w * q2.x; - this.y = -q1.x * q2.z + q1.y * q2.w + q1.z * q2.x + q1.w * q2.y; - this.z = q1.x * q2.y - q1.y * q2.x + q1.z * q2.w + q1.w * q2.z; - this.w = -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w; - - return this; - - }, - - multiplyVector3: function ( vec, dest ) { - - if( !dest ) { dest = vec; } - - var x = vec.x, y = vec.y, z = vec.z, - qx = this.x, qy = this.y, qz = this.z, qw = this.w; - - // calculate quat * vec - - var ix = qw * x + qy * z - qz * y, - iy = qw * y + qz * x - qx * z, - iz = qw * z + qx * y - qy * x, - iw = -qx * x - qy * y - qz * z; - - // calculate result * inverse quat - - dest.x = ix * qw + iw * -qx + iy * -qz - iz * -qy; - dest.y = iy * qw + iw * -qy + iz * -qx - ix * -qz; - dest.z = iz * qw + iw * -qz + ix * -qy - iy * -qx; - - return dest; - - } - -} - -THREE.Quaternion.slerp = function ( qa, qb, qm, t ) { - - // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ - - var cosHalfTheta = qa.w * qb.w + qa.x * qb.x + qa.y * qb.y + qa.z * qb.z; - - if (cosHalfTheta < 0) { - qm.w = -qb.w; qm.x = -qb.x; qm.y = -qb.y; qm.z = -qb.z; - cosHalfTheta = -cosHalfTheta; - } else { - qm.copy(qb); - } - - if ( Math.abs( cosHalfTheta ) >= 1.0 ) { - - qm.w = qa.w; qm.x = qa.x; qm.y = qa.y; qm.z = qa.z; - return qm; - - } - - var halfTheta = Math.acos( cosHalfTheta ), - sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta ); - - if ( Math.abs( sinHalfTheta ) < 0.001 ) { - - qm.w = 0.5 * ( qa.w + qb.w ); - qm.x = 0.5 * ( qa.x + qb.x ); - qm.y = 0.5 * ( qa.y + qb.y ); - qm.z = 0.5 * ( qa.z + qb.z ); - - return qm; - - } - - var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta, - ratioB = Math.sin( t * halfTheta ) / sinHalfTheta; - - qm.w = ( qa.w * ratioA + qm.w * ratioB ); - qm.x = ( qa.x * ratioA + qm.x * ratioB ); - qm.y = ( qa.y * ratioA + qm.y * ratioB ); - qm.z = ( qa.z * ratioA + qm.z * ratioB ); - - return qm; - -} -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Vertex = function ( position ) { - - this.position = position || new THREE.Vector3(); - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Face3 = function ( a, b, c, normal, color, materialIndex ) { - - this.a = a; - this.b = b; - this.c = c; - - this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); - this.vertexNormals = normal instanceof Array ? normal : [ ]; - - this.color = color instanceof THREE.Color ? color : new THREE.Color(); - this.vertexColors = color instanceof Array ? color : []; - - this.vertexTangents = []; - - this.materialIndex = materialIndex; - - this.centroid = new THREE.Vector3(); - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) { - - this.a = a; - this.b = b; - this.c = c; - this.d = d; - - this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3(); - this.vertexNormals = normal instanceof Array ? normal : [ ]; - - this.color = color instanceof THREE.Color ? color : new THREE.Color(); - this.vertexColors = color instanceof Array ? color : []; - - this.vertexTangents = []; - - this.materialIndex = materialIndex; - - this.centroid = new THREE.Vector3(); - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.UV = function ( u, v ) { - - this.u = u || 0; - this.v = v || 0; - -}; - -THREE.UV.prototype = { - - constructor: THREE.UV, - - set: function ( u, v ) { - - this.u = u; - this.v = v; - - return this; - - }, - - copy: function ( uv ) { - - this.u = uv.u; - this.v = uv.v; - - return this; - - }, - - clone: function () { - - return new THREE.UV( this.u, this.v ); - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author kile / http://kile.stravaganza.org/ - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - * @author zz85 / http://www.lab4games.net/zz85/blog - */ - -THREE.Geometry = function () { - - this.id = THREE.GeometryCount ++; - - this.vertices = []; - this.colors = []; // one-to-one vertex colors, used in ParticleSystem, Line and Ribbon - - this.materials = []; - - this.faces = []; - - this.faceUvs = [[]]; - this.faceVertexUvs = [[]]; - - this.morphTargets = []; - this.morphColors = []; - - this.skinWeights = []; - this.skinIndices = []; - - this.boundingBox = null; - this.boundingSphere = null; - - this.hasTangents = false; - - this.dynamic = false; // unless set to true the *Arrays will be deleted once sent to a buffer. - -}; - -THREE.Geometry.prototype = { - - constructor : THREE.Geometry, - - applyMatrix: function ( matrix ) { - - var matrixRotation = new THREE.Matrix4(); - matrixRotation.extractRotation( matrix, new THREE.Vector3( 1, 1, 1 ) ); - - for ( var i = 0, il = this.vertices.length; i < il; i ++ ) { - - var vertex = this.vertices[ i ]; - - matrix.multiplyVector3( vertex.position ); - - } - - for ( var i = 0, il = this.faces.length; i < il; i ++ ) { - - var face = this.faces[ i ]; - - matrixRotation.multiplyVector3( face.normal ); - - for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) { - - matrixRotation.multiplyVector3( face.vertexNormals[ j ] ); - - } - - matrix.multiplyVector3( face.centroid ); - - } - - }, - - computeCentroids: function () { - - var f, fl, face; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - face.centroid.set( 0, 0, 0 ); - - if ( face instanceof THREE.Face3 ) { - - face.centroid.addSelf( this.vertices[ face.a ].position ); - face.centroid.addSelf( this.vertices[ face.b ].position ); - face.centroid.addSelf( this.vertices[ face.c ].position ); - face.centroid.divideScalar( 3 ); - - } else if ( face instanceof THREE.Face4 ) { - - face.centroid.addSelf( this.vertices[ face.a ].position ); - face.centroid.addSelf( this.vertices[ face.b ].position ); - face.centroid.addSelf( this.vertices[ face.c ].position ); - face.centroid.addSelf( this.vertices[ face.d ].position ); - face.centroid.divideScalar( 4 ); - - } - - } - - }, - - computeFaceNormals: function () { - - var n, nl, v, vl, vertex, f, fl, face, vA, vB, vC, - cb = new THREE.Vector3(), ab = new THREE.Vector3(); - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - vA = this.vertices[ face.a ]; - vB = this.vertices[ face.b ]; - vC = this.vertices[ face.c ]; - - cb.sub( vC.position, vB.position ); - ab.sub( vA.position, vB.position ); - cb.crossSelf( ab ); - - if ( !cb.isZero() ) { - - cb.normalize(); - - } - - face.normal.copy( cb ); - - } - - }, - - computeVertexNormals: function () { - - var v, vl, f, fl, face, vertices; - - // create internal buffers for reuse when calling this method repeatedly - // (otherwise memory allocation / deallocation every frame is big resource hog) - - if ( this.__tmpVertices === undefined ) { - - this.__tmpVertices = new Array( this.vertices.length ); - vertices = this.__tmpVertices; - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - vertices[ v ] = new THREE.Vector3(); - - } - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - if ( face instanceof THREE.Face3 ) { - - face.vertexNormals = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]; - - } else if ( face instanceof THREE.Face4 ) { - - face.vertexNormals = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]; - - } - - } - - } else { - - vertices = this.__tmpVertices; - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - vertices[ v ].set( 0, 0, 0 ); - - } - - } - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - if ( face instanceof THREE.Face3 ) { - - vertices[ face.a ].addSelf( face.normal ); - vertices[ face.b ].addSelf( face.normal ); - vertices[ face.c ].addSelf( face.normal ); - - } else if ( face instanceof THREE.Face4 ) { - - vertices[ face.a ].addSelf( face.normal ); - vertices[ face.b ].addSelf( face.normal ); - vertices[ face.c ].addSelf( face.normal ); - vertices[ face.d ].addSelf( face.normal ); - - } - - } - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - vertices[ v ].normalize(); - - } - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - if ( face instanceof THREE.Face3 ) { - - face.vertexNormals[ 0 ].copy( vertices[ face.a ] ); - face.vertexNormals[ 1 ].copy( vertices[ face.b ] ); - face.vertexNormals[ 2 ].copy( vertices[ face.c ] ); - - } else if ( face instanceof THREE.Face4 ) { - - face.vertexNormals[ 0 ].copy( vertices[ face.a ] ); - face.vertexNormals[ 1 ].copy( vertices[ face.b ] ); - face.vertexNormals[ 2 ].copy( vertices[ face.c ] ); - face.vertexNormals[ 3 ].copy( vertices[ face.d ] ); - - } - - } - - }, - - computeTangents: function () { - - // based on http://www.terathon.com/code/tangent.html - // tangents go to vertices - - var f, fl, v, vl, i, il, vertexIndex, - face, uv, vA, vB, vC, uvA, uvB, uvC, - x1, x2, y1, y2, z1, z2, - s1, s2, t1, t2, r, t, test, - tan1 = [], tan2 = [], - sdir = new THREE.Vector3(), tdir = new THREE.Vector3(), - tmp = new THREE.Vector3(), tmp2 = new THREE.Vector3(), - n = new THREE.Vector3(), w; - - for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - tan1[ v ] = new THREE.Vector3(); - tan2[ v ] = new THREE.Vector3(); - - } - - function handleTriangle( context, a, b, c, ua, ub, uc ) { - - vA = context.vertices[ a ].position; - vB = context.vertices[ b ].position; - vC = context.vertices[ c ].position; - - uvA = uv[ ua ]; - uvB = uv[ ub ]; - uvC = uv[ uc ]; - - x1 = vB.x - vA.x; - x2 = vC.x - vA.x; - y1 = vB.y - vA.y; - y2 = vC.y - vA.y; - z1 = vB.z - vA.z; - z2 = vC.z - vA.z; - - s1 = uvB.u - uvA.u; - s2 = uvC.u - uvA.u; - t1 = uvB.v - uvA.v; - t2 = uvC.v - uvA.v; - - r = 1.0 / ( s1 * t2 - s2 * t1 ); - sdir.set( ( t2 * x1 - t1 * x2 ) * r, - ( t2 * y1 - t1 * y2 ) * r, - ( t2 * z1 - t1 * z2 ) * r ); - tdir.set( ( s1 * x2 - s2 * x1 ) * r, - ( s1 * y2 - s2 * y1 ) * r, - ( s1 * z2 - s2 * z1 ) * r ); - - tan1[ a ].addSelf( sdir ); - tan1[ b ].addSelf( sdir ); - tan1[ c ].addSelf( sdir ); - - tan2[ a ].addSelf( tdir ); - tan2[ b ].addSelf( tdir ); - tan2[ c ].addSelf( tdir ); - - } - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - uv = this.faceVertexUvs[ 0 ][ f ]; // use UV layer 0 for tangents - - if ( face instanceof THREE.Face3 ) { - - handleTriangle( this, face.a, face.b, face.c, 0, 1, 2 ); - - } else if ( face instanceof THREE.Face4 ) { - - handleTriangle( this, face.a, face.b, face.c, 0, 1, 2 ); - handleTriangle( this, face.a, face.b, face.d, 0, 1, 3 ); - - } - - } - - var faceIndex = [ 'a', 'b', 'c', 'd' ]; - - for ( f = 0, fl = this.faces.length; f < fl; f ++ ) { - - face = this.faces[ f ]; - - for ( i = 0; i < face.vertexNormals.length; i++ ) { - - n.copy( face.vertexNormals[ i ] ); - - vertexIndex = face[ faceIndex[ i ] ]; - - t = tan1[ vertexIndex ]; - - // Gram-Schmidt orthogonalize - - tmp.copy( t ); - tmp.subSelf( n.multiplyScalar( n.dot( t ) ) ).normalize(); - - // Calculate handedness - - tmp2.cross( face.vertexNormals[ i ], t ); - test = tmp2.dot( tan2[ vertexIndex ] ); - w = (test < 0.0) ? -1.0 : 1.0; - - face.vertexTangents[ i ] = new THREE.Vector4( tmp.x, tmp.y, tmp.z, w ); - - } - - } - - this.hasTangents = true; - - }, - - computeBoundingBox: function () { - - if ( this.vertices.length > 0 ) { - - var position, firstPosition = this.vertices[ 0 ].position; - - if ( ! this.boundingBox ) { - - this.boundingBox = { min: firstPosition.clone(), max: firstPosition.clone() }; - - } else { - - this.boundingBox.min.copy( firstPosition ); - this.boundingBox.max.copy( firstPosition ); - - } - - var min = this.boundingBox.min, - max = this.boundingBox.max; - - for ( var v = 1, vl = this.vertices.length; v < vl; v ++ ) { - - position = this.vertices[ v ].position; - - if ( position.x < min.x ) { - - min.x = position.x; - - } else if ( position.x > max.x ) { - - max.x = position.x; - - } - - if ( position.y < min.y ) { - - min.y = position.y; - - } else if ( position.y > max.y ) { - - max.y = position.y; - - } - - if ( position.z < min.z ) { - - min.z = position.z; - - } else if ( position.z > max.z ) { - - max.z = position.z; - - } - - } - - } - - }, - - computeBoundingSphere: function () { - - var radius, maxRadius = 0; - - for ( var v = 0, vl = this.vertices.length; v < vl; v ++ ) { - - radius = this.vertices[ v ].position.length(); - if ( radius > maxRadius ) maxRadius = radius; - - } - - this.boundingSphere = { radius: maxRadius }; - - }, - - /* - * Checks for duplicate vertices with hashmap. - * Duplicated vertices are removed - * and faces' vertices are updated. - */ - - mergeVertices: function() { - - var verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique) - var unique = [], changes = []; - - var v, key; - var precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001 - var precision = Math.pow( 10, precisionPoints ); - var i,il, face; - - for ( i = 0, il = this.vertices.length; i < il; i ++ ) { - - v = this.vertices[ i ].position; - key = [ Math.round( v.x * precision ), Math.round( v.y * precision ), Math.round( v.z * precision ) ].join( '_' ); - - if ( verticesMap[ key ] === undefined ) { - - verticesMap[ key ] = i; - unique.push( this.vertices[ i ] ); - changes[ i ] = unique.length - 1; - - } else { - - //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]); - changes[ i ] = changes[ verticesMap[ key ] ]; - - } - - }; - - - // Start to patch face indices - - for( i = 0, il = this.faces.length; i < il; i ++ ) { - - face = this.faces[ i ]; - - if ( face instanceof THREE.Face3 ) { - - face.a = changes[ face.a ]; - face.b = changes[ face.b ]; - face.c = changes[ face.c ]; - - } else if ( face instanceof THREE.Face4 ) { - - face.a = changes[ face.a ]; - face.b = changes[ face.b ]; - face.c = changes[ face.c ]; - face.d = changes[ face.d ]; - - } - - } - - // Use unique set of vertices - - this.vertices = unique; - - } - -}; - -THREE.GeometryCount = 0; -/** - * Spline from Tween.js, slightly optimized (and trashed) - * http://sole.github.com/tween.js/examples/05_spline.html - * - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Spline = function ( points ) { - - this.points = points; - - var c = [], v3 = { x: 0, y: 0, z: 0 }, - point, intPoint, weight, w2, w3, - pa, pb, pc, pd; - - this.initFromArray = function( a ) { - - this.points = []; - - for ( var i = 0; i < a.length; i++ ) { - - this.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] }; - - } - - }; - - this.getPoint = function ( k ) { - - point = ( this.points.length - 1 ) * k; - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > this.points.length - 2 ? intPoint : intPoint + 1; - c[ 3 ] = intPoint > this.points.length - 3 ? intPoint : intPoint + 2; - - pa = this.points[ c[ 0 ] ]; - pb = this.points[ c[ 1 ] ]; - pc = this.points[ c[ 2 ] ]; - pd = this.points[ c[ 3 ] ]; - - w2 = weight * weight; - w3 = weight * w2; - - v3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 ); - v3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 ); - v3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 ); - - return v3; - - }; - - this.getControlPointsArray = function () { - - var i, p, l = this.points.length, - coords = []; - - for ( i = 0; i < l; i ++ ) { - - p = this.points[ i ]; - coords[ i ] = [ p.x, p.y, p.z ]; - - } - - return coords; - - }; - - // approximate length by summing linear segments - - this.getLength = function ( nSubDivisions ) { - - var i, index, nSamples, position, - point = 0, intPoint = 0, oldIntPoint = 0, - oldPosition = new THREE.Vector3(), - tmpVec = new THREE.Vector3(), - chunkLengths = [], - totalLength = 0; - - // first point has 0 length - - chunkLengths[ 0 ] = 0; - - if ( !nSubDivisions ) nSubDivisions = 100; - - nSamples = this.points.length * nSubDivisions; - - oldPosition.copy( this.points[ 0 ] ); - - for ( i = 1; i < nSamples; i ++ ) { - - index = i / nSamples; - - position = this.getPoint( index ); - tmpVec.copy( position ); - - totalLength += tmpVec.distanceTo( oldPosition ); - - oldPosition.copy( position ); - - point = ( this.points.length - 1 ) * index; - intPoint = Math.floor( point ); - - if ( intPoint != oldIntPoint ) { - - chunkLengths[ intPoint ] = totalLength; - oldIntPoint = intPoint; - - } - - } - - // last point ends with total length - - chunkLengths[ chunkLengths.length ] = totalLength; - - return { chunks: chunkLengths, total: totalLength }; - - }; - - this.reparametrizeByArcLength = function ( samplingCoef ) { - - var i, j, - index, indexCurrent, indexNext, - linearDistance, realDistance, - sampling, position, - newpoints = [], - tmpVec = new THREE.Vector3(), - sl = this.getLength(); - - newpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() ); - - for ( i = 1; i < this.points.length; i++ ) { - - //tmpVec.copy( this.points[ i - 1 ] ); - //linearDistance = tmpVec.distanceTo( this.points[ i ] ); - - realDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ]; - - sampling = Math.ceil( samplingCoef * realDistance / sl.total ); - - indexCurrent = ( i - 1 ) / ( this.points.length - 1 ); - indexNext = i / ( this.points.length - 1 ); - - for ( j = 1; j < sampling - 1; j++ ) { - - index = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent ); - - position = this.getPoint( index ); - newpoints.push( tmpVec.copy( position ).clone() ); - - } - - newpoints.push( tmpVec.copy( this.points[ i ] ).clone() ); - - } - - this.points = newpoints; - - }; - - // Catmull-Rom - - function interpolate( p0, p1, p2, p3, t, t2, t3 ) { - - var v0 = ( p2 - p0 ) * 0.5, - v1 = ( p3 - p1 ) * 0.5; - - return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; - - }; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.Edge = function( v1, v2, vi1, vi2 ) { - - this.vertices = [ v1, v2 ]; // vertex references - this.vertexIndices = [ vi1, vi2 ]; // vertex indices - - this.faces = []; // face references - this.faceIndices = []; // face indices - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.Camera = function () { - - if ( arguments.length ) { - - console.warn( 'DEPRECATED: Camera() is now PerspectiveCamera() or OrthographicCamera().' ); - return new THREE.PerspectiveCamera( arguments[ 0 ], arguments[ 1 ], arguments[ 2 ], arguments[ 3 ] ); - - } - - THREE.Object3D.call( this ); - - this.matrixWorldInverse = new THREE.Matrix4(); - - this.projectionMatrix = new THREE.Matrix4(); - this.projectionMatrixInverse = new THREE.Matrix4(); - - -}; - -THREE.Camera.prototype = new THREE.Object3D(); -THREE.Camera.prototype.constructor = THREE.Camera; - -THREE.Camera.prototype.lookAt = function ( vector ) { - - // TODO: Add hierarchy support. - - this.matrix.lookAt( this.position, vector, this.up ); - - if ( this.rotationAutoUpdate ) { - - this.rotation.setRotationFromMatrix( this.matrix ); - - } - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) { - - THREE.Camera.call( this ); - - this.left = left; - this.right = right; - this.top = top; - this.bottom = bottom; - - this.near = ( near !== undefined ) ? near : 0.1; - this.far = ( far !== undefined ) ? far : 2000; - - this.updateProjectionMatrix(); - -}; - -THREE.OrthographicCamera.prototype = new THREE.Camera(); -THREE.OrthographicCamera.prototype.constructor = THREE.OrthographicCamera; - -THREE.OrthographicCamera.prototype.updateProjectionMatrix = function () { - - this.projectionMatrix = THREE.Matrix4.makeOrtho( this.left, this.right, this.top, this.bottom, this.near, this.far ); - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author greggman / http://games.greggman.com/ - * @author zz85 / http://www.lab4games.net/zz85/blog - */ - -THREE.PerspectiveCamera = function ( fov, aspect, near, far ) { - - THREE.Camera.call( this ); - - this.fov = fov !== undefined ? fov : 50; - this.aspect = aspect !== undefined ? aspect : 1; - this.near = near !== undefined ? near : 0.1; - this.far = far !== undefined ? far : 2000; - - this.updateProjectionMatrix(); - -}; - -THREE.PerspectiveCamera.prototype = new THREE.Camera(); -THREE.PerspectiveCamera.prototype.constructor = THREE.PerspectiveCamera; - - -/** - * Uses Focal Length (in mm) to estimate and set FOV - * 35mm (fullframe) camera is used if frame size is not specified; - * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html - */ - -THREE.PerspectiveCamera.prototype.setLens = function ( focalLength, frameSize ) { - - frameSize = frameSize !== undefined ? frameSize : 43.25; // 36x24mm - - this.fov = 2 * Math.atan( frameSize / ( focalLength * 2 ) ); - this.fov = 180 / Math.PI * this.fov; - - this.updateProjectionMatrix(); - -} - - -/** - * 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 - * - * var w = 1920; - * var h = 1080; - * var fullWidth = w * 3; - * var fullHeight = h * 2; - * - * --A-- - * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); - * --B-- - * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); - * --C-- - * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); - * --D-- - * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); - * --E-- - * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); - * --F-- - * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); - * - * Note there is no reason monitors have to be the same size or in a grid. - */ - -THREE.PerspectiveCamera.prototype.setViewOffset = function ( fullWidth, fullHeight, x, y, width, height ) { - - this.fullWidth = fullWidth; - this.fullHeight = fullHeight; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - - this.updateProjectionMatrix(); - -}; - - -THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function () { - - if ( this.fullWidth ) { - - var aspect = this.fullWidth / this.fullHeight; - var top = Math.tan( this.fov * Math.PI / 360 ) * this.near; - var bottom = -top; - var left = aspect * bottom; - var right = aspect * top; - var width = Math.abs( right - left ); - var height = Math.abs( top - bottom ); - - this.projectionMatrix = THREE.Matrix4.makeFrustum( - left + this.x * width / this.fullWidth, - left + ( this.x + this.width ) * width / this.fullWidth, - top - ( this.y + this.height ) * height / this.fullHeight, - top - this.y * height / this.fullHeight, - this.near, - this.far ); - - } else { - - this.projectionMatrix = THREE.Matrix4.makePerspective( this.fov, this.aspect, this.near, this.far ); - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Light = function ( hex ) { - - THREE.Object3D.call( this ); - - this.color = new THREE.Color( hex ); - -}; - -THREE.Light.prototype = new THREE.Object3D(); -THREE.Light.prototype.constructor = THREE.Light; -THREE.Light.prototype.supr = THREE.Object3D.prototype; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.AmbientLight = function ( hex ) { - - THREE.Light.call( this, hex ); - -}; - -THREE.AmbientLight.prototype = new THREE.Light(); -THREE.AmbientLight.prototype.constructor = THREE.AmbientLight; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.DirectionalLight = function ( hex, intensity, distance ) { - - THREE.Light.call( this, hex ); - - this.position = new THREE.Vector3( 0, 1, 0 ); - this.target = new THREE.Object3D(); - - this.intensity = ( intensity !== undefined ) ? intensity : 1; - this.distance = ( distance !== undefined ) ? distance : 0; - - this.castShadow = false; - this.onlyShadow = false; - - // - - this.shadowCameraLeft = -500; - this.shadowCameraRight = 500; - this.shadowCameraTop = 500; - this.shadowCameraBottom = -500; - - this.shadowCameraVisible = false; - - this.shadowBias = 0; - this.shadowDarkness = 0.5; - - this.shadowMapWidth = 512; - this.shadowMapHeight = 512; - - // - - this.shadowMap = null; - this.shadowMapSize = null; - this.shadowCamera = null; - this.shadowMatrix = null; - -}; - -THREE.DirectionalLight.prototype = new THREE.Light(); -THREE.DirectionalLight.prototype.constructor = THREE.DirectionalLight; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.PointLight = function ( hex, intensity, distance ) { - - THREE.Light.call( this, hex ); - - this.position = new THREE.Vector3( 0, 0, 0 ); - this.intensity = ( intensity !== undefined ) ? intensity : 1; - this.distance = ( distance !== undefined ) ? distance : 0; - -}; - -THREE.PointLight.prototype = new THREE.Light(); -THREE.PointLight.prototype.constructor = THREE.PointLight; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SpotLight = function ( hex, intensity, distance, castShadow ) { - - THREE.Light.call( this, hex ); - - this.position = new THREE.Vector3( 0, 1, 0 ); - this.target = new THREE.Object3D(); - - this.intensity = ( intensity !== undefined ) ? intensity : 1; - this.distance = ( distance !== undefined ) ? distance : 0; - - this.castShadow = ( castShadow !== undefined ) ? castShadow : false; - this.onlyShadow = false; - - // - - this.shadowCameraNear = 50; - this.shadowCameraFar = 5000; - this.shadowCameraFov = 50; - - this.shadowCameraVisible = false; - - this.shadowBias = 0; - this.shadowDarkness = 0.5; - - this.shadowMapWidth = 512; - this.shadowMapHeight = 512; - - // - - this.shadowMap = null; - this.shadowMapSize = null; - this.shadowCamera = null; - this.shadowMatrix = null; - -}; - -THREE.SpotLight.prototype = new THREE.Light(); -THREE.SpotLight.prototype.constructor = THREE.SpotLight; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Material = function ( parameters ) { - - parameters = parameters || {}; - - this.name = ''; - - this.id = THREE.MaterialCount ++; - - this.opacity = parameters.opacity !== undefined ? parameters.opacity : 1; - this.transparent = parameters.transparent !== undefined ? parameters.transparent : false; - - this.blending = parameters.blending !== undefined ? parameters.blending : THREE.NormalBlending; - - this.depthTest = parameters.depthTest !== undefined ? parameters.depthTest : true; - this.depthWrite = parameters.depthWrite !== undefined ? parameters.depthWrite : true; - - this.polygonOffset = parameters.polygonOffset !== undefined ? parameters.polygonOffset : false; - this.polygonOffsetFactor = parameters.polygonOffsetFactor !== undefined ? parameters.polygonOffsetFactor : 0; - this.polygonOffsetUnits = parameters.polygonOffsetUnits !== undefined ? parameters.polygonOffsetUnits : 0; - - this.alphaTest = parameters.alphaTest !== undefined ? parameters.alphaTest : 0; - - this.overdraw = parameters.overdraw !== undefined ? parameters.overdraw : false; // Boolean for fixing antialiasing gaps in CanvasRenderer - -} - -THREE.MaterialCount = 0; - -THREE.NoShading = 0; -THREE.FlatShading = 1; -THREE.SmoothShading = 2; - -THREE.NoColors = 0; -THREE.FaceColors = 1; -THREE.VertexColors = 2; - -THREE.NormalBlending = 0; -THREE.AdditiveBlending = 1; -THREE.SubtractiveBlending = 2; -THREE.MultiplyBlending = 3; -THREE.AdditiveAlphaBlending = 4; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * - * blending: THREE.NormalBlending, - * depthTest: , - * - * linewidth: , - * linecap: "round", - * linejoin: "round", - * - * vertexColors: - * - * fog: - * } - */ - -THREE.LineBasicMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.color = parameters.color !== undefined ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - - this.linewidth = parameters.linewidth !== undefined ? parameters.linewidth : 1; - this.linecap = parameters.linecap !== undefined ? parameters.linecap : 'round'; - this.linejoin = parameters.linejoin !== undefined ? parameters.linejoin : 'round'; - - this.vertexColors = parameters.vertexColors ? parameters.vertexColors : false; - - this.fog = parameters.fog !== undefined ? parameters.fog : true; - -}; - -THREE.LineBasicMaterial.prototype = new THREE.Material(); -THREE.LineBasicMaterial.prototype.constructor = THREE.LineBasicMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * map: new THREE.Texture( ), - * - * lightMap: new THREE.Texture( ), - * - * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), - * combine: THREE.Multiply, - * reflectivity: , - * refractionRatio: , - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * - * wireframe: , - * wireframeLinewidth: , - * - * vertexColors: false / THREE.VertexColors / THREE.FaceColors, - * skinning: , - * - * fog: - * } - */ - -THREE.MeshBasicMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.color = parameters.color !== undefined ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - - this.map = parameters.map !== undefined ? parameters.map : null; - - this.lightMap = parameters.lightMap !== undefined ? parameters.lightMap : null; - - this.envMap = parameters.envMap !== undefined ? parameters.envMap : null; - this.combine = parameters.combine !== undefined ? parameters.combine : THREE.MultiplyOperation; - this.reflectivity = parameters.reflectivity !== undefined ? parameters.reflectivity : 1; - this.refractionRatio = parameters.refractionRatio !== undefined ? parameters.refractionRatio : 0.98; - - this.fog = parameters.fog !== undefined ? parameters.fog : true; - - this.shading = parameters.shading !== undefined ? parameters.shading : THREE.SmoothShading; - - this.wireframe = parameters.wireframe !== undefined ? parameters.wireframe : false; - this.wireframeLinewidth = parameters.wireframeLinewidth !== undefined ? parameters.wireframeLinewidth : 1; - this.wireframeLinecap = parameters.wireframeLinecap !== undefined ? parameters.wireframeLinecap : 'round'; - this.wireframeLinejoin = parameters.wireframeLinejoin !== undefined ? parameters.wireframeLinejoin : 'round'; - - this.vertexColors = parameters.vertexColors !== undefined ? parameters.vertexColors : false; - - this.skinning = parameters.skinning !== undefined ? parameters.skinning : false; - this.morphTargets = parameters.morphTargets !== undefined ? parameters.morphTargets : false; - -}; - -THREE.MeshBasicMaterial.prototype = new THREE.Material(); -THREE.MeshBasicMaterial.prototype.constructor = THREE.MeshBasicMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * ambient: , - * opacity: , - * - * map: new THREE.Texture( ), - * - * lightMap: new THREE.Texture( ), - * - * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), - * combine: THREE.Multiply, - * reflectivity: , - * refractionRatio: , - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * - * wireframe: , - * wireframeLinewidth: , - * - * vertexColors: false / THREE.VertexColors / THREE.FaceColors, - * skinning: , - * - * fog: - * } - */ - -THREE.MeshLambertMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.color = parameters.color !== undefined ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - this.ambient = parameters.ambient !== undefined ? new THREE.Color( parameters.ambient ) : new THREE.Color( 0x050505 ); - - this.wrapAround = parameters.wrapAround !== undefined ? parameters.wrapAround: false; - this.wrapRGB = new THREE.Vector3( 1, 1, 1 ); - - this.map = parameters.map !== undefined ? parameters.map : null; - - this.lightMap = parameters.lightMap !== undefined ? parameters.lightMap : null; - - this.envMap = parameters.envMap !== undefined ? parameters.envMap : null; - this.combine = parameters.combine !== undefined ? parameters.combine : THREE.MultiplyOperation; - this.reflectivity = parameters.reflectivity !== undefined ? parameters.reflectivity : 1; - this.refractionRatio = parameters.refractionRatio !== undefined ? parameters.refractionRatio : 0.98; - - this.fog = parameters.fog !== undefined ? parameters.fog : true; - - this.shading = parameters.shading !== undefined ? parameters.shading : THREE.SmoothShading; - - this.wireframe = parameters.wireframe !== undefined ? parameters.wireframe : false; - this.wireframeLinewidth = parameters.wireframeLinewidth !== undefined ? parameters.wireframeLinewidth : 1; - this.wireframeLinecap = parameters.wireframeLinecap !== undefined ? parameters.wireframeLinecap : 'round'; - this.wireframeLinejoin = parameters.wireframeLinejoin !== undefined ? parameters.wireframeLinejoin : 'round'; - - this.vertexColors = parameters.vertexColors !== undefined ? parameters.vertexColors : false; - - this.skinning = parameters.skinning !== undefined ? parameters.skinning : false; - this.morphTargets = parameters.morphTargets !== undefined ? parameters.morphTargets : false; - -}; - -THREE.MeshLambertMaterial.prototype = new THREE.Material(); -THREE.MeshLambertMaterial.prototype.constructor = THREE.MeshLambertMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * ambient: , - * specular: , - * shininess: , - * opacity: , - * - * map: new THREE.Texture( ), - * - * lightMap: new THREE.Texture( ), - * - * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), - * combine: THREE.Multiply, - * reflectivity: , - * refractionRatio: , - * - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - * - * wireframe: , - * wireframeLinewidth: , - * - * vertexColors: false / THREE.VertexColors / THREE.FaceColors, - * skinning: , - * - * fog: - * } - */ - -THREE.MeshPhongMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.color = parameters.color !== undefined ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - this.ambient = parameters.ambient !== undefined ? new THREE.Color( parameters.ambient ) : new THREE.Color( 0x050505 ); - this.specular = parameters.specular !== undefined ? new THREE.Color( parameters.specular ) : new THREE.Color( 0x111111 ); - this.shininess = parameters.shininess !== undefined ? parameters.shininess : 30; - - this.metal = parameters.metal !== undefined ? parameters.metal : false; - this.perPixel = parameters.perPixel !== undefined ? parameters.perPixel : false; - - this.wrapAround = parameters.wrapAround !== undefined ? parameters.wrapAround: false; - this.wrapRGB = new THREE.Vector3( 1, 1, 1 ); - - this.map = parameters.map !== undefined ? parameters.map : null; - - this.lightMap = parameters.lightMap !== undefined ? parameters.lightMap : null; - - this.envMap = parameters.envMap !== undefined ? parameters.envMap : null; - this.combine = parameters.combine !== undefined ? parameters.combine : THREE.MultiplyOperation; - this.reflectivity = parameters.reflectivity !== undefined ? parameters.reflectivity : 1; - this.refractionRatio = parameters.refractionRatio !== undefined ? parameters.refractionRatio : 0.98; - - this.fog = parameters.fog !== undefined ? parameters.fog : true; - - this.shading = parameters.shading !== undefined ? parameters.shading : THREE.SmoothShading; - - this.wireframe = parameters.wireframe !== undefined ? parameters.wireframe : false; - this.wireframeLinewidth = parameters.wireframeLinewidth !== undefined ? parameters.wireframeLinewidth : 1; - this.wireframeLinecap = parameters.wireframeLinecap !== undefined ? parameters.wireframeLinecap : 'round'; - this.wireframeLinejoin = parameters.wireframeLinejoin !== undefined ? parameters.wireframeLinejoin : 'round'; - - this.vertexColors = parameters.vertexColors !== undefined ? parameters.vertexColors : false; - - this.skinning = parameters.skinning !== undefined ? parameters.skinning : false; - this.morphTargets = parameters.morphTargets !== undefined ? parameters.morphTargets : false; - -}; - -THREE.MeshPhongMaterial.prototype = new THREE.Material(); -THREE.MeshPhongMaterial.prototype.constructor = THREE.MeshPhongMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * opacity: , - - * blending: THREE.NormalBlending, - * depthTest: , - - * wireframe: , - * wireframeLinewidth: - * } - */ - -THREE.MeshDepthMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.shading = parameters.shading !== undefined ? parameters.shading : THREE.SmoothShading; // doesn't really apply here, normals are not used - - this.wireframe = parameters.wireframe !== undefined ? parameters.wireframe : false; - this.wireframeLinewidth = parameters.wireframeLinewidth !== undefined ? parameters.wireframeLinewidth : 1; - //this.morphTargets = parameters.morphTargets !== undefined ? parameters.morphTargets : false; - // this.morphTargets = true; - -}; - -THREE.MeshDepthMaterial.prototype = new THREE.Material(); -THREE.MeshDepthMaterial.prototype.constructor = THREE.MeshDepthMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * - * parameters = { - * opacity: , - - * shading: THREE.FlatShading, - * blending: THREE.NormalBlending, - * depthTest: , - - * wireframe: , - * wireframeLinewidth: - * } - */ - -THREE.MeshNormalMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.shading = parameters.shading ? parameters.shading : THREE.FlatShading; - - this.wireframe = parameters.wireframe ? parameters.wireframe : false; - this.wireframeLinewidth = parameters.wireframeLinewidth ? parameters.wireframeLinewidth : 1; - -}; - -THREE.MeshNormalMaterial.prototype = new THREE.Material(); -THREE.MeshNormalMaterial.prototype.constructor = THREE.MeshNormalMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.MeshFaceMaterial = function () { - -}; -THREE.MeshShaderMaterial = function ( parameters ) { - - console.warn( 'DEPRECATED: MeshShaderMaterial() is now ShaderMaterial().' ); - - return new THREE.ShaderMaterial( parameters ); - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * color: , - * opacity: , - * map: new THREE.Texture( ), - * - * size: , - * - * blending: THREE.NormalBlending, - * depthTest: , - * - * vertexColors: , - * - * fog: - * } - */ - -THREE.ParticleBasicMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.color = parameters.color !== undefined ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - - this.map = parameters.map !== undefined ? parameters.map : null; - - this.size = parameters.size !== undefined ? parameters.size : 1; - this.sizeAttenuation = parameters.sizeAttenuation !== undefined ? parameters.sizeAttenuation : true; - - this.vertexColors = parameters.vertexColors !== undefined ? parameters.vertexColors : false; - - this.fog = parameters.fog !== undefined ? parameters.fog : true; - -}; - -THREE.ParticleBasicMaterial.prototype = new THREE.Material(); -THREE.ParticleBasicMaterial.prototype.constructor = THREE.ParticleBasicMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * - * parameters = { - * color: , - * program: , - * opacity: , - * blending: THREE.NormalBlending - * } - */ - -THREE.ParticleCanvasMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.color = parameters.color !== undefined ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - this.program = parameters.program !== undefined ? parameters.program : function ( context, color ) {}; - -}; - -THREE.ParticleCanvasMaterial.prototype = new THREE.Material(); -THREE.ParticleCanvasMaterial.prototype.constructor = THREE.ParticleCanvasMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.ParticleDOMMaterial = function ( domElement ) { - - THREE.Material.call( this ); - - this.domElement = domElement; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - * - * parameters = { - * fragmentShader: , - * vertexShader: , - - * uniforms: { "parameter1": { type: "f", value: 1.0 }, "parameter2": { type: "i" value2: 2 } }, - - * shading: THREE.SmoothShading, - * blending: THREE.NormalBlending, - * depthTest: , - - * wireframe: , - * wireframeLinewidth: , - - * lights: , - * vertexColors: , - * skinning: , - * morphTargets: , - * } - */ - -THREE.ShaderMaterial = function ( parameters ) { - - THREE.Material.call( this, parameters ); - - parameters = parameters || {}; - - this.fragmentShader = parameters.fragmentShader !== undefined ? parameters.fragmentShader : "void main() {}"; - this.vertexShader = parameters.vertexShader !== undefined ? parameters.vertexShader : "void main() {}"; - this.uniforms = parameters.uniforms !== undefined ? parameters.uniforms : {}; - this.attributes = parameters.attributes; - - this.shading = parameters.shading !== undefined ? parameters.shading : THREE.SmoothShading; - - this.wireframe = parameters.wireframe !== undefined ? parameters.wireframe : false; - this.wireframeLinewidth = parameters.wireframeLinewidth !== undefined ? parameters.wireframeLinewidth : 1; - - this.fog = parameters.fog !== undefined ? parameters.fog : false; // set to use scene fog - this.lights = parameters.lights !== undefined ? parameters.lights : false; // set to use scene lights - this.vertexColors = parameters.vertexColors !== undefined ? parameters.vertexColors : false; // set to use "color" attribute stream - this.skinning = parameters.skinning !== undefined ? parameters.skinning : false; // set to use skinning attribute streams - this.morphTargets = parameters.morphTargets !== undefined ? parameters.morphTargets : false; // set to use morph targets - -}; - -THREE.ShaderMaterial.prototype = new THREE.Material(); -THREE.ShaderMaterial.prototype.constructor = THREE.ShaderMaterial; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author szimek / https://github.com/szimek/ - */ - -THREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type ) { - - this.id = THREE.TextureCount ++; - - this.image = image; - - this.mapping = mapping !== undefined ? mapping : new THREE.UVMapping(); - - this.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping; - this.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping; - - this.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter; - this.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter; - - this.format = format !== undefined ? format : THREE.RGBAFormat; - this.type = type !== undefined ? type : THREE.UnsignedByteType; - - this.offset = new THREE.Vector2( 0, 0 ); - this.repeat = new THREE.Vector2( 1, 1 ); - - this.generateMipmaps = true; - - this.needsUpdate = false; - this.onUpdate = null; - -}; - -THREE.Texture.prototype = { - - constructor: THREE.Texture, - - clone: function () { - - var clonedTexture = new THREE.Texture( this.image, this.mapping, this.wrapS, this.wrapT, this.magFilter, this.minFilter, this.format, this.type ); - - clonedTexture.offset.copy( this.offset ); - clonedTexture.repeat.copy( this.repeat ); - - return clonedTexture; - - } - -}; - -THREE.TextureCount = 0; - -THREE.MultiplyOperation = 0; -THREE.MixOperation = 1; - -// Mapping modes - -THREE.CubeReflectionMapping = function () {}; -THREE.CubeRefractionMapping = function () {}; - -THREE.LatitudeReflectionMapping = function () {}; -THREE.LatitudeRefractionMapping = function () {}; - -THREE.SphericalReflectionMapping = function () {}; -THREE.SphericalRefractionMapping = function () {}; - -THREE.UVMapping = function () {}; - -// Wrapping modes - -THREE.RepeatWrapping = 0; -THREE.ClampToEdgeWrapping = 1; -THREE.MirroredRepeatWrapping = 2; - -// Filters - -THREE.NearestFilter = 3; -THREE.NearestMipMapNearestFilter = 4; -THREE.NearestMipMapLinearFilter = 5; -THREE.LinearFilter = 6; -THREE.LinearMipMapNearestFilter = 7; -THREE.LinearMipMapLinearFilter = 8; - -// Types - -THREE.ByteType = 9; -THREE.UnsignedByteType = 10; -THREE.ShortType = 11; -THREE.UnsignedShortType = 12; -THREE.IntType = 13; -THREE.UnsignedIntType = 14; -THREE.FloatType = 15; - -// Formats - -THREE.AlphaFormat = 16; -THREE.RGBFormat = 17; -THREE.RGBAFormat = 18; -THREE.LuminanceFormat = 19; -THREE.LuminanceAlphaFormat = 20; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter ) { - - THREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type ); - - this.image = { data: data, width: width, height: height }; - -}; - -THREE.DataTexture.prototype = new THREE.Texture(); -THREE.DataTexture.prototype.constructor = THREE.DataTexture; - -THREE.DataTexture.prototype.clone = function () { - - var clonedTexture = new THREE.DataTexture( this.image.data, this.image.width, this.image.height, this.format, this.type, this.mapping, this.wrapS, this.wrapT, this.magFilter, this.minFilter ); - - clonedTexture.offset.copy( this.offset ); - clonedTexture.repeat.copy( this.repeat ); - - return clonedTexture; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Particle = function ( material ) { - - THREE.Object3D.call( this ); - - this.material = material; - -}; - -THREE.Particle.prototype = new THREE.Object3D(); -THREE.Particle.prototype.constructor = THREE.Particle; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.ParticleSystem = function ( geometry, material ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry; - this.material = material; - - this.sortParticles = false; - - if ( this.geometry ) { - - // calc bound radius - - if( !this.geometry.boundingSphere ) { - - this.geometry.computeBoundingSphere(); - - } - - this.boundRadius = geometry.boundingSphere.radius; - - } - - this.frustumCulled = false; - -}; - -THREE.ParticleSystem.prototype = new THREE.Object3D(); -THREE.ParticleSystem.prototype.constructor = THREE.ParticleSystem; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Line = function ( geometry, material, type ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry; - this.material = material; - - this.type = ( type !== undefined ) ? type : THREE.LineStrip; - - if ( this.geometry ) { - - if ( ! this.geometry.boundingSphere ) { - - this.geometry.computeBoundingSphere(); - - } - - } - -}; - -THREE.LineStrip = 0; -THREE.LinePieces = 1; - -THREE.Line.prototype = new THREE.Object3D(); -THREE.Line.prototype.constructor = THREE.Line; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.Mesh = function ( geometry, material ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry; - this.material = material; - - if ( material instanceof Array ) { - - console.warn( 'DEPRECATED: Mesh material can no longer be an Array. Using material at index 0...' ); - this.material = material[ 0 ]; - - } - - if ( this.geometry ) { - - // calc bound radius - - if( ! this.geometry.boundingSphere ) { - - this.geometry.computeBoundingSphere(); - - } - - this.boundRadius = geometry.boundingSphere.radius; - - - // setup morph targets - - if( this.geometry.morphTargets.length ) { - - this.morphTargetBase = -1; - this.morphTargetForcedOrder = []; - this.morphTargetInfluences = []; - this.morphTargetDictionary = {}; - - for( var m = 0; m < this.geometry.morphTargets.length; m ++ ) { - - this.morphTargetInfluences.push( 0 ); - this.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m; - - } - - } - - } - -} - -THREE.Mesh.prototype = new THREE.Object3D(); -THREE.Mesh.prototype.constructor = THREE.Mesh; -THREE.Mesh.prototype.supr = THREE.Object3D.prototype; - - -/* - * Get Morph Target Index by Name - */ - -THREE.Mesh.prototype.getMorphTargetIndexByName = function( name ) { - - if ( this.morphTargetDictionary[ name ] !== undefined ) { - - return this.morphTargetDictionary[ name ]; - } - - console.log( "THREE.Mesh.getMorphTargetIndexByName: morph target " + name + " does not exist. Returning 0." ); - return 0; - -} -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Bone = function( belongsToSkin ) { - - THREE.Object3D.call( this ); - - this.skin = belongsToSkin; - this.skinMatrix = new THREE.Matrix4(); - -}; - -THREE.Bone.prototype = new THREE.Object3D(); -THREE.Bone.prototype.constructor = THREE.Bone; -THREE.Bone.prototype.supr = THREE.Object3D.prototype; - - -THREE.Bone.prototype.update = function( parentSkinMatrix, forceUpdate ) { - - // update local - - if ( this.matrixAutoUpdate ) { - - forceUpdate |= this.updateMatrix(); - - } - - // update skin matrix - - if ( forceUpdate || this.matrixWorldNeedsUpdate ) { - - if( parentSkinMatrix ) { - - this.skinMatrix.multiply( parentSkinMatrix, this.matrix ); - - } else { - - this.skinMatrix.copy( this.matrix ); - - } - - this.matrixWorldNeedsUpdate = false; - forceUpdate = true; - - } - - // update children - - var child, i, l = this.children.length; - - for ( i = 0; i < l; i ++ ) { - - this.children[ i ].update( this.skinMatrix, forceUpdate ); - - } - -}; - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SkinnedMesh = function( geometry, material ) { - - THREE.Mesh.call( this, geometry, material ); - - // init bones - - this.identityMatrix = new THREE.Matrix4(); - - this.bones = []; - this.boneMatrices = []; - - var b, bone, gbone, p, q, s; - - if ( this.geometry.bones !== undefined ) { - - for ( b = 0; b < this.geometry.bones.length; b ++ ) { - - gbone = this.geometry.bones[ b ]; - - p = gbone.pos; - q = gbone.rotq; - s = gbone.scl; - - bone = this.addBone(); - - bone.name = gbone.name; - bone.position.set( p[0], p[1], p[2] ); - bone.quaternion.set( q[0], q[1], q[2], q[3] ); - bone.useQuaternion = true; - - if ( s !== undefined ) { - - bone.scale.set( s[0], s[1], s[2] ); - - } else { - - bone.scale.set( 1, 1, 1 ); - - } - - } - - for ( b = 0; b < this.bones.length; b ++ ) { - - gbone = this.geometry.bones[ b ]; - bone = this.bones[ b ]; - - if ( gbone.parent === -1 ) { - - this.add( bone ); - - } else { - - this.bones[ gbone.parent ].add( bone ); - - } - - } - - this.boneMatrices = new Float32Array( 16 * this.bones.length ); - - this.pose(); - - } - -}; - -THREE.SkinnedMesh.prototype = new THREE.Mesh(); -THREE.SkinnedMesh.prototype.constructor = THREE.SkinnedMesh; - -THREE.SkinnedMesh.prototype.addBone = function( bone ) { - - if ( bone === undefined ) { - - bone = new THREE.Bone( this ); - - } - - this.bones.push( bone ); - - return bone; - -}; - -THREE.SkinnedMesh.prototype.updateMatrixWorld = function ( force ) { - - this.matrixAutoUpdate && this.updateMatrix(); - - // update matrixWorld - - if ( this.matrixWorldNeedsUpdate || force ) { - - if ( this.parent ) { - - this.matrixWorld.multiply( this.parent.matrixWorld, this.matrix ); - - } else { - - this.matrixWorld.copy( this.matrix ); - - } - - this.matrixWorldNeedsUpdate = false; - - force = true; - - } - - // update children - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - var child = this.children[ i ]; - - if ( child instanceof THREE.Bone ) { - - child.update( this.identityMatrix, false ); - - } else { - - child.updateMatrixWorld( true ); - - } - - } - - // flatten bone matrices to array - - var b, bl = this.bones.length, - ba = this.bones, - bm = this.boneMatrices; - - for ( b = 0; b < bl; b ++ ) { - - ba[ b ].skinMatrix.flattenToArrayOffset( bm, b * 16 ); - - } - -}; - -/* - * Pose - */ - -THREE.SkinnedMesh.prototype.pose = function() { - - this.updateMatrixWorld( true ); - - var bim, bone, boneInverses = []; - - for ( var b = 0; b < this.bones.length; b ++ ) { - - bone = this.bones[ b ]; - - var inverseMatrix = new THREE.Matrix4(); - inverseMatrix.getInverse( bone.skinMatrix ); - - boneInverses.push( inverseMatrix ); - - bone.skinMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 ); - - } - - // project vertices to local - - if ( this.geometry.skinVerticesA === undefined ) { - - this.geometry.skinVerticesA = []; - this.geometry.skinVerticesB = []; - - var orgVertex, vertex; - - for ( var i = 0; i < this.geometry.skinIndices.length; i ++ ) { - - orgVertex = this.geometry.vertices[ i ].position; - - var indexA = this.geometry.skinIndices[ i ].x; - var indexB = this.geometry.skinIndices[ i ].y; - - vertex = new THREE.Vector3( orgVertex.x, orgVertex.y, orgVertex.z ); - this.geometry.skinVerticesA.push( boneInverses[ indexA ].multiplyVector3( vertex ) ); - - vertex = new THREE.Vector3( orgVertex.x, orgVertex.y, orgVertex.z ); - this.geometry.skinVerticesB.push( boneInverses[ indexB ].multiplyVector3( vertex ) ); - - // todo: add more influences - - // normalize weights - - if ( this.geometry.skinWeights[ i ].x + this.geometry.skinWeights[ i ].y !== 1 ) { - - var len = ( 1.0 - ( this.geometry.skinWeights[ i ].x + this.geometry.skinWeights[ i ].y ) ) * 0.5; - this.geometry.skinWeights[ i ].x += len; - this.geometry.skinWeights[ i ].y += len; - - } - - } - - } - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.MorphAnimMesh = function( geometry, material ) { - - THREE.Mesh.call( this, geometry, material ); - - // API - - this.duration = 1000; // milliseconds - this.mirroredLoop = false; - this.time = 0; - - // internals - - this.lastKeyframe = 0; - this.currentKeyframe = 0; - - this.direction = 1; - this.directionBackwards = false; - -}; - -THREE.MorphAnimMesh.prototype = new THREE.Mesh(); -THREE.MorphAnimMesh.prototype.constructor = THREE.MorphAnimMesh; - -THREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) { - - var frameTime = this.duration / ( this.geometry.morphTargets.length - 1 ); - - this.time += this.direction * delta; - - if ( this.mirroredLoop ) { - - if ( this.time > this.duration || this.time < 0 ) { - - this.direction *= -1; - - if ( this.time > this.duration ) { - - this.time = this.duration; - this.directionBackwards = true; - - } - - if ( this.time < 0 ) { - - this.time = 0; - this.directionBackwards = false; - - } - - } - - } else { - - this.time = this.time % this.duration; - - } - - var keyframe = THREE.Math.clamp( Math.floor( this.time / frameTime ), 0, this.geometry.morphTargets.length - 1 ); - - if ( keyframe != this.currentKeyframe ) { - - this.morphTargetInfluences[ this.lastKeyframe ] = 0; - this.morphTargetInfluences[ this.currentKeyframe ] = 1; - - this.morphTargetInfluences[ keyframe ] = 0; - - this.lastKeyframe = this.currentKeyframe; - this.currentKeyframe = keyframe; - - } - - var mix = ( this.time % frameTime ) / frameTime; - - if ( this.directionBackwards ) { - - mix = 1 - mix; - - } - - this.morphTargetInfluences[ this.currentKeyframe ] = mix; - this.morphTargetInfluences[ this.lastKeyframe ] = 1 - mix; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Ribbon = function ( geometry, material ) { - - THREE.Object3D.call( this ); - - this.geometry = geometry; - this.material = material; - -}; - -THREE.Ribbon.prototype = new THREE.Object3D(); -THREE.Ribbon.prototype.constructor = THREE.Ribbon; -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.LOD = function () { - - THREE.Object3D.call( this ); - - this.LODs = []; - -}; - -THREE.LOD.prototype = new THREE.Object3D(); -THREE.LOD.prototype.constructor = THREE.LOD; -THREE.LOD.prototype.supr = THREE.Object3D.prototype; - -THREE.LOD.prototype.addLevel = function ( object3D, visibleAtDistance ) { - - if ( visibleAtDistance === undefined ) { - - visibleAtDistance = 0; - - } - - visibleAtDistance = Math.abs( visibleAtDistance ); - - for ( var l = 0; l < this.LODs.length; l ++ ) { - - if ( visibleAtDistance < this.LODs[ l ].visibleAtDistance ) { - - break; - - } - - } - - this.LODs.splice( l, 0, { visibleAtDistance: visibleAtDistance, object3D: object3D } ); - this.add( object3D ); - -}; - -THREE.LOD.prototype.update = function ( camera ) { - - if ( this.LODs.length > 1 ) { - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - var inverse = camera.matrixWorldInverse; - var distance = -( inverse.n31 * this.position.x + inverse.n32 * this.position.y + inverse.n33 * this.position.z + inverse.n34 ); - - this.LODs[ 0 ].object3D.visible = true; - - for ( var l = 1; l < this.LODs.length; l ++ ) { - - if( distance >= this.LODs[ l ].visibleAtDistance ) { - - this.LODs[ l - 1 ].object3D.visible = false; - this.LODs[ l ].object3D.visible = true; - - } else { - - break; - - } - - } - - for( ; l < this.LODs.length; l ++ ) { - - this.LODs[ l ].object3D.visible = false; - - } - - } - -}; -/** - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.Sprite = function ( parameters ) { - - THREE.Object3D.call( this ); - - this.color = ( parameters.color !== undefined ) ? new THREE.Color( parameters.color ) : new THREE.Color( 0xffffff ); - this.map = ( parameters.map !== undefined ) ? parameters.map : new THREE.Texture(); - this.blending = ( parameters.blending !== undefined ) ? parameters.blending : THREE.NormalBlending; - - this.useScreenCoordinates = ( parameters.useScreenCoordinates !== undefined ) ? parameters.useScreenCoordinates : true; - this.mergeWith3D = ( parameters.mergeWith3D !== undefined ) ? parameters.mergeWith3D : !this.useScreenCoordinates; - this.affectedByDistance = ( parameters.affectedByDistance !== undefined ) ? parameters.affectedByDistance : !this.useScreenCoordinates; - this.scaleByViewport = ( parameters.scaleByViewport !== undefined ) ? parameters.scaleByViewport : !this.affectedByDistance; - this.alignment = ( parameters.alignment instanceof THREE.Vector2 ) ? parameters.alignment : THREE.SpriteAlignment.center; - - this.rotation3d = this.rotation; - this.rotation = 0; - this.opacity = 1; - - this.uvOffset = new THREE.Vector2( 0, 0 ); - this.uvScale = new THREE.Vector2( 1, 1 ); - -}; - -THREE.Sprite.prototype = new THREE.Object3D(); -THREE.Sprite.prototype.constructor = THREE.Sprite; - - -/* - * Custom update matrix - */ - -THREE.Sprite.prototype.updateMatrix = function () { - - this.matrix.setPosition( this.position ); - - this.rotation3d.set( 0, 0, this.rotation ); - this.matrix.setRotationFromEuler( this.rotation3d ); - - if ( this.scale.x !== 1 || this.scale.y !== 1 ) { - - this.matrix.scale( this.scale ); - this.boundRadiusScale = Math.max( this.scale.x, this.scale.y ); - - } - - this.matrixWorldNeedsUpdate = true; - -}; - -/* - * Alignment - */ - -THREE.SpriteAlignment = {}; -THREE.SpriteAlignment.topLeft = new THREE.Vector2( 1, -1 ); -THREE.SpriteAlignment.topCenter = new THREE.Vector2( 0, -1 ); -THREE.SpriteAlignment.topRight = new THREE.Vector2( -1, -1 ); -THREE.SpriteAlignment.centerLeft = new THREE.Vector2( 1, 0 ); -THREE.SpriteAlignment.center = new THREE.Vector2( 0, 0 ); -THREE.SpriteAlignment.centerRight = new THREE.Vector2( -1, 0 ); -THREE.SpriteAlignment.bottomLeft = new THREE.Vector2( 1, 1 ); -THREE.SpriteAlignment.bottomCenter = new THREE.Vector2( 0, 1 ); -THREE.SpriteAlignment.bottomRight = new THREE.Vector2( -1, 1 ); -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.Scene = function () { - - THREE.Object3D.call( this ); - - this.fog = null; - this.overrideMaterial = null; - - this.matrixAutoUpdate = false; - - this.objects = []; - this.lights = []; - - this.__objectsAdded = []; - this.__objectsRemoved = []; - -}; - -THREE.Scene.prototype = new THREE.Object3D(); -THREE.Scene.prototype.constructor = THREE.Scene; - -THREE.Scene.prototype.addObject = function ( object ) { - - if ( object instanceof THREE.Light ) { - - if ( this.lights.indexOf( object ) === - 1 ) { - - this.lights.push( object ); - - } - - } else if ( !( object instanceof THREE.Camera || object instanceof THREE.Bone ) ) { - - if ( this.objects.indexOf( object ) === - 1 ) { - - this.objects.push( object ); - this.__objectsAdded.push( object ); - - // check if previously removed - - var i = this.__objectsRemoved.indexOf( object ); - - if ( i !== -1 ) { - - this.__objectsRemoved.splice( i, 1 ); - - } - - } - - } - - for ( var c = 0; c < object.children.length; c ++ ) { - - this.addObject( object.children[ c ] ); - - } - -}; - -THREE.Scene.prototype.removeObject = function ( object ) { - - if ( object instanceof THREE.Light ) { - - var i = this.lights.indexOf( object ); - - if ( i !== -1 ) { - - this.lights.splice( i, 1 ); - - } - - } else if ( !( object instanceof THREE.Camera ) ) { - - var i = this.objects.indexOf( object ); - - if( i !== -1 ) { - - this.objects.splice( i, 1 ); - this.__objectsRemoved.push( object ); - - // check if previously added - - var ai = this.__objectsAdded.indexOf( object ); - - if ( ai !== -1 ) { - - this.__objectsAdded.splice( ai, 1 ); - - } - - } - - } - - for ( var c = 0; c < object.children.length; c ++ ) { - - this.removeObject( object.children[ c ] ); - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Fog = function ( hex, near, far ) { - - this.color = new THREE.Color( hex ); - - this.near = ( near !== undefined ) ? near : 1; - this.far = ( far !== undefined ) ? far : 1000; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.FogExp2 = function ( hex, density ) { - - this.color = new THREE.Color( hex ); - this.density = ( density !== undefined ) ? density : 0.00025; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.DOMRenderer = function () { - - var _renderList = null, - _projector = new THREE.Projector(), - _div = document.createElement( 'div' ), - _width, _height, _widthHalf, _heightHalf; - - this.domElement = _div; - - this.setSize = function ( width, height ) { - - _width = width; _height = height; - _widthHalf = _width / 2; _heightHalf = _height / 2; - - }; - - this.render = function ( scene, camera ) { - - var e, el, m, ml, element, material, dom, v1x, v1y; - - _renderList = _projector.projectScene( scene, camera ); - - for ( e = 0, el = _renderList.length; e < el; e++ ) { - - element = _renderList[ e ]; - - if ( element instanceof THREE.RenderableParticle ) { - - v1x = element.x * _widthHalf + _widthHalf; v1y = element.y * _heightHalf + _heightHalf; - - for ( m = 0, ml = element.material.length; m < ml; m++ ) { - - material = element.material[ m ]; - - if ( material instanceof THREE.ParticleDOMMaterial ) { - - dom = material.domElement; - dom.style.left = v1x + 'px'; - dom.style.top = v1y + 'px'; - - } - - } - - } - - } - - }; - -} -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.CanvasRenderer = function ( parameters ) { - - parameters = parameters || {}; - - var _this = this, - _renderData, _elements, _lights, - _projector = new THREE.Projector(), - - _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ), - - _canvasWidth, _canvasHeight, _canvasWidthHalf, _canvasHeightHalf, - _context = _canvas.getContext( '2d' ), - - _clearColor = new THREE.Color( 0x000000 ), - _clearOpacity = 0, - - _contextGlobalAlpha = 1, - _contextGlobalCompositeOperation = 0, - _contextStrokeStyle = null, - _contextFillStyle = null, - _contextLineWidth = null, - _contextLineCap = null, - _contextLineJoin = null, - - _v1, _v2, _v3, _v4, - _v5 = new THREE.RenderableVertex(), - _v6 = new THREE.RenderableVertex(), - - _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, - _v4x, _v4y, _v5x, _v5y, _v6x, _v6y, - - _color = new THREE.Color(), - _color1 = new THREE.Color(), - _color2 = new THREE.Color(), - _color3 = new THREE.Color(), - _color4 = new THREE.Color(), - - _patterns = [], _imagedatas = [], - - _near, _far, - - _image, _uvs, - _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, - - _clipRect = new THREE.Rectangle(), - _clearRect = new THREE.Rectangle(), - _bboxRect = new THREE.Rectangle(), - - _enableLighting = false, - _ambientLight = new THREE.Color(), - _directionalLights = new THREE.Color(), - _pointLights = new THREE.Color(), - - _pi2 = Math.PI * 2, - _vector3 = new THREE.Vector3(), // Needed for PointLight - - _pixelMap, _pixelMapContext, _pixelMapImage, _pixelMapData, - _gradientMap, _gradientMapContext, _gradientMapQuality = 16; - - _pixelMap = document.createElement( 'canvas' ); - _pixelMap.width = _pixelMap.height = 2; - - _pixelMapContext = _pixelMap.getContext( '2d' ); - _pixelMapContext.fillStyle = 'rgba(0,0,0,1)'; - _pixelMapContext.fillRect( 0, 0, 2, 2 ); - - _pixelMapImage = _pixelMapContext.getImageData( 0, 0, 2, 2 ); - _pixelMapData = _pixelMapImage.data; - - _gradientMap = document.createElement( 'canvas' ); - _gradientMap.width = _gradientMap.height = _gradientMapQuality; - - _gradientMapContext = _gradientMap.getContext( '2d' ); - _gradientMapContext.translate( - _gradientMapQuality / 2, - _gradientMapQuality / 2 ); - _gradientMapContext.scale( _gradientMapQuality, _gradientMapQuality ); - - _gradientMapQuality --; // Fix UVs - - this.domElement = _canvas; - - this.autoClear = true; - this.sortObjects = true; - this.sortElements = true; - - this.info = { - - render: { - - vertices: 0, - faces: 0 - - } - - } - - this.setSize = function ( width, height ) { - - _canvasWidth = width; - _canvasHeight = height; - _canvasWidthHalf = Math.floor( _canvasWidth / 2 ); - _canvasHeightHalf = Math.floor( _canvasHeight / 2 ); - - _canvas.width = _canvasWidth; - _canvas.height = _canvasHeight; - - _clipRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf ); - _clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf ); - - _contextGlobalAlpha = 1; - _contextGlobalCompositeOperation = 0; - _contextStrokeStyle = null; - _contextFillStyle = null; - _contextLineWidth = null; - _contextLineCap = null; - _contextLineJoin = null; - - }; - - this.setClearColor = function( color, opacity ) { - - _clearColor.copy( color ); - _clearOpacity = opacity; - - _clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf ); - - }; - - this.setClearColorHex = function( hex, opacity ) { - - _clearColor.setHex( hex ); - _clearOpacity = opacity; - - _clearRect.set( - _canvasWidthHalf, - _canvasHeightHalf, _canvasWidthHalf, _canvasHeightHalf ); - - }; - - this.clear = function () { - - _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf ); - - if ( !_clearRect.isEmpty() ) { - - _clearRect.minSelf( _clipRect ); - _clearRect.inflate( 2 ); - - if ( _clearOpacity < 1 ) { - - _context.clearRect( Math.floor( _clearRect.getX() ), Math.floor( _clearRect.getY() ), Math.floor( _clearRect.getWidth() ), Math.floor( _clearRect.getHeight() ) ); - - } - - if ( _clearOpacity > 0 ) { - - setBlending( THREE.NormalBlending ); - setOpacity( 1 ); - - setFillStyle( 'rgba(' + Math.floor( _clearColor.r * 255 ) + ',' + Math.floor( _clearColor.g * 255 ) + ',' + Math.floor( _clearColor.b * 255 ) + ',' + _clearOpacity + ')' ); - - _context.fillRect( Math.floor( _clearRect.getX() ), Math.floor( _clearRect.getY() ), Math.floor( _clearRect.getWidth() ), Math.floor( _clearRect.getHeight() ) ); - - } - - _clearRect.empty(); - - } - - - }; - - this.render = function ( scene, camera ) { - - var e, el, element, material; - - this.autoClear ? this.clear() : _context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf ); - - _this.info.render.vertices = 0; - _this.info.render.faces = 0; - - _renderData = _projector.projectScene( scene, camera, this.sortElements ); - _elements = _renderData.elements; - _lights = _renderData.lights; - - - _context.fillStyle = 'rgba( 0, 255, 255, 0.5 )'; - _context.fillRect( _clipRect.getX(), _clipRect.getY(), _clipRect.getWidth(), _clipRect.getHeight() ); - - - _enableLighting = _lights.length > 0; - - if ( _enableLighting ) { - - calculateLights( _lights ); - - } - - for ( e = 0, el = _elements.length; e < el; e++ ) { - - element = _elements[ e ]; - - material = element.material; - material = material instanceof THREE.MeshFaceMaterial ? element.faceMaterial : material; - - if ( material == null || material.opacity == 0 ) continue; - - _bboxRect.empty(); - - if ( element instanceof THREE.RenderableParticle ) { - - _v1 = element; - _v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf; - - renderParticle( _v1, element, material, scene ); - - } else if ( element instanceof THREE.RenderableLine ) { - - _v1 = element.v1; _v2 = element.v2; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - - _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y ); - _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y ); - - if ( _clipRect.intersects( _bboxRect ) ) { - - renderLine( _v1, _v2, element, material, scene ); - - } - - - } else if ( element instanceof THREE.RenderableFace3 ) { - - _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf; - - if ( material.overdraw ) { - - expand( _v1.positionScreen, _v2.positionScreen ); - expand( _v2.positionScreen, _v3.positionScreen ); - expand( _v3.positionScreen, _v1.positionScreen ); - - } - - _bboxRect.add3Points( _v1.positionScreen.x, _v1.positionScreen.y, - _v2.positionScreen.x, _v2.positionScreen.y, - _v3.positionScreen.x, _v3.positionScreen.y ); - - if ( _clipRect.intersects( _bboxRect ) ) { - - renderFace3( _v1, _v2, _v3, 0, 1, 2, element, material, scene ); - - } - - } else if ( element instanceof THREE.RenderableFace4 ) { - - _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; _v4 = element.v4; - - _v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf; - _v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf; - _v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf; - _v4.positionScreen.x *= _canvasWidthHalf; _v4.positionScreen.y *= _canvasHeightHalf; - - _v5.positionScreen.copy( _v2.positionScreen ); - _v6.positionScreen.copy( _v4.positionScreen ); - - if ( material.overdraw ) { - - expand( _v1.positionScreen, _v2.positionScreen ); - expand( _v2.positionScreen, _v4.positionScreen ); - expand( _v4.positionScreen, _v1.positionScreen ); - - expand( _v3.positionScreen, _v5.positionScreen ); - expand( _v3.positionScreen, _v6.positionScreen ); - - } - - _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y ); - _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y ); - _bboxRect.addPoint( _v3.positionScreen.x, _v3.positionScreen.y ); - _bboxRect.addPoint( _v4.positionScreen.x, _v4.positionScreen.y ); - - if ( _clipRect.intersects( _bboxRect ) ) { - - renderFace4( _v1, _v2, _v3, _v4, _v5, _v6, element, material, scene ); - - } - - } - - /* - _context.lineWidth = 1; - _context.strokeStyle = 'rgba( 0, 255, 0, 0.5 )'; - _context.strokeRect( _bboxRect.getX(), _bboxRect.getY(), _bboxRect.getWidth(), _bboxRect.getHeight() ); - */ - - _clearRect.addRectangle( _bboxRect ); - - - } - - - _context.lineWidth = 1; - _context.strokeStyle = 'rgba( 255, 0, 0, 0.5 )'; - _context.strokeRect( _clearRect.getX(), _clearRect.getY(), _clearRect.getWidth(), _clearRect.getHeight() ); - - - _context.setTransform( 1, 0, 0, 1, 0, 0 ); - - // - - function calculateLights( lights ) { - - var l, ll, light, lightColor; - - _ambientLight.setRGB( 0, 0, 0 ); - _directionalLights.setRGB( 0, 0, 0 ); - _pointLights.setRGB( 0, 0, 0 ); - - for ( l = 0, ll = lights.length; l < ll; l ++ ) { - - light = lights[ l ]; - lightColor = light.color; - - if ( light instanceof THREE.AmbientLight ) { - - _ambientLight.r += lightColor.r; - _ambientLight.g += lightColor.g; - _ambientLight.b += lightColor.b; - - } else if ( light instanceof THREE.DirectionalLight ) { - - // for particles - - _directionalLights.r += lightColor.r; - _directionalLights.g += lightColor.g; - _directionalLights.b += lightColor.b; - - } else if ( light instanceof THREE.PointLight ) { - - // for particles - - _pointLights.r += lightColor.r; - _pointLights.g += lightColor.g; - _pointLights.b += lightColor.b; - - } - - } - - } - - function calculateLight( lights, position, normal, color ) { - - var l, ll, light, lightColor, lightPosition, amount; - - for ( l = 0, ll = lights.length; l < ll; l ++ ) { - - light = lights[ l ]; - lightColor = light.color; - - if ( light instanceof THREE.DirectionalLight ) { - - lightPosition = light.matrixWorld.getPosition(); - - amount = normal.dot( lightPosition ); - - if ( amount <= 0 ) continue; - - amount *= light.intensity; - - color.r += lightColor.r * amount; - color.g += lightColor.g * amount; - color.b += lightColor.b * amount; - - } else if ( light instanceof THREE.PointLight ) { - - lightPosition = light.matrixWorld.getPosition(); - - amount = normal.dot( _vector3.sub( lightPosition, position ).normalize() ); - - if ( amount <= 0 ) continue; - - amount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 ); - - if ( amount == 0 ) continue; - - amount *= light.intensity; - - color.r += lightColor.r * amount; - color.g += lightColor.g * amount; - color.b += lightColor.b * amount; - - } - - } - - } - - function renderParticle ( v1, element, material, scene ) { - - setOpacity( material.opacity ); - setBlending( material.blending ); - - var width, height, scaleX, scaleY, - bitmap, bitmapWidth, bitmapHeight; - - if ( material instanceof THREE.ParticleBasicMaterial ) { - - if ( material.map ) { - - bitmap = material.map.image; - bitmapWidth = bitmap.width >> 1; - bitmapHeight = bitmap.height >> 1; - - scaleX = element.scale.x * _canvasWidthHalf; - scaleY = element.scale.y * _canvasHeightHalf; - - width = scaleX * bitmapWidth; - height = scaleY * bitmapHeight; - - // TODO: Rotations break this... - - _bboxRect.set( v1.x - width, v1.y - height, v1.x + width, v1.y + height ); - - if ( !_clipRect.intersects( _bboxRect ) ) { - - return; - - } - - _context.save(); - _context.translate( v1.x, v1.y ); - _context.rotate( - element.rotation ); - _context.scale( scaleX, - scaleY ); - - _context.translate( - bitmapWidth, - bitmapHeight ); - _context.drawImage( bitmap, 0, 0 ); - - _context.restore(); - - } - - - _context.beginPath(); - _context.moveTo( v1.x - 10, v1.y ); - _context.lineTo( v1.x + 10, v1.y ); - _context.moveTo( v1.x, v1.y - 10 ); - _context.lineTo( v1.x, v1.y + 10 ); - _context.closePath(); - _context.strokeStyle = 'rgb(255,255,0)'; - _context.stroke(); - - - } else if ( material instanceof THREE.ParticleCanvasMaterial ) { - - width = element.scale.x * _canvasWidthHalf; - height = element.scale.y * _canvasHeightHalf; - - _bboxRect.set( v1.x - width, v1.y - height, v1.x + width, v1.y + height ); - - if ( !_clipRect.intersects( _bboxRect ) ) { - - return; - - } - - setStrokeStyle( material.color.getContextStyle() ); - setFillStyle( material.color.getContextStyle() ); - - _context.save(); - _context.translate( v1.x, v1.y ); - _context.rotate( - element.rotation ); - _context.scale( width, height ); - - material.program( _context ); - - _context.restore(); - - } - - } - - function renderLine( v1, v2, element, material, scene ) { - - setOpacity( material.opacity ); - setBlending( material.blending ); - - _context.beginPath(); - _context.moveTo( v1.positionScreen.x, v1.positionScreen.y ); - _context.lineTo( v2.positionScreen.x, v2.positionScreen.y ); - _context.closePath(); - - if ( material instanceof THREE.LineBasicMaterial ) { - - setLineWidth( material.linewidth ); - setLineCap( material.linecap ); - setLineJoin( material.linejoin ); - setStrokeStyle( material.color.getContextStyle() ); - - _context.stroke(); - _bboxRect.inflate( material.linewidth * 2 ); - - } - - } - - function renderFace3( v1, v2, v3, uv1, uv2, uv3, element, material, scene ) { - - _this.info.render.vertices += 3; - _this.info.render.faces ++; - - setOpacity( material.opacity ); - setBlending( material.blending ); - - _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y; - _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y; - _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y; - - drawTriangle( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y ); - - if ( material instanceof THREE.MeshBasicMaterial ) { - - if ( material.map/* && !material.wireframe*/ ) { - - if ( material.map.mapping instanceof THREE.UVMapping ) { - - _uvs = element.uvs[ 0 ]; - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].u, _uvs[ uv1 ].v, _uvs[ uv2 ].u, _uvs[ uv2 ].v, _uvs[ uv3 ].u, _uvs[ uv3 ].v, material.map ); - - } - - - } else if ( material.envMap ) { - - if ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) { - - var cameraMatrix = camera.matrixWorldInverse; - - _vector3.copy( element.vertexNormalsWorld[ uv1 ] ); - _uv1x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5; - _uv1y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5; - - _vector3.copy( element.vertexNormalsWorld[ uv2 ] ); - _uv2x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5; - _uv2y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5; - - _vector3.copy( element.vertexNormalsWorld[ uv3 ] ); - _uv3x = ( _vector3.x * cameraMatrix.n11 + _vector3.y * cameraMatrix.n12 + _vector3.z * cameraMatrix.n13 ) * 0.5 + 0.5; - _uv3y = - ( _vector3.x * cameraMatrix.n21 + _vector3.y * cameraMatrix.n22 + _vector3.z * cameraMatrix.n23 ) * 0.5 + 0.5; - - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap ); - - }/* else if ( material.envMap.mapping == THREE.SphericalRefractionMapping ) { - - - - }*/ - - - } else { - - material.wireframe ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color ); - - } - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - if ( material.map && !material.wireframe ) { - - if ( material.map.mapping instanceof THREE.UVMapping ) { - - _uvs = element.uvs[ 0 ]; - patternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uvs[ uv1 ].u, _uvs[ uv1 ].v, _uvs[ uv2 ].u, _uvs[ uv2 ].v, _uvs[ uv3 ].u, _uvs[ uv3 ].v, material.map ); - - } - - setBlending( THREE.SubtractiveBlending ); - - } - - if ( _enableLighting ) { - - if ( !material.wireframe && material.shading == THREE.SmoothShading && element.vertexNormalsWorld.length == 3 ) { - - _color1.r = _color2.r = _color3.r = _ambientLight.r; - _color1.g = _color2.g = _color3.g = _ambientLight.g; - _color1.b = _color2.b = _color3.b = _ambientLight.b; - - calculateLight( _lights, element.v1.positionWorld, element.vertexNormalsWorld[ 0 ], _color1 ); - calculateLight( _lights, element.v2.positionWorld, element.vertexNormalsWorld[ 1 ], _color2 ); - calculateLight( _lights, element.v3.positionWorld, element.vertexNormalsWorld[ 2 ], _color3 ); - - _color1.r = Math.max( 0, Math.min( material.color.r * _color1.r, 1 ) ); - _color1.g = Math.max( 0, Math.min( material.color.g * _color1.g, 1 ) ); - _color1.b = Math.max( 0, Math.min( material.color.b * _color1.b, 1 ) ); - - _color2.r = Math.max( 0, Math.min( material.color.r * _color2.r, 1 ) ); - _color2.g = Math.max( 0, Math.min( material.color.g * _color2.g, 1 ) ); - _color2.b = Math.max( 0, Math.min( material.color.b * _color2.b, 1 ) ); - - _color3.r = Math.max( 0, Math.min( material.color.r * _color3.r, 1 ) ); - _color3.g = Math.max( 0, Math.min( material.color.g * _color3.g, 1 ) ); - _color3.b = Math.max( 0, Math.min( material.color.b * _color3.b, 1 ) ); - - _color4.r = ( _color2.r + _color3.r ) * 0.5; - _color4.g = ( _color2.g + _color3.g ) * 0.5; - _color4.b = ( _color2.b + _color3.b ) * 0.5; - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image ); - - } else { - - _color.r = _ambientLight.r; - _color.g = _ambientLight.g; - _color.b = _ambientLight.b; - - calculateLight( _lights, element.centroidWorld, element.normalWorld, _color ); - - _color.r = Math.max( 0, Math.min( material.color.r * _color.r, 1 ) ); - _color.g = Math.max( 0, Math.min( material.color.g * _color.g, 1 ) ); - _color.b = Math.max( 0, Math.min( material.color.b * _color.b, 1 ) ); - - material.wireframe ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color ); - - } - - } else { - - material.wireframe ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color ); - - } - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - _near = camera.near; - _far = camera.far; - - _color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z, _near, _far ); - _color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z, _near, _far ); - _color3.r = _color3.g = _color3.b = 1 - smoothstep( v3.positionScreen.z, _near, _far ); - - _color4.r = ( _color2.r + _color3.r ) * 0.5; - _color4.g = ( _color2.g + _color3.g ) * 0.5; - _color4.b = ( _color2.b + _color3.b ) * 0.5; - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - clipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image ); - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - _color.r = normalToComponent( element.normalWorld.x ); - _color.g = normalToComponent( element.normalWorld.y ); - _color.b = normalToComponent( element.normalWorld.z ); - - material.wireframe ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color ); - - } - - } - - function renderFace4( v1, v2, v3, v4, v5, v6, element, material, scene ) { - - _this.info.render.vertices += 4; - _this.info.render.faces ++; - - setOpacity( material.opacity ); - setBlending( material.blending ); - - if ( material.map || material.envMap ) { - - // Let renderFace3() handle this - - renderFace3( v1, v2, v4, 0, 1, 3, element, material, scene ); - renderFace3( v5, v3, v6, 1, 2, 3, element, material, scene ); - - return; - - } - - _v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y; - _v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y; - _v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y; - _v4x = v4.positionScreen.x; _v4y = v4.positionScreen.y; - _v5x = v5.positionScreen.x; _v5y = v5.positionScreen.y; - _v6x = v6.positionScreen.x; _v6y = v6.positionScreen.y; - - if ( material instanceof THREE.MeshBasicMaterial ) { - - drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y ); - - material.wireframe ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color ); - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - if ( _enableLighting ) { - - if ( !material.wireframe && material.shading == THREE.SmoothShading && element.vertexNormalsWorld.length == 4 ) { - - _color1.r = _color2.r = _color3.r = _color4.r = _ambientLight.r; - _color1.g = _color2.g = _color3.g = _color4.g = _ambientLight.g; - _color1.b = _color2.b = _color3.b = _color4.b = _ambientLight.b; - - calculateLight( _lights, element.v1.positionWorld, element.vertexNormalsWorld[ 0 ], _color1 ); - calculateLight( _lights, element.v2.positionWorld, element.vertexNormalsWorld[ 1 ], _color2 ); - calculateLight( _lights, element.v4.positionWorld, element.vertexNormalsWorld[ 3 ], _color3 ); - calculateLight( _lights, element.v3.positionWorld, element.vertexNormalsWorld[ 2 ], _color4 ); - - _color1.r = Math.max( 0, Math.min( material.color.r * _color1.r, 1 ) ); - _color1.g = Math.max( 0, Math.min( material.color.g * _color1.g, 1 ) ); - _color1.b = Math.max( 0, Math.min( material.color.b * _color1.b, 1 ) ); - - _color2.r = Math.max( 0, Math.min( material.color.r * _color2.r, 1 ) ); - _color2.g = Math.max( 0, Math.min( material.color.g * _color2.g, 1 ) ); - _color2.b = Math.max( 0, Math.min( material.color.b * _color2.b, 1 ) ); - - _color3.r = Math.max( 0, Math.min( material.color.r * _color3.r, 1 ) ); - _color3.g = Math.max( 0, Math.min( material.color.g * _color3.g, 1 ) ); - _color3.b = Math.max( 0, Math.min( material.color.b * _color3.b, 1 ) ); - - _color4.r = Math.max( 0, Math.min( material.color.r * _color4.r, 1 ) ); - _color4.g = Math.max( 0, Math.min( material.color.g * _color4.g, 1 ) ); - _color4.b = Math.max( 0, Math.min( material.color.b * _color4.b, 1 ) ); - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - // TODO: UVs are incorrect, v4->v3? - - drawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y ); - clipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image ); - - drawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y ); - clipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image ); - - } else { - - _color.r = _ambientLight.r; - _color.g = _ambientLight.g; - _color.b = _ambientLight.b; - - calculateLight( _lights, element.centroidWorld, element.normalWorld, _color ); - - _color.r = Math.max( 0, Math.min( material.color.r * _color.r, 1 ) ); - _color.g = Math.max( 0, Math.min( material.color.g * _color.g, 1 ) ); - _color.b = Math.max( 0, Math.min( material.color.b * _color.b, 1 ) ); - - drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y ); - - material.wireframe ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color ); - - } - - } else { - - drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y ); - - material.wireframe ? strokePath( material.color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( material.color ); - - } - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - _color.r = normalToComponent( element.normalWorld.x ); - _color.g = normalToComponent( element.normalWorld.y ); - _color.b = normalToComponent( element.normalWorld.z ); - - drawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y ); - - material.wireframe ? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin ) : fillPath( _color ); - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - _near = camera.near; - _far = camera.far; - - _color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z, _near, _far ); - _color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z, _near, _far ); - _color3.r = _color3.g = _color3.b = 1 - smoothstep( v4.positionScreen.z, _near, _far ); - _color4.r = _color4.g = _color4.b = 1 - smoothstep( v3.positionScreen.z, _near, _far ); - - _image = getGradientTexture( _color1, _color2, _color3, _color4 ); - - // TODO: UVs are incorrect, v4->v3? - - drawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y ); - clipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image ); - - drawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y ); - clipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image ); - - } - - } - - // - - function drawTriangle( x0, y0, x1, y1, x2, y2 ) { - - _context.beginPath(); - _context.moveTo( x0, y0 ); - _context.lineTo( x1, y1 ); - _context.lineTo( x2, y2 ); - _context.lineTo( x0, y0 ); - _context.closePath(); - - } - - function drawQuad( x0, y0, x1, y1, x2, y2, x3, y3 ) { - - _context.beginPath(); - _context.moveTo( x0, y0 ); - _context.lineTo( x1, y1 ); - _context.lineTo( x2, y2 ); - _context.lineTo( x3, y3 ); - _context.lineTo( x0, y0 ); - _context.closePath(); - - } - - function strokePath( color, linewidth, linecap, linejoin ) { - - setLineWidth( linewidth ); - setLineCap( linecap ); - setLineJoin( linejoin ); - setStrokeStyle( color.getContextStyle() ); - - _context.stroke(); - - _bboxRect.inflate( linewidth * 2 ); - - } - - function fillPath( color ) { - - setFillStyle( color.getContextStyle() ); - _context.fill(); - - } - - function patternPath( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture ) { - - if ( texture.image.width == 0 ) return; - - if ( texture.needsUpdate == true || _patterns[ texture.id ] == undefined ) { - - var repeatX = texture.wrapS == THREE.RepeatWrapping; - var repeatY = texture.wrapT == THREE.RepeatWrapping; - - _patterns[ texture.id ] = _context.createPattern( texture.image, repeatX && repeatY ? 'repeat' : repeatX && !repeatY ? 'repeat-x' : !repeatX && repeatY ? 'repeat-y' : 'no-repeat' ); - - texture.needsUpdate = false; - - } - - setFillStyle( _patterns[ texture.id ] ); - - // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 - - var a, b, c, d, e, f, det, idet, - offsetX = texture.offset.x / texture.repeat.x, - offsetY = texture.offset.y / texture.repeat.y, - width = texture.image.width * texture.repeat.x, - height = texture.image.height * texture.repeat.y; - - u0 = ( u0 + offsetX ) * width; - v0 = ( v0 + offsetY ) * height; - - u1 = ( u1 + offsetX ) * width; - v1 = ( v1 + offsetY ) * height; - - u2 = ( u2 + offsetX ) * width; - v2 = ( v2 + offsetY ) * height; - - x1 -= x0; y1 -= y0; - x2 -= x0; y2 -= y0; - - u1 -= u0; v1 -= v0; - u2 -= u0; v2 -= v0; - - det = u1 * v2 - u2 * v1; - - if ( det == 0 ) { - - if ( _imagedatas[ texture.id ] === undefined ) { - - var canvas = document.createElement( 'canvas' ) - canvas.width = texture.image.width; - canvas.height = texture.image.height; - - var context = canvas.getContext( '2d' ); - context.drawImage( texture.image, 0, 0 ); - - _imagedatas[ texture.id ] = context.getImageData( 0, 0, texture.image.width, texture.image.height ).data; - - // variables cannot be deleted in ES5 strict mode - //delete canvas; - - } - - var data = _imagedatas[ texture.id ]; - var index = ( Math.floor( u0 ) + Math.floor( v0 ) * texture.image.width ) * 4; - - _color.setRGB( data[ index ] / 255, data[ index + 1 ] / 255, data[ index + 2 ] / 255 ); - fillPath( _color ); - - return; - - } - - idet = 1 / det; - - a = ( v2 * x1 - v1 * x2 ) * idet; - b = ( v2 * y1 - v1 * y2 ) * idet; - c = ( u1 * x2 - u2 * x1 ) * idet; - d = ( u1 * y2 - u2 * y1 ) * idet; - - e = x0 - a * u0 - c * v0; - f = y0 - b * u0 - d * v0; - - _context.save(); - _context.transform( a, b, c, d, e, f ); - _context.fill(); - _context.restore(); - - } - - function clipImage( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, image ) { - - // http://extremelysatisfactorytotalitarianism.com/blog/?p=2120 - - var a, b, c, d, e, f, det, idet, - width = image.width - 1, - height = image.height - 1; - - u0 *= width; v0 *= height; - u1 *= width; v1 *= height; - u2 *= width; v2 *= height; - - x1 -= x0; y1 -= y0; - x2 -= x0; y2 -= y0; - - u1 -= u0; v1 -= v0; - u2 -= u0; v2 -= v0; - - det = u1 * v2 - u2 * v1; - - idet = 1 / det; - - a = ( v2 * x1 - v1 * x2 ) * idet; - b = ( v2 * y1 - v1 * y2 ) * idet; - c = ( u1 * x2 - u2 * x1 ) * idet; - d = ( u1 * y2 - u2 * y1 ) * idet; - - e = x0 - a * u0 - c * v0; - f = y0 - b * u0 - d * v0; - - _context.save(); - _context.transform( a, b, c, d, e, f ); - _context.clip(); - _context.drawImage( image, 0, 0 ); - _context.restore(); - - } - - function getGradientTexture( color1, color2, color3, color4 ) { - - // http://mrdoob.com/blog/post/710 - - var c1r = ~~ ( color1.r * 255 ), c1g = ~~ ( color1.g * 255 ), c1b = ~~ ( color1.b * 255 ), - c2r = ~~ ( color2.r * 255 ), c2g = ~~ ( color2.g * 255 ), c2b = ~~ ( color2.b * 255 ), - c3r = ~~ ( color3.r * 255 ), c3g = ~~ ( color3.g * 255 ), c3b = ~~ ( color3.b * 255 ), - c4r = ~~ ( color4.r * 255 ), c4g = ~~ ( color4.g * 255 ), c4b = ~~ ( color4.b * 255 ); - - _pixelMapData[ 0 ] = c1r < 0 ? 0 : c1r > 255 ? 255 : c1r; - _pixelMapData[ 1 ] = c1g < 0 ? 0 : c1g > 255 ? 255 : c1g; - _pixelMapData[ 2 ] = c1b < 0 ? 0 : c1b > 255 ? 255 : c1b; - - _pixelMapData[ 4 ] = c2r < 0 ? 0 : c2r > 255 ? 255 : c2r; - _pixelMapData[ 5 ] = c2g < 0 ? 0 : c2g > 255 ? 255 : c2g; - _pixelMapData[ 6 ] = c2b < 0 ? 0 : c2b > 255 ? 255 : c2b; - - _pixelMapData[ 8 ] = c3r < 0 ? 0 : c3r > 255 ? 255 : c3r; - _pixelMapData[ 9 ] = c3g < 0 ? 0 : c3g > 255 ? 255 : c3g; - _pixelMapData[ 10 ] = c3b < 0 ? 0 : c3b > 255 ? 255 : c3b; - - _pixelMapData[ 12 ] = c4r < 0 ? 0 : c4r > 255 ? 255 : c4r; - _pixelMapData[ 13 ] = c4g < 0 ? 0 : c4g > 255 ? 255 : c4g; - _pixelMapData[ 14 ] = c4b < 0 ? 0 : c4b > 255 ? 255 : c4b; - - _pixelMapContext.putImageData( _pixelMapImage, 0, 0 ); - _gradientMapContext.drawImage( _pixelMap, 0, 0 ); - - return _gradientMap; - - } - - function smoothstep( value, min, max ) { - - var x = ( value - min ) / ( max - min ); - return x * x * ( 3 - 2 * x ); - - } - - function normalToComponent( normal ) { - - var component = ( normal + 1 ) * 0.5; - return component < 0 ? 0 : ( component > 1 ? 1 : component ); - - } - - // Hide anti-alias gaps - - function expand( v1, v2 ) { - - var x = v2.x - v1.x, y = v2.y - v1.y, - det = x * x + y * y, idet; - - if ( det == 0 ) return; - - idet = 1 / Math.sqrt( det ); - - x *= idet; y *= idet; - - v2.x += x; v2.y += y; - v1.x -= x; v1.y -= y; - - } - }; - - // Context cached methods. - - function setOpacity( value ) { - - if ( _contextGlobalAlpha != value ) { - - _context.globalAlpha = _contextGlobalAlpha = value; - - } - - } - - function setBlending( value ) { - - if ( _contextGlobalCompositeOperation != value ) { - - switch ( value ) { - - case THREE.NormalBlending: - - _context.globalCompositeOperation = 'source-over'; - - break; - - case THREE.AdditiveBlending: - - _context.globalCompositeOperation = 'lighter'; - - break; - - case THREE.SubtractiveBlending: - - _context.globalCompositeOperation = 'darker'; - - break; - - } - - _contextGlobalCompositeOperation = value; - - } - - } - - function setLineWidth( value ) { - - if ( _contextLineWidth != value ) { - - _context.lineWidth = _contextLineWidth = value; - - } - - } - - function setLineCap( value ) { - - // "butt", "round", "square" - - if ( _contextLineCap != value ) { - - _context.lineCap = _contextLineCap = value; - - } - - } - - function setLineJoin( value ) { - - // "round", "bevel", "miter" - - if ( _contextLineJoin != value ) { - - _context.lineJoin = _contextLineJoin = value; - - } - - } - - function setStrokeStyle( style ) { - - if ( _contextStrokeStyle != style ) { - - _context.strokeStyle = _contextStrokeStyle = style; - - } - - } - - function setFillStyle( style ) { - - if ( _contextFillStyle != style ) { - - _context.fillStyle = _contextFillStyle = style; - - } - - } - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.SVGRenderer = function () { - - var _this = this, - _renderData, _elements, _lights, - _projector = new THREE.Projector(), - _svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'), - _svgWidth, _svgHeight, _svgWidthHalf, _svgHeightHalf, - - _v1, _v2, _v3, _v4, - - _clipRect = new THREE.Rectangle(), - _bboxRect = new THREE.Rectangle(), - - _enableLighting = false, - _color = new THREE.Color(), - _ambientLight = new THREE.Color(), - _directionalLights = new THREE.Color(), - _pointLights = new THREE.Color(), - - _w, // z-buffer to w-buffer - _vector3 = new THREE.Vector3(), // Needed for PointLight - - _svgPathPool = [], _svgCirclePool = [], _svgLinePool = [], - _svgNode, _pathCount, _circleCount, _lineCount, - _quality = 1; - - this.domElement = _svg; - - this.autoClear = true; - this.sortObjects = true; - this.sortElements = true; - - this.info = { - - render: { - - vertices: 0, - faces: 0 - - } - - } - - this.setQuality = function( quality ) { - - switch(quality) { - - case "high": _quality = 1; break; - case "low": _quality = 0; break; - - } - - }; - - this.setSize = function( width, height ) { - - _svgWidth = width; _svgHeight = height; - _svgWidthHalf = _svgWidth / 2; _svgHeightHalf = _svgHeight / 2; - - _svg.setAttribute( 'viewBox', ( - _svgWidthHalf ) + ' ' + ( - _svgHeightHalf ) + ' ' + _svgWidth + ' ' + _svgHeight ); - _svg.setAttribute( 'width', _svgWidth ); - _svg.setAttribute( 'height', _svgHeight ); - - _clipRect.set( - _svgWidthHalf, - _svgHeightHalf, _svgWidthHalf, _svgHeightHalf ); - - }; - - this.clear = function () { - - while ( _svg.childNodes.length > 0 ) { - - _svg.removeChild( _svg.childNodes[ 0 ] ); - - } - - }; - - this.render = function ( scene, camera ) { - - var e, el, element, material; - - this.autoClear && this.clear(); - - _this.info.render.vertices = 0; - _this.info.render.faces = 0; - - _renderData = _projector.projectScene( scene, camera, this.sortElements ); - _elements = _renderData.elements; - _lights = _renderData.lights; - - _pathCount = 0; _circleCount = 0; _lineCount = 0; - - _enableLighting = _lights.length > 0; - - if ( _enableLighting ) { - - calculateLights( _lights ); - - } - - for ( e = 0, el = _elements.length; e < el; e ++ ) { - - element = _elements[ e ]; - - material = element.material; - material = material instanceof THREE.MeshFaceMaterial ? element.faceMaterial : material; - - if ( material == null || material.opacity == 0 ) continue; - - _bboxRect.empty(); - - if ( element instanceof THREE.RenderableParticle ) { - - _v1 = element; - _v1.x *= _svgWidthHalf; _v1.y *= -_svgHeightHalf; - - renderParticle( _v1, element, material, scene ); - - } else if ( element instanceof THREE.RenderableLine ) { - - _v1 = element.v1; _v2 = element.v2; - - _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf; - _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf; - - _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y ); - _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y ); - - if ( !_clipRect.intersects( _bboxRect ) ) { - - continue; - - } - - renderLine( _v1, _v2, element, material, scene ); - - } else if ( element instanceof THREE.RenderableFace3 ) { - - _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; - - _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf; - _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf; - _v3.positionScreen.x *= _svgWidthHalf; _v3.positionScreen.y *= - _svgHeightHalf; - - _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y ); - _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y ); - _bboxRect.addPoint( _v3.positionScreen.x, _v3.positionScreen.y ); - - if ( !_clipRect.intersects( _bboxRect ) ) { - - continue; - - } - - renderFace3( _v1, _v2, _v3, element, material, scene ); - - } else if ( element instanceof THREE.RenderableFace4 ) { - - _v1 = element.v1; _v2 = element.v2; _v3 = element.v3; _v4 = element.v4; - - _v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= -_svgHeightHalf; - _v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= -_svgHeightHalf; - _v3.positionScreen.x *= _svgWidthHalf; _v3.positionScreen.y *= -_svgHeightHalf; - _v4.positionScreen.x *= _svgWidthHalf; _v4.positionScreen.y *= -_svgHeightHalf; - - _bboxRect.addPoint( _v1.positionScreen.x, _v1.positionScreen.y ); - _bboxRect.addPoint( _v2.positionScreen.x, _v2.positionScreen.y ); - _bboxRect.addPoint( _v3.positionScreen.x, _v3.positionScreen.y ); - _bboxRect.addPoint( _v4.positionScreen.x, _v4.positionScreen.y ); - - if ( !_clipRect.intersects( _bboxRect) ) { - - continue; - - } - - renderFace4( _v1, _v2, _v3, _v4, element, material, scene ); - - } - - } - - }; - - function calculateLights( lights ) { - - var l, ll, light, lightColor; - - _ambientLight.setRGB( 0, 0, 0 ); - _directionalLights.setRGB( 0, 0, 0 ); - _pointLights.setRGB( 0, 0, 0 ); - - for ( l = 0, ll = lights.length; l < ll; l++ ) { - - light = lights[ l ]; - lightColor = light.color; - - if ( light instanceof THREE.AmbientLight ) { - - _ambientLight.r += lightColor.r; - _ambientLight.g += lightColor.g; - _ambientLight.b += lightColor.b; - - } else if ( light instanceof THREE.DirectionalLight ) { - - _directionalLights.r += lightColor.r; - _directionalLights.g += lightColor.g; - _directionalLights.b += lightColor.b; - - } else if ( light instanceof THREE.PointLight ) { - - _pointLights.r += lightColor.r; - _pointLights.g += lightColor.g; - _pointLights.b += lightColor.b; - - } - - } - - } - - function calculateLight( lights, position, normal, color ) { - - var l, ll, light, lightColor, lightPosition, amount; - - for ( l = 0, ll = lights.length; l < ll; l ++ ) { - - light = lights[ l ]; - lightColor = light.color; - - if ( light instanceof THREE.DirectionalLight ) { - - lightPosition = light.matrixWorld.getPosition(); - - amount = normal.dot( lightPosition ); - - if ( amount <= 0 ) continue; - - amount *= light.intensity; - - color.r += lightColor.r * amount; - color.g += lightColor.g * amount; - color.b += lightColor.b * amount; - - } else if ( light instanceof THREE.PointLight ) { - - lightPosition = light.matrixWorld.getPosition(); - - amount = normal.dot( _vector3.sub( lightPosition, position ).normalize() ); - - if ( amount <= 0 ) continue; - - amount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 ); - - if ( amount == 0 ) continue; - - amount *= light.intensity; - - color.r += lightColor.r * amount; - color.g += lightColor.g * amount; - color.b += lightColor.b * amount; - - } - - } - - } - - function renderParticle( v1, element, material, scene ) { - - /* - _svgNode = getCircleNode( _circleCount++ ); - _svgNode.setAttribute( 'cx', v1.x ); - _svgNode.setAttribute( 'cy', v1.y ); - _svgNode.setAttribute( 'r', element.scale.x * _svgWidthHalf ); - - if ( material instanceof THREE.ParticleCircleMaterial ) { - - if ( _enableLighting ) { - - _color.r = _ambientLight.r + _directionalLights.r + _pointLights.r; - _color.g = _ambientLight.g + _directionalLights.g + _pointLights.g; - _color.b = _ambientLight.b + _directionalLights.b + _pointLights.b; - - _color.r = material.color.r * _color.r; - _color.g = material.color.g * _color.g; - _color.b = material.color.b * _color.b; - - _color.updateStyleString(); - - } else { - - _color = material.color; - - } - - _svgNode.setAttribute( 'style', 'fill: ' + _color.__styleString ); - - } - - _svg.appendChild( _svgNode ); - */ - - } - - function renderLine ( v1, v2, element, material, scene ) { - - _svgNode = getLineNode( _lineCount ++ ); - - _svgNode.setAttribute( 'x1', v1.positionScreen.x ); - _svgNode.setAttribute( 'y1', v1.positionScreen.y ); - _svgNode.setAttribute( 'x2', v2.positionScreen.x ); - _svgNode.setAttribute( 'y2', v2.positionScreen.y ); - - if ( material instanceof THREE.LineBasicMaterial ) { - - _svgNode.setAttribute( 'style', 'fill: none; stroke: ' + material.color.getContextStyle() + '; stroke-width: ' + material.linewidth + '; stroke-opacity: ' + material.opacity + '; stroke-linecap: ' + material.linecap + '; stroke-linejoin: ' + material.linejoin ); - - _svg.appendChild( _svgNode ); - - } - - } - - function renderFace3( v1, v2, v3, element, material, scene ) { - - _this.info.render.vertices += 3; - _this.info.render.faces ++; - - _svgNode = getPathNode( _pathCount ++ ); - _svgNode.setAttribute( 'd', 'M ' + v1.positionScreen.x + ' ' + v1.positionScreen.y + ' L ' + v2.positionScreen.x + ' ' + v2.positionScreen.y + ' L ' + v3.positionScreen.x + ',' + v3.positionScreen.y + 'z' ); - - if ( material instanceof THREE.MeshBasicMaterial ) { - - _color.copy( material.color ); - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - if ( _enableLighting ) { - - _color.r = _ambientLight.r; - _color.g = _ambientLight.g; - _color.b = _ambientLight.b; - - calculateLight( _lights, element.centroidWorld, element.normalWorld, _color ); - - _color.r = Math.max( 0, Math.min( material.color.r * _color.r, 1 ) ); - _color.g = Math.max( 0, Math.min( material.color.g * _color.g, 1 ) ); - _color.b = Math.max( 0, Math.min( material.color.b * _color.b, 1 ) ); - - } else { - - _color.copy( material.color ); - - } - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - _w = 1 - ( material.__2near / (material.__farPlusNear - element.z * material.__farMinusNear) ); - _color.setRGB( _w, _w, _w ); - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - _color.setRGB( normalToComponent( element.normalWorld.x ), normalToComponent( element.normalWorld.y ), normalToComponent( element.normalWorld.z ) ); - - } - - if ( material.wireframe ) { - - _svgNode.setAttribute( 'style', 'fill: none; stroke: ' + _color.getContextStyle() + '; stroke-width: ' + material.wireframeLinewidth + '; stroke-opacity: ' + material.opacity + '; stroke-linecap: ' + material.wireframeLinecap + '; stroke-linejoin: ' + material.wireframeLinejoin ); - - } else { - - _svgNode.setAttribute( 'style', 'fill: ' + _color.getContextStyle() + '; fill-opacity: ' + material.opacity ); - - } - - _svg.appendChild( _svgNode ); - - } - - function renderFace4( v1, v2, v3, v4, element, material, scene ) { - - _this.info.render.vertices += 4; - _this.info.render.faces ++; - - _svgNode = getPathNode( _pathCount ++ ); - _svgNode.setAttribute( 'd', 'M ' + v1.positionScreen.x + ' ' + v1.positionScreen.y + ' L ' + v2.positionScreen.x + ' ' + v2.positionScreen.y + ' L ' + v3.positionScreen.x + ',' + v3.positionScreen.y + ' L ' + v4.positionScreen.x + ',' + v4.positionScreen.y + 'z' ); - - if ( material instanceof THREE.MeshBasicMaterial ) { - - _color.copy( material.color ); - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - if ( _enableLighting ) { - - _color.r = _ambientLight.r; - _color.g = _ambientLight.g; - _color.b = _ambientLight.b; - - calculateLight( _lights, element.centroidWorld, element.normalWorld, _color ); - - _color.r = Math.max( 0, Math.min( material.color.r * _color.r, 1 ) ); - _color.g = Math.max( 0, Math.min( material.color.g * _color.g, 1 ) ); - _color.b = Math.max( 0, Math.min( material.color.b * _color.b, 1 ) ); - - } else { - - _color.copy( material.color ); - - } - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - _w = 1 - ( material.__2near / (material.__farPlusNear - element.z * material.__farMinusNear) ); - _color.setRGB( _w, _w, _w ); - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - _color.setRGB( normalToComponent( element.normalWorld.x ), normalToComponent( element.normalWorld.y ), normalToComponent( element.normalWorld.z ) ); - - } - - if ( material.wireframe ) { - - _svgNode.setAttribute( 'style', 'fill: none; stroke: ' + _color.getContextStyle() + '; stroke-width: ' + material.wireframeLinewidth + '; stroke-opacity: ' + material.opacity + '; stroke-linecap: ' + material.wireframeLinecap + '; stroke-linejoin: ' + material.wireframeLinejoin ); - - } else { - - _svgNode.setAttribute( 'style', 'fill: ' + _color.getContextStyle() + '; fill-opacity: ' + material.opacity ); - - } - - _svg.appendChild( _svgNode ); - - } - - function getLineNode( id ) { - - if ( _svgLinePool[ id ] == null ) { - - _svgLinePool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'line' ); - - if ( _quality == 0 ) { - - _svgLinePool[ id ].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed - - } - - return _svgLinePool[ id ]; - - } - - return _svgLinePool[ id ]; - - } - - function getPathNode( id ) { - - if ( _svgPathPool[ id ] == null ) { - - _svgPathPool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' ); - - if ( _quality == 0 ) { - - _svgPathPool[ id ].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed - - } - - return _svgPathPool[ id ]; - - } - - return _svgPathPool[ id ]; - - } - - function getCircleNode( id ) { - - if ( _svgCirclePool[id] == null ) { - - _svgCirclePool[ id ] = document.createElementNS( 'http://www.w3.org/2000/svg', 'circle' ); - - if ( _quality == 0 ) { - - _svgCirclePool[id].setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed - - } - - return _svgCirclePool[ id ]; - - } - - return _svgCirclePool[ id ]; - - } - - function normalToComponent( normal ) { - - var component = ( normal + 1 ) * 0.5; - return component < 0 ? 0 : ( component > 1 ? 1 : component ); - - } - - function pad( str ) { - - while ( str.length < 6 ) str = '0' + str; - return str; - - } - -}; -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - * @author mikael emtinger / http://gomo.se/ - */ - -THREE.ShaderChunk = { - - // FOG - - fog_pars_fragment: [ - - "#ifdef USE_FOG", - - "uniform vec3 fogColor;", - - "#ifdef FOG_EXP2", - - "uniform float fogDensity;", - - "#else", - - "uniform float fogNear;", - "uniform float fogFar;", - - "#endif", - - "#endif" - - ].join("\n"), - - fog_fragment: [ - - "#ifdef USE_FOG", - - "float depth = gl_FragCoord.z / gl_FragCoord.w;", - - "#ifdef FOG_EXP2", - - "const float LOG2 = 1.442695;", - "float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );", - "fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );", - - "#else", - - "float fogFactor = smoothstep( fogNear, fogFar, depth );", - - "#endif", - - "gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );", - - "#endif" - - ].join("\n"), - - // ENVIRONMENT MAP - - envmap_pars_fragment: [ - - "#ifdef USE_ENVMAP", - - "varying vec3 vReflect;", - - "uniform float reflectivity;", - "uniform samplerCube envMap;", - "uniform float flipEnvMap;", - "uniform int combine;", - - "#endif" - - ].join("\n"), - - envmap_fragment: [ - - "#ifdef USE_ENVMAP", - - "vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * vReflect.x, vReflect.yz ) );", - - "#ifdef GAMMA_INPUT", - - "cubeColor.xyz *= cubeColor.xyz;", - - "#endif", - - "if ( combine == 1 ) {", - - "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity );", - - "} else {", - - "gl_FragColor.xyz = gl_FragColor.xyz * cubeColor.xyz;", - - "}", - - "#endif" - - ].join("\n"), - - envmap_pars_vertex: [ - - "#ifdef USE_ENVMAP", - - "varying vec3 vReflect;", - - "uniform float refractionRatio;", - "uniform bool useRefract;", - - "#endif" - - ].join("\n"), - - envmap_vertex : [ - - "#ifdef USE_ENVMAP", - - "vec4 mPosition = objectMatrix * vec4( position, 1.0 );", - "vec3 nWorld = mat3( objectMatrix[ 0 ].xyz, objectMatrix[ 1 ].xyz, objectMatrix[ 2 ].xyz ) * normal;", - - "if ( useRefract ) {", - - "vReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refractionRatio );", - - "} else {", - - "vReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );", - - "}", - - "#endif" - - ].join("\n"), - - // COLOR MAP (particles) - - map_particle_pars_fragment: [ - - "#ifdef USE_MAP", - - "uniform sampler2D map;", - - "#endif" - - ].join("\n"), - - - map_particle_fragment: [ - - "#ifdef USE_MAP", - - "gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );", - - "#endif" - - ].join("\n"), - - // COLOR MAP (triangles) - - map_pars_vertex: [ - - "#ifdef USE_MAP", - - "varying vec2 vUv;", - "uniform vec4 offsetRepeat;", - - "#endif" - - ].join("\n"), - - map_pars_fragment: [ - - "#ifdef USE_MAP", - - "varying vec2 vUv;", - "uniform sampler2D map;", - - "#endif" - - ].join("\n"), - - map_vertex: [ - - "#ifdef USE_MAP", - - "vUv = uv * offsetRepeat.zw + offsetRepeat.xy;", - - "#endif" - - ].join("\n"), - - map_fragment: [ - - "#ifdef USE_MAP", - - "#ifdef GAMMA_INPUT", - - "vec4 texelColor = texture2D( map, vUv );", - "texelColor.xyz *= texelColor.xyz;", - - "gl_FragColor = gl_FragColor * texelColor;", - - "#else", - - "gl_FragColor = gl_FragColor * texture2D( map, vUv );", - - "#endif", - - "#endif" - - ].join("\n"), - - // LIGHT MAP - - lightmap_pars_fragment: [ - - "#ifdef USE_LIGHTMAP", - - "varying vec2 vUv2;", - "uniform sampler2D lightMap;", - - "#endif" - - ].join("\n"), - - lightmap_pars_vertex: [ - - "#ifdef USE_LIGHTMAP", - - "varying vec2 vUv2;", - - "#endif" - - ].join("\n"), - - lightmap_fragment: [ - - "#ifdef USE_LIGHTMAP", - - "gl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );", - - "#endif" - - ].join("\n"), - - lightmap_vertex: [ - - "#ifdef USE_LIGHTMAP", - - "vUv2 = uv2;", - - "#endif" - - ].join("\n"), - - // LIGHTS LAMBERT - - lights_lambert_pars_vertex: [ - - "uniform vec3 ambient;", - "uniform vec3 diffuse;", - - "uniform vec3 ambientLightColor;", - - "#if MAX_DIR_LIGHTS > 0", - - "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];", - "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];", - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "#endif", - - "#ifdef WRAP_AROUND", - - "uniform vec3 wrapRGB;", - - "#endif", - - ].join("\n"), - - lights_lambert_vertex: [ - - "vLightWeighting = vec3( 0.0 );", - - "#if MAX_DIR_LIGHTS > 0", - - "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );", - "vec3 dirVector = normalize( lDirection.xyz );", - - "#ifdef WRAP_AROUND", - - "float directionalLightWeightingFull = max( dot( transformedNormal, dirVector ), 0.0 );", - "float directionalLightWeightingHalf = max( 0.5 * dot( transformedNormal, dirVector ) + 0.5, 0.0 );", - - "vec3 directionalLightWeighting = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );", - - "#else", - - "float directionalLightWeighting = max( dot( transformedNormal, dirVector ), 0.0 );", - - "#endif", - - "vLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;", - - "}", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz - mvPosition.xyz;", - - "float lDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - - "#ifdef WRAP_AROUND", - - "float pointLightWeightingFull = max( dot( transformedNormal, lVector ), 0.0 );", - "float pointLightWeightingHalf = max( 0.5 * dot( transformedNormal, lVector ) + 0.5, 0.0 );", - - "vec3 pointLightWeighting = mix( vec3 ( pointLightWeightingFull ), vec3( pointLightWeightingHalf ), wrapRGB );", - - "#else", - - "float pointLightWeighting = max( dot( transformedNormal, lVector ), 0.0 );", - - "#endif", - - "vLightWeighting += pointLightColor[ i ] * pointLightWeighting * lDistance;", - - "}", - - "#endif", - - "vLightWeighting = vLightWeighting * diffuse + ambient * ambientLightColor;", - - ].join("\n"), - - // LIGHTS PHONG - - lights_phong_pars_vertex: [ - - "#if MAX_POINT_LIGHTS > 0", - "#ifndef PHONG_PER_PIXEL", - - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];", - - "#endif", - "#endif" - - ].join("\n"), - - - lights_phong_vertex: [ - - "#if MAX_POINT_LIGHTS > 0", - "#ifndef PHONG_PER_PIXEL", - - "for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz - mvPosition.xyz;", - - "float lDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );", - - "vPointLight[ i ] = vec4( lVector, lDistance );", - - "}", - - "#endif", - "#endif" - - ].join("\n"), - - lights_phong_pars_fragment: [ - - "uniform vec3 ambientLightColor;", - - "#if MAX_DIR_LIGHTS > 0", - - "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];", - "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];", - - "#ifdef PHONG_PER_PIXEL", - - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "#else", - - "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];", - - "#endif", - - "#endif", - - "#ifdef WRAP_AROUND", - - "uniform vec3 wrapRGB;", - - "#endif", - - "varying vec3 vViewPosition;", - "varying vec3 vNormal;" - - ].join("\n"), - - lights_phong_fragment: [ - - "vec3 normal = normalize( vNormal );", - "vec3 viewPosition = normalize( vViewPosition );", - - "#if MAX_POINT_LIGHTS > 0", - - "vec3 pointDiffuse = vec3( 0.0 );", - "vec3 pointSpecular = vec3( 0.0 );", - - "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "#ifdef PHONG_PER_PIXEL", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz + vViewPosition.xyz;", - - "float lDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - - "#else", - - "vec3 lVector = normalize( vPointLight[ i ].xyz );", - "float lDistance = vPointLight[ i ].w;", - - "#endif", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float pointDiffuseWeightFull = max( dot( normal, lVector ), 0.0 );", - "float pointDiffuseWeightHalf = max( 0.5 * dot( normal, lVector ) + 0.5, 0.0 );", - - "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float pointDiffuseWeight = max( dot( normal, lVector ), 0.0 );", - - "#endif", - - "pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;", - - // specular - - "vec3 pointHalfVector = normalize( lVector + viewPosition );", - "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );", - "float pointSpecularWeight = max( pow( pointDotNormalHalf, shininess ), 0.0 );", - - "#ifdef PHYSICALLY_BASED_SHADING", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( dot( lVector, pointHalfVector ), 5.0 );", - "pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;", - - "#else", - - "pointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;", - - "#endif", - - "}", - - "#endif", - - "#if MAX_DIR_LIGHTS > 0", - - "vec3 dirDiffuse = vec3( 0.0 );", - "vec3 dirSpecular = vec3( 0.0 );" , - - "for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {", - - "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );", - "vec3 dirVector = normalize( lDirection.xyz );", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float dirDiffuseWeightFull = max( dot( normal, dirVector ), 0.0 );", - "float dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );", - - "vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );", - - "#endif", - - "dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;", - - // specular - - "vec3 dirHalfVector = normalize( dirVector + viewPosition );", - "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );", - "float dirSpecularWeight = max( pow( dirDotNormalHalf, shininess ), 0.0 );", - - "#ifdef PHYSICALLY_BASED_SHADING", - - /* - // fresnel term from skin shader - "const float F0 = 0.128;", - - "float base = 1.0 - dot( viewPosition, dirHalfVector );", - "float exponential = pow( base, 5.0 );", - - "float fresnel = exponential + F0 * ( 1.0 - exponential );", - */ - - /* - // fresnel term from fresnel shader - "const float mFresnelBias = 0.08;", - "const float mFresnelScale = 0.3;", - "const float mFresnelPower = 5.0;", - - "float fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );", - */ - - // normalization factor - //float specularNormalization = ( shininess + 2.0 ) / 8.0; - - //"dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;", - - "vec3 schlick = specular + vec3( 1.0 - specular ) * pow( dot( dirVector, dirHalfVector ), 5.0 );", - "dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;", - - "#else", - - "dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;", - - "#endif", - - "}", - - "#endif", - - "vec3 totalDiffuse = vec3( 0.0 );", - "vec3 totalSpecular = vec3( 0.0 );", - - "#if MAX_DIR_LIGHTS > 0", - - "totalDiffuse += dirDiffuse;", - "totalSpecular += dirSpecular;", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "totalDiffuse += pointDiffuse;", - "totalSpecular += pointSpecular;", - - "#endif", - - "#ifdef METAL", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient + totalSpecular );", - - "#else", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * ambient ) + totalSpecular;", - - "#endif" - - ].join("\n"), - - // VERTEX COLORS - - color_pars_fragment: [ - - "#ifdef USE_COLOR", - - "varying vec3 vColor;", - - "#endif" - - ].join("\n"), - - - color_fragment: [ - - "#ifdef USE_COLOR", - - "gl_FragColor = gl_FragColor * vec4( vColor, opacity );", - - "#endif" - - ].join("\n"), - - color_pars_vertex: [ - - "#ifdef USE_COLOR", - - "varying vec3 vColor;", - - "#endif" - - ].join("\n"), - - - color_vertex: [ - - "#ifdef USE_COLOR", - - "#ifdef GAMMA_INPUT", - - "vColor = color * color;", - - "#else", - - "vColor = color;", - - "#endif", - - "#endif" - - ].join("\n"), - - // SKINNING - - skinning_pars_vertex: [ - - "#ifdef USE_SKINNING", - - "uniform mat4 boneGlobalMatrices[ MAX_BONES ];", - - "#endif" - - ].join("\n"), - - skinning_vertex: [ - - "#ifdef USE_SKINNING", - - "gl_Position = ( boneGlobalMatrices[ int( skinIndex.x ) ] * skinVertexA ) * skinWeight.x;", - "gl_Position += ( boneGlobalMatrices[ int( skinIndex.y ) ] * skinVertexB ) * skinWeight.y;", - - // this doesn't work, no idea why - //"gl_Position = projectionMatrix * cameraInverseMatrix * objectMatrix * gl_Position;", - - "gl_Position = projectionMatrix * viewMatrix * objectMatrix * gl_Position;", - - "#endif" - - ].join("\n"), - - // MORPHING - - morphtarget_pars_vertex: [ - - "#ifdef USE_MORPHTARGETS", - - "uniform float morphTargetInfluences[ 8 ];", - - "#endif" - - ].join("\n"), - - morphtarget_vertex: [ - - "#ifdef USE_MORPHTARGETS", - - "vec3 morphed = vec3( 0.0, 0.0, 0.0 );", - "morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];", - "morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];", - "morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];", - "morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];", - "morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];", - "morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];", - "morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];", - "morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];", - "morphed += position;", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );", - - "#endif" - - ].join("\n"), - - default_vertex : [ - - "#ifndef USE_MORPHTARGETS", - "#ifndef USE_SKINNING", - - "gl_Position = projectionMatrix * mvPosition;", - - "#endif", - "#endif" - - ].join("\n"), - - // SHADOW MAP - - // based on SpiderGL shadow map and Fabien Sanglard's GLSL shadow mapping examples - // http://spidergl.org/example.php?id=6 - // http://fabiensanglard.net/shadowmapping - - shadowmap_pars_fragment: [ - - "#ifdef USE_SHADOWMAP", - - "uniform sampler2D shadowMap[ MAX_SHADOWS ];", - "uniform vec2 shadowMapSize[ MAX_SHADOWS ];", - - "uniform float shadowDarkness[ MAX_SHADOWS ];", - "uniform float shadowBias[ MAX_SHADOWS ];", - - "varying vec4 vShadowCoord[ MAX_SHADOWS ];", - - "float unpackDepth( const in vec4 rgba_depth ) {", - - "const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );", - "float depth = dot( rgba_depth, bit_shift );", - "return depth;", - - "}", - - "#endif" - - ].join("\n"), - - shadowmap_fragment: [ - - "#ifdef USE_SHADOWMAP", - - "vec3 shadowColor = vec3( 1.0 );", - "float fDepth;", - - "for( int i = 0; i < MAX_SHADOWS; i ++ ) {", - - "vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;", - - // don't shadow pixels behind far plane of light frustum - - "if ( shadowCoord.z <= 1.0 ) {", - - "shadowCoord.z += shadowBias[ i ];", - - // using "if ( all )" for ATI OpenGL shader compiler - // "if ( something && something )" breaks it - - // don't shadow pixels outside of light frustum - - "bvec4 shadowTest = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );", - - "if ( all( shadowTest ) ) {", - - "#ifdef SHADOWMAP_SOFT", - - // Percentage-close filtering - // (9 pixel kernel) - // http://fabiensanglard.net/shadowmappingPCF/ - - "float shadow = 0.0;", - - /* - // this breaks shader compiler / validator on some ATI cards when using OpenGL - // must enroll loop manually - - "for ( float y = -1.25; y <= 1.25; y += 1.25 )", - "for ( float x = -1.25; x <= 1.25; x += 1.25 ) {", - - "vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );", - - // doesn't seem to produce any noticeable visual difference compared to simple "texture2D" lookup - //"vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );", - - "float fDepth = unpackDepth( rgbaDepth );", - - "if ( fDepth < shadowCoord.z )", - "shadow += 1.0;", - - "}", - - "shadow /= 9.0;", - - */ - - "const float shadowDelta = 1.0 / 9.0;", - - "float xPixelOffset = 1.0 / shadowMapSize[ i ].x;", - "float yPixelOffset = 1.0 / shadowMapSize[ i ].y;", - - "float dx0 = -1.25 * xPixelOffset;", - "float dy0 = -1.25 * yPixelOffset;", - "float dx1 = 1.25 * xPixelOffset;", - "float dy1 = 1.25 * yPixelOffset;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );", - "if ( fDepth < shadowCoord.z ) shadow += shadowDelta;", - - "shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );", - - "#else", - - "vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );", - "float fDepth = unpackDepth( rgbaDepth );", - - "if ( fDepth < shadowCoord.z )", - - // spot with multiple shadows is darker - - "shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );", - - // spot with multiple shadows has the same color as single shadow spot - - //"shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );", - - "#endif", - - "}", - - "}", - - - // uncomment to see light frustum boundaries - //"if ( !( shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0 ) )", - // "gl_FragColor.xyz = gl_FragColor.xyz * vec3( 1.0, 0.0, 0.0 );", - - "}", - - "#ifdef GAMMA_OUTPUT", - - "shadowColor *= shadowColor;", - - "#endif", - - "gl_FragColor.xyz = gl_FragColor.xyz * shadowColor;", - - "#endif" - - ].join("\n"), - - shadowmap_pars_vertex: [ - - "#ifdef USE_SHADOWMAP", - - "varying vec4 vShadowCoord[ MAX_SHADOWS ];", - "uniform mat4 shadowMatrix[ MAX_SHADOWS ];", - - "#endif" - - ].join("\n"), - - shadowmap_vertex: [ - - "#ifdef USE_SHADOWMAP", - - "for( int i = 0; i < MAX_SHADOWS; i ++ ) {", - - "#ifdef USE_MORPHTARGETS", - - "vShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( morphed, 1.0 );", - - "#else", - - "vShadowCoord[ i ] = shadowMatrix[ i ] * objectMatrix * vec4( position, 1.0 );", - - "#endif", - - "}", - - "#endif" - - ].join("\n"), - - // ALPHATEST - - alphatest_fragment: [ - - "#ifdef ALPHATEST", - - "if ( gl_FragColor.a < ALPHATEST ) discard;", - - "#endif" - - ].join("\n"), - - // LINEAR SPACE - - linear_to_gamma_fragment: [ - - "#ifdef GAMMA_OUTPUT", - - "gl_FragColor.xyz = sqrt( gl_FragColor.xyz );", - - "#endif" - - ].join("\n"), - - -}; - -THREE.UniformsUtils = { - - merge: function ( uniforms ) { - - var u, p, tmp, merged = {}; - - for ( u = 0; u < uniforms.length; u++ ) { - - tmp = this.clone( uniforms[ u ] ); - - for ( p in tmp ) { - - merged[ p ] = tmp[ p ]; - - } - - } - - return merged; - - }, - - clone: function ( uniforms_src ) { - - var u, p, parameter, parameter_src, uniforms_dst = {}; - - for ( u in uniforms_src ) { - - uniforms_dst[ u ] = {}; - - for ( p in uniforms_src[ u ] ) { - - parameter_src = uniforms_src[ u ][ p ]; - - if ( parameter_src instanceof THREE.Color || - parameter_src instanceof THREE.Vector2 || - parameter_src instanceof THREE.Vector3 || - parameter_src instanceof THREE.Vector4 || - parameter_src instanceof THREE.Matrix4 || - parameter_src instanceof THREE.Texture ) { - - uniforms_dst[ u ][ p ] = parameter_src.clone(); - - } else if ( parameter_src instanceof Array ) { - - uniforms_dst[ u ][ p ] = parameter_src.slice(); - - } else { - - uniforms_dst[ u ][ p ] = parameter_src; - - } - - } - - } - - return uniforms_dst; - - } - -}; - -THREE.UniformsLib = { - - common: { - - "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, - "opacity" : { type: "f", value: 1.0 }, - - "map" : { type: "t", value: 0, texture: null }, - "offsetRepeat" : { type: "v4", value: new THREE.Vector4( 0, 0, 1, 1 ) }, - - "lightMap" : { type: "t", value: 2, texture: null }, - - "envMap" : { type: "t", value: 1, texture: null }, - "flipEnvMap" : { type: "f", value: -1 }, - "useRefract" : { type: "i", value: 0 }, - "reflectivity" : { type: "f", value: 1.0 }, - "refractionRatio" : { type: "f", value: 0.98 }, - "combine" : { type: "i", value: 0 }, - - "morphTargetInfluences" : { type: "f", value: 0 } - - }, - - fog : { - - "fogDensity" : { type: "f", value: 0.00025 }, - "fogNear" : { type: "f", value: 1 }, - "fogFar" : { type: "f", value: 2000 }, - "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } - - }, - - lights: { - - "ambientLightColor" : { type: "fv", value: [] }, - "directionalLightDirection" : { type: "fv", value: [] }, - "directionalLightColor" : { type: "fv", value: [] }, - "pointLightColor" : { type: "fv", value: [] }, - "pointLightPosition" : { type: "fv", value: [] }, - "pointLightDistance" : { type: "fv1", value: [] } - - }, - - particle: { - - "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) }, - "opacity" : { type: "f", value: 1.0 }, - "size" : { type: "f", value: 1.0 }, - "scale" : { type: "f", value: 1.0 }, - "map" : { type: "t", value: 0, texture: null }, - - "fogDensity" : { type: "f", value: 0.00025 }, - "fogNear" : { type: "f", value: 1 }, - "fogFar" : { type: "f", value: 2000 }, - "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) } - - }, - - shadowmap: { - - "shadowMap": { type: "tv", value: 6, texture: [] }, - "shadowMapSize": { type: "v2v", value: [] }, - - "shadowBias" : { type: "fv1", value: [] }, - "shadowDarkness": { type: "fv1", value: [] }, - - "shadowMatrix" : { type: "m4v", value: [] }, - - } - -}; - -THREE.ShaderLib = { - - 'depth': { - - uniforms: { - - "mNear": { type: "f", value: 1.0 }, - "mFar" : { type: "f", value: 2000.0 }, - "opacity" : { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - // "#ifdef USE_MORPHTARGETS", - // "uniform float morphTargetInfluences[ 8 ];", - // "#endif", - - "void main() {", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - // "#ifdef USE_MORPHTARGETS", - // "vec3 morphed = vec3( 0.0, 0.0, 0.0 );", - // "morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];", - // "morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];", - // "morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];", - // "morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];", - // "morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];", - // "morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];", - // "morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];", - // "morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];", - // "morphed += position;", - - // "gl_Position = projectionMatrix * modelViewMatrix * vec4( morphed, 1.0 );", - // "#endif", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float mNear;", - "uniform float mFar;", - "uniform float opacity;", - - "void main() {", - - "float depth = gl_FragCoord.z / gl_FragCoord.w;", - "float color = 1.0 - smoothstep( mNear, mFar, depth );", - "gl_FragColor = vec4( vec3( color ), opacity );", - - "}" - - ].join("\n") - - }, - - 'normal': { - - uniforms: { - - "opacity" : { type: "f", value: 1.0 } - - }, - - vertexShader: [ - - "varying vec3 vNormal;", - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - "vNormal = normalize( normalMatrix * normal );", - - "gl_Position = projectionMatrix * mvPosition;", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - "varying vec3 vNormal;", - - "void main() {", - - "gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );", - - "}" - - ].join("\n") - - }, - - 'basic': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "shadowmap" ] - - ] ), - - vertexShader: [ - - THREE.ShaderChunk[ "map_pars_vertex" ], - THREE.ShaderChunk[ "lightmap_pars_vertex" ], - THREE.ShaderChunk[ "envmap_pars_vertex" ], - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - THREE.ShaderChunk[ "map_vertex" ], - THREE.ShaderChunk[ "lightmap_vertex" ], - THREE.ShaderChunk[ "envmap_vertex" ], - THREE.ShaderChunk[ "color_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 diffuse;", - "uniform float opacity;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_pars_fragment" ], - THREE.ShaderChunk[ "lightmap_pars_fragment" ], - THREE.ShaderChunk[ "envmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( diffuse, opacity );", - - THREE.ShaderChunk[ "map_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - THREE.ShaderChunk[ "lightmap_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "envmap_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'lambert': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "lights" ], - THREE.UniformsLib[ "shadowmap" ], - - { - "ambient" : { type: "c", value: new THREE.Color( 0x050505 ) }, - "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - } - - ] ), - - vertexShader: [ - - "varying vec3 vLightWeighting;", - - THREE.ShaderChunk[ "map_pars_vertex" ], - THREE.ShaderChunk[ "lightmap_pars_vertex" ], - THREE.ShaderChunk[ "envmap_pars_vertex" ], - THREE.ShaderChunk[ "lights_lambert_pars_vertex" ], - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - THREE.ShaderChunk[ "map_vertex" ], - THREE.ShaderChunk[ "lightmap_vertex" ], - THREE.ShaderChunk[ "envmap_vertex" ], - THREE.ShaderChunk[ "color_vertex" ], - - "vec3 transformedNormal = normalize( normalMatrix * normal );", - - THREE.ShaderChunk[ "lights_lambert_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform float opacity;", - - "varying vec3 vLightWeighting;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_pars_fragment" ], - THREE.ShaderChunk[ "lightmap_pars_fragment" ], - THREE.ShaderChunk[ "envmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );", - - THREE.ShaderChunk[ "map_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - - "gl_FragColor.xyz = gl_FragColor.xyz * vLightWeighting;", - - THREE.ShaderChunk[ "lightmap_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "envmap_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'phong': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "common" ], - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "lights" ], - THREE.UniformsLib[ "shadowmap" ], - - { - "ambient" : { type: "c", value: new THREE.Color( 0x050505 ) }, - "specular" : { type: "c", value: new THREE.Color( 0x111111 ) }, - "shininess": { type: "f", value: 30 }, - "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - } - - ] ), - - vertexShader: [ - - "varying vec3 vViewPosition;", - "varying vec3 vNormal;", - - THREE.ShaderChunk[ "map_pars_vertex" ], - THREE.ShaderChunk[ "lightmap_pars_vertex" ], - THREE.ShaderChunk[ "envmap_pars_vertex" ], - THREE.ShaderChunk[ "lights_phong_pars_vertex" ], - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "skinning_pars_vertex" ], - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - THREE.ShaderChunk[ "map_vertex" ], - THREE.ShaderChunk[ "lightmap_vertex" ], - THREE.ShaderChunk[ "envmap_vertex" ], - THREE.ShaderChunk[ "color_vertex" ], - - "#ifndef USE_ENVMAP", - - "vec4 mPosition = objectMatrix * vec4( position, 1.0 );", - - "#endif", - - "vViewPosition = -mvPosition.xyz;", - - "vec3 transformedNormal = normalMatrix * normal;", - "vNormal = transformedNormal;", - - THREE.ShaderChunk[ "lights_phong_vertex" ], - THREE.ShaderChunk[ "skinning_vertex" ], - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 diffuse;", - "uniform float opacity;", - - "uniform vec3 ambient;", - "uniform vec3 specular;", - "uniform float shininess;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_pars_fragment" ], - THREE.ShaderChunk[ "lightmap_pars_fragment" ], - THREE.ShaderChunk[ "envmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "lights_phong_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( vec3 ( 1.0 ), opacity );", - - THREE.ShaderChunk[ "map_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - - THREE.ShaderChunk[ "lights_phong_fragment" ], - - THREE.ShaderChunk[ "lightmap_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "envmap_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - 'particle_basic': { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "particle" ], - THREE.UniformsLib[ "shadowmap" ] - - ] ), - - vertexShader: [ - - "uniform float size;", - "uniform float scale;", - - THREE.ShaderChunk[ "color_pars_vertex" ], - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - THREE.ShaderChunk[ "color_vertex" ], - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - "#ifdef USE_SIZEATTENUATION", - "gl_PointSize = size * ( scale / length( mvPosition.xyz ) );", - "#else", - "gl_PointSize = size;", - "#endif", - - "gl_Position = projectionMatrix * mvPosition;", - - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform vec3 psColor;", - "uniform float opacity;", - - THREE.ShaderChunk[ "color_pars_fragment" ], - THREE.ShaderChunk[ "map_particle_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( psColor, opacity );", - - THREE.ShaderChunk[ "map_particle_fragment" ], - THREE.ShaderChunk[ "alphatest_fragment" ], - THREE.ShaderChunk[ "color_fragment" ], - THREE.ShaderChunk[ "shadowmap_fragment" ], - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n") - - }, - - // Depth encoding into RGBA texture - // based on SpiderGL shadow map example - // http://spidergl.org/example.php?id=6 - // originally from - // http://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD - // see also here: - // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/ - - 'depthRGBA': { - - uniforms: {}, - - vertexShader: [ - - THREE.ShaderChunk[ "morphtarget_pars_vertex" ], - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - THREE.ShaderChunk[ "morphtarget_vertex" ], - THREE.ShaderChunk[ "default_vertex" ], - - "}" - - ].join("\n"), - - fragmentShader: [ - - "vec4 pack_depth( const in float depth ) {", - - "const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );", - "const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );", - "vec4 res = fract( depth * bit_shift );", - "res -= res.xxyz * bit_mask;", - "return res;", - - "}", - - "void main() {", - - "gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );", - - //"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );", - //"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );", - //"gl_FragData[ 0 ] = pack_depth( z );", - //"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );", - - "}" - - ].join("\n") - - } - -};/** - * @author supereggbert / http://www.paulbrunt.co.uk/ - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author szimek / https://github.com/szimek/ - */ - -THREE.WebGLRenderer = function ( parameters ) { - - // constructor parameters - - parameters = parameters || {}; - - var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ), - - _precision = parameters.precision !== undefined ? parameters.precision : 'mediump', - - _alpha = parameters.alpha !== undefined ? parameters.alpha : true, - _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true, - _antialias = parameters.antialias !== undefined ? parameters.antialias : false, - _stencil = parameters.stencil !== undefined ? parameters.stencil : true, - _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false, - - _clearColor = parameters.clearColor !== undefined ? new THREE.Color( parameters.clearColor ) : new THREE.Color( 0x000000 ), - _clearAlpha = parameters.clearAlpha !== undefined ? parameters.clearAlpha : 0, - - _maxLights = parameters.maxLights !== undefined ? parameters.maxLights : 4; - - // public properties - - this.domElement = _canvas; - this.context = null; - - // clearing - - this.autoClear = true; - this.autoClearColor = true; - this.autoClearDepth = true; - this.autoClearStencil = true; - - // scene graph - - this.sortObjects = true; - - this.autoUpdateObjects = true; - this.autoUpdateScene = true; - - // physically based shading - - this.gammaInput = false; - this.gammaOutput = false; - this.physicallyBasedShading = false; - - // shadow map - - this.shadowMapEnabled = false; - this.shadowMapAutoUpdate = true; - this.shadowMapSoft = true; - this.shadowMapCullFrontFaces = true; - - // morphs - - this.maxMorphTargets = 8; - - // flags - - this.autoScaleCubemaps = true; - - // custom render plugins - - this.renderPluginsPre = []; - this.renderPluginsPost = []; - - // info - - this.info = { - - memory: { - - programs: 0, - geometries: 0, - textures: 0 - - }, - - render: { - - calls: 0, - vertices: 0, - faces: 0, - points: 0 - - } - - }; - - // internal properties - - var _this = this, - - _gl, - - _programs = [], - - // internal state cache - - _currentProgram = null, - _currentFramebuffer = null, - _currentMaterialId = -1, - _currentGeometryGroupHash = null, - _currentCamera = null, - _geometryGroupCounter = 0, - - // GL state cache - - _oldDoubleSided = null, - _oldFlipSided = null, - _oldBlending = null, - _oldDepthTest = null, - _oldDepthWrite = null, - _oldPolygonOffset = null, - _oldPolygonOffsetFactor = null, - _oldPolygonOffsetUnits = null, - _oldLineWidth = null, - - _viewportX = 0, - _viewportY = 0, - _viewportWidth = 0, - _viewportHeight = 0, - _currentWidth = 0, - _currentHeight = 0, - - // frustum - - _frustum = new THREE.Frustum(), - - // camera matrices cache - - _projScreenMatrix = new THREE.Matrix4(), - - _vector3 = new THREE.Vector4(), - - // light arrays cache - - _direction = new THREE.Vector3(), - - _lights = { - - ambient: [ 0, 0, 0 ], - directional: { length: 0, colors: new Array(), positions: new Array() }, - point: { length: 0, colors: new Array(), positions: new Array(), distances: new Array() } - - }; - - // initialize - - _gl = initGL(); - - setDefaultGLState(); - - this.context = _gl; - - // GPU capabilities - - var _maxVertexTextures = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ), - _maxTextureSize = _gl.getParameter( _gl.MAX_TEXTURE_SIZE ), - _maxCubemapSize = _gl.getParameter( _gl.MAX_CUBE_MAP_TEXTURE_SIZE ); - - // API - - this.getContext = function () { - - return _gl; - - }; - - this.supportsVertexTextures = function () { - - return _maxVertexTextures > 0; - - }; - - this.setSize = function ( width, height ) { - - _canvas.width = width; - _canvas.height = height; - - this.setViewport( 0, 0, _canvas.width, _canvas.height ); - - }; - - this.setViewport = function ( x, y, width, height ) { - - _viewportX = x; - _viewportY = y; - - _viewportWidth = width; - _viewportHeight = height; - - _gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight ); - - }; - - this.setScissor = function ( x, y, width, height ) { - - _gl.scissor( x, y, width, height ); - - }; - - this.enableScissorTest = function ( enable ) { - - enable ? _gl.enable( _gl.SCISSOR_TEST ) : _gl.disable( _gl.SCISSOR_TEST ); - - }; - - // Clearing - - this.setClearColorHex = function ( hex, alpha ) { - - _clearColor.setHex( hex ); - _clearAlpha = alpha; - - _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); - - }; - - this.setClearColor = function ( color, alpha ) { - - _clearColor.copy( color ); - _clearAlpha = alpha; - - _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); - - }; - - this.getClearColor = function () { - - return _clearColor; - - }; - - this.getClearAlpha = function () { - - return _clearAlpha; - - }; - - this.clear = function ( color, depth, stencil ) { - - var bits = 0; - - if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT; - if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT; - if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT; - - _gl.clear( bits ); - - }; - - this.clearTarget = function ( renderTarget, color, depth, stencil ) { - - this.setRenderTarget( renderTarget ); - this.clear( color, depth, stencil ); - - }; - - // Plugins - - this.addPostPlugin = function ( plugin ) { - - plugin.init( this ); - this.renderPluginsPost.push( plugin ); - - }; - - this.addPrePlugin = function ( plugin ) { - - plugin.init( this ); - this.renderPluginsPre.push( plugin ); - - }; - - // Deallocation - - this.deallocateObject = function ( object ) { - - if ( ! object.__webglInit ) return; - - object.__webglInit = false; - - delete object._modelViewMatrix; - - delete object._normalMatrixArray; - delete object._modelViewMatrixArray; - delete object._objectMatrixArray; - - if ( object instanceof THREE.Mesh ) { - - for ( var g in object.geometry.geometryGroups ) { - - deleteMeshBuffers( object.geometry.geometryGroups[ g ] ); - - } - - } else if ( object instanceof THREE.Ribbon ) { - - deleteRibbonBuffers( object.geometry ); - - } else if ( object instanceof THREE.Line ) { - - deleteLineBuffers( object.geometry ); - - } else if ( object instanceof THREE.ParticleSystem ) { - - deleteParticleBuffers( object.geometry ); - - } - - }; - - this.deallocateTexture = function ( texture ) { - - if ( ! texture.__webglInit ) return; - - texture.__webglInit = false; - _gl.deleteTexture( texture.__webglTexture ); - - _this.info.memory.textures --; - - }; - - // Rendering - - this.updateShadowMap = function ( scene, camera ) { - - _currentProgram = null; - _oldBlending = -1; - _oldDepthTest = -1; - _oldDepthWrite = -1; - _currentGeometryGroupHash = -1; - _currentMaterialId = -1; - - this.shadowMapPlugin.update( scene, camera ); - - }; - - // Internal functions - - // Buffer allocation - - function createParticleBuffers ( geometry ) { - - geometry.__webglVertexBuffer = _gl.createBuffer(); - geometry.__webglColorBuffer = _gl.createBuffer(); - - _this.info.geometries ++; - - }; - - function createLineBuffers ( geometry ) { - - geometry.__webglVertexBuffer = _gl.createBuffer(); - geometry.__webglColorBuffer = _gl.createBuffer(); - - _this.info.memory.geometries ++; - - }; - - function createRibbonBuffers ( geometry ) { - - geometry.__webglVertexBuffer = _gl.createBuffer(); - geometry.__webglColorBuffer = _gl.createBuffer(); - - _this.info.memory.geometries ++; - - }; - - function createMeshBuffers ( geometryGroup ) { - - geometryGroup.__webglVertexBuffer = _gl.createBuffer(); - geometryGroup.__webglNormalBuffer = _gl.createBuffer(); - geometryGroup.__webglTangentBuffer = _gl.createBuffer(); - geometryGroup.__webglColorBuffer = _gl.createBuffer(); - geometryGroup.__webglUVBuffer = _gl.createBuffer(); - geometryGroup.__webglUV2Buffer = _gl.createBuffer(); - - geometryGroup.__webglSkinVertexABuffer = _gl.createBuffer(); - geometryGroup.__webglSkinVertexBBuffer = _gl.createBuffer(); - geometryGroup.__webglSkinIndicesBuffer = _gl.createBuffer(); - geometryGroup.__webglSkinWeightsBuffer = _gl.createBuffer(); - - geometryGroup.__webglFaceBuffer = _gl.createBuffer(); - geometryGroup.__webglLineBuffer = _gl.createBuffer(); - - if ( geometryGroup.numMorphTargets ) { - - var m, ml; - - geometryGroup.__webglMorphTargetsBuffers = []; - - for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) { - - geometryGroup.__webglMorphTargetsBuffers.push( _gl.createBuffer() ); - - } - - } - - _this.info.memory.geometries ++; - - }; - - // Buffer deallocation - - function deleteParticleBuffers ( geometry ) { - - _gl.deleteBuffer( geometry.__webglVertexBuffer ); - _gl.deleteBuffer( geometry.__webglColorBuffer ); - - _this.info.memory.geometries --; - - }; - - function deleteLineBuffers ( geometry ) { - - _gl.deleteBuffer( geometry.__webglVertexBuffer ); - _gl.deleteBuffer( geometry.__webglColorBuffer ); - - _this.info.memory.geometries --; - - }; - - function deleteRibbonBuffers ( geometry ) { - - _gl.deleteBuffer( geometry.__webglVertexBuffer ); - _gl.deleteBuffer( geometry.__webglColorBuffer ); - - _this.info.memory.geometries --; - - }; - - function deleteMeshBuffers ( geometryGroup ) { - - _gl.deleteBuffer( geometryGroup.__webglVertexBuffer ); - _gl.deleteBuffer( geometryGroup.__webglNormalBuffer ); - _gl.deleteBuffer( geometryGroup.__webglTangentBuffer ); - _gl.deleteBuffer( geometryGroup.__webglColorBuffer ); - _gl.deleteBuffer( geometryGroup.__webglUVBuffer ); - _gl.deleteBuffer( geometryGroup.__webglUV2Buffer ); - - _gl.deleteBuffer( geometryGroup.__webglSkinVertexABuffer ); - _gl.deleteBuffer( geometryGroup.__webglSkinVertexBBuffer ); - _gl.deleteBuffer( geometryGroup.__webglSkinIndicesBuffer ); - _gl.deleteBuffer( geometryGroup.__webglSkinWeightsBuffer ); - - _gl.deleteBuffer( geometryGroup.__webglFaceBuffer ); - _gl.deleteBuffer( geometryGroup.__webglLineBuffer ); - - if ( geometryGroup.numMorphTargets ) { - - for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) { - - _gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] ); - - } - - } - - - if ( geometryGroup.__webglCustomAttributesList ) { - - for ( var id in geometryGroup.__webglCustomAttributesList ) { - - _gl.deleteBuffer( geometryGroup.__webglCustomAttributesList[ id ].buffer ); - - } - - } - - _this.info.memory.geometries --; - - }; - - // Buffer initialization - - function initCustomAttributes ( geometry, object ) { - - var nvertices = geometry.vertices.length; - - var material = object.material; - - if ( material.attributes ) { - - if ( geometry.__webglCustomAttributesList === undefined ) { - - geometry.__webglCustomAttributesList = []; - - } - - for ( var a in material.attributes ) { - - var attribute = material.attributes[ a ]; - - if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) { - - attribute.__webglInitialized = true; - - var size = 1; // "f" and "i" - - if ( attribute.type === "v2" ) size = 2; - else if ( attribute.type === "v3" ) size = 3; - else if ( attribute.type === "v4" ) size = 4; - else if ( attribute.type === "c" ) size = 3; - - attribute.size = size; - - attribute.array = new Float32Array( nvertices * size ); - - attribute.buffer = _gl.createBuffer(); - attribute.buffer.belongsToAttribute = a; - - attribute.needsUpdate = true; - - } - - geometry.__webglCustomAttributesList.push( attribute ); - - } - - } - - }; - - function initParticleBuffers ( geometry, object ) { - - var nvertices = geometry.vertices.length; - - geometry.__vertexArray = new Float32Array( nvertices * 3 ); - geometry.__colorArray = new Float32Array( nvertices * 3 ); - - geometry.__sortArray = []; - - geometry.__webglParticleCount = nvertices; - - initCustomAttributes ( geometry, object ); - - }; - - function initLineBuffers ( geometry, object ) { - - var nvertices = geometry.vertices.length; - - geometry.__vertexArray = new Float32Array( nvertices * 3 ); - geometry.__colorArray = new Float32Array( nvertices * 3 ); - - geometry.__webglLineCount = nvertices; - - initCustomAttributes ( geometry, object ); - - }; - - function initRibbonBuffers ( geometry ) { - - var nvertices = geometry.vertices.length; - - geometry.__vertexArray = new Float32Array( nvertices * 3 ); - geometry.__colorArray = new Float32Array( nvertices * 3 ); - - geometry.__webglVertexCount = nvertices; - - }; - - function initMeshBuffers ( geometryGroup, object ) { - - var geometry = object.geometry, - faces3 = geometryGroup.faces3, - faces4 = geometryGroup.faces4, - - nvertices = faces3.length * 3 + faces4.length * 4, - ntris = faces3.length * 1 + faces4.length * 2, - nlines = faces3.length * 3 + faces4.length * 4, - - material = getBufferMaterial( object, geometryGroup ), - - uvType = bufferGuessUVType( material ), - normalType = bufferGuessNormalType( material ), - vertexColorType = bufferGuessVertexColorType( material ); - - //console.log( "uvType", uvType, "normalType", normalType, "vertexColorType", vertexColorType, object, geometryGroup, material ); - - geometryGroup.__vertexArray = new Float32Array( nvertices * 3 ); - - if ( normalType ) { - - geometryGroup.__normalArray = new Float32Array( nvertices * 3 ); - - } - - if ( geometry.hasTangents ) { - - geometryGroup.__tangentArray = new Float32Array( nvertices * 4 ); - - } - - if ( vertexColorType ) { - - geometryGroup.__colorArray = new Float32Array( nvertices * 3 ); - - } - - if ( uvType ) { - - if ( geometry.faceUvs.length > 0 || geometry.faceVertexUvs.length > 0 ) { - - geometryGroup.__uvArray = new Float32Array( nvertices * 2 ); - - } - - if ( geometry.faceUvs.length > 1 || geometry.faceVertexUvs.length > 1 ) { - - geometryGroup.__uv2Array = new Float32Array( nvertices * 2 ); - - } - - } - - if ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) { - - geometryGroup.__skinVertexAArray = new Float32Array( nvertices * 4 ); - geometryGroup.__skinVertexBArray = new Float32Array( nvertices * 4 ); - geometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 ); - geometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 ); - - } - - geometryGroup.__faceArray = new Uint16Array( ntris * 3 ); - geometryGroup.__lineArray = new Uint16Array( nlines * 2 ); - - if ( geometryGroup.numMorphTargets ) { - - geometryGroup.__morphTargetsArrays = []; - - for ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) { - - geometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) ); - - } - - } - - geometryGroup.__webglFaceCount = ntris * 3; - geometryGroup.__webglLineCount = nlines * 2; - - - // custom attributes - - if ( material.attributes ) { - - if ( geometryGroup.__webglCustomAttributesList === undefined ) { - - geometryGroup.__webglCustomAttributesList = []; - - } - - for ( var a in material.attributes ) { - - // Do a shallow copy of the attribute object so different geometryGroup chunks use different - // attribute buffers which are correctly indexed in the setMeshBuffers function - - var originalAttribute = material.attributes[ a ]; - - var attribute = {}; - - for ( var property in originalAttribute ) { - - attribute[ property ] = originalAttribute[ property ]; - - } - - if( !attribute.__webglInitialized || attribute.createUniqueBuffers ) { - - attribute.__webglInitialized = true; - - var size = 1; // "f" and "i" - - if( attribute.type === "v2" ) size = 2; - else if( attribute.type === "v3" ) size = 3; - else if( attribute.type === "v4" ) size = 4; - else if( attribute.type === "c" ) size = 3; - - attribute.size = size; - - attribute.array = new Float32Array( nvertices * size ); - - attribute.buffer = _gl.createBuffer(); - attribute.buffer.belongsToAttribute = a; - - originalAttribute.needsUpdate = true; - attribute.__original = originalAttribute; - - } - - geometryGroup.__webglCustomAttributesList.push( attribute ); - - } - - } - - geometryGroup.__inittedArrays = true; - - }; - - function getBufferMaterial( object, geometryGroup ) { - - if ( object.material && ! ( object.material instanceof THREE.MeshFaceMaterial ) ) { - - return object.material; - - } else if ( geometryGroup.materialIndex >= 0 ) { - - return object.geometry.materials[ geometryGroup.materialIndex ]; - - } - - }; - - function materialNeedsSmoothNormals ( material ) { - - return material && material.shading !== undefined && material.shading === THREE.SmoothShading; - - }; - - function bufferGuessNormalType ( material ) { - - // only MeshBasicMaterial and MeshDepthMaterial don't need normals - - if ( ( material instanceof THREE.MeshBasicMaterial && !material.envMap ) || material instanceof THREE.MeshDepthMaterial ) { - - return false; - - } - - if ( materialNeedsSmoothNormals( material ) ) { - - return THREE.SmoothShading; - - } else { - - return THREE.FlatShading; - - } - - }; - - function bufferGuessVertexColorType ( material ) { - - if ( material.vertexColors ) { - - return material.vertexColors; - - } - - return false; - - }; - - function bufferGuessUVType ( material ) { - - // material must use some texture to require uvs - - if ( material.map || material.lightMap || material instanceof THREE.ShaderMaterial ) { - - return true; - - } - - return false; - - }; - - // Buffer setting - - function setParticleBuffers ( geometry, hint, object ) { - - var v, c, vertex, offset, index, color, - - vertices = geometry.vertices, - vl = vertices.length, - - colors = geometry.colors, - cl = colors.length, - - vertexArray = geometry.__vertexArray, - colorArray = geometry.__colorArray, - - sortArray = geometry.__sortArray, - - dirtyVertices = geometry.__dirtyVertices, - dirtyElements = geometry.__dirtyElements, - dirtyColors = geometry.__dirtyColors, - - customAttributes = geometry.__webglCustomAttributesList, - i, il, - a, ca, cal, value, - customAttribute; - - if ( object.sortParticles ) { - - _projScreenMatrix.multiplySelf( object.matrixWorld ); - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ].position; - - _vector3.copy( vertex ); - _projScreenMatrix.multiplyVector3( _vector3 ); - - sortArray[ v ] = [ _vector3.z, v ]; - - } - - sortArray.sort( function( a, b ) { return b[ 0 ] - a[ 0 ]; } ); - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ sortArray[v][1] ].position; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - for ( c = 0; c < cl; c ++ ) { - - offset = c * 3; - - color = colors[ sortArray[c][1] ]; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( ! ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) ) continue; - - offset = 0; - - cal = customAttribute.value.length; - - if ( customAttribute.size === 1 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - customAttribute.array[ ca ] = customAttribute.value[ index ]; - - } - - } else if ( customAttribute.size === 2 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - - offset += 2; - - } - - } else if ( customAttribute.size === 3 ) { - - if ( customAttribute.type === "c" ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.r; - customAttribute.array[ offset + 1 ] = value.g; - customAttribute.array[ offset + 2 ] = value.b; - - offset += 3; - - } - - } else { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - - offset += 3; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - index = sortArray[ ca ][ 1 ]; - - value = customAttribute.value[ index ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - customAttribute.array[ offset + 3 ] = value.w; - - offset += 4; - - } - - } - - } - - } - - } else { - - if ( dirtyVertices ) { - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ].position; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - } - - if ( dirtyColors ) { - - for ( c = 0; c < cl; c ++ ) { - - color = colors[ c ]; - - offset = c * 3; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( customAttribute.needsUpdate && - ( customAttribute.boundTo === undefined || - customAttribute.boundTo === "vertices") ) { - - cal = customAttribute.value.length; - - offset = 0; - - if ( customAttribute.size === 1 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - customAttribute.array[ ca ] = customAttribute.value[ ca ]; - - } - - } else if ( customAttribute.size === 2 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - - offset += 2; - - } - - } else if ( customAttribute.size === 3 ) { - - if ( customAttribute.type === "c" ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.r; - customAttribute.array[ offset + 1 ] = value.g; - customAttribute.array[ offset + 2 ] = value.b; - - offset += 3; - - } - - } else { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - - offset += 3; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - customAttribute.array[ offset + 3 ] = value.w; - - offset += 4; - - } - - } - - } - - } - - } - - } - - if ( dirtyVertices || object.sortParticles ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyColors || object.sortParticles ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( customAttribute.needsUpdate || object.sortParticles ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint ); - - } - - } - - } - - - }; - - function setLineBuffers ( geometry, hint ) { - - var v, c, vertex, offset, color, - - vertices = geometry.vertices, - colors = geometry.colors, - vl = vertices.length, - cl = colors.length, - - vertexArray = geometry.__vertexArray, - colorArray = geometry.__colorArray, - - dirtyVertices = geometry.__dirtyVertices, - dirtyColors = geometry.__dirtyColors, - - customAttributes = geometry.__webglCustomAttributesList, - - i, il, - a, ca, cal, value, - customAttribute; - - if ( dirtyVertices ) { - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ].position; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyColors ) { - - for ( c = 0; c < cl; c ++ ) { - - color = colors[ c ]; - - offset = c * 3; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( customAttribute.needsUpdate && - ( customAttribute.boundTo === undefined || - customAttribute.boundTo === "vertices" ) ) { - - offset = 0; - - cal = customAttribute.value.length; - - if ( customAttribute.size === 1 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - customAttribute.array[ ca ] = customAttribute.value[ ca ]; - - } - - } else if ( customAttribute.size === 2 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - - offset += 2; - - } - - } else if ( customAttribute.size === 3 ) { - - if ( customAttribute.type === "c" ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.r; - customAttribute.array[ offset + 1 ] = value.g; - customAttribute.array[ offset + 2 ] = value.b; - - offset += 3; - - } - - } else { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - - offset += 3; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - for ( ca = 0; ca < cal; ca ++ ) { - - value = customAttribute.value[ ca ]; - - customAttribute.array[ offset ] = value.x; - customAttribute.array[ offset + 1 ] = value.y; - customAttribute.array[ offset + 2 ] = value.z; - customAttribute.array[ offset + 3 ] = value.w; - - offset += 4; - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint ); - - } - - } - - } - - }; - - function setRibbonBuffers ( geometry, hint ) { - - var v, c, vertex, offset, color, - - vertices = geometry.vertices, - colors = geometry.colors, - vl = vertices.length, - cl = colors.length, - - vertexArray = geometry.__vertexArray, - colorArray = geometry.__colorArray, - - dirtyVertices = geometry.__dirtyVertices, - dirtyColors = geometry.__dirtyColors; - - if ( dirtyVertices ) { - - for ( v = 0; v < vl; v ++ ) { - - vertex = vertices[ v ].position; - - offset = v * 3; - - vertexArray[ offset ] = vertex.x; - vertexArray[ offset + 1 ] = vertex.y; - vertexArray[ offset + 2 ] = vertex.z; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyColors ) { - - for ( c = 0; c < cl; c ++ ) { - - color = colors[ c ]; - - offset = c * 3; - - colorArray[ offset ] = color.r; - colorArray[ offset + 1 ] = color.g; - colorArray[ offset + 2 ] = color.b; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - }; - - function setMeshBuffers( geometryGroup, object, hint, dispose, material ) { - - if ( ! geometryGroup.__inittedArrays ) { - - // console.log( object ); - return; - - } - - var normalType = bufferGuessNormalType( material ), - vertexColorType = bufferGuessVertexColorType( material ), - uvType = bufferGuessUVType( material ), - - needsSmoothNormals = ( normalType === THREE.SmoothShading ); - - var f, fl, fi, face, - vertexNormals, faceNormal, normal, - vertexColors, faceColor, - vertexTangents, - uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, - c1, c2, c3, c4, - sw1, sw2, sw3, sw4, - si1, si2, si3, si4, - sa1, sa2, sa3, sa4, - sb1, sb2, sb3, sb4, - m, ml, i, il, - vn, uvi, uv2i, - vk, vkl, vka, - a, - - vertexIndex = 0, - - offset = 0, - offset_uv = 0, - offset_uv2 = 0, - offset_face = 0, - offset_normal = 0, - offset_tangent = 0, - offset_line = 0, - offset_color = 0, - offset_skin = 0, - offset_morphTarget = 0, - offset_custom = 0, - offset_customSrc = 0, - - value, - - vertexArray = geometryGroup.__vertexArray, - uvArray = geometryGroup.__uvArray, - uv2Array = geometryGroup.__uv2Array, - normalArray = geometryGroup.__normalArray, - tangentArray = geometryGroup.__tangentArray, - colorArray = geometryGroup.__colorArray, - - skinVertexAArray = geometryGroup.__skinVertexAArray, - skinVertexBArray = geometryGroup.__skinVertexBArray, - skinIndexArray = geometryGroup.__skinIndexArray, - skinWeightArray = geometryGroup.__skinWeightArray, - - morphTargetsArrays = geometryGroup.__morphTargetsArrays, - - customAttributes = geometryGroup.__webglCustomAttributesList, - customAttribute, - - faceArray = geometryGroup.__faceArray, - lineArray = geometryGroup.__lineArray, - - geometry = object.geometry, // this is shared for all chunks - - dirtyVertices = geometry.__dirtyVertices, - dirtyElements = geometry.__dirtyElements, - dirtyUvs = geometry.__dirtyUvs, - dirtyNormals = geometry.__dirtyNormals, - dirtyTangents = geometry.__dirtyTangents, - dirtyColors = geometry.__dirtyColors, - dirtyMorphTargets = geometry.__dirtyMorphTargets, - - vertices = geometry.vertices, - chunk_faces3 = geometryGroup.faces3, - chunk_faces4 = geometryGroup.faces4, - obj_faces = geometry.faces, - - obj_uvs = geometry.faceVertexUvs[ 0 ], - obj_uvs2 = geometry.faceVertexUvs[ 1 ], - - obj_colors = geometry.colors, - - obj_skinVerticesA = geometry.skinVerticesA, - obj_skinVerticesB = geometry.skinVerticesB, - obj_skinIndices = geometry.skinIndices, - obj_skinWeights = geometry.skinWeights, - - morphTargets = geometry.morphTargets; - - if ( dirtyVertices ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = vertices[ face.a ].position; - v2 = vertices[ face.b ].position; - v3 = vertices[ face.c ].position; - - vertexArray[ offset ] = v1.x; - vertexArray[ offset + 1 ] = v1.y; - vertexArray[ offset + 2 ] = v1.z; - - vertexArray[ offset + 3 ] = v2.x; - vertexArray[ offset + 4 ] = v2.y; - vertexArray[ offset + 5 ] = v2.z; - - vertexArray[ offset + 6 ] = v3.x; - vertexArray[ offset + 7 ] = v3.y; - vertexArray[ offset + 8 ] = v3.z; - - offset += 9; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - v1 = vertices[ face.a ].position; - v2 = vertices[ face.b ].position; - v3 = vertices[ face.c ].position; - v4 = vertices[ face.d ].position; - - vertexArray[ offset ] = v1.x; - vertexArray[ offset + 1 ] = v1.y; - vertexArray[ offset + 2 ] = v1.z; - - vertexArray[ offset + 3 ] = v2.x; - vertexArray[ offset + 4 ] = v2.y; - vertexArray[ offset + 5 ] = v2.z; - - vertexArray[ offset + 6 ] = v3.x; - vertexArray[ offset + 7 ] = v3.y; - vertexArray[ offset + 8 ] = v3.z; - - vertexArray[ offset + 9 ] = v4.x; - vertexArray[ offset + 10 ] = v4.y; - vertexArray[ offset + 11 ] = v4.z; - - offset += 12; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint ); - - } - - if ( dirtyMorphTargets ) { - - for ( vk = 0, vkl = morphTargets.length; vk < vkl; vk ++ ) { - - offset_morphTarget = 0; - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = morphTargets[ vk ].vertices[ face.a ].position; - v2 = morphTargets[ vk ].vertices[ face.b ].position; - v3 = morphTargets[ vk ].vertices[ face.c ].position; - - vka = morphTargetsArrays[ vk ]; - - vka[ offset_morphTarget ] = v1.x; - vka[ offset_morphTarget + 1 ] = v1.y; - vka[ offset_morphTarget + 2 ] = v1.z; - - vka[ offset_morphTarget + 3 ] = v2.x; - vka[ offset_morphTarget + 4 ] = v2.y; - vka[ offset_morphTarget + 5 ] = v2.z; - - vka[ offset_morphTarget + 6 ] = v3.x; - vka[ offset_morphTarget + 7 ] = v3.y; - vka[ offset_morphTarget + 8 ] = v3.z; - - offset_morphTarget += 9; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - v1 = morphTargets[ vk ].vertices[ face.a ].position; - v2 = morphTargets[ vk ].vertices[ face.b ].position; - v3 = morphTargets[ vk ].vertices[ face.c ].position; - v4 = morphTargets[ vk ].vertices[ face.d ].position; - - vka = morphTargetsArrays[ vk ]; - - vka[ offset_morphTarget ] = v1.x; - vka[ offset_morphTarget + 1 ] = v1.y; - vka[ offset_morphTarget + 2 ] = v1.z; - - vka[ offset_morphTarget + 3 ] = v2.x; - vka[ offset_morphTarget + 4 ] = v2.y; - vka[ offset_morphTarget + 5 ] = v2.z; - - vka[ offset_morphTarget + 6 ] = v3.x; - vka[ offset_morphTarget + 7 ] = v3.y; - vka[ offset_morphTarget + 8 ] = v3.z; - - vka[ offset_morphTarget + 9 ] = v4.x; - vka[ offset_morphTarget + 10 ] = v4.y; - vka[ offset_morphTarget + 11 ] = v4.z; - - offset_morphTarget += 12; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ vk ] ); - _gl.bufferData( _gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint ); - - } - - } - - if ( obj_skinWeights.length ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - // weights - - sw1 = obj_skinWeights[ face.a ]; - sw2 = obj_skinWeights[ face.b ]; - sw3 = obj_skinWeights[ face.c ]; - - skinWeightArray[ offset_skin ] = sw1.x; - skinWeightArray[ offset_skin + 1 ] = sw1.y; - skinWeightArray[ offset_skin + 2 ] = sw1.z; - skinWeightArray[ offset_skin + 3 ] = sw1.w; - - skinWeightArray[ offset_skin + 4 ] = sw2.x; - skinWeightArray[ offset_skin + 5 ] = sw2.y; - skinWeightArray[ offset_skin + 6 ] = sw2.z; - skinWeightArray[ offset_skin + 7 ] = sw2.w; - - skinWeightArray[ offset_skin + 8 ] = sw3.x; - skinWeightArray[ offset_skin + 9 ] = sw3.y; - skinWeightArray[ offset_skin + 10 ] = sw3.z; - skinWeightArray[ offset_skin + 11 ] = sw3.w; - - // indices - - si1 = obj_skinIndices[ face.a ]; - si2 = obj_skinIndices[ face.b ]; - si3 = obj_skinIndices[ face.c ]; - - skinIndexArray[ offset_skin ] = si1.x; - skinIndexArray[ offset_skin + 1 ] = si1.y; - skinIndexArray[ offset_skin + 2 ] = si1.z; - skinIndexArray[ offset_skin + 3 ] = si1.w; - - skinIndexArray[ offset_skin + 4 ] = si2.x; - skinIndexArray[ offset_skin + 5 ] = si2.y; - skinIndexArray[ offset_skin + 6 ] = si2.z; - skinIndexArray[ offset_skin + 7 ] = si2.w; - - skinIndexArray[ offset_skin + 8 ] = si3.x; - skinIndexArray[ offset_skin + 9 ] = si3.y; - skinIndexArray[ offset_skin + 10 ] = si3.z; - skinIndexArray[ offset_skin + 11 ] = si3.w; - - // vertices A - - sa1 = obj_skinVerticesA[ face.a ]; - sa2 = obj_skinVerticesA[ face.b ]; - sa3 = obj_skinVerticesA[ face.c ]; - - skinVertexAArray[ offset_skin ] = sa1.x; - skinVertexAArray[ offset_skin + 1 ] = sa1.y; - skinVertexAArray[ offset_skin + 2 ] = sa1.z; - skinVertexAArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader - - skinVertexAArray[ offset_skin + 4 ] = sa2.x; - skinVertexAArray[ offset_skin + 5 ] = sa2.y; - skinVertexAArray[ offset_skin + 6 ] = sa2.z; - skinVertexAArray[ offset_skin + 7 ] = 1; - - skinVertexAArray[ offset_skin + 8 ] = sa3.x; - skinVertexAArray[ offset_skin + 9 ] = sa3.y; - skinVertexAArray[ offset_skin + 10 ] = sa3.z; - skinVertexAArray[ offset_skin + 11 ] = 1; - - // vertices B - - sb1 = obj_skinVerticesB[ face.a ]; - sb2 = obj_skinVerticesB[ face.b ]; - sb3 = obj_skinVerticesB[ face.c ]; - - skinVertexBArray[ offset_skin ] = sb1.x; - skinVertexBArray[ offset_skin + 1 ] = sb1.y; - skinVertexBArray[ offset_skin + 2 ] = sb1.z; - skinVertexBArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader - - skinVertexBArray[ offset_skin + 4 ] = sb2.x; - skinVertexBArray[ offset_skin + 5 ] = sb2.y; - skinVertexBArray[ offset_skin + 6 ] = sb2.z; - skinVertexBArray[ offset_skin + 7 ] = 1; - - skinVertexBArray[ offset_skin + 8 ] = sb3.x; - skinVertexBArray[ offset_skin + 9 ] = sb3.y; - skinVertexBArray[ offset_skin + 10 ] = sb3.z; - skinVertexBArray[ offset_skin + 11 ] = 1; - - offset_skin += 12; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - // weights - - sw1 = obj_skinWeights[ face.a ]; - sw2 = obj_skinWeights[ face.b ]; - sw3 = obj_skinWeights[ face.c ]; - sw4 = obj_skinWeights[ face.d ]; - - skinWeightArray[ offset_skin ] = sw1.x; - skinWeightArray[ offset_skin + 1 ] = sw1.y; - skinWeightArray[ offset_skin + 2 ] = sw1.z; - skinWeightArray[ offset_skin + 3 ] = sw1.w; - - skinWeightArray[ offset_skin + 4 ] = sw2.x; - skinWeightArray[ offset_skin + 5 ] = sw2.y; - skinWeightArray[ offset_skin + 6 ] = sw2.z; - skinWeightArray[ offset_skin + 7 ] = sw2.w; - - skinWeightArray[ offset_skin + 8 ] = sw3.x; - skinWeightArray[ offset_skin + 9 ] = sw3.y; - skinWeightArray[ offset_skin + 10 ] = sw3.z; - skinWeightArray[ offset_skin + 11 ] = sw3.w; - - skinWeightArray[ offset_skin + 12 ] = sw4.x; - skinWeightArray[ offset_skin + 13 ] = sw4.y; - skinWeightArray[ offset_skin + 14 ] = sw4.z; - skinWeightArray[ offset_skin + 15 ] = sw4.w; - - // indices - - si1 = obj_skinIndices[ face.a ]; - si2 = obj_skinIndices[ face.b ]; - si3 = obj_skinIndices[ face.c ]; - si4 = obj_skinIndices[ face.d ]; - - skinIndexArray[ offset_skin ] = si1.x; - skinIndexArray[ offset_skin + 1 ] = si1.y; - skinIndexArray[ offset_skin + 2 ] = si1.z; - skinIndexArray[ offset_skin + 3 ] = si1.w; - - skinIndexArray[ offset_skin + 4 ] = si2.x; - skinIndexArray[ offset_skin + 5 ] = si2.y; - skinIndexArray[ offset_skin + 6 ] = si2.z; - skinIndexArray[ offset_skin + 7 ] = si2.w; - - skinIndexArray[ offset_skin + 8 ] = si3.x; - skinIndexArray[ offset_skin + 9 ] = si3.y; - skinIndexArray[ offset_skin + 10 ] = si3.z; - skinIndexArray[ offset_skin + 11 ] = si3.w; - - skinIndexArray[ offset_skin + 12 ] = si4.x; - skinIndexArray[ offset_skin + 13 ] = si4.y; - skinIndexArray[ offset_skin + 14 ] = si4.z; - skinIndexArray[ offset_skin + 15 ] = si4.w; - - // vertices A - - sa1 = obj_skinVerticesA[ face.a ]; - sa2 = obj_skinVerticesA[ face.b ]; - sa3 = obj_skinVerticesA[ face.c ]; - sa4 = obj_skinVerticesA[ face.d ]; - - skinVertexAArray[ offset_skin ] = sa1.x; - skinVertexAArray[ offset_skin + 1 ] = sa1.y; - skinVertexAArray[ offset_skin + 2 ] = sa1.z; - skinVertexAArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader - - skinVertexAArray[ offset_skin + 4 ] = sa2.x; - skinVertexAArray[ offset_skin + 5 ] = sa2.y; - skinVertexAArray[ offset_skin + 6 ] = sa2.z; - skinVertexAArray[ offset_skin + 7 ] = 1; - - skinVertexAArray[ offset_skin + 8 ] = sa3.x; - skinVertexAArray[ offset_skin + 9 ] = sa3.y; - skinVertexAArray[ offset_skin + 10 ] = sa3.z; - skinVertexAArray[ offset_skin + 11 ] = 1; - - skinVertexAArray[ offset_skin + 12 ] = sa4.x; - skinVertexAArray[ offset_skin + 13 ] = sa4.y; - skinVertexAArray[ offset_skin + 14 ] = sa4.z; - skinVertexAArray[ offset_skin + 15 ] = 1; - - // vertices B - - sb1 = obj_skinVerticesB[ face.a ]; - sb2 = obj_skinVerticesB[ face.b ]; - sb3 = obj_skinVerticesB[ face.c ]; - sb4 = obj_skinVerticesB[ face.d ]; - - skinVertexBArray[ offset_skin ] = sb1.x; - skinVertexBArray[ offset_skin + 1 ] = sb1.y; - skinVertexBArray[ offset_skin + 2 ] = sb1.z; - skinVertexBArray[ offset_skin + 3 ] = 1; // pad for faster vertex shader - - skinVertexBArray[ offset_skin + 4 ] = sb2.x; - skinVertexBArray[ offset_skin + 5 ] = sb2.y; - skinVertexBArray[ offset_skin + 6 ] = sb2.z; - skinVertexBArray[ offset_skin + 7 ] = 1; - - skinVertexBArray[ offset_skin + 8 ] = sb3.x; - skinVertexBArray[ offset_skin + 9 ] = sb3.y; - skinVertexBArray[ offset_skin + 10 ] = sb3.z; - skinVertexBArray[ offset_skin + 11 ] = 1; - - skinVertexBArray[ offset_skin + 12 ] = sb4.x; - skinVertexBArray[ offset_skin + 13 ] = sb4.y; - skinVertexBArray[ offset_skin + 14 ] = sb4.z; - skinVertexBArray[ offset_skin + 15 ] = 1; - - offset_skin += 16; - - } - - if ( offset_skin > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinVertexABuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, skinVertexAArray, hint ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinVertexBBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, skinVertexBArray, hint ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, skinIndexArray, hint ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, skinWeightArray, hint ); - - } - - } - - if ( dirtyColors && vertexColorType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - vertexColors = face.vertexColors; - faceColor = face.color; - - if ( vertexColors.length === 3 && vertexColorType === THREE.VertexColors ) { - - c1 = vertexColors[ 0 ]; - c2 = vertexColors[ 1 ]; - c3 = vertexColors[ 2 ]; - - } else { - - c1 = faceColor; - c2 = faceColor; - c3 = faceColor; - - } - - colorArray[ offset_color ] = c1.r; - colorArray[ offset_color + 1 ] = c1.g; - colorArray[ offset_color + 2 ] = c1.b; - - colorArray[ offset_color + 3 ] = c2.r; - colorArray[ offset_color + 4 ] = c2.g; - colorArray[ offset_color + 5 ] = c2.b; - - colorArray[ offset_color + 6 ] = c3.r; - colorArray[ offset_color + 7 ] = c3.g; - colorArray[ offset_color + 8 ] = c3.b; - - offset_color += 9; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - vertexColors = face.vertexColors; - faceColor = face.color; - - if ( vertexColors.length === 4 && vertexColorType === THREE.VertexColors ) { - - c1 = vertexColors[ 0 ]; - c2 = vertexColors[ 1 ]; - c3 = vertexColors[ 2 ]; - c4 = vertexColors[ 3 ]; - - } else { - - c1 = faceColor; - c2 = faceColor; - c3 = faceColor; - c4 = faceColor; - - } - - colorArray[ offset_color ] = c1.r; - colorArray[ offset_color + 1 ] = c1.g; - colorArray[ offset_color + 2 ] = c1.b; - - colorArray[ offset_color + 3 ] = c2.r; - colorArray[ offset_color + 4 ] = c2.g; - colorArray[ offset_color + 5 ] = c2.b; - - colorArray[ offset_color + 6 ] = c3.r; - colorArray[ offset_color + 7 ] = c3.g; - colorArray[ offset_color + 8 ] = c3.b; - - colorArray[ offset_color + 9 ] = c4.r; - colorArray[ offset_color + 10 ] = c4.g; - colorArray[ offset_color + 11 ] = c4.b; - - offset_color += 12; - - } - - if ( offset_color > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint ); - - } - - } - - if ( dirtyTangents && geometry.hasTangents ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - vertexTangents = face.vertexTangents; - - t1 = vertexTangents[ 0 ]; - t2 = vertexTangents[ 1 ]; - t3 = vertexTangents[ 2 ]; - - tangentArray[ offset_tangent ] = t1.x; - tangentArray[ offset_tangent + 1 ] = t1.y; - tangentArray[ offset_tangent + 2 ] = t1.z; - tangentArray[ offset_tangent + 3 ] = t1.w; - - tangentArray[ offset_tangent + 4 ] = t2.x; - tangentArray[ offset_tangent + 5 ] = t2.y; - tangentArray[ offset_tangent + 6 ] = t2.z; - tangentArray[ offset_tangent + 7 ] = t2.w; - - tangentArray[ offset_tangent + 8 ] = t3.x; - tangentArray[ offset_tangent + 9 ] = t3.y; - tangentArray[ offset_tangent + 10 ] = t3.z; - tangentArray[ offset_tangent + 11 ] = t3.w; - - offset_tangent += 12; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - vertexTangents = face.vertexTangents; - - t1 = vertexTangents[ 0 ]; - t2 = vertexTangents[ 1 ]; - t3 = vertexTangents[ 2 ]; - t4 = vertexTangents[ 3 ]; - - tangentArray[ offset_tangent ] = t1.x; - tangentArray[ offset_tangent + 1 ] = t1.y; - tangentArray[ offset_tangent + 2 ] = t1.z; - tangentArray[ offset_tangent + 3 ] = t1.w; - - tangentArray[ offset_tangent + 4 ] = t2.x; - tangentArray[ offset_tangent + 5 ] = t2.y; - tangentArray[ offset_tangent + 6 ] = t2.z; - tangentArray[ offset_tangent + 7 ] = t2.w; - - tangentArray[ offset_tangent + 8 ] = t3.x; - tangentArray[ offset_tangent + 9 ] = t3.y; - tangentArray[ offset_tangent + 10 ] = t3.z; - tangentArray[ offset_tangent + 11 ] = t3.w; - - tangentArray[ offset_tangent + 12 ] = t4.x; - tangentArray[ offset_tangent + 13 ] = t4.y; - tangentArray[ offset_tangent + 14 ] = t4.z; - tangentArray[ offset_tangent + 15 ] = t4.w; - - offset_tangent += 16; - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint ); - - } - - if ( dirtyNormals && normalType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - vertexNormals = face.vertexNormals; - faceNormal = face.normal; - - if ( vertexNormals.length === 3 && needsSmoothNormals ) { - - for ( i = 0; i < 3; i ++ ) { - - vn = vertexNormals[ i ]; - - normalArray[ offset_normal ] = vn.x; - normalArray[ offset_normal + 1 ] = vn.y; - normalArray[ offset_normal + 2 ] = vn.z; - - offset_normal += 3; - - } - - } else { - - for ( i = 0; i < 3; i ++ ) { - - normalArray[ offset_normal ] = faceNormal.x; - normalArray[ offset_normal + 1 ] = faceNormal.y; - normalArray[ offset_normal + 2 ] = faceNormal.z; - - offset_normal += 3; - - } - - } - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - vertexNormals = face.vertexNormals; - faceNormal = face.normal; - - if ( vertexNormals.length === 4 && needsSmoothNormals ) { - - for ( i = 0; i < 4; i ++ ) { - - vn = vertexNormals[ i ]; - - normalArray[ offset_normal ] = vn.x; - normalArray[ offset_normal + 1 ] = vn.y; - normalArray[ offset_normal + 2 ] = vn.z; - - offset_normal += 3; - - } - - } else { - - for ( i = 0; i < 4; i ++ ) { - - normalArray[ offset_normal ] = faceNormal.x; - normalArray[ offset_normal + 1 ] = faceNormal.y; - normalArray[ offset_normal + 2 ] = faceNormal.z; - - offset_normal += 3; - - } - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint ); - - } - - if ( dirtyUvs && obj_uvs && uvType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - fi = chunk_faces3[ f ]; - - face = obj_faces[ fi ]; - uv = obj_uvs[ fi ]; - - if ( uv === undefined ) continue; - - for ( i = 0; i < 3; i ++ ) { - - uvi = uv[ i ]; - - uvArray[ offset_uv ] = uvi.u; - uvArray[ offset_uv + 1 ] = uvi.v; - - offset_uv += 2; - - } - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - fi = chunk_faces4[ f ]; - - face = obj_faces[ fi ]; - uv = obj_uvs[ fi ]; - - if ( uv === undefined ) continue; - - for ( i = 0; i < 4; i ++ ) { - - uvi = uv[ i ]; - - uvArray[ offset_uv ] = uvi.u; - uvArray[ offset_uv + 1 ] = uvi.v; - - offset_uv += 2; - - } - - } - - if ( offset_uv > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint ); - - } - - } - - if ( dirtyUvs && obj_uvs2 && uvType ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - fi = chunk_faces3[ f ]; - - face = obj_faces[ fi ]; - uv2 = obj_uvs2[ fi ]; - - if ( uv2 === undefined ) continue; - - for ( i = 0; i < 3; i ++ ) { - - uv2i = uv2[ i ]; - - uv2Array[ offset_uv2 ] = uv2i.u; - uv2Array[ offset_uv2 + 1 ] = uv2i.v; - - offset_uv2 += 2; - - } - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - fi = chunk_faces4[ f ]; - - face = obj_faces[ fi ]; - uv2 = obj_uvs2[ fi ]; - - if ( uv2 === undefined ) continue; - - for ( i = 0; i < 4; i ++ ) { - - uv2i = uv2[ i ]; - - uv2Array[ offset_uv2 ] = uv2i.u; - uv2Array[ offset_uv2 + 1 ] = uv2i.v; - - offset_uv2 += 2; - - } - - } - - if ( offset_uv2 > 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, uv2Array, hint ); - - } - - } - - if ( dirtyElements ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - faceArray[ offset_face ] = vertexIndex; - faceArray[ offset_face + 1 ] = vertexIndex + 1; - faceArray[ offset_face + 2 ] = vertexIndex + 2; - - offset_face += 3; - - lineArray[ offset_line ] = vertexIndex; - lineArray[ offset_line + 1 ] = vertexIndex + 1; - - lineArray[ offset_line + 2 ] = vertexIndex; - lineArray[ offset_line + 3 ] = vertexIndex + 2; - - lineArray[ offset_line + 4 ] = vertexIndex + 1; - lineArray[ offset_line + 5 ] = vertexIndex + 2; - - offset_line += 6; - - vertexIndex += 3; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - faceArray[ offset_face ] = vertexIndex; - faceArray[ offset_face + 1 ] = vertexIndex + 1; - faceArray[ offset_face + 2 ] = vertexIndex + 3; - - faceArray[ offset_face + 3 ] = vertexIndex + 1; - faceArray[ offset_face + 4 ] = vertexIndex + 2; - faceArray[ offset_face + 5 ] = vertexIndex + 3; - - offset_face += 6; - - lineArray[ offset_line ] = vertexIndex; - lineArray[ offset_line + 1 ] = vertexIndex + 1; - - lineArray[ offset_line + 2 ] = vertexIndex; - lineArray[ offset_line + 3 ] = vertexIndex + 3; - - lineArray[ offset_line + 4 ] = vertexIndex + 1; - lineArray[ offset_line + 5 ] = vertexIndex + 2; - - lineArray[ offset_line + 6 ] = vertexIndex + 2; - lineArray[ offset_line + 7 ] = vertexIndex + 3; - - offset_line += 8; - - vertexIndex += 4; - - } - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint ); - - } - - if ( customAttributes ) { - - for ( i = 0, il = customAttributes.length; i < il; i ++ ) { - - customAttribute = customAttributes[ i ]; - - if ( ! customAttribute.__original.needsUpdate ) continue; - - offset_custom = 0; - offset_customSrc = 0; - - if ( customAttribute.size === 1 ) { - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - customAttribute.array[ offset_custom ] = customAttribute.value[ face.a ]; - customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ]; - customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ]; - - offset_custom += 3; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - customAttribute.array[ offset_custom ] = customAttribute.value[ face.a ]; - customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ]; - customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ]; - customAttribute.array[ offset_custom + 3 ] = customAttribute.value[ face.d ]; - - offset_custom += 4; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - customAttribute.array[ offset_custom ] = value; - customAttribute.array[ offset_custom + 1 ] = value; - customAttribute.array[ offset_custom + 2 ] = value; - - offset_custom += 3; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces4[ f ] ]; - - customAttribute.array[ offset_custom ] = value; - customAttribute.array[ offset_custom + 1 ] = value; - customAttribute.array[ offset_custom + 2 ] = value; - customAttribute.array[ offset_custom + 3 ] = value; - - offset_custom += 4; - - } - - } - - } else if ( customAttribute.size === 2 ) { - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - - customAttribute.array[ offset_custom + 2 ] = v2.x; - customAttribute.array[ offset_custom + 3 ] = v2.y; - - customAttribute.array[ offset_custom + 4 ] = v3.x; - customAttribute.array[ offset_custom + 5 ] = v3.y; - - offset_custom += 6; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - v4 = customAttribute.value[ face.d ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - - customAttribute.array[ offset_custom + 2 ] = v2.x; - customAttribute.array[ offset_custom + 3 ] = v2.y; - - customAttribute.array[ offset_custom + 4 ] = v3.x; - customAttribute.array[ offset_custom + 5 ] = v3.y; - - customAttribute.array[ offset_custom + 6 ] = v4.x; - customAttribute.array[ offset_custom + 7 ] = v4.y; - - offset_custom += 8; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - - customAttribute.array[ offset_custom + 2 ] = v2.x; - customAttribute.array[ offset_custom + 3 ] = v2.y; - - customAttribute.array[ offset_custom + 4 ] = v3.x; - customAttribute.array[ offset_custom + 5 ] = v3.y; - - offset_custom += 6; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces4[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - v4 = value; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - - customAttribute.array[ offset_custom + 2 ] = v2.x; - customAttribute.array[ offset_custom + 3 ] = v2.y; - - customAttribute.array[ offset_custom + 4 ] = v3.x; - customAttribute.array[ offset_custom + 5 ] = v3.y; - - customAttribute.array[ offset_custom + 6 ] = v4.x; - customAttribute.array[ offset_custom + 7 ] = v4.y; - - offset_custom += 8; - - } - - } - - } else if ( customAttribute.size === 3 ) { - - var pp; - - if ( customAttribute.type === "c" ) { - - pp = [ "r", "g", "b" ]; - - } else { - - pp = [ "x", "y", "z" ]; - - } - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - offset_custom += 9; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - v4 = customAttribute.value[ face.d ]; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 9 ] = v4[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ]; - - offset_custom += 12; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - offset_custom += 9; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces4[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - v4 = value; - - customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ]; - - customAttribute.array[ offset_custom + 9 ] = v4[ pp[ 0 ] ]; - customAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ]; - customAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ]; - - offset_custom += 12; - - } - - } - - } else if ( customAttribute.size === 4 ) { - - if ( customAttribute.boundTo === undefined || customAttribute.boundTo === "vertices" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces3[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - offset_custom += 12; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - face = obj_faces[ chunk_faces4[ f ] ]; - - v1 = customAttribute.value[ face.a ]; - v2 = customAttribute.value[ face.b ]; - v3 = customAttribute.value[ face.c ]; - v4 = customAttribute.value[ face.d ]; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - customAttribute.array[ offset_custom + 12 ] = v4.x; - customAttribute.array[ offset_custom + 13 ] = v4.y; - customAttribute.array[ offset_custom + 14 ] = v4.z; - customAttribute.array[ offset_custom + 15 ] = v4.w; - - offset_custom += 16; - - } - - } else if ( customAttribute.boundTo === "faces" ) { - - for ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces3[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - offset_custom += 12; - - } - - for ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) { - - value = customAttribute.value[ chunk_faces4[ f ] ]; - - v1 = value; - v2 = value; - v3 = value; - v4 = value; - - customAttribute.array[ offset_custom ] = v1.x; - customAttribute.array[ offset_custom + 1 ] = v1.y; - customAttribute.array[ offset_custom + 2 ] = v1.z; - customAttribute.array[ offset_custom + 3 ] = v1.w; - - customAttribute.array[ offset_custom + 4 ] = v2.x; - customAttribute.array[ offset_custom + 5 ] = v2.y; - customAttribute.array[ offset_custom + 6 ] = v2.z; - customAttribute.array[ offset_custom + 7 ] = v2.w; - - customAttribute.array[ offset_custom + 8 ] = v3.x; - customAttribute.array[ offset_custom + 9 ] = v3.y; - customAttribute.array[ offset_custom + 10 ] = v3.z; - customAttribute.array[ offset_custom + 11 ] = v3.w; - - customAttribute.array[ offset_custom + 12 ] = v4.x; - customAttribute.array[ offset_custom + 13 ] = v4.y; - customAttribute.array[ offset_custom + 14 ] = v4.z; - customAttribute.array[ offset_custom + 15 ] = v4.w; - - offset_custom += 16; - - } - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint ); - - } - - } - - if ( dispose ) { - - delete geometryGroup.__inittedArrays; - delete geometryGroup.__colorArray; - delete geometryGroup.__normalArray; - delete geometryGroup.__tangentArray; - delete geometryGroup.__uvArray; - delete geometryGroup.__uv2Array; - delete geometryGroup.__faceArray; - delete geometryGroup.__vertexArray; - delete geometryGroup.__lineArray; - delete geometryGroup.__skinVertexAArray; - delete geometryGroup.__skinVertexBArray; - delete geometryGroup.__skinIndexArray; - delete geometryGroup.__skinWeightArray; - - } - - }; - - // Buffer rendering - - this.renderBufferImmediate = function ( object, program, shading ) { - - if ( ! object.__webglVertexBuffer ) object.__webglVertexBuffer = _gl.createBuffer(); - if ( ! object.__webglNormalBuffer ) object.__webglNormalBuffer = _gl.createBuffer(); - - if ( object.hasPos ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglVertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW ); - _gl.enableVertexAttribArray( program.attributes.position ); - _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( object.hasNormal ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglNormalBuffer ); - - if ( shading === THREE.FlatShading ) { - - var nx, ny, nz, - nax, nbx, ncx, nay, nby, ncy, naz, nbz, ncz, - normalArray, - i, il = object.count * 3; - - for( i = 0; i < il; i += 9 ) { - - normalArray = object.normalArray; - - nax = normalArray[ i ]; - nay = normalArray[ i + 1 ]; - naz = normalArray[ i + 2 ]; - - nbx = normalArray[ i + 3 ]; - nby = normalArray[ i + 4 ]; - nbz = normalArray[ i + 5 ]; - - ncx = normalArray[ i + 6 ]; - ncy = normalArray[ i + 7 ]; - ncz = normalArray[ i + 8 ]; - - nx = ( nax + nbx + ncx ) / 3; - ny = ( nay + nby + ncy ) / 3; - nz = ( naz + nbz + ncz ) / 3; - - normalArray[ i ] = nx; - normalArray[ i + 1 ] = ny; - normalArray[ i + 2 ] = nz; - - normalArray[ i + 3 ] = nx; - normalArray[ i + 4 ] = ny; - normalArray[ i + 5 ] = nz; - - normalArray[ i + 6 ] = nx; - normalArray[ i + 7 ] = ny; - normalArray[ i + 8 ] = nz; - - } - - } - - _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW ); - _gl.enableVertexAttribArray( program.attributes.normal ); - _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); - - } - - _gl.drawArrays( _gl.TRIANGLES, 0, object.count ); - - object.count = 0; - - }; - - this.renderBufferDirect = function ( camera, lights, fog, material, geometryGroup, object ) { - - if ( material.opacity === 0 ) return; - - var program, attributes, linewidth, primitives, a, attribute; - - program = setProgram( camera, lights, fog, material, object ); - - attributes = program.attributes; - - var updateBuffers = false, - wireframeBit = material.wireframe ? 1 : 0, - geometryGroupHash = ( geometryGroup.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit; - - if ( geometryGroupHash !== _currentGeometryGroupHash ) { - - _currentGeometryGroupHash = geometryGroupHash; - updateBuffers = true; - - } - - // render mesh - - if ( object instanceof THREE.Mesh ) { - - var offsets = geometryGroup.offsets; - - for ( var i = 0, il = offsets.length; i < il; ++ i ) { - - if ( updateBuffers ) { - - // vertices - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.vertexPositionBuffer ); - _gl.vertexAttribPointer( attributes.position, geometryGroup.vertexPositionBuffer.itemSize, _gl.FLOAT, false, 0, offsets[ i ].index * 4 * 3 ); - - // normals - - if ( attributes.normal >= 0 && geometryGroup.vertexNormalBuffer ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.vertexNormalBuffer ); - _gl.vertexAttribPointer( attributes.normal, geometryGroup.vertexNormalBuffer.itemSize, _gl.FLOAT, false, 0, offsets[ i ].index * 4 * 3 ); - - } - - // uvs - - if ( attributes.uv >= 0 && geometryGroup.vertexUvBuffer ) { - - if ( geometryGroup.vertexUvBuffer ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.vertexUvBuffer ); - _gl.vertexAttribPointer( attributes.uv, geometryGroup.vertexUvBuffer.itemSize, _gl.FLOAT, false, 0, offsets[ i ].index * 4 * 2 ); - - _gl.enableVertexAttribArray( attributes.uv ); - - } else { - - _gl.disableVertexAttribArray( attributes.uv ); - - } - - } - - // colors - - if ( attributes.color >= 0 && geometryGroup.vertexColorBuffer ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.vertexColorBuffer ); - _gl.vertexAttribPointer( attributes.color, geometryGroup.vertexColorBuffer.itemSize, _gl.FLOAT, false, 0, offsets[ i ].index * 4 * 4 ); - - - } - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.vertexIndexBuffer ); - - } - - // render indexed triangles - - _gl.drawElements( _gl.TRIANGLES, offsets[ i ].count, _gl.UNSIGNED_SHORT, offsets[ i ].start * 2 ); // 2 = Uint16 - - _this.info.render.calls ++; - _this.info.render.vertices += offsets[ i ].count; // not really true, here vertices can be shared - _this.info.render.faces += offsets[ i ].count / 3; - - } - - } - - }; - - this.renderBuffer = function ( camera, lights, fog, material, geometryGroup, object ) { - - if ( material.opacity === 0 ) return; - - var program, attributes, linewidth, primitives, a, attribute, i, il; - - program = setProgram( camera, lights, fog, material, object ); - - attributes = program.attributes; - - var updateBuffers = false, - wireframeBit = material.wireframe ? 1 : 0, - geometryGroupHash = ( geometryGroup.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit; - - if ( geometryGroupHash !== _currentGeometryGroupHash ) { - - _currentGeometryGroupHash = geometryGroupHash; - updateBuffers = true; - - } - - // vertices - - if ( !material.morphTargets && attributes.position >= 0 ) { - - if ( updateBuffers ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer ); - _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } - - } else { - - if ( object.morphTargetBase ) { - - setupMorphTargets( material, geometryGroup, object ); - - } - - } - - - if ( updateBuffers ) { - - // custom attributes - - // Use the per-geometryGroup custom attribute arrays which are setup in initMeshBuffers - - if ( geometryGroup.__webglCustomAttributesList ) { - - for ( i = 0, il = geometryGroup.__webglCustomAttributesList.length; i < il; i ++ ) { - - attribute = geometryGroup.__webglCustomAttributesList[ i ]; - - if( attributes[ attribute.buffer.belongsToAttribute ] >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, attribute.buffer ); - _gl.vertexAttribPointer( attributes[ attribute.buffer.belongsToAttribute ], attribute.size, _gl.FLOAT, false, 0, 0 ); - - } - - } - - } - - - // colors - - if ( attributes.color >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer ); - _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 ); - - } - - // normals - - if ( attributes.normal >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer ); - _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 ); - - } - - // tangents - - if ( attributes.tangent >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer ); - _gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 ); - - } - - // uvs - - if ( attributes.uv >= 0 ) { - - if ( geometryGroup.__webglUVBuffer ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer ); - _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); - - _gl.enableVertexAttribArray( attributes.uv ); - - } else { - - _gl.disableVertexAttribArray( attributes.uv ); - - } - - } - - if ( attributes.uv2 >= 0 ) { - - if ( geometryGroup.__webglUV2Buffer ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer ); - _gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 ); - - _gl.enableVertexAttribArray( attributes.uv2 ); - - } else { - - _gl.disableVertexAttribArray( attributes.uv2 ); - - } - - } - - if ( material.skinning && - attributes.skinVertexA >= 0 && attributes.skinVertexB >= 0 && - attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinVertexABuffer ); - _gl.vertexAttribPointer( attributes.skinVertexA, 4, _gl.FLOAT, false, 0, 0 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinVertexBBuffer ); - _gl.vertexAttribPointer( attributes.skinVertexB, 4, _gl.FLOAT, false, 0, 0 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer ); - _gl.vertexAttribPointer( attributes.skinIndex, 4, _gl.FLOAT, false, 0, 0 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer ); - _gl.vertexAttribPointer( attributes.skinWeight, 4, _gl.FLOAT, false, 0, 0 ); - - } - - } - - // render mesh - - if ( object instanceof THREE.Mesh ) { - - // wireframe - - if ( material.wireframe ) { - - setLineWidth( material.wireframeLinewidth ); - - if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer ); - _gl.drawElements( _gl.LINES, geometryGroup.__webglLineCount, _gl.UNSIGNED_SHORT, 0 ); - - // triangles - - } else { - - if ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer ); - _gl.drawElements( _gl.TRIANGLES, geometryGroup.__webglFaceCount, _gl.UNSIGNED_SHORT, 0 ); - - } - - _this.info.render.calls ++; - _this.info.render.vertices += geometryGroup.__webglFaceCount; - _this.info.render.faces += geometryGroup.__webglFaceCount / 3; - - // render lines - - } else if ( object instanceof THREE.Line ) { - - primitives = ( object.type === THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES; - - setLineWidth( material.linewidth ); - - _gl.drawArrays( primitives, 0, geometryGroup.__webglLineCount ); - - _this.info.render.calls ++; - - // render particles - - } else if ( object instanceof THREE.ParticleSystem ) { - - _gl.drawArrays( _gl.POINTS, 0, geometryGroup.__webglParticleCount ); - - _this.info.render.calls ++; - _this.info.render.points += geometryGroup.__webglParticleCount; - - // render ribbon - - } else if ( object instanceof THREE.Ribbon ) { - - _gl.drawArrays( _gl.TRIANGLE_STRIP, 0, geometryGroup.__webglVertexCount ); - - _this.info.render.calls ++; - - } - - }; - - function setupMorphTargets ( material, geometryGroup, object ) { - - // set base - - var attributes = material.program.attributes; - - if ( object.morphTargetBase !== - 1 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ object.morphTargetBase ] ); - _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } else if ( attributes.position >= 0 ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer ); - _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 ); - - } - - if ( object.morphTargetForcedOrder.length ) { - - // set forced order - - var m = 0; - var order = object.morphTargetForcedOrder; - var influences = object.morphTargetInfluences; - - while ( m < material.numSupportedMorphTargets && m < order.length ) { - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ order[ m ] ] ); - _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - object.__webglMorphTargetInfluences[ m ] = influences[ order[ m ] ]; - - m ++; - } - - } else { - - // find most influencing - - var used = []; - var candidateInfluence = - 1; - var candidate = 0; - var influences = object.morphTargetInfluences; - var i, il = influences.length; - var m = 0; - - if ( object.morphTargetBase !== - 1 ) { - - used[ object.morphTargetBase ] = true; - - } - - while ( m < material.numSupportedMorphTargets ) { - - for ( i = 0; i < il; i ++ ) { - - if ( !used[ i ] && influences[ i ] > candidateInfluence ) { - - candidate = i; - candidateInfluence = influences[ candidate ]; - - } - - } - - _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ candidate ] ); - _gl.vertexAttribPointer( attributes[ "morphTarget" + m ], 3, _gl.FLOAT, false, 0, 0 ); - - object.__webglMorphTargetInfluences[ m ] = candidateInfluence; - - used[ candidate ] = 1; - candidateInfluence = -1; - m ++; - - } - - } - - // load updated influences uniform - - if( material.program.uniforms.morphTargetInfluences !== null ) { - - _gl.uniform1fv( material.program.uniforms.morphTargetInfluences, object.__webglMorphTargetInfluences ); - - } - - }; - - - function painterSort ( a, b ) { - - return b.z - a.z; - - }; - - // Rendering - - this.render = function ( scene, camera, renderTarget, forceClear ) { - - var i, il, - - program, material, - webglObject, object, - renderList, - - lights = scene.lights, - fog = scene.fog; - - _currentMaterialId = -1; - - if ( this.autoUpdateObjects ) this.initWebGLObjects( scene ); - - if ( camera.parent === undefined ) { - - console.warn( 'DEPRECATED: Camera hasn\'t been added to a Scene. Adding it...' ); - scene.add( camera ); - - } - - if ( this.autoUpdateScene ) scene.updateMatrixWorld(); - - // custom render plugins (pre pass) - - renderPlugins( this.renderPluginsPre, scene, camera ); - - _this.info.render.calls = 0; - _this.info.render.vertices = 0; - _this.info.render.faces = 0; - _this.info.render.points = 0; - - camera.matrixWorldInverse.getInverse( camera.matrixWorld ); - - if ( ! camera._viewMatrixArray ) camera._viewMatrixArray = new Float32Array( 16 ); - camera.matrixWorldInverse.flattenToArray( camera._viewMatrixArray ); - - if ( ! camera._projectionMatrixArray ) camera._projectionMatrixArray = new Float32Array( 16 ); - camera.projectionMatrix.flattenToArray( camera._projectionMatrixArray ); - - _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrixWorldInverse ); - _frustum.setFromMatrix( _projScreenMatrix ); - - this.setRenderTarget( renderTarget ); - - if ( this.autoClear || forceClear ) { - - this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); - - } - - // set matrices for regular objects (frustum culled) - - renderList = scene.__webglObjects; - - for ( i = 0, il = renderList.length; i < il; i ++ ) { - - webglObject = renderList[ i ]; - object = webglObject.object; - - webglObject.render = false; - - if ( object.visible ) { - - if ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.contains( object ) ) { - - object.matrixWorld.flattenToArray( object._objectMatrixArray ); - - setupMatrices( object, camera ); - - unrollBufferMaterial( webglObject ); - - webglObject.render = true; - - if ( this.sortObjects ) { - - if ( object.renderDepth ) { - - webglObject.z = object.renderDepth; - - } else { - - _vector3.copy( object.position ); - _projScreenMatrix.multiplyVector3( _vector3 ); - - webglObject.z = _vector3.z; - - } - - } - - } - - } - - } - - if ( this.sortObjects ) { - - renderList.sort( painterSort ); - - } - - // set matrices for immediate objects - - renderList = scene.__webglObjectsImmediate; - - for ( i = 0, il = renderList.length; i < il; i ++ ) { - - webglObject = renderList[ i ]; - object = webglObject.object; - - if ( object.visible ) { - - if( object.matrixAutoUpdate ) { - - object.matrixWorld.flattenToArray( object._objectMatrixArray ); - - } - - setupMatrices( object, camera ); - - unrollImmediateBufferMaterial( webglObject ); - - } - - } - - if ( scene.overrideMaterial ) { - - this.setBlending( scene.overrideMaterial.blending ); - this.setDepthTest( scene.overrideMaterial.depthTest ); - this.setDepthWrite( scene.overrideMaterial.depthWrite ); - setPolygonOffset( scene.overrideMaterial.polygonOffset, scene.overrideMaterial.polygonOffsetFactor, scene.overrideMaterial.polygonOffsetUnits ); - - renderObjects( scene.__webglObjects, false, "", camera, lights, fog, true, scene.overrideMaterial ); - renderObjectsImmediate( scene.__webglObjectsImmediate, "", camera, lights, fog, false, scene.overrideMaterial ); - - } else { - - // opaque pass (front-to-back order) - - this.setBlending( THREE.NormalBlending ); - - renderObjects( scene.__webglObjects, true, "opaque", camera, lights, fog, false ); - renderObjectsImmediate( scene.__webglObjectsImmediate, "opaque", camera, lights, fog, false ); - - // transparent pass (back-to-front order) - - renderObjects( scene.__webglObjects, false, "transparent", camera, lights, fog, true ); - renderObjectsImmediate( scene.__webglObjectsImmediate, "transparent", camera, lights, fog, true ); - - } - - // custom render plugins (post pass) - - renderPlugins( this.renderPluginsPost, scene, camera ); - - - // Generate mipmap if we're using any kind of mipmap filtering - - if ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) { - - updateRenderTargetMipmap( renderTarget ); - - } - - // Ensure depth buffer writing is enabled so it can be cleared on next render - - this.setDepthTest( true ); - this.setDepthWrite( true ); - - // _gl.finish(); - - }; - - function renderPlugins( plugins, scene, camera ) { - - if ( ! plugins.length ) return; - - for ( var i = 0, il = plugins.length; i < il; i ++ ) { - - _currentProgram = null; - _currentCamera = null; - _oldBlending = -1; - _oldDepthTest = -1; - _oldDepthWrite = -1; - _currentGeometryGroupHash = -1; - _currentMaterialId = -1; - - plugins[ i ].render( scene, camera, _currentWidth, _currentHeight ); - - _currentProgram = null; - _currentCamera = null; - _oldBlending = -1; - _oldDepthTest = -1; - _oldDepthWrite = -1; - _currentGeometryGroupHash = -1; - _currentMaterialId = -1; - - } - - }; - - function renderObjects ( renderList, reverse, materialType, camera, lights, fog, useBlending, overrideMaterial ) { - - var webglObject, object, buffer, material, start, end, delta; - - if ( reverse ) { - - start = renderList.length - 1; - end = -1; - delta = -1; - - } else { - - start = 0; - end = renderList.length; - delta = 1; - } - - for ( var i = start; i !== end; i += delta ) { - - webglObject = renderList[ i ]; - - if ( webglObject.render ) { - - object = webglObject.object; - buffer = webglObject.buffer; - - if ( overrideMaterial ) { - - material = overrideMaterial; - - } else { - - material = webglObject[ materialType ]; - - if ( ! material ) continue; - - if ( useBlending ) _this.setBlending( material.blending ); - - _this.setDepthTest( material.depthTest ); - _this.setDepthWrite( material.depthWrite ); - setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); - - } - - _this.setObjectFaces( object ); - - if ( buffer instanceof THREE.BufferGeometry ) { - - _this.renderBufferDirect( camera, lights, fog, material, buffer, object ); - - } else { - - _this.renderBuffer( camera, lights, fog, material, buffer, object ); - - } - - } - - } - - }; - - function renderObjectsImmediate ( renderList, materialType, camera, lights, fog, useBlending, overrideMaterial ) { - - var webglObject, object, material, program; - - for ( var i = 0, il = renderList.length; i < il; i ++ ) { - - webglObject = renderList[ i ]; - object = webglObject.object; - - if ( object.visible ) { - - if ( overrideMaterial ) { - - material = overrideMaterial; - - } else { - - material = webglObject[ materialType ]; - - if ( ! material ) continue; - - if ( useBlending ) _this.setBlending( material.blending ); - - _this.setDepthTest( material.depthTest ); - _this.setDepthWrite( material.depthWrite ); - setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits ); - - } - - _this.renderImmediateObject( camera, lights, fog, material, object ); - - } - - } - - }; - - this.renderImmediateObject = function ( camera, lights, fog, material, object ) { - - var program = setProgram( camera, lights, fog, material, object ); - - _currentGeometryGroupHash = -1; - - _this.setObjectFaces( object ); - - if ( object.immediateRenderCallback ) { - - object.immediateRenderCallback( program, _gl, _frustum ); - - } else { - - object.render( function( object ) { _this.renderBufferImmediate( object, program, material.shading ); } ); - - } - - }; - - function unrollImmediateBufferMaterial ( globject ) { - - var object = globject.object, - material = object.material; - - if ( material.transparent ) { - - globject.transparent = material; - globject.opaque = null; - - } else { - - globject.opaque = material; - globject.transparent = null; - - } - - }; - - function unrollBufferMaterial ( globject ) { - - var object = globject.object, - buffer = globject.buffer, - material, materialIndex, meshMaterial; - - meshMaterial = object.material; - - if ( meshMaterial instanceof THREE.MeshFaceMaterial ) { - - materialIndex = buffer.materialIndex; - - if ( materialIndex >= 0 ) { - - material = object.geometry.materials[ materialIndex ]; - - if ( material.transparent ) { - - globject.transparent = material; - globject.opaque = null; - - } else { - - globject.opaque = material; - globject.transparent = null; - - } - - } - - } else { - - material = meshMaterial; - - if ( material ) { - - if ( material.transparent ) { - - globject.transparent = material; - globject.opaque = null; - - } else { - - globject.opaque = material; - globject.transparent = null; - - } - - } - - } - - }; - - // Geometry splitting - - function sortFacesByMaterial ( geometry ) { - - var f, fl, face, materialIndex, vertices, - materialHash, groupHash, - hash_map = {}; - - var numMorphTargets = geometry.morphTargets.length; - - geometry.geometryGroups = {}; - - for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) { - - face = geometry.faces[ f ]; - materialIndex = face.materialIndex; - - materialHash = ( materialIndex !== undefined ) ? materialIndex : -1; - - if ( hash_map[ materialHash ] === undefined ) { - - hash_map[ materialHash ] = { 'hash': materialHash, 'counter': 0 }; - - } - - groupHash = hash_map[ materialHash ].hash + '_' + hash_map[ materialHash ].counter; - - if ( geometry.geometryGroups[ groupHash ] === undefined ) { - - geometry.geometryGroups[ groupHash ] = { 'faces3': [], 'faces4': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets }; - - } - - vertices = face instanceof THREE.Face3 ? 3 : 4; - - if ( geometry.geometryGroups[ groupHash ].vertices + vertices > 65535 ) { - - hash_map[ materialHash ].counter += 1; - groupHash = hash_map[ materialHash ].hash + '_' + hash_map[ materialHash ].counter; - - if ( geometry.geometryGroups[ groupHash ] === undefined ) { - - geometry.geometryGroups[ groupHash ] = { 'faces3': [], 'faces4': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets }; - - } - - } - - if ( face instanceof THREE.Face3 ) { - - geometry.geometryGroups[ groupHash ].faces3.push( f ); - - } else { - - geometry.geometryGroups[ groupHash ].faces4.push( f ); - - } - - geometry.geometryGroups[ groupHash ].vertices += vertices; - - } - - geometry.geometryGroupsList = []; - - for ( var g in geometry.geometryGroups ) { - - geometry.geometryGroups[ g ].id = _geometryGroupCounter ++; - - geometry.geometryGroupsList.push( geometry.geometryGroups[ g ] ); - - } - - }; - - // Objects refresh - - this.initWebGLObjects = function ( scene ) { - - if ( !scene.__webglObjects ) { - - scene.__webglObjects = []; - scene.__webglObjectsImmediate = []; - scene.__webglSprites = []; - scene.__webglFlares = []; - - } - - while ( scene.__objectsAdded.length ) { - - addObject( scene.__objectsAdded[ 0 ], scene ); - scene.__objectsAdded.splice( 0, 1 ); - - } - - while ( scene.__objectsRemoved.length ) { - - removeObject( scene.__objectsRemoved[ 0 ], scene ); - scene.__objectsRemoved.splice( 0, 1 ); - - } - - // update must be called after objects adding / removal - - for ( var o = 0, ol = scene.__webglObjects.length; o < ol; o ++ ) { - - updateObject( scene.__webglObjects[ o ].object ); - - } - - }; - - // Objects adding - - function addObject ( object, scene ) { - - var g, geometry, geometryGroup; - - if ( ! object.__webglInit ) { - - object.__webglInit = true; - - object._modelViewMatrix = new THREE.Matrix4(); - - object._normalMatrixArray = new Float32Array( 9 ); - object._modelViewMatrixArray = new Float32Array( 16 ); - object._objectMatrixArray = new Float32Array( 16 ); - - object.matrixWorld.flattenToArray( object._objectMatrixArray ); - - if ( object instanceof THREE.Mesh ) { - - geometry = object.geometry; - - if ( geometry instanceof THREE.Geometry ) { - - if ( geometry.geometryGroups === undefined ) { - - sortFacesByMaterial( geometry ); - - } - - // create separate VBOs per geometry chunk - - for ( g in geometry.geometryGroups ) { - - geometryGroup = geometry.geometryGroups[ g ]; - - // initialise VBO on the first access - - if ( ! geometryGroup.__webglVertexBuffer ) { - - createMeshBuffers( geometryGroup ); - initMeshBuffers( geometryGroup, object ); - - geometry.__dirtyVertices = true; - geometry.__dirtyMorphTargets = true; - geometry.__dirtyElements = true; - geometry.__dirtyUvs = true; - geometry.__dirtyNormals = true; - geometry.__dirtyTangents = true; - geometry.__dirtyColors = true; - - } - - } - - } - - } else if ( object instanceof THREE.Ribbon ) { - - geometry = object.geometry; - - if( ! geometry.__webglVertexBuffer ) { - - createRibbonBuffers( geometry ); - initRibbonBuffers( geometry ); - - geometry.__dirtyVertices = true; - geometry.__dirtyColors = true; - - } - - } else if ( object instanceof THREE.Line ) { - - geometry = object.geometry; - - if( ! geometry.__webglVertexBuffer ) { - - createLineBuffers( geometry ); - initLineBuffers( geometry, object ); - - geometry.__dirtyVertices = true; - geometry.__dirtyColors = true; - - } - - } else if ( object instanceof THREE.ParticleSystem ) { - - geometry = object.geometry; - - if ( ! geometry.__webglVertexBuffer ) { - - createParticleBuffers( geometry ); - initParticleBuffers( geometry, object ); - - geometry.__dirtyVertices = true; - geometry.__dirtyColors = true; - - } - - } - - } - - if ( ! object.__webglActive ) { - - if ( object instanceof THREE.Mesh ) { - - geometry = object.geometry; - - if ( geometry instanceof THREE.BufferGeometry ) { - - addBuffer( scene.__webglObjects, geometry, object ); - - } else { - - for ( g in geometry.geometryGroups ) { - - geometryGroup = geometry.geometryGroups[ g ]; - - addBuffer( scene.__webglObjects, geometryGroup, object ); - - } - - } - - } else if ( object instanceof THREE.Ribbon || - object instanceof THREE.Line || - object instanceof THREE.ParticleSystem ) { - - geometry = object.geometry; - addBuffer( scene.__webglObjects, geometry, object ); - - } else if ( THREE.MarchingCubes !== undefined && object instanceof THREE.MarchingCubes || object.immediateRenderCallback ) { - - addBufferImmediate( scene.__webglObjectsImmediate, object ); - - } else if ( object instanceof THREE.Sprite ) { - - scene.__webglSprites.push( object ); - - } else if ( object instanceof THREE.LensFlare ) { - - scene.__webglFlares.push( object ); - - } - - object.__webglActive = true; - - } - - }; - - function addBuffer ( objlist, buffer, object ) { - - objlist.push( - { - buffer: buffer, - object: object, - opaque: null, - transparent: null - } - ); - - }; - - function addBufferImmediate ( objlist, object ) { - - objlist.push( - { - object: object, - opaque: null, - transparent: null - } - ); - - }; - - // Objects updates - - function updateObject ( object ) { - - var geometry = object.geometry, - geometryGroup, customAttributesDirty, material; - - if ( object instanceof THREE.Mesh ) { - - if ( geometry instanceof THREE.BufferGeometry ) { - - /* - if ( geometry.__dirtyVertices || geometry.__dirtyElements || - geometry.__dirtyUvs || geometry.__dirtyNormals || - geometry.__dirtyColors ) { - - // TODO - // set buffers from typed arrays - - } - */ - - geometry.__dirtyVertices = false; - geometry.__dirtyElements = false; - geometry.__dirtyUvs = false; - geometry.__dirtyNormals = false; - geometry.__dirtyColors = false; - - } else { - - // check all geometry groups - - for( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) { - - geometryGroup = geometry.geometryGroupsList[ i ]; - - material = getBufferMaterial( object, geometryGroup ); - - customAttributesDirty = material.attributes && areCustomAttributesDirty( material ); - - if ( geometry.__dirtyVertices || geometry.__dirtyMorphTargets || geometry.__dirtyElements || - geometry.__dirtyUvs || geometry.__dirtyNormals || - geometry.__dirtyColors || geometry.__dirtyTangents || customAttributesDirty ) { - - setMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material ); - - } - - } - - geometry.__dirtyVertices = false; - geometry.__dirtyMorphTargets = false; - geometry.__dirtyElements = false; - geometry.__dirtyUvs = false; - geometry.__dirtyNormals = false; - geometry.__dirtyColors = false; - geometry.__dirtyTangents = false; - - material.attributes && clearCustomAttributes( material ); - - } - - } else if ( object instanceof THREE.Ribbon ) { - - if ( geometry.__dirtyVertices || geometry.__dirtyColors ) { - - setRibbonBuffers( geometry, _gl.DYNAMIC_DRAW ); - - } - - geometry.__dirtyVertices = false; - geometry.__dirtyColors = false; - - } else if ( object instanceof THREE.Line ) { - - material = getBufferMaterial( object, geometryGroup ); - - customAttributesDirty = material.attributes && areCustomAttributesDirty( material ); - - if ( geometry.__dirtyVertices || geometry.__dirtyColors || customAttributesDirty ) { - - setLineBuffers( geometry, _gl.DYNAMIC_DRAW ); - - } - - geometry.__dirtyVertices = false; - geometry.__dirtyColors = false; - - material.attributes && clearCustomAttributes( material ); - - } else if ( object instanceof THREE.ParticleSystem ) { - - material = getBufferMaterial( object, geometryGroup ); - - customAttributesDirty = material.attributes && areCustomAttributesDirty( material ); - - if ( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles || customAttributesDirty ) { - - setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object ); - - } - - geometry.__dirtyVertices = false; - geometry.__dirtyColors = false; - - material.attributes && clearCustomAttributes( material ); - - } - - }; - - // Objects updates - custom attributes check - - function areCustomAttributesDirty ( material ) { - - for ( var a in material.attributes ) { - - if ( material.attributes[ a ].needsUpdate ) return true; - - } - - return false; - - }; - - function clearCustomAttributes ( material ) { - - for ( var a in material.attributes ) { - - material.attributes[ a ].needsUpdate = false; - - } - - }; - - // Objects removal - - function removeObject ( object, scene ) { - - if ( object instanceof THREE.Mesh || - object instanceof THREE.ParticleSystem || - object instanceof THREE.Ribbon || - object instanceof THREE.Line ) { - - removeInstances( scene.__webglObjects, object ); - - } else if ( object instanceof THREE.Sprite ) { - - removeInstancesDirect( scene.__webglSprites, object ); - - } else if ( object instanceof THREE.LensFlare ) { - - removeInstancesDirect( scene.__webglFlares, object ); - - } else if ( object instanceof THREE.MarchingCubes || object.immediateRenderCallback ) { - - removeInstances( scene.__webglObjectsImmediate, object ); - - } - - object.__webglActive = false; - - }; - - function removeInstances ( objlist, object ) { - - for ( var o = objlist.length - 1; o >= 0; o -- ) { - - if ( objlist[ o ].object === object ) { - - objlist.splice( o, 1 ); - - } - - } - - }; - - function removeInstancesDirect ( objlist, object ) { - - for ( var o = objlist.length - 1; o >= 0; o -- ) { - - if ( objlist[ o ] === object ) { - - objlist.splice( o, 1 ); - - } - - } - - }; - - // Materials - - this.initMaterial = function ( material, lights, fog, object ) { - - var u, a, identifiers, i, parameters, maxLightCount, maxBones, maxShadows, shaderID; - - if ( material instanceof THREE.MeshDepthMaterial ) { - - shaderID = 'depth'; - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - shaderID = 'normal'; - - } else if ( material instanceof THREE.MeshBasicMaterial ) { - - shaderID = 'basic'; - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - shaderID = 'lambert'; - - } else if ( material instanceof THREE.MeshPhongMaterial ) { - - shaderID = 'phong'; - - } else if ( material instanceof THREE.LineBasicMaterial ) { - - shaderID = 'basic'; - - } else if ( material instanceof THREE.ParticleBasicMaterial ) { - - shaderID = 'particle_basic'; - - } - - if ( shaderID ) { - - setMaterialShaders( material, THREE.ShaderLib[ shaderID ] ); - - } - - // heuristics to create shader parameters according to lights in the scene - // (not to blow over maxLights budget) - - maxLightCount = allocateLights( lights ); - - maxShadows = allocateShadows( lights ); - - maxBones = allocateBones( object ); - - parameters = { - - map: !!material.map, envMap: !!material.envMap, lightMap: !!material.lightMap, - vertexColors: material.vertexColors, - fog: fog, useFog: material.fog, - sizeAttenuation: material.sizeAttenuation, - skinning: material.skinning, - morphTargets: material.morphTargets, - maxMorphTargets: this.maxMorphTargets, - maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point, - maxBones: maxBones, - shadowMapEnabled: this.shadowMapEnabled && object.receiveShadow, - shadowMapSoft: this.shadowMapSoft, - maxShadows: maxShadows, - alphaTest: material.alphaTest, - metal: material.metal, - perPixel: material.perPixel, - wrapAround: material.wrapAround - - }; - - material.program = buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, parameters ); - - var attributes = material.program.attributes; - - if ( attributes.position >= 0 ) _gl.enableVertexAttribArray( attributes.position ); - if ( attributes.color >= 0 ) _gl.enableVertexAttribArray( attributes.color ); - if ( attributes.normal >= 0 ) _gl.enableVertexAttribArray( attributes.normal ); - if ( attributes.tangent >= 0 ) _gl.enableVertexAttribArray( attributes.tangent ); - - if ( material.skinning && - attributes.skinVertexA >=0 && attributes.skinVertexB >= 0 && - attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) { - - _gl.enableVertexAttribArray( attributes.skinVertexA ); - _gl.enableVertexAttribArray( attributes.skinVertexB ); - _gl.enableVertexAttribArray( attributes.skinIndex ); - _gl.enableVertexAttribArray( attributes.skinWeight ); - - } - - if ( material.attributes ) { - - for ( a in material.attributes ) { - - if( attributes[ a ] !== undefined && attributes[ a ] >= 0 ) _gl.enableVertexAttribArray( attributes[ a ] ); - - } - - } - - if ( material.morphTargets ) { - - material.numSupportedMorphTargets = 0; - - var id, base = "morphTarget"; - - for ( i = 0; i < this.maxMorphTargets; i ++ ) { - - id = base + i; - - if ( attributes[ id ] >= 0 ) { - - _gl.enableVertexAttribArray( attributes[ id ] ); - material.numSupportedMorphTargets ++; - - } - - } - - } - - material.uniformsList = []; - - for ( u in material.uniforms ) { - - material.uniformsList.push( [ material.uniforms[ u ], u ] ); - - } - - }; - - function setMaterialShaders ( material, shaders ) { - - material.uniforms = THREE.UniformsUtils.clone( shaders.uniforms ); - material.vertexShader = shaders.vertexShader; - material.fragmentShader = shaders.fragmentShader; - - }; - - function setProgram ( camera, lights, fog, material, object ) { - - if ( ! material.program ) { - - _this.initMaterial( material, lights, fog, object ); - - } - - if ( material.morphTargets ) { - - if ( ! object.__webglMorphTargetInfluences ) { - - object.__webglMorphTargetInfluences = new Float32Array( _this.maxMorphTargets ); - - for ( var i = 0, il = _this.maxMorphTargets; i < il; i ++ ) { - - object.__webglMorphTargetInfluences[ i ] = 0; - - } - - } - - } - - var refreshMaterial = false; - - var program = material.program, - p_uniforms = program.uniforms, - m_uniforms = material.uniforms; - - if ( program !== _currentProgram ) { - - _gl.useProgram( program ); - _currentProgram = program; - - refreshMaterial = true; - - } - - if ( material.id !== _currentMaterialId ) { - - _currentMaterialId = material.id; - refreshMaterial = true; - - } - - if ( refreshMaterial || camera !== _currentCamera ) { - - _gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera._projectionMatrixArray ); - - if ( camera !== _currentCamera ) _currentCamera = camera; - - } - - if ( refreshMaterial ) { - - // refresh uniforms common to several materials - - if ( fog && material.fog ) { - - refreshUniformsFog( m_uniforms, fog ); - - } - - if ( material instanceof THREE.MeshPhongMaterial || - material instanceof THREE.MeshLambertMaterial || - material.lights ) { - - setupLights( program, lights ); - refreshUniformsLights( m_uniforms, _lights ); - - } - - if ( material instanceof THREE.MeshBasicMaterial || - material instanceof THREE.MeshLambertMaterial || - material instanceof THREE.MeshPhongMaterial ) { - - refreshUniformsCommon( m_uniforms, material ); - - } - - // refresh single material specific uniforms - - if ( material instanceof THREE.LineBasicMaterial ) { - - refreshUniformsLine( m_uniforms, material ); - - } else if ( material instanceof THREE.ParticleBasicMaterial ) { - - refreshUniformsParticle( m_uniforms, material ); - - } else if ( material instanceof THREE.MeshPhongMaterial ) { - - refreshUniformsPhong( m_uniforms, material ); - - } else if ( material instanceof THREE.MeshLambertMaterial ) { - - refreshUniformsLambert( m_uniforms, material ); - - } else if ( material instanceof THREE.MeshDepthMaterial ) { - - m_uniforms.mNear.value = camera.near; - m_uniforms.mFar.value = camera.far; - m_uniforms.opacity.value = material.opacity; - - } else if ( material instanceof THREE.MeshNormalMaterial ) { - - m_uniforms.opacity.value = material.opacity; - - } - - if ( object.receiveShadow && ! material._shadowPass ) { - - refreshUniformsShadow( m_uniforms, lights ); - - } - - // load common uniforms - - loadUniformsGeneric( program, material.uniformsList ); - - // load material specific uniforms - // (shader material also gets them for the sake of genericity) - - if ( material instanceof THREE.ShaderMaterial || - material instanceof THREE.MeshPhongMaterial || - material.envMap ) { - - if ( p_uniforms.cameraPosition !== null ) { - - _gl.uniform3f( p_uniforms.cameraPosition, camera.position.x, camera.position.y, camera.position.z ); - - } - - } - - if ( material instanceof THREE.MeshPhongMaterial || - material instanceof THREE.MeshLambertMaterial || - material instanceof THREE.ShaderMaterial || - material.skinning ) { - - if ( p_uniforms.viewMatrix !== null ) { - - _gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera._viewMatrixArray ); - - } - - } - - if ( material.skinning ) { - - loadUniformsSkinning( p_uniforms, object, camera ); - - } - - } - - loadUniformsMatrices( p_uniforms, object ); - - if ( material instanceof THREE.ShaderMaterial || - material.envMap || - material.skinning || - object.receiveShadow ) { - - if ( p_uniforms.objectMatrix !== null ) { - - _gl.uniformMatrix4fv( p_uniforms.objectMatrix, false, object._objectMatrixArray ); - - } - - } - - return program; - - }; - - // Uniforms (refresh uniforms objects) - - function refreshUniformsCommon ( uniforms, material ) { - - uniforms.opacity.value = material.opacity; - - if ( _this.gammaInput ) { - - uniforms.diffuse.value.copyGammaToLinear( material.color ); - - } else { - - uniforms.diffuse.value = material.color; - - } - - uniforms.map.texture = material.map; - - if ( material.map ) { - - uniforms.offsetRepeat.value.set( material.map.offset.x, material.map.offset.y, material.map.repeat.x, material.map.repeat.y ); - - } - - uniforms.lightMap.texture = material.lightMap; - - uniforms.envMap.texture = material.envMap; - uniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : -1; - - if ( _this.gammaInput ) { - - //uniforms.reflectivity.value = material.reflectivity * material.reflectivity; - uniforms.reflectivity.value = material.reflectivity; - - } else { - - uniforms.reflectivity.value = material.reflectivity; - - } - - uniforms.refractionRatio.value = material.refractionRatio; - uniforms.combine.value = material.combine; - uniforms.useRefract.value = material.envMap && material.envMap.mapping instanceof THREE.CubeRefractionMapping; - - }; - - function refreshUniformsLine ( uniforms, material ) { - - uniforms.diffuse.value = material.color; - uniforms.opacity.value = material.opacity; - - }; - - function refreshUniformsParticle ( uniforms, material ) { - - uniforms.psColor.value = material.color; - uniforms.opacity.value = material.opacity; - uniforms.size.value = material.size; - uniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this. - - uniforms.map.texture = material.map; - - }; - - function refreshUniformsFog ( uniforms, fog ) { - - uniforms.fogColor.value = fog.color; - - if ( fog instanceof THREE.Fog ) { - - uniforms.fogNear.value = fog.near; - uniforms.fogFar.value = fog.far; - - } else if ( fog instanceof THREE.FogExp2 ) { - - uniforms.fogDensity.value = fog.density; - - } - - }; - - function refreshUniformsPhong ( uniforms, material ) { - - uniforms.shininess.value = material.shininess; - - if ( _this.gammaInput ) { - - uniforms.ambient.value.copyGammaToLinear( material.ambient ); - uniforms.specular.value.copyGammaToLinear( material.specular ); - - } else { - - uniforms.ambient.value = material.ambient; - uniforms.specular.value = material.specular; - - } - - if ( material.wrapAround ) { - - uniforms.wrapRGB.value.copy( material.wrapRGB ); - - } - - }; - - function refreshUniformsLambert ( uniforms, material ) { - - if ( _this.gammaInput ) { - - uniforms.ambient.value.copyGammaToLinear( material.ambient ); - - } else { - - uniforms.ambient.value = material.ambient; - - } - - if ( material.wrapAround ) { - - uniforms.wrapRGB.value.copy( material.wrapRGB ); - - } - - }; - - function refreshUniformsLights ( uniforms, lights ) { - - uniforms.ambientLightColor.value = lights.ambient; - - uniforms.directionalLightColor.value = lights.directional.colors; - uniforms.directionalLightDirection.value = lights.directional.positions; - - uniforms.pointLightColor.value = lights.point.colors; - uniforms.pointLightPosition.value = lights.point.positions; - uniforms.pointLightDistance.value = lights.point.distances; - - }; - - function refreshUniformsShadow ( uniforms, lights ) { - - if ( uniforms.shadowMatrix ) { - - var j = 0; - - for ( var i = 0, il = lights.length; i < il; i ++ ) { - - var light = lights[ i ]; - - if ( ! light.castShadow ) continue; - - if ( light instanceof THREE.SpotLight || light instanceof THREE.DirectionalLight ) { - - uniforms.shadowMap.texture[ j ] = light.shadowMap; - uniforms.shadowMapSize.value[ j ] = light.shadowMapSize; - - uniforms.shadowMatrix.value[ j ] = light.shadowMatrix; - - uniforms.shadowDarkness.value[ j ] = light.shadowDarkness; - uniforms.shadowBias.value[ j ] = light.shadowBias; - - j ++; - - } - - } - - } - - }; - - // Uniforms (load to GPU) - - function loadUniformsSkinning ( uniforms, object, camera ) { - - _gl.uniformMatrix4fv( uniforms.cameraInverseMatrix, false, camera._viewMatrixArray ); - _gl.uniformMatrix4fv( uniforms.boneGlobalMatrices, false, object.boneMatrices ); - - }; - - - function loadUniformsMatrices ( uniforms, object ) { - - _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrixArray ); - - if ( uniforms.normalMatrix ) { - - _gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrixArray ); - - } - - }; - - function loadUniformsGeneric ( program, uniforms ) { - - var uniform, value, type, location, texture, i, il, j, jl, offset; - - for( j = 0, jl = uniforms.length; j < jl; j ++ ) { - - location = program.uniforms[ uniforms[ j ][ 1 ] ]; - if ( !location ) continue; - - uniform = uniforms[ j ][ 0 ]; - - type = uniform.type; - value = uniform.value; - - // single integer - - if( type === "i" ) { - - _gl.uniform1i( location, value ); - - // single float - - } else if( type === "f" ) { - - _gl.uniform1f( location, value ); - - // single THREE.Vector2 - - } else if( type === "v2" ) { - - _gl.uniform2f( location, value.x, value.y ); - - // single THREE.Vector3 - - } else if( type === "v3" ) { - - _gl.uniform3f( location, value.x, value.y, value.z ); - - // single THREE.Vector4 - - } else if( type === "v4" ) { - - _gl.uniform4f( location, value.x, value.y, value.z, value.w ); - - // single THREE.Color - - } else if( type === "c" ) { - - _gl.uniform3f( location, value.r, value.g, value.b ); - - // flat array of floats (JS or typed array) - - } else if( type === "fv1" ) { - - _gl.uniform1fv( location, value ); - - // flat array of floats with 3 x N size (JS or typed array) - - } else if( type === "fv" ) { - - _gl.uniform3fv( location, value ); - - // array of THREE.Vector2 - - } else if( type === "v2v" ) { - - if ( ! uniform._array ) { - - uniform._array = new Float32Array( 2 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - offset = i * 2; - - uniform._array[ offset ] = value[ i ].x; - uniform._array[ offset + 1 ] = value[ i ].y; - - } - - _gl.uniform2fv( location, uniform._array ); - - // array of THREE.Vector3 - - } else if( type === "v3v" ) { - - if ( ! uniform._array ) { - - uniform._array = new Float32Array( 3 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - offset = i * 3; - - uniform._array[ offset ] = value[ i ].x; - uniform._array[ offset + 1 ] = value[ i ].y; - uniform._array[ offset + 2 ] = value[ i ].z; - - } - - _gl.uniform3fv( location, uniform._array ); - - // array of THREE.Vector4 - - } else if( type == "v4v" ) { - - if ( ! uniform._array ) { - - uniform._array = new Float32Array( 4 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - offset = i * 4; - - uniform._array[ offset ] = value[ i ].x; - uniform._array[ offset + 1 ] = value[ i ].y; - uniform._array[ offset + 2 ] = value[ i ].z; - uniform._array[ offset + 3 ] = value[ i ].w; - - } - - _gl.uniform4fv( location, uniform._array ); - - // single THREE.Matrix4 - - } else if( type === "m4" ) { - - if ( ! uniform._array ) { - - uniform._array = new Float32Array( 16 ); - - } - - value.flattenToArray( uniform._array ); - _gl.uniformMatrix4fv( location, false, uniform._array ); - - // array of THREE.Matrix4 - - } else if( type === "m4v" ) { - - if ( ! uniform._array ) { - - uniform._array = new Float32Array( 16 * value.length ); - - } - - for ( i = 0, il = value.length; i < il; i ++ ) { - - value[ i ].flattenToArrayOffset( uniform._array, i * 16 ); - - } - - _gl.uniformMatrix4fv( location, false, uniform._array ); - - - // single THREE.Texture (2d or cube) - - } else if( type === "t" ) { - - _gl.uniform1i( location, value ); - - texture = uniform.texture; - - if ( !texture ) continue; - - if ( texture.image instanceof Array && texture.image.length === 6 ) { - - setCubeTexture( texture, value ); - - } else if ( texture instanceof THREE.WebGLRenderTargetCube ) { - - setCubeTextureDynamic( texture, value ); - - } else { - - _this.setTexture( texture, value ); - - } - - // array of THREE.Texture (2d) - - } else if( type === "tv" ) { - - if ( ! uniform._array ) { - - uniform._array = []; - - for( i = 0, il = uniform.texture.length; i < il; i ++ ) { - - uniform._array[ i ] = value + i; - - } - - } - - _gl.uniform1iv( location, uniform._array ); - - for( i = 0, il = uniform.texture.length; i < il; i ++ ) { - - texture = uniform.texture[ i ]; - - if ( !texture ) continue; - - _this.setTexture( texture, uniform._array[ i ] ); - - } - - } - - } - - }; - - function setupMatrices ( object, camera ) { - - object._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray ); - - var inverseMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ); - - if ( inverseMatrix ) { - - inverseMatrix.transposeIntoArray( object._normalMatrixArray ); - - } - - }; - - function setupLights ( program, lights ) { - - var l, ll, light, n, - r = 0, g = 0, b = 0, - color, position, intensity, distance, - - zlights = _lights, - - dcolors = zlights.directional.colors, - dpositions = zlights.directional.positions, - - pcolors = zlights.point.colors, - ppositions = zlights.point.positions, - pdistances = zlights.point.distances, - - dlength = 0, - plength = 0, - - doffset = 0, - poffset = 0; - - for ( l = 0, ll = lights.length; l < ll; l ++ ) { - - light = lights[ l ]; - - if ( light.onlyShadow ) continue; - - color = light.color; - intensity = light.intensity; - distance = light.distance; - - if ( light instanceof THREE.AmbientLight ) { - - if ( _this.gammaInput ) { - - r += color.r * color.r; - g += color.g * color.g; - b += color.b * color.b; - - } else { - - r += color.r; - g += color.g; - b += color.b; - - } - - } else if ( light instanceof THREE.DirectionalLight ) { - - doffset = dlength * 3; - - if ( _this.gammaInput ) { - - dcolors[ doffset ] = color.r * color.r * intensity * intensity; - dcolors[ doffset + 1 ] = color.g * color.g * intensity * intensity; - dcolors[ doffset + 2 ] = color.b * color.b * intensity * intensity; - - } else { - - dcolors[ doffset ] = color.r * intensity; - dcolors[ doffset + 1 ] = color.g * intensity; - dcolors[ doffset + 2 ] = color.b * intensity; - - } - - _direction.copy( light.matrixWorld.getPosition() ); - _direction.subSelf( light.target.matrixWorld.getPosition() ); - _direction.normalize(); - - dpositions[ doffset ] = _direction.x; - dpositions[ doffset + 1 ] = _direction.y; - dpositions[ doffset + 2 ] = _direction.z; - - dlength += 1; - - } else if( light instanceof THREE.PointLight || light instanceof THREE.SpotLight ) { - - poffset = plength * 3; - - if ( _this.gammaInput ) { - - pcolors[ poffset ] = color.r * color.r * intensity * intensity; - pcolors[ poffset + 1 ] = color.g * color.g * intensity * intensity; - pcolors[ poffset + 2 ] = color.b * color.b * intensity * intensity; - - } else { - - pcolors[ poffset ] = color.r * intensity; - pcolors[ poffset + 1 ] = color.g * intensity; - pcolors[ poffset + 2 ] = color.b * intensity; - - } - - position = light.matrixWorld.getPosition(); - - ppositions[ poffset ] = position.x; - ppositions[ poffset + 1 ] = position.y; - ppositions[ poffset + 2 ] = position.z; - - pdistances[ plength ] = distance; - - plength += 1; - - } - - } - - // null eventual remains from removed lights - // (this is to avoid if in shader) - - for ( l = dlength * 3, ll = dcolors.length; l < ll; l ++ ) dcolors[ l ] = 0.0; - for ( l = plength * 3, ll = pcolors.length; l < ll; l ++ ) pcolors[ l ] = 0.0; - - zlights.point.length = plength; - zlights.directional.length = dlength; - - zlights.ambient[ 0 ] = r; - zlights.ambient[ 1 ] = g; - zlights.ambient[ 2 ] = b; - - }; - - // GL state setting - - this.setFaceCulling = function ( cullFace, frontFace ) { - - if ( cullFace ) { - - if ( !frontFace || frontFace === "ccw" ) { - - _gl.frontFace( _gl.CCW ); - - } else { - - _gl.frontFace( _gl.CW ); - - } - - if( cullFace === "back" ) { - - _gl.cullFace( _gl.BACK ); - - } else if( cullFace === "front" ) { - - _gl.cullFace( _gl.FRONT ); - - } else { - - _gl.cullFace( _gl.FRONT_AND_BACK ); - - } - - _gl.enable( _gl.CULL_FACE ); - - } else { - - _gl.disable( _gl.CULL_FACE ); - - } - - }; - - this.setObjectFaces = function ( object ) { - - if ( _oldDoubleSided !== object.doubleSided ) { - - if( object.doubleSided ) { - - _gl.disable( _gl.CULL_FACE ); - - } else { - - _gl.enable( _gl.CULL_FACE ); - - } - - _oldDoubleSided = object.doubleSided; - - } - - if ( _oldFlipSided !== object.flipSided ) { - - if( object.flipSided ) { - - _gl.frontFace( _gl.CW ); - - } else { - - _gl.frontFace( _gl.CCW ); - - } - - _oldFlipSided = object.flipSided; - - } - - }; - - this.setDepthTest = function ( depthTest ) { - - if ( _oldDepthTest !== depthTest ) { - - if ( depthTest ) { - - _gl.enable( _gl.DEPTH_TEST ); - - } else { - - _gl.disable( _gl.DEPTH_TEST ); - - } - - _oldDepthTest = depthTest; - - } - - }; - - this.setDepthWrite = function ( depthWrite ) { - - if ( _oldDepthWrite !== depthWrite ) { - - _gl.depthMask( depthWrite ); - _oldDepthWrite = depthWrite; - - } - - }; - - function setLineWidth ( width ) { - - if ( width !== _oldLineWidth ) { - - _gl.lineWidth( width ); - - _oldLineWidth = width; - - } - - }; - - function setPolygonOffset ( polygonoffset, factor, units ) { - - if ( _oldPolygonOffset !== polygonoffset ) { - - if ( polygonoffset ) { - - _gl.enable( _gl.POLYGON_OFFSET_FILL ); - - } else { - - _gl.disable( _gl.POLYGON_OFFSET_FILL ); - - } - - _oldPolygonOffset = polygonoffset; - - } - - if ( polygonoffset && ( _oldPolygonOffsetFactor !== factor || _oldPolygonOffsetUnits !== units ) ) { - - _gl.polygonOffset( factor, units ); - - _oldPolygonOffsetFactor = factor; - _oldPolygonOffsetUnits = units; - - } - - }; - - this.setBlending = function ( blending ) { - - if ( blending !== _oldBlending ) { - - switch ( blending ) { - - case THREE.AdditiveBlending: - - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE ); - - break; - - case THREE.SubtractiveBlending: - - // TODO: Find blendFuncSeparate() combination - - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.ZERO, _gl.ONE_MINUS_SRC_COLOR ); - - break; - - case THREE.MultiplyBlending: - - // TODO: Find blendFuncSeparate() combination - - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.ZERO, _gl.SRC_COLOR ); - - break; - - default: - - _gl.blendEquationSeparate( _gl.FUNC_ADD, _gl.FUNC_ADD ); - _gl.blendFuncSeparate( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA, _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA ); - - break; - - } - - _oldBlending = blending; - - } - - }; - - // Shaders - - function buildProgram ( shaderID, fragmentShader, vertexShader, uniforms, attributes, parameters ) { - - var p, pl, program, code; - var chunks = []; - - // Generate code - - if ( shaderID ) { - - chunks.push( shaderID ); - - } else { - - chunks.push( fragmentShader ); - chunks.push( vertexShader ); - - } - - for ( p in parameters ) { - - chunks.push( p ); - chunks.push( parameters[ p ] ); - - } - - code = chunks.join(); - - // Check if code has been already compiled - - for ( p = 0, pl = _programs.length; p < pl; p ++ ) { - - if ( _programs[ p ].code === code ) { - - // console.log( "Code already compiled." /*: \n\n" + code*/ ); - - return _programs[ p ].program; - - } - - } - - //console.log( "building new program " ); - - // - - program = _gl.createProgram(); - - var prefix_vertex = [ - - ( _maxVertexTextures > 0 ) ? "#define VERTEX_TEXTURES" : "", - - _this.gammaInput ? "#define GAMMA_INPUT" : "", - _this.gammaOutput ? "#define GAMMA_OUTPUT" : "", - _this.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "", - - "#define MAX_DIR_LIGHTS " + parameters.maxDirLights, - "#define MAX_POINT_LIGHTS " + parameters.maxPointLights, - - "#define MAX_SHADOWS " + parameters.maxShadows, - - "#define MAX_BONES " + parameters.maxBones, - - parameters.map ? "#define USE_MAP" : "", - parameters.envMap ? "#define USE_ENVMAP" : "", - parameters.lightMap ? "#define USE_LIGHTMAP" : "", - parameters.vertexColors ? "#define USE_COLOR" : "", - parameters.skinning ? "#define USE_SKINNING" : "", - parameters.morphTargets ? "#define USE_MORPHTARGETS" : "", - parameters.perPixel ? "#define PHONG_PER_PIXEL" : "", - parameters.wrapAround ? "#define WRAP_AROUND" : "", - - parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", - parameters.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "", - - parameters.sizeAttenuation ? "#define USE_SIZEATTENUATION" : "", - - "uniform mat4 objectMatrix;", - "uniform mat4 modelViewMatrix;", - "uniform mat4 projectionMatrix;", - "uniform mat4 viewMatrix;", - "uniform mat3 normalMatrix;", - "uniform vec3 cameraPosition;", - - "uniform mat4 cameraInverseMatrix;", - - "attribute vec3 position;", - "attribute vec3 normal;", - "attribute vec2 uv;", - "attribute vec2 uv2;", - - "#ifdef USE_COLOR", - - "attribute vec3 color;", - - "#endif", - - "#ifdef USE_MORPHTARGETS", - - "attribute vec3 morphTarget0;", - "attribute vec3 morphTarget1;", - "attribute vec3 morphTarget2;", - "attribute vec3 morphTarget3;", - "attribute vec3 morphTarget4;", - "attribute vec3 morphTarget5;", - "attribute vec3 morphTarget6;", - "attribute vec3 morphTarget7;", - - "#endif", - - "#ifdef USE_SKINNING", - - "attribute vec4 skinVertexA;", - "attribute vec4 skinVertexB;", - "attribute vec4 skinIndex;", - "attribute vec4 skinWeight;", - - "#endif", - - "" - - ].join("\n"); - - var prefix_fragment = [ - - "precision " + _precision + " float;", - - "#define MAX_DIR_LIGHTS " + parameters.maxDirLights, - "#define MAX_POINT_LIGHTS " + parameters.maxPointLights, - - "#define MAX_SHADOWS " + parameters.maxShadows, - - parameters.alphaTest ? "#define ALPHATEST " + parameters.alphaTest: "", - - _this.gammaInput ? "#define GAMMA_INPUT" : "", - _this.gammaOutput ? "#define GAMMA_OUTPUT" : "", - _this.physicallyBasedShading ? "#define PHYSICALLY_BASED_SHADING" : "", - - ( parameters.useFog && parameters.fog ) ? "#define USE_FOG" : "", - ( parameters.useFog && parameters.fog instanceof THREE.FogExp2 ) ? "#define FOG_EXP2" : "", - - parameters.map ? "#define USE_MAP" : "", - parameters.envMap ? "#define USE_ENVMAP" : "", - parameters.lightMap ? "#define USE_LIGHTMAP" : "", - parameters.vertexColors ? "#define USE_COLOR" : "", - - parameters.metal ? "#define METAL" : "", - parameters.perPixel ? "#define PHONG_PER_PIXEL" : "", - parameters.wrapAround ? "#define WRAP_AROUND" : "", - - parameters.shadowMapEnabled ? "#define USE_SHADOWMAP" : "", - parameters.shadowMapSoft ? "#define SHADOWMAP_SOFT" : "", - - "uniform mat4 viewMatrix;", - "uniform vec3 cameraPosition;", - "" - - ].join("\n"); - - _gl.attachShader( program, getShader( "fragment", prefix_fragment + fragmentShader ) ); - _gl.attachShader( program, getShader( "vertex", prefix_vertex + vertexShader ) ); - - _gl.linkProgram( program ); - - if ( !_gl.getProgramParameter( program, _gl.LINK_STATUS ) ) { - - console.error( "Could not initialise shader\n" + "VALIDATE_STATUS: " + _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) + ", gl error [" + _gl.getError() + "]" ); - - } - - //console.log( prefix_fragment + fragmentShader ); - //console.log( prefix_vertex + vertexShader ); - - program.uniforms = {}; - program.attributes = {}; - - var identifiers, u, a, i; - - // cache uniform locations - - identifiers = [ - - 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition', - 'cameraInverseMatrix', 'boneGlobalMatrices', 'morphTargetInfluences' - - ]; - - for ( u in uniforms ) { - - identifiers.push( u ); - - } - - cacheUniformLocations( program, identifiers ); - - // cache attributes locations - - identifiers = [ - - "position", "normal", "uv", "uv2", "tangent", "color", - "skinVertexA", "skinVertexB", "skinIndex", "skinWeight" - - ]; - - for ( i = 0; i < parameters.maxMorphTargets; i ++ ) { - - identifiers.push( "morphTarget" + i ); - - } - - for ( a in attributes ) { - - identifiers.push( a ); - - } - - cacheAttributeLocations( program, identifiers ); - - program.id = _programs.length; - - _programs.push( { program: program, code: code } ); - - _this.info.memory.programs = _programs.length; - - return program; - - }; - - // Shader parameters cache - - function cacheUniformLocations ( program, identifiers ) { - - var i, l, id; - - for( i = 0, l = identifiers.length; i < l; i ++ ) { - - id = identifiers[ i ]; - program.uniforms[ id ] = _gl.getUniformLocation( program, id ); - - } - - }; - - function cacheAttributeLocations ( program, identifiers ) { - - var i, l, id; - - for( i = 0, l = identifiers.length; i < l; i ++ ) { - - id = identifiers[ i ]; - program.attributes[ id ] = _gl.getAttribLocation( program, id ); - - } - - }; - - function getShader ( type, string ) { - - var shader; - - if ( type === "fragment" ) { - - shader = _gl.createShader( _gl.FRAGMENT_SHADER ); - - } else if ( type === "vertex" ) { - - shader = _gl.createShader( _gl.VERTEX_SHADER ); - - } - - _gl.shaderSource( shader, string ); - _gl.compileShader( shader ); - - if ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) { - - console.error( _gl.getShaderInfoLog( shader ) ); - console.error( string ); - return null; - - } - - return shader; - - }; - - // Textures - - - function isPowerOfTwo ( value ) { - - return ( value & ( value - 1 ) ) === 0; - - }; - - function setTextureParameters ( textureType, texture, isImagePowerOfTwo ) { - - if ( isImagePowerOfTwo ) { - - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) ); - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); - - _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); - _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) ); - - } else { - - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - - _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) ); - _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) ); - - } - - }; - - this.setTexture = function ( texture, slot ) { - - if ( texture.needsUpdate ) { - - if ( ! texture.__webglInit ) { - - texture.__webglInit = true; - texture.__webglTexture = _gl.createTexture(); - - _this.info.memory.textures ++; - - } - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture ); - - var image = texture.image, - isImagePowerOfTwo = isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ), - glFormat = paramThreeToGL( texture.format ), - glType = paramThreeToGL( texture.type ); - - setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo ); - - if ( texture instanceof THREE.DataTexture ) { - - _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); - - } else { - - _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image ); - - } - - if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); - - texture.needsUpdate = false; - - if ( texture.onUpdated ) texture.onUpdated(); - - } else { - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture ); - - } - - }; - - function clampToMaxSize ( image, maxSize ) { - - if ( image.width <= maxSize && image.height <= maxSize ) { - - return image; - - } - - // Warning: Scaling through the canvas will only work with images that use - // premultiplied alpha. - - var maxDimension = Math.max( image.width, image.height ); - var newWidth = Math.floor( image.width * maxSize / maxDimension ); - var newHeight = Math.floor( image.height * maxSize / maxDimension ); - - var canvas = document.createElement( 'canvas' ); - canvas.width = newWidth; - canvas.height = newHeight; - - var ctx = canvas.getContext( "2d" ); - ctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, newWidth, newHeight ); - - return canvas; - - } - - function setCubeTexture ( texture, slot ) { - - if ( texture.image.length === 6 ) { - - if ( texture.needsUpdate ) { - - if ( ! texture.image.__webglTextureCube ) { - - texture.image.__webglTextureCube = _gl.createTexture(); - - } - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube ); - - var cubeImage = []; - - for ( var i = 0; i < 6; i ++ ) { - - if ( _this.autoScaleCubemaps ) { - - cubeImage[ i ] = clampToMaxSize( texture.image[ i ], _maxCubemapSize ); - - } else { - - cubeImage[ i ] = texture.image[ i ]; - - } - - } - - var image = cubeImage[ 0 ], - isImagePowerOfTwo = isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ), - glFormat = paramThreeToGL( texture.format ), - glType = paramThreeToGL( texture.type ); - - setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo ); - - for ( var i = 0; i < 6; i ++ ) { - - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] ); - - } - - if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); - - texture.needsUpdate = false; - - if ( texture.onUpdated ) texture.onUpdated(); - - } else { - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube ); - - } - - } - - }; - - function setCubeTextureDynamic ( texture, slot ) { - - _gl.activeTexture( _gl.TEXTURE0 + slot ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture ); - - }; - - // Render targets - - function setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) { - - _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); - _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 ); - - }; - - function setupRenderBuffer ( renderbuffer, renderTarget ) { - - _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer ); - - if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height ); - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); - - /* For some reason this is not working. Defaulting to RGBA4. - } else if( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height ); - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); - */ - } else if( renderTarget.depthBuffer && renderTarget.stencilBuffer ) { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height ); - _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer ); - - } else { - - _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height ); - - } - - }; - - this.setRenderTarget = function ( renderTarget ) { - - var isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube ); - - if ( renderTarget && ! renderTarget.__webglFramebuffer ) { - - if( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true; - if( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true; - - renderTarget.__webglTexture = _gl.createTexture(); - - // Setup texture, create render and frame buffers - - var isTargetPowerOfTwo = isPowerOfTwo( renderTarget.width ) && isPowerOfTwo( renderTarget.height ), - glFormat = paramThreeToGL( renderTarget.format ), - glType = paramThreeToGL( renderTarget.type ); - - if ( isCube ) { - - renderTarget.__webglFramebuffer = []; - renderTarget.__webglRenderbuffer = []; - - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture ); - setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo ); - - for ( var i = 0; i < 6; i ++ ) { - - renderTarget.__webglFramebuffer[ i ] = _gl.createFramebuffer(); - renderTarget.__webglRenderbuffer[ i ] = _gl.createRenderbuffer(); - - _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); - - setupFrameBuffer( renderTarget.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i ); - setupRenderBuffer( renderTarget.__webglRenderbuffer[ i ], renderTarget ); - - } - - } else { - - renderTarget.__webglFramebuffer = _gl.createFramebuffer(); - renderTarget.__webglRenderbuffer = _gl.createRenderbuffer(); - - _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture ); - setTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo ); - - _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null ); - - setupFrameBuffer( renderTarget.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D ); - setupRenderBuffer( renderTarget.__webglRenderbuffer, renderTarget ); - - } - - // Release everything - - if ( isCube ) { - - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); - - } else { - - _gl.bindTexture( _gl.TEXTURE_2D, null ); - - } - - _gl.bindRenderbuffer( _gl.RENDERBUFFER, null ); - _gl.bindFramebuffer( _gl.FRAMEBUFFER, null); - - } - - var framebuffer, width, height, vx, vy; - - if ( renderTarget ) { - - if ( isCube ) { - - framebuffer = renderTarget.__webglFramebuffer[ renderTarget.activeCubeFace ]; - - } else { - - framebuffer = renderTarget.__webglFramebuffer; - - } - - width = renderTarget.width; - height = renderTarget.height; - - vx = 0; - vy = 0; - - } else { - - framebuffer = null; - - width = _viewportWidth; - height = _viewportHeight; - - vx = _viewportX; - vy = _viewportY; - - } - - if ( framebuffer !== _currentFramebuffer ) { - - _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); - _gl.viewport( vx, vy, width, height ); - - _currentFramebuffer = framebuffer; - - } - - _currentWidth = width; - _currentHeight = height; - - }; - - function updateRenderTargetMipmap ( renderTarget ) { - - if ( renderTarget instanceof THREE.WebGLRenderTargetCube ) { - - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture ); - _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); - _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null ); - - } else { - - _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture ); - _gl.generateMipmap( _gl.TEXTURE_2D ); - _gl.bindTexture( _gl.TEXTURE_2D, null ); - - } - - }; - - // Fallback filters for non-power-of-2 textures - - function filterFallback ( f ) { - - switch ( f ) { - - case THREE.NearestFilter: - case THREE.NearestMipMapNearestFilter: - case THREE.NearestMipMapLinearFilter: return _gl.NEAREST; break; - - case THREE.LinearFilter: - case THREE.LinearMipMapNearestFilter: - case THREE.LinearMipMapLinearFilter: - default: - - return _gl.LINEAR; break; - - } - - }; - - // Map three.js constants to WebGL constants - - function paramThreeToGL ( p ) { - - switch ( p ) { - - case THREE.RepeatWrapping: return _gl.REPEAT; break; - case THREE.ClampToEdgeWrapping: return _gl.CLAMP_TO_EDGE; break; - case THREE.MirroredRepeatWrapping: return _gl.MIRRORED_REPEAT; break; - - case THREE.NearestFilter: return _gl.NEAREST; break; - case THREE.NearestMipMapNearestFilter: return _gl.NEAREST_MIPMAP_NEAREST; break; - case THREE.NearestMipMapLinearFilter: return _gl.NEAREST_MIPMAP_LINEAR; break; - - case THREE.LinearFilter: return _gl.LINEAR; break; - case THREE.LinearMipMapNearestFilter: return _gl.LINEAR_MIPMAP_NEAREST; break; - case THREE.LinearMipMapLinearFilter: return _gl.LINEAR_MIPMAP_LINEAR; break; - - case THREE.ByteType: return _gl.BYTE; break; - case THREE.UnsignedByteType: return _gl.UNSIGNED_BYTE; break; - case THREE.ShortType: return _gl.SHORT; break; - case THREE.UnsignedShortType: return _gl.UNSIGNED_SHORT; break; - case THREE.IntType: return _gl.INT; break; - case THREE.UnsignedShortType: return _gl.UNSIGNED_INT; break; - case THREE.FloatType: return _gl.FLOAT; break; - - case THREE.AlphaFormat: return _gl.ALPHA; break; - case THREE.RGBFormat: return _gl.RGB; break; - case THREE.RGBAFormat: return _gl.RGBA; break; - case THREE.LuminanceFormat: return _gl.LUMINANCE; break; - case THREE.LuminanceAlphaFormat: return _gl.LUMINANCE_ALPHA; break; - - } - - return 0; - - }; - - // Allocations - - function allocateBones ( object ) { - - // default for when object is not specified - // ( for example when prebuilding shader - // to be used with multiple objects ) - // - // - leave some extra space for other uniforms - // - limit here is ANGLE's 254 max uniform vectors - // (up to 54 should be safe) - - var maxBones = 50; - - if ( object !== undefined && object instanceof THREE.SkinnedMesh ) { - - maxBones = object.bones.length; - - } - - return maxBones; - - }; - - function allocateLights ( lights ) { - - var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights; - dirLights = pointLights = maxDirLights = maxPointLights = 0; - - for ( l = 0, ll = lights.length; l < ll; l++ ) { - - light = lights[ l ]; - - if ( light.onlyShadow ) continue; - - if ( light instanceof THREE.DirectionalLight ) dirLights ++; - if ( light instanceof THREE.PointLight ) pointLights ++; - if ( light instanceof THREE.SpotLight ) pointLights ++; - - } - - if ( ( pointLights + dirLights ) <= _maxLights ) { - - maxDirLights = dirLights; - maxPointLights = pointLights; - - } else { - - maxDirLights = Math.ceil( _maxLights * dirLights / ( pointLights + dirLights ) ); - maxPointLights = _maxLights - maxDirLights; - - } - - return { 'directional' : maxDirLights, 'point' : maxPointLights }; - - }; - - function allocateShadows ( lights ) { - - var l, ll, light, maxShadows = 0; - - for ( l = 0, ll = lights.length; l < ll; l++ ) { - - light = lights[ l ]; - - if ( ! light.castShadow ) continue; - - if ( light instanceof THREE.SpotLight || light instanceof THREE.DirectionalLight ) maxShadows ++; - - } - - return maxShadows; - - }; - - // Initialization - - function initGL () { - - var gl; - - try { - - if ( ! ( gl = _canvas.getContext( 'experimental-webgl', { alpha: _alpha, premultipliedAlpha: _premultipliedAlpha, antialias: _antialias, stencil: _stencil, preserveDrawingBuffer: _preserveDrawingBuffer } ) ) ) { - - throw 'Error creating WebGL context.'; - - } - - console.log( - navigator.userAgent + " | " + - gl.getParameter( gl.VERSION ) + " | " + - gl.getParameter( gl.VENDOR ) + " | " + - gl.getParameter( gl.RENDERER ) + " | " + - gl.getParameter( gl.SHADING_LANGUAGE_VERSION ) - ); - - } catch ( error ) { - - console.error( error ); - - } - - return gl; - - }; - - function setDefaultGLState () { - - _gl.clearColor( 0, 0, 0, 1 ); - _gl.clearDepth( 1 ); - _gl.clearStencil( 0 ); - - _gl.enable( _gl.DEPTH_TEST ); - _gl.depthFunc( _gl.LEQUAL ); - - _gl.frontFace( _gl.CCW ); - _gl.cullFace( _gl.BACK ); - _gl.enable( _gl.CULL_FACE ); - - _gl.enable( _gl.BLEND ); - _gl.blendEquation( _gl.FUNC_ADD ); - _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA ); - - _gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha ); - - }; - - // default plugins (order is important) - - this.shadowMapPlugin = new THREE.ShadowMapPlugin(); - this.addPrePlugin( this.shadowMapPlugin ); - - this.addPostPlugin( new THREE.SpritePlugin() ); - this.addPostPlugin( new THREE.LensFlarePlugin() ); - -}; -/** - * @author szimek / https://github.com/szimek/ - */ - -THREE.WebGLRenderTarget = function ( width, height, options ) { - - this.width = width; - this.height = height; - - options = options || {}; - - this.wrapS = options.wrapS !== undefined ? options.wrapS : THREE.ClampToEdgeWrapping; - this.wrapT = options.wrapT !== undefined ? options.wrapT : THREE.ClampToEdgeWrapping; - - this.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter; - this.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter; - - this.offset = new THREE.Vector2( 0, 0 ); - this.repeat = new THREE.Vector2( 1, 1 ); - - this.format = options.format !== undefined ? options.format : THREE.RGBAFormat; - this.type = options.type !== undefined ? options.type : THREE.UnsignedByteType; - - this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true; - this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true; - - this.generateMipmaps = true; - -}; - -THREE.WebGLRenderTarget.prototype.clone = function() { - - var tmp = new THREE.WebGLRenderTarget( this.width, this.height ); - - tmp.wrapS = this.wrapS; - tmp.wrapT = this.wrapT; - - tmp.magFilter = this.magFilter; - tmp.minFilter = this.minFilter; - - tmp.offset.copy( this.offset ); - tmp.repeat.copy( this.repeat ); - - tmp.format = this.format; - tmp.type = this.type; - - tmp.depthBuffer = this.depthBuffer; - tmp.stencilBuffer = this.stencilBuffer; - - return tmp; - -}; -/** - * @author alteredq / http://alteredqualia.com - */ - -THREE.WebGLRenderTargetCube = function ( width, height, options ) { - - THREE.WebGLRenderTarget.call( this, width, height, options ); - - this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 - -}; - -THREE.WebGLRenderTargetCube.prototype = new THREE.WebGLRenderTarget(); -THREE.WebGLRenderTargetCube.prototype.constructor = THREE.WebGLRenderTargetCube; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.RenderableVertex = function () { - - this.positionWorld = new THREE.Vector3(); - this.positionScreen = new THREE.Vector4(); - - this.visible = true; - -}; - -THREE.RenderableVertex.prototype.copy = function ( vertex ) { - - this.positionWorld.copy( vertex.positionWorld ); - this.positionScreen.copy( vertex.positionScreen ); - -} -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.RenderableFace3 = function () { - - this.v1 = new THREE.RenderableVertex(); - this.v2 = new THREE.RenderableVertex(); - this.v3 = new THREE.RenderableVertex(); - - this.centroidWorld = new THREE.Vector3(); - this.centroidScreen = new THREE.Vector3(); - - this.normalWorld = new THREE.Vector3(); - this.vertexNormalsWorld = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]; - - this.material = null; - this.faceMaterial = null; - this.uvs = [[]]; - - this.z = null; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.RenderableFace4 = function () { - - this.v1 = new THREE.RenderableVertex(); - this.v2 = new THREE.RenderableVertex(); - this.v3 = new THREE.RenderableVertex(); - this.v4 = new THREE.RenderableVertex(); - - this.centroidWorld = new THREE.Vector3(); - this.centroidScreen = new THREE.Vector3(); - - this.normalWorld = new THREE.Vector3(); - this.vertexNormalsWorld = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]; - - this.material = null; - this.faceMaterial = null; - this.uvs = [[]]; - - this.z = null; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.RenderableObject = function () { - - this.object = null; - this.z = null; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.RenderableParticle = function () { - - this.x = null; - this.y = null; - this.z = null; - - this.rotation = null; - this.scale = new THREE.Vector2(); - - this.material = null; - -}; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.RenderableLine = function () { - - this.z = null; - - this.v1 = new THREE.RenderableVertex(); - this.v2 = new THREE.RenderableVertex(); - - this.material = null; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.ColorUtils = { - - adjustHSV : function ( color, h, s, v ) { - - var hsv = THREE.ColorUtils.__hsv; - - THREE.ColorUtils.rgbToHsv( color, hsv ); - - hsv.h = THREE.Math.clamp( hsv.h + h, 0, 1 ); - hsv.s = THREE.Math.clamp( hsv.s + s, 0, 1 ); - hsv.v = THREE.Math.clamp( hsv.v + v, 0, 1 ); - - color.setHSV( hsv.h, hsv.s, hsv.v ); - - }, - - // based on MochiKit implementation by Bob Ippolito - - rgbToHsv : function ( color, hsv ) { - - var r = color.r; - var g = color.g; - var b = color.b; - - var max = Math.max( Math.max( r, g ), b ); - var min = Math.min( Math.min( r, g ), b ); - - var hue; - var saturation; - var value = max; - - if ( min === max ) { - - hue = 0; - saturation = 0; - - } else { - - var delta = ( max - min ); - saturation = delta / max; - - if ( r === max ) { - - hue = ( g - b ) / delta; - - } else if ( g === max ) { - - hue = 2 + ( ( b - r ) / delta ); - - } else { - - hue = 4 + ( ( r - g ) / delta ); - } - - hue /= 6; - - if ( hue < 0 ) { - - hue += 1; - - } - - if ( hue > 1 ) { - - hue -= 1; - - } - - } - - if ( hsv === undefined ) { - - hsv = { h: 0, s: 0, v: 0 }; - - } - - hsv.h = hue; - hsv.s = saturation; - hsv.v = value; - - return hsv; - - } - -}; - -THREE.ColorUtils.__hsv = { h: 0, s: 0, v: 0 };/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.GeometryUtils = { - - // Merge two geometries or geometry and geometry from object (using object's transform) - - merge: function ( geometry1, object2 /* mesh | geometry */ ) { - - var matrix, matrixRotation, - vertexOffset = geometry1.vertices.length, - uvPosition = geometry1.faceVertexUvs[ 0 ].length, - geometry2 = object2 instanceof THREE.Mesh ? object2.geometry : object2, - vertices1 = geometry1.vertices, - vertices2 = geometry2.vertices, - faces1 = geometry1.faces, - faces2 = geometry2.faces, - uvs1 = geometry1.faceVertexUvs[ 0 ], - uvs2 = geometry2.faceVertexUvs[ 0 ]; - - var geo1MaterialsMap = {}; - - for ( var i = 0; i < geometry1.materials.length; i ++ ) { - - var id = geometry1.materials[ i ].id; - - geo1MaterialsMap[ id ] = i; - - } - - - if ( object2 instanceof THREE.Mesh ) { - - object2.matrixAutoUpdate && object2.updateMatrix(); - - matrix = object2.matrix; - matrixRotation = new THREE.Matrix4(); - matrixRotation.extractRotation( matrix, object2.scale ); - - } - - // vertices - - for ( var i = 0, il = vertices2.length; i < il; i ++ ) { - - var vertex = vertices2[ i ]; - - var vertexCopy = new THREE.Vertex( vertex.position.clone() ); - - if ( matrix ) matrix.multiplyVector3( vertexCopy.position ); - - vertices1.push( vertexCopy ); - - } - - // faces - - for ( i = 0, il = faces2.length; i < il; i ++ ) { - - var face = faces2[ i ], faceCopy, normal, color, - faceVertexNormals = face.vertexNormals, - faceVertexColors = face.vertexColors; - - if ( face instanceof THREE.Face3 ) { - - faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); - - } else if ( face instanceof THREE.Face4 ) { - - faceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset ); - - } - - faceCopy.normal.copy( face.normal ); - - if ( matrixRotation ) matrixRotation.multiplyVector3( faceCopy.normal ); - - for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { - - normal = faceVertexNormals[ j ].clone(); - - if ( matrixRotation ) matrixRotation.multiplyVector3( normal ); - - faceCopy.vertexNormals.push( normal ); - - } - - faceCopy.color.copy( face.color ); - - for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { - - color = faceVertexColors[ j ]; - faceCopy.vertexColors.push( color.clone() ); - - } - - if ( face.materialIndex !== undefined ) { - - var material2 = geometry2.materials[ face.materialIndex ]; - var materialId2 = material2.id; - - var materialIndex = geo1MaterialsMap[ materialId2 ]; - - if ( materialIndex === undefined ) { - - materialIndex = geometry1.materials.length; - geo1MaterialsMap[ materialId2 ] = materialIndex; - - geometry1.materials.push( material2 ); - - } - - faceCopy.materialIndex = materialIndex; - - } - - faceCopy.centroid.copy( face.centroid ); - if ( matrix ) matrix.multiplyVector3( faceCopy.centroid ); - - faces1.push( faceCopy ); - - } - - // uvs - - for ( i = 0, il = uvs2.length; i < il; i ++ ) { - - var uv = uvs2[ i ], uvCopy = []; - - for ( var j = 0, jl = uv.length; j < jl; j ++ ) { - - uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) ); - - } - - uvs1.push( uvCopy ); - - } - - }, - - clone: function ( geometry ) { - - var cloneGeo = new THREE.Geometry(); - - var i, il; - - var vertices = geometry.vertices, - faces = geometry.faces, - uvs = geometry.faceVertexUvs[ 0 ]; - - // materials - - if ( geometry.materials ) { - - cloneGeo.materials = geometry.materials.slice(); - - } - - // vertices - - for ( i = 0, il = vertices.length; i < il; i ++ ) { - - var vertex = vertices[ i ]; - var vertexCopy = new THREE.Vertex( vertex.position.clone() ); - - cloneGeo.vertices.push( vertexCopy ); - - } - - // faces - - for ( i = 0, il = faces.length; i < il; i ++ ) { - - var face = faces[ i ], faceCopy, normal, color, - faceVertexNormals = face.vertexNormals, - faceVertexColors = face.vertexColors; - - if ( face instanceof THREE.Face3 ) { - - faceCopy = new THREE.Face3( face.a, face.b, face.c ); - - } else if ( face instanceof THREE.Face4 ) { - - faceCopy = new THREE.Face4( face.a, face.b, face.c, face.d ); - - } - - faceCopy.normal.copy( face.normal ); - - for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { - - normal = faceVertexNormals[ j ]; - faceCopy.vertexNormals.push( normal.clone() ); - - } - - faceCopy.color.copy( face.color ); - - for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { - - color = faceVertexColors[ j ]; - faceCopy.vertexColors.push( color.clone() ); - - } - - faceCopy.materialIndex = face.materialIndex; - - faceCopy.centroid.copy( face.centroid ); - - cloneGeo.faces.push( faceCopy ); - - } - - // uvs - - for ( i = 0, il = uvs.length; i < il; i ++ ) { - - var uv = uvs[ i ], uvCopy = []; - - for ( var j = 0, jl = uv.length; j < jl; j ++ ) { - - uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) ); - - } - - cloneGeo.faceVertexUvs[ 0 ].push( uvCopy ); - - } - - return cloneGeo; - - }, - - // Get random point in triangle (via barycentric coordinates) - // (uniform distribution) - // http://www.cgafaq.info/wiki/Random_Point_In_Triangle - - randomPointInTriangle: function ( vectorA, vectorB, vectorC ) { - - var a, b, c, - point = new THREE.Vector3(), - tmp = THREE.GeometryUtils.__v1; - - a = THREE.GeometryUtils.random(); - b = THREE.GeometryUtils.random(); - - if ( ( a + b ) > 1 ) { - - a = 1 - a; - b = 1 - b; - - } - - c = 1 - a - b; - - point.copy( vectorA ); - point.multiplyScalar( a ); - - tmp.copy( vectorB ); - tmp.multiplyScalar( b ); - - point.addSelf( tmp ); - - tmp.copy( vectorC ); - tmp.multiplyScalar( c ); - - point.addSelf( tmp ); - - return point; - - }, - - // Get random point in face (triangle / quad) - // (uniform distribution) - - randomPointInFace: function ( face, geometry, useCachedAreas ) { - - var vA, vB, vC, vD; - - if ( face instanceof THREE.Face3 ) { - - vA = geometry.vertices[ face.a ].position; - vB = geometry.vertices[ face.b ].position; - vC = geometry.vertices[ face.c ].position; - - return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC ); - - } else if ( face instanceof THREE.Face4 ) { - - vA = geometry.vertices[ face.a ].position; - vB = geometry.vertices[ face.b ].position; - vC = geometry.vertices[ face.c ].position; - vD = geometry.vertices[ face.d ].position; - - var area1, area2; - - if ( useCachedAreas ) { - - if ( face._area1 && face._area2 ) { - - area1 = face._area1; - area2 = face._area2; - - } else { - - area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ); - area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD ); - - face._area1 = area1; - face._area2 = area2; - - } - - } else { - - area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ), - area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD ); - - } - - var r = THREE.GeometryUtils.random() * ( area1 + area2 ); - - if ( r < area1 ) { - - return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vD ); - - } else { - - return THREE.GeometryUtils.randomPointInTriangle( vB, vC, vD ); - - } - - } - - }, - - // Get uniformly distributed random points in mesh - // - create array with cumulative sums of face areas - // - pick random number from 0 to total area - // - find corresponding place in area array by binary search - // - get random point in face - - randomPointsInGeometry: function ( geometry, n ) { - - var face, i, - faces = geometry.faces, - vertices = geometry.vertices, - il = faces.length, - totalArea = 0, - cumulativeAreas = [], - vA, vB, vC, vD; - - // precompute face areas - - for ( i = 0; i < il; i ++ ) { - - face = faces[ i ]; - - if ( face instanceof THREE.Face3 ) { - - vA = vertices[ face.a ].position; - vB = vertices[ face.b ].position; - vC = vertices[ face.c ].position; - - face._area = THREE.GeometryUtils.triangleArea( vA, vB, vC ); - - } else if ( face instanceof THREE.Face4 ) { - - vA = vertices[ face.a ].position; - vB = vertices[ face.b ].position; - vC = vertices[ face.c ].position; - vD = vertices[ face.d ].position; - - face._area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ); - face._area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD ); - - face._area = face._area1 + face._area2; - - } - - totalArea += face._area; - - cumulativeAreas[ i ] = totalArea; - - } - - // binary search cumulative areas array - - function binarySearchIndices( value ) { - - function binarySearch( start, end ) { - - // return closest larger index - // if exact number is not found - - if ( end < start ) - return start; - - var mid = start + Math.floor( ( end - start ) / 2 ); - - if ( cumulativeAreas[ mid ] > value ) { - - return binarySearch( start, mid - 1 ); - - } else if ( cumulativeAreas[ mid ] < value ) { - - return binarySearch( mid + 1, end ); - - } else { - - return mid; - - } - - } - - var result = binarySearch( 0, cumulativeAreas.length - 1 ) - return result; - - } - - // pick random face weighted by face area - - var r, index, - result = []; - - var stats = {}; - - for ( i = 0; i < n; i ++ ) { - - r = THREE.GeometryUtils.random() * totalArea; - - index = binarySearchIndices( r ); - - result[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true ); - - if ( ! stats[ index ] ) { - - stats[ index ] = 1; - - } else { - - stats[ index ] += 1; - - } - - } - - return result; - - }, - - // Get triangle area (by Heron's formula) - // http://en.wikipedia.org/wiki/Heron%27s_formula - - triangleArea: function ( vectorA, vectorB, vectorC ) { - - var s, a, b, c, - tmp = THREE.GeometryUtils.__v1; - - tmp.sub( vectorA, vectorB ); - a = tmp.length(); - - tmp.sub( vectorA, vectorC ); - b = tmp.length(); - - tmp.sub( vectorB, vectorC ); - c = tmp.length(); - - s = 0.5 * ( a + b + c ); - - return Math.sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) ); - - }, - - // Center geometry so that 0,0,0 is in center of bounding box - - center: function ( geometry ) { - - geometry.computeBoundingBox(); - - var bb = geometry.boundingBox; - - var offset = new THREE.Vector3(); - - offset.add( bb.min, bb.max ); - offset.multiplyScalar( -0.5 ); - - geometry.applyMatrix( new THREE.Matrix4().setTranslation( offset.x, offset.y, offset.z ) ); - geometry.computeBoundingBox(); - - return offset; - - }, - - // Normalize UVs to be from <0,1> - // (for now just the first set of UVs) - - normalizeUVs: function ( geometry ) { - - var uvSet = geometry.faceVertexUvs[ 0 ]; - - for ( var i = 0, il = uvSet.length; i < il; i ++ ) { - - var uvs = uvSet[ i ]; - - for ( var j = 0, jl = uvs.length; j < jl; j ++ ) { - - // texture repeat - - if( uvs[ j ].u !== 1.0 ) uvs[ j ].u = uvs[ j ].u - Math.floor( uvs[ j ].u ); - if( uvs[ j ].v !== 1.0 ) uvs[ j ].v = uvs[ j ].v - Math.floor( uvs[ j ].v ); - - } - - } - - } - -}; - -THREE.GeometryUtils.random = THREE.Math.random16; - -THREE.GeometryUtils.__v1 = new THREE.Vector3(); -/** - * @author alteredq / http://alteredqualia.com/ - * @author mrdoob / http://mrdoob.com/ - */ - -THREE.ImageUtils = { - - crossOrigin: '', - - loadTexture: function ( path, mapping, callback ) { - - var image = new Image(), texture = new THREE.Texture( image, mapping ); - - image.onload = function () { texture.needsUpdate = true; if ( callback ) callback( this ); }; - image.crossOrigin = this.crossOrigin; - image.src = path; - - return texture; - - }, - - loadTextureCube: function ( array, mapping, callback ) { - - var i, l, images = [], texture = new THREE.Texture( images, mapping ); - - images.loadCount = 0; - - for ( i = 0, l = array.length; i < l; ++ i ) { - - images[ i ] = new Image(); - images[ i ].onload = function () { - - images.loadCount += 1; - if ( images.loadCount === 6 ) texture.needsUpdate = true; - if ( callback ) callback( this ); - - }; - - images[ i ].crossOrigin = ''; - images[ i ].src = array[ i ]; - - } - - return texture; - - }, - - getNormalMap: function ( image, depth ) { - - // Adapted from http://www.paulbrunt.co.uk/lab/heightnormal/ - - var cross = function ( a, b ) { - - return [ a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ], a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ], a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ] ]; - - } - - var subtract = function ( a, b ) { - - return [ a[ 0 ] - b[ 0 ], a[ 1 ] - b[ 1 ], a[ 2 ] - b[ 2 ] ]; - - } - - var normalize = function ( a ) { - - var l = Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] ); - return [ a[ 0 ] / l, a[ 1 ] / l, a[ 2 ] / l ]; - - } - - depth = depth | 1; - - var width = image.width; - var height = image.height; - - var canvas = document.createElement( 'canvas' ); - canvas.width = width; - canvas.height = height; - - var context = canvas.getContext( '2d' ); - context.drawImage( image, 0, 0 ); - - var data = context.getImageData( 0, 0, width, height ).data; - var imageData = context.createImageData( width, height ); - var output = imageData.data; - - for ( var x = 0; x < width; x ++ ) { - - for ( var y = 1; y < height; y ++ ) { - - var ly = y - 1 < 0 ? height - 1 : y - 1; - var uy = ( y + 1 ) % height; - var lx = x - 1 < 0 ? width - 1 : x - 1; - var ux = ( x + 1 ) % width; - - var points = []; - var origin = [ 0, 0, data[ ( y * width + x ) * 4 ] / 255 * depth ]; - points.push( [ - 1, 0, data[ ( y * width + lx ) * 4 ] / 255 * depth ] ); - points.push( [ - 1, - 1, data[ ( ly * width + lx ) * 4 ] / 255 * depth ] ); - points.push( [ 0, - 1, data[ ( ly * width + x ) * 4 ] / 255 * depth ] ); - points.push( [ 1, - 1, data[ ( ly * width + ux ) * 4 ] / 255 * depth ] ); - points.push( [ 1, 0, data[ ( y * width + ux ) * 4 ] / 255 * depth ] ); - points.push( [ 1, 1, data[ ( uy * width + ux ) * 4 ] / 255 * depth ] ); - points.push( [ 0, 1, data[ ( uy * width + x ) * 4 ] / 255 * depth ] ); - points.push( [ - 1, 1, data[ ( uy * width + lx ) * 4 ] / 255 * depth ] ); - - var normals = []; - var num_points = points.length; - - for ( var i = 0; i < num_points; i ++ ) { - - var v1 = points[ i ]; - var v2 = points[ ( i + 1 ) % num_points ]; - v1 = subtract( v1, origin ); - v2 = subtract( v2, origin ); - normals.push( normalize( cross( v1, v2 ) ) ); - - } - - var normal = [ 0, 0, 0 ]; - - for ( var i = 0; i < normals.length; i ++ ) { - - normal[ 0 ] += normals[ i ][ 0 ]; - normal[ 1 ] += normals[ i ][ 1 ]; - normal[ 2 ] += normals[ i ][ 2 ]; - - } - - normal[ 0 ] /= normals.length; - normal[ 1 ] /= normals.length; - normal[ 2 ] /= normals.length; - - var idx = ( y * width + x ) * 4; - - output[ idx ] = ( ( normal[ 0 ] + 1.0 ) / 2.0 * 255 ) | 0; - output[ idx + 1 ] = ( ( normal[ 1 ] + 1.0 / 2.0 ) * 255 ) | 0; - output[ idx + 2 ] = ( normal[ 2 ] * 255 ) | 0; - output[ idx + 3 ] = 255; - - } - - } - - context.putImageData( imageData, 0, 0 ); - - return canvas; - - } - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SceneUtils = { - - showHierarchy : function ( root, visible ) { - - THREE.SceneUtils.traverseHierarchy( root, function( node ) { node.visible = visible; } ); - - }, - - traverseHierarchy : function ( root, callback ) { - - var n, i, l = root.children.length; - - for ( i = 0; i < l; i ++ ) { - - n = root.children[ i ]; - - callback( n ); - - THREE.SceneUtils.traverseHierarchy( n, callback ); - - } - - }, - - createMultiMaterialObject : function ( geometry, materials ) { - - var i, il = materials.length, - group = new THREE.Object3D(); - - for ( i = 0; i < il; i ++ ) { - - var object = new THREE.Mesh( geometry, materials[ i ] ); - group.add( object ); - - } - - return group; - - }, - - cloneObject: function ( source ) { - - var object; - - // subclass specific properties - // (must process in order from more specific subclasses to more abstract classes) - - if ( source instanceof THREE.MorphAnimMesh ) { - - object = new THREE.MorphAnimMesh( source.geometry, source.material ); - - object.duration = source.duration; - object.mirroredLoop = source.mirroredLoop; - object.time = source.time; - - object.lastKeyframe = source.lastKeyframe; - object.currentKeyframe = source.currentKeyframe; - - object.direction = source.direction; - object.directionBackwards = source.directionBackwards; - - } else if ( source instanceof THREE.SkinnedMesh ) { - - object = new THREE.SkinnedMesh( source.geometry, source.material ); - - } else if ( source instanceof THREE.Mesh ) { - - object = new THREE.Mesh( source.geometry, source.material ); - - } else if ( source instanceof THREE.Line ) { - - object = new THREE.Line( source.geometry, source.material, source.type ); - - } else if ( source instanceof THREE.Ribbon ) { - - object = new THREE.Ribbon( source.geometry, source.material ); - - } else if ( source instanceof THREE.ParticleSystem ) { - - object = new THREE.ParticleSystem( source.geometry, source.material ); - object.sortParticles = source.sortParticles; - - } else if ( source instanceof THREE.Particle ) { - - object = new THREE.Particle( source.material ); - - } else if ( source instanceof THREE.Sprite ) { - - object = new THREE.Sprite( {} ); - - object.color.copy( source.color ); - object.map = source.map; - object.blending = source.blending; - - object.useScreenCoordinates = source.useScreenCoordinates; - object.mergeWith3D = source.mergeWith3D; - object.affectedByDistance = source.affectedByDistance; - object.scaleByViewport = source.scaleByViewport; - object.alignment = source.alignment; - - object.rotation3d.copy( source.rotation3d ); - object.rotation = source.rotation; - object.opacity = source.opacity; - - object.uvOffset.copy( source.uvOffset ); - object.uvScale.copy( source.uvScale); - - } else if ( source instanceof THREE.LOD ) { - - object = new THREE.LOD(); - - } else if ( source instanceof THREE.MarchingCubes ) { - - object = new THREE.MarchingCubes( source.resolution, source.material ); - object.field.set( source.field ); - object.isolation = source.isolation; - - } else if ( source instanceof THREE.Object3D ) { - - object = new THREE.Object3D(); - - } - - // base class properties - - object.name = source.name; - - object.parent = source.parent; - - object.up.copy( source.up ); - - object.position.copy( source.position ); - - // because of Sprite madness - - if ( object.rotation instanceof THREE.Vector3 ) - object.rotation.copy( source.rotation ); - - object.eulerOrder = source.eulerOrder; - - object.scale.copy( source.scale ); - - object.dynamic = source.dynamic; - - object.doubleSided = source.doubleSided; - object.flipSided = source.flipSided; - - object.renderDepth = source.renderDepth; - - object.rotationAutoUpdate = source.rotationAutoUpdate; - - object.matrix.copy( source.matrix ); - object.matrixWorld.copy( source.matrixWorld ); - object.matrixRotationWorld.copy( source.matrixRotationWorld ); - - object.matrixAutoUpdate = source.matrixAutoUpdate; - object.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate; - - object.quaternion.copy( source.quaternion ); - object.useQuaternion = source.useQuaternion; - - object.boundRadius = source.boundRadius; - object.boundRadiusScale = source.boundRadiusScale; - - object.visible = source.visible; - - object.castShadow = source.castShadow; - object.receiveShadow = source.receiveShadow; - - object.frustumCulled = source.frustumCulled; - - // children - - for ( var i = 0; i < source.children.length; i ++ ) { - - var child = THREE.SceneUtils.cloneObject( source.children[ i ] ); - object.children[ i ] = child; - - child.parent = object; - - } - - // LODs need to be patched separately to use cloned children - - if ( source instanceof THREE.LOD ) { - - for ( var i = 0; i < source.LODs.length; i ++ ) { - - var lod = source.LODs[ i ]; - object.LODs[ i ] = { visibleAtDistance: lod.visibleAtDistance, object3D: object.children[ i ] }; - - } - - } - - return object; - - } - -}; -/** - * @author alteredq / http://alteredqualia.com/ - * @author mr.doob / http://mrdoob.com/ - * - * ShaderUtils currently contains: - * - * fresnel - * normal - * cube - * - */ - -if ( THREE.WebGLRenderer ) { - -THREE.ShaderUtils = { - - lib: { - - /* ------------------------------------------------------------------------- - // Fresnel shader - // - based on Nvidia Cg tutorial - ------------------------------------------------------------------------- */ - - 'fresnel': { - - uniforms: { - - "mRefractionRatio": { type: "f", value: 1.02 }, - "mFresnelBias": { type: "f", value: 0.1 }, - "mFresnelPower": { type: "f", value: 2.0 }, - "mFresnelScale": { type: "f", value: 1.0 }, - "tCube": { type: "t", value: 1, texture: null } - - }, - - fragmentShader: [ - - "uniform samplerCube tCube;", - - "varying vec3 vReflect;", - "varying vec3 vRefract[3];", - "varying float vReflectionFactor;", - - "void main() {", - - "vec4 reflectedColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );", - "vec4 refractedColor = vec4( 1.0, 1.0, 1.0, 1.0 );", - - "refractedColor.r = textureCube( tCube, vec3( -vRefract[0].x, vRefract[0].yz ) ).r;", - "refractedColor.g = textureCube( tCube, vec3( -vRefract[1].x, vRefract[1].yz ) ).g;", - "refractedColor.b = textureCube( tCube, vec3( -vRefract[2].x, vRefract[2].yz ) ).b;", - "refractedColor.a = 1.0;", - - "gl_FragColor = mix( refractedColor, reflectedColor, clamp( vReflectionFactor, 0.0, 1.0 ) );", - - "}" - - ].join("\n"), - - vertexShader: [ - - "uniform float mRefractionRatio;", - "uniform float mFresnelBias;", - "uniform float mFresnelScale;", - "uniform float mFresnelPower;", - - "varying vec3 vReflect;", - "varying vec3 vRefract[3];", - "varying float vReflectionFactor;", - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - "vec4 mPosition = objectMatrix * vec4( position, 1.0 );", - - "vec3 nWorld = normalize ( mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal );", - - "vec3 I = mPosition.xyz - cameraPosition;", - - "vReflect = reflect( I, nWorld );", - "vRefract[0] = refract( normalize( I ), nWorld, mRefractionRatio );", - "vRefract[1] = refract( normalize( I ), nWorld, mRefractionRatio * 0.99 );", - "vRefract[2] = refract( normalize( I ), nWorld, mRefractionRatio * 0.98 );", - "vReflectionFactor = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( I ), nWorld ), mFresnelPower );", - - "gl_Position = projectionMatrix * mvPosition;", - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Normal map shader - // - Blinn-Phong - // - normal + diffuse + specular + AO + displacement + reflection + shadow maps - // - point and directional lights (use with "lights: true" material option) - ------------------------------------------------------------------------- */ - - 'normal' : { - - uniforms: THREE.UniformsUtils.merge( [ - - THREE.UniformsLib[ "fog" ], - THREE.UniformsLib[ "lights" ], - THREE.UniformsLib[ "shadowmap" ], - - { - - "enableAO" : { type: "i", value: 0 }, - "enableDiffuse" : { type: "i", value: 0 }, - "enableSpecular" : { type: "i", value: 0 }, - "enableReflection": { type: "i", value: 0 }, - - "tDiffuse" : { type: "t", value: 0, texture: null }, - "tCube" : { type: "t", value: 1, texture: null }, - "tNormal" : { type: "t", value: 2, texture: null }, - "tSpecular" : { type: "t", value: 3, texture: null }, - "tAO" : { type: "t", value: 4, texture: null }, - "tDisplacement": { type: "t", value: 5, texture: null }, - - "uNormalScale": { type: "f", value: 1.0 }, - - "uDisplacementBias": { type: "f", value: 0.0 }, - "uDisplacementScale": { type: "f", value: 1.0 }, - - "uDiffuseColor": { type: "c", value: new THREE.Color( 0xeeeeee ) }, - "uSpecularColor": { type: "c", value: new THREE.Color( 0x111111 ) }, - "uAmbientColor": { type: "c", value: new THREE.Color( 0x050505 ) }, - "uShininess": { type: "f", value: 30 }, - "uOpacity": { type: "f", value: 1 }, - - "uReflectivity": { type: "f", value: 0.5 }, - - "uOffset" : { type: "v2", value: new THREE.Vector2( 0, 0 ) }, - "uRepeat" : { type: "v2", value: new THREE.Vector2( 1, 1 ) }, - - "wrapRGB" : { type: "v3", value: new THREE.Vector3( 1, 1, 1 ) } - - } - - ] ), - - fragmentShader: [ - - "uniform vec3 uAmbientColor;", - "uniform vec3 uDiffuseColor;", - "uniform vec3 uSpecularColor;", - "uniform float uShininess;", - "uniform float uOpacity;", - - "uniform bool enableDiffuse;", - "uniform bool enableSpecular;", - "uniform bool enableAO;", - "uniform bool enableReflection;", - - "uniform sampler2D tDiffuse;", - "uniform sampler2D tNormal;", - "uniform sampler2D tSpecular;", - "uniform sampler2D tAO;", - - "uniform samplerCube tCube;", - - "uniform float uNormalScale;", - "uniform float uReflectivity;", - - "varying vec3 vTangent;", - "varying vec3 vBinormal;", - "varying vec3 vNormal;", - "varying vec2 vUv;", - - "uniform vec3 ambientLightColor;", - - "#if MAX_DIR_LIGHTS > 0", - "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];", - "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];", - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];", - "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];", - "#endif", - - "#ifdef WRAP_AROUND", - "uniform vec3 wrapRGB;", - "#endif", - - "varying vec3 vViewPosition;", - - THREE.ShaderChunk[ "shadowmap_pars_fragment" ], - THREE.ShaderChunk[ "fog_pars_fragment" ], - - "void main() {", - - "gl_FragColor = vec4( vec3( 1.0 ), uOpacity );", - - "vec3 specularTex = vec3( 1.0 );", - - "vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;", - "normalTex.xy *= uNormalScale;", - "normalTex = normalize( normalTex );", - - "if( enableDiffuse ) {", - - "#ifdef GAMMA_INPUT", - - "vec4 texelColor = texture2D( tDiffuse, vUv );", - "texelColor.xyz *= texelColor.xyz;", - - "gl_FragColor = gl_FragColor * texelColor;", - - "#else", - - "gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );", - - "#endif", - - "}", - - "if( enableAO ) {", - - "#ifdef GAMMA_INPUT", - - "vec4 aoColor = texture2D( tAO, vUv );", - "aoColor.xyz *= aoColor.xyz;", - - "gl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;", - - "#else", - - "gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;", - - "#endif", - - "}", - - "if( enableSpecular )", - "specularTex = texture2D( tSpecular, vUv ).xyz;", - - "mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );", - "vec3 finalNormal = tsb * normalTex;", - - "vec3 normal = normalize( finalNormal );", - "vec3 viewPosition = normalize( vViewPosition );", - - // point lights - - "#if MAX_POINT_LIGHTS > 0", - - "vec3 pointDiffuse = vec3( 0.0 );", - "vec3 pointSpecular = vec3( 0.0 );", - - "for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {", - - "vec3 pointVector = normalize( vPointLight[ i ].xyz );", - "float pointDistance = vPointLight[ i ].w;", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );", - "float pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );", - - "vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );", - - "#else", - - "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );", - - "#endif", - - "pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;", - - // specular - - "vec3 pointHalfVector = normalize( pointVector + viewPosition );", - "float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );", - "float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );", - - "pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;", - - "}", - - "#endif", - - // directional lights - - "#if MAX_DIR_LIGHTS > 0", - - "vec3 dirDiffuse = vec3( 0.0 );", - "vec3 dirSpecular = vec3( 0.0 );", - - "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {", - - "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );", - "vec3 dirVector = normalize( lDirection.xyz );", - - // diffuse - - "#ifdef WRAP_AROUND", - - "float directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );", - "float directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );", - - "vec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );", - - "#else", - - "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );", - - "#endif", - - "dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;", - - // specular - - "vec3 dirHalfVector = normalize( dirVector + viewPosition );", - "float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );", - "float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );", - - "dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;", - - "}", - - "#endif", - - // all lights contribution summation - - "vec3 totalDiffuse = vec3( 0.0 );", - "vec3 totalSpecular = vec3( 0.0 );", - - "#if MAX_DIR_LIGHTS > 0", - - "totalDiffuse += dirDiffuse;", - "totalSpecular += dirSpecular;", - - "#endif", - - "#if MAX_POINT_LIGHTS > 0", - - "totalDiffuse += pointDiffuse;", - "totalSpecular += pointSpecular;", - - "#endif", - - "gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor) + totalSpecular;", - - "if ( enableReflection ) {", - - "vec3 wPos = cameraPosition - vViewPosition;", - "vec3 vReflect = reflect( normalize( wPos ), normal );", - - "vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );", - - "#ifdef GAMMA_INPUT", - - "cubeColor.xyz *= cubeColor.xyz;", - - "#endif", - - "gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );", - - "}", - - THREE.ShaderChunk[ "shadowmap_fragment" ], - THREE.ShaderChunk[ "linear_to_gamma_fragment" ], - THREE.ShaderChunk[ "fog_fragment" ], - - "}" - - ].join("\n"), - - vertexShader: [ - - "attribute vec4 tangent;", - - "uniform vec2 uOffset;", - "uniform vec2 uRepeat;", - - "#ifdef VERTEX_TEXTURES", - - "uniform sampler2D tDisplacement;", - "uniform float uDisplacementScale;", - "uniform float uDisplacementBias;", - - "#endif", - - "varying vec3 vTangent;", - "varying vec3 vBinormal;", - "varying vec3 vNormal;", - "varying vec2 vUv;", - - "#if MAX_POINT_LIGHTS > 0", - - "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];", - "uniform float pointLightDistance[ MAX_POINT_LIGHTS ];", - - "varying vec4 vPointLight[ MAX_POINT_LIGHTS ];", - - "#endif", - - "varying vec3 vViewPosition;", - - THREE.ShaderChunk[ "shadowmap_pars_vertex" ], - - "void main() {", - - "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", - - "vViewPosition = -mvPosition.xyz;", - - // normal, tangent and binormal vectors - - "vNormal = normalMatrix * normal;", - "vTangent = normalMatrix * tangent.xyz;", - "vBinormal = cross( vNormal, vTangent ) * tangent.w;", - - "vUv = uv * uRepeat + uOffset;", - - // point lights - - "#if MAX_POINT_LIGHTS > 0", - - "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {", - - "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );", - "vec3 lVector = lPosition.xyz - mvPosition.xyz;", - - "float lDistance = 1.0;", - "if ( pointLightDistance[ i ] > 0.0 )", - "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );", - - "lVector = normalize( lVector );", - - "vPointLight[ i ] = vec4( lVector, lDistance );", - - "}", - - "#endif", - - // displacement mapping - - "#ifdef VERTEX_TEXTURES", - - "vec3 dv = texture2D( tDisplacement, uv ).xyz;", - "float df = uDisplacementScale * dv.x + uDisplacementBias;", - "vec4 displacedPosition = vec4( normalize( vNormal.xyz ) * df, 0.0 ) + mvPosition;", - "gl_Position = projectionMatrix * displacedPosition;", - - "#else", - - "gl_Position = projectionMatrix * mvPosition;", - - "#endif", - - THREE.ShaderChunk[ "shadowmap_vertex" ], - - "}" - - ].join("\n") - - }, - - /* ------------------------------------------------------------------------- - // Cube map shader - ------------------------------------------------------------------------- */ - - 'cube': { - - uniforms: { "tCube": { type: "t", value: 1, texture: null }, - "tFlip": { type: "f", value: -1 } }, - - vertexShader: [ - - "varying vec3 vViewPosition;", - - "void main() {", - - "vec4 mPosition = objectMatrix * vec4( position, 1.0 );", - "vViewPosition = cameraPosition - mPosition.xyz;", - - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform samplerCube tCube;", - "uniform float tFlip;", - - "varying vec3 vViewPosition;", - - "void main() {", - - "vec3 wPos = cameraPosition - vViewPosition;", - "gl_FragColor = textureCube( tCube, vec3( tFlip * wPos.x, wPos.yz ) );", - - "}" - - ].join("\n") - - } - - } - -}; - -};/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.BufferGeometry = function () { - - this.id = THREE.GeometryCount ++; - - // GL buffers - - this.vertexIndexBuffer = null; - this.vertexPositionBuffer = null; - this.vertexNormalBuffer = null; - this.vertexUvBuffer = null; - this.vertexColorBuffer = null; - - // typed arrays (kept only if dynamic flag is set) - - this.vertexIndexArray = null; - this.vertexPositionArray = null; - this.vertexNormalArray = null; - this.vertexUvArray = null; - this.vertexColorArray = null; - - this.dynamic = false; - - // boundings - - this.boundingBox = null; - this.boundingSphere = null; - - // for compatibility - - this.morphTargets = []; - -}; - -THREE.BufferGeometry.prototype = { - - constructor : THREE.BufferGeometry, - - // for compatibility - - computeBoundingBox: function () { - - }, - - // for compatibility - - computeBoundingSphere: function () { - - } - - -}; - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * Extensible curve object - * - * Some common of Curve methods - * .getPoint(t), getTangent(t) - * .getPointAt(u), getTagentAt(u) - * .getPoints(), .getSpacedPoints() - * .getLength() - * - * This file contains following classes: - * - * -- 2d classes -- - * THREE.Curve - * THREE.LineCurve - * THREE.QuadraticBezierCurve - * THREE.CubicBezierCurve - * THREE.SplineCurve - * THREE.ArcCurve - * - * -- 3d classes -- - * THREE.LineCurve3 - * THREE.QuadraticBezierCurve3 - * THREE.CubicBezierCurve3 - * THREE.SplineCurve3 - * - **/ - -/************************************************************** - * Abstract Curve base class - **************************************************************/ - -THREE.Curve = function () { - -}; - -// Virtual base class method to overwrite and implement in subclasses -// - t [0 .. 1] - -THREE.Curve.prototype.getPoint = function ( t ) { - - console.log( "Warning, getPoint() not implemented!" ); - return null; - -}; - -// Get point at relative position in curve according to arc length -// - u [0 .. 1] - -THREE.Curve.prototype.getPointAt = function ( u ) { - - var t = this.getUtoTmapping( u ); - return this.getPoint( t ); - -}; - -// Get sequence of points using getPoint( t ) - -THREE.Curve.prototype.getPoints = function ( divisions ) { - - if ( !divisions ) divisions = 5; - - var d, pts = []; - - for ( d = 0; d <= divisions; d ++ ) { - - pts.push( this.getPoint( d / divisions ) ); - - }; - - return pts; - -}; - -// Get sequence of points using getPointAt( u ) - -THREE.Curve.prototype.getSpacedPoints = function ( divisions ) { - - if ( !divisions ) divisions = 5; - - var d, pts = []; - - for ( d = 0; d <= divisions; d ++ ) { - - pts.push( this.getPointAt( d / divisions ) ); - - }; - - return pts; - -}; - -// Get total curve length - -THREE.Curve.prototype.getLength = function () { - - var lengths = this.getLengths(); - return lengths[ lengths.length - 1 ]; - -}; - -// Get list of cumulative segment lengths - -THREE.Curve.prototype.getLengths = function ( divisions ) { - - if ( !divisions ) divisions = 200; - - if ( this.cacheArcLengths && ( this.cacheArcLengths.length == divisions + 1 ) ) { - - //console.log( "cached", this.cacheArcLengths ); - return this.cacheArcLengths; - - } - - var cache = []; - var current, last = this.getPoint( 0 ); - var p, sum = 0; - - cache.push( 0 ); - - for ( 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. - -}; - -// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equi distance - -THREE.Curve.prototype.getUtoTmapping = function ( u, distance ) { - - var arcLengths = this.getLengths(); - - var i = 0, il = arcLengths.length; - - var targetArcLength; // The targeted u distance value to get - - if ( distance ) { - - targetArcLength = distance; - - } else { - - targetArcLength = u * arcLengths[ il - 1 ]; - - } - - //var time = Date.now(); - - // binary search for the index with largest value smaller than target u distance - - var 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; - continue; - - } else if ( comparison > 0 ) { - - high = i - 1; - continue; - - } else { - - high = i; - break; - - // DONE - - } - - } - - i = high; - - //console.log('b' , i, low, high, Date.now()- time); - - if ( arcLengths[ i ] == targetArcLength ) { - - var t = i / ( il - 1 ); - return t; - - } - - // we could get finer grain at lengths, or use simple interpolatation between two points - - var lengthBefore = arcLengths[ i ]; - var lengthAfter = arcLengths[ i + 1 ]; - - var segmentLength = lengthAfter - lengthBefore; - - // determine where we are between the 'before' and 'after' points - - var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength; - - // add that fractional amount to t - - t = ( i + segmentFraction ) / ( il -1 ); - - return t; - -}; - -// In case any sub curve does not implement its tangent / normal finding, -// we get 2 points with a small delta and find a gradient of the 2 points -// which seems to make a reasonable approximation - -THREE.Curve.prototype.getNormalVector = function( t ) { - - var vec = this.getTangent( t ); - - return new THREE.Vector2( -vec.y , vec.x ); - -}; - -// Returns a unit vector tangent at t - -THREE.Curve.prototype.getTangent = function( t ) { - - var delta = 0.0001; - var t1 = t - delta; - var t2 = t + delta; - - // Capping in case of danger - - if ( t1 < 0 ) t1 = 0; - if ( t2 > 1 ) t2 = 1; - - var pt1 = this.getPoint( t1 ); - var pt2 = this.getPoint( t2 ); - - var vec = pt1.clone().subSelf(pt2); - return vec.normalize(); - -}; - - -THREE.Curve.prototype.getTangentAt = function ( u ) { - - var t = this.getUtoTmapping( u ); - return this.getTangent( t ); - -}; - -/************************************************************** - * Line - **************************************************************/ - -THREE.LineCurve = function ( v1, v2 ) { - - if ( ! ( v1 instanceof THREE.Vector2 ) ) { - - // Fall back for old constuctor signature - should be removed over time - - THREE.LineCurve.oldConstructor.apply( this, arguments ); - return; - - } - - this.v1 = v1; - this.v2 = v2; - -}; - -THREE.LineCurve.oldConstructor = function ( x1, y1, x2, y2 ) { - - this.constructor( new THREE.Vector2( x1, y1 ), new THREE.Vector2( x2, y2 ) ); - -}; - -THREE.LineCurve.prototype = new THREE.Curve(); -THREE.LineCurve.prototype.constructor = THREE.LineCurve; - -THREE.LineCurve.prototype.getPoint = function ( t ) { - - var point = new THREE.Vector2(); - - point.sub( this.v2, this.v1 ); - point.multiplyScalar( t ).addSelf( this.v1 ); - - return point; - -}; - -// Line curve is linear, so we can overwrite default getPointAt - -THREE.LineCurve.prototype.getPointAt = function ( u ) { - - return this.getPoint( u ); - -}; - -THREE.LineCurve.prototype.getTangent = function( t ) { - - var tangent = new THREE.Vector2(); - - tangent.sub( this.v2, this.v1 ); - tangent.normalize(); - - return tangent; - -}; - -/************************************************************** - * Quadratic Bezier curve - **************************************************************/ - - -THREE.QuadraticBezierCurve = function ( v0, v1, v2 ) { - - if ( !( v1 instanceof THREE.Vector2 ) ) { - - var args = Array.prototype.slice.call( arguments ); - - v0 = new THREE.Vector2( args[ 0 ], args[ 1 ] ); - v1 = new THREE.Vector2( args[ 2 ], args[ 3 ] ); - v2 = new THREE.Vector2( args[ 4 ], args[ 5 ] ); - - } - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - -}; - -THREE.QuadraticBezierCurve.prototype = new THREE.Curve(); -THREE.QuadraticBezierCurve.prototype.constructor = THREE.QuadraticBezierCurve; - - -THREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) { - - var tx, ty; - - tx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x ); - ty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y ); - - return new THREE.Vector2( tx, ty ); - -}; - - -THREE.QuadraticBezierCurve.prototype.getTangent = function( t ) { - - // iterate sub segments - // get lengths for sub segments - // if segment is bezier - // perform subdivisions - - var tx, ty; - - tx = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x ); - ty = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y ); - - // returns unit vector - - var tangent = new THREE.Vector2( tx, ty ); - tangent.normalize(); - - return tangent; - -}; - - -/************************************************************** - * Cubic Bezier curve - **************************************************************/ - -THREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) { - - if ( ! ( v1 instanceof THREE.Vector2 ) ) { - - var args = Array.prototype.slice.call( arguments ); - - v0 = new THREE.Vector2( args[ 0 ], args[ 1 ] ); - v1 = new THREE.Vector2( args[ 2 ], args[ 3 ] ); - v2 = new THREE.Vector2( args[ 4 ], args[ 5 ] ); - v3 = new THREE.Vector2( args[ 6 ], args[ 7 ] ); - - } - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.v3 = v3; - -}; - -THREE.CubicBezierCurve.prototype = new THREE.Curve(); -THREE.CubicBezierCurve.prototype.constructor = THREE.CubicBezierCurve; - -THREE.CubicBezierCurve.prototype.getPoint = function ( t ) { - - var tx, ty; - - tx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ); - ty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ); - - return new THREE.Vector2( tx, ty ); - -}; - -THREE.CubicBezierCurve.prototype.getTangent = function( t ) { - - var tx, ty; - - tx = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ); - ty = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ); - - // return normal unit vector - - var tangent = new THREE.Vector2( tx, ty ); - tangent.normalize(); - - return tangent; - -}; - - -/************************************************************** - * Spline curve - **************************************************************/ - -THREE.SplineCurve = function ( points /* array of Vector2 */ ) { - - this.points = (points == undefined) ? [] : points; - -}; - -THREE.SplineCurve.prototype = new THREE.Curve(); -THREE.SplineCurve.prototype.constructor = THREE.SplineCurve; - -THREE.SplineCurve.prototype.getPoint = function ( t ) { - - var v = new THREE.Vector2(); - var c = []; - var points = this.points, point, intPoint, weight; - point = ( points.length - 1 ) * t; - - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1; - c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2; - - v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight ); - v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight ); - - return v; - -}; - -/************************************************************** - * Arc curve - **************************************************************/ - -THREE.ArcCurve = function ( aX, aY, aRadius, - aStartAngle, aEndAngle, - aClockwise ) { - - this.aX = aX; - this.aY = aY; - - this.aRadius = aRadius; - - this.aStartAngle = aStartAngle; - this.aEndAngle = aEndAngle; - - this.aClockwise = aClockwise; - -}; - -THREE.ArcCurve.prototype = new THREE.Curve(); -THREE.ArcCurve.prototype.constructor = THREE.ArcCurve; - -THREE.ArcCurve.prototype.getPoint = function ( t ) { - - var deltaAngle = this.aEndAngle - this.aStartAngle; - - if ( !this.aClockwise ) { - - t = 1 - t; - - } - - var angle = this.aStartAngle + t * deltaAngle; - - var tx = this.aX + this.aRadius * Math.cos( angle ); - var ty = this.aY + this.aRadius * Math.sin( angle ); - - return new THREE.Vector2( tx, ty ); - -}; - -/************************************************************** - * Utils - **************************************************************/ - -THREE.Curve.Utils = { - - tangentQuadraticBezier: function ( t, p0, p1, p2 ) { - - return 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 ); - - }, - - // Puay Bing, thanks for helping with this derivative! - - tangentCubicBezier: function (t, p0, p1, p2, p3 ) { - - return -3 * p0 * (1 - t) * (1 - t) + - 3 * p1 * (1 - t) * (1-t) - 6 *t *p1 * (1-t) + - 6 * t * p2 * (1-t) - 3 * t * t * p2 + - 3 * t * t * p3; - }, - - - tangentSpline: function ( t, p0, p1, p2, p3 ) { - - // To check if my formulas are correct - - var h00 = 6 * t * t - 6 * t; // derived from 2t^3 − 3t^2 + 1 - var h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t - var h01 = -6 * t * t + 6 * t; // − 2t3 + 3t2 - var h11 = 3 * t * t - 2 * t; // t3 − t2 - - return h00 + h10 + h01 + h11; - - }, - - // Catmull-Rom - - interpolate: function( p0, p1, p2, p3, t ) { - - var v0 = ( p2 - p0 ) * 0.5; - var v1 = ( p3 - p1 ) * 0.5; - var t2 = t * t; - var t3 = t * t2; - return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1; - - } - -}; - - -/* -getPoint DONE -getLength DONE -getLengths DONE - -curve.getPoints(); DONE -curve.getPointAtArcLength(t); DONE -curve.transform(params); -curve.getTangentAt(t); DONE -*/ - -/************************************************************** - * 3D Curves - **************************************************************/ - -// A Factory method for creating new curve subclasses - -THREE.Curve.create = function( constructor, getPointFunc ) { - - var subClass = constructor; - - subClass.prototype = new THREE.Curve(); - - subClass.prototype.constructor = constructor; - subClass.prototype.getPoint = getPointFunc; - - return subClass; - -}; - - -/************************************************************** - * Line3D - **************************************************************/ - -THREE.LineCurve3 = THREE.Curve.create( - - function ( v1, v2 ) { - - this.v1 = v1; - this.v2 = v2; - - }, - - function ( t ) { - - var r = new THREE.Vector3(); - - - r.sub( this.v2, this.v1 ); // diff - r.multiplyScalar( t ); - r.addSelf( this.v1 ); - - return r; - - } - -); - - -/************************************************************** - * Quadratic Bezier 3D curve - **************************************************************/ - -THREE.QuadraticBezierCurve3 = THREE.Curve.create( - - function ( v0, v1, v2 ) { - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - - }, - - function ( t ) { - - var tx, ty, tz; - - tx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x ); - ty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y ); - tz = THREE.Shape.Utils.b2( t, this.v0.z, this.v1.z, this.v2.z ); - - return new THREE.Vector3( tx, ty, tz ); - - } - -); - - - -/************************************************************** - * Cubic Bezier 3D curve - **************************************************************/ - -THREE.CubicBezierCurve3 = THREE.Curve.create( - - function ( v0, v1, v2, v3 ) { - - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.v3 = v3; - - }, - - function ( t ) { - - var tx, ty, tz; - - tx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x ); - ty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y ); - tz = THREE.Shape.Utils.b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z ); - - return new THREE.Vector3( tx, ty, tz ); - - } - -); - - - -/************************************************************** - * Spline 3D curve - **************************************************************/ - - -THREE.SplineCurve3 = THREE.Curve.create( - - function ( points /* array of Vector3 */) { - - this.points = (points == undefined) ? [] : points; - - }, - - function ( t ) { - - var v = new THREE.Vector3(); - var c = []; - var points = this.points, point, intPoint, weight; - point = ( points.length - 1 ) * t; - - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1; - c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2; - - v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight ); - v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight ); - v.z = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].z, points[ c[ 1 ] ].z, points[ c[ 2 ] ].z, points[ c[ 3 ] ].z, weight ); - - return v; - - } - -); -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * - **/ - -/************************************************************** - * Curved Path - a curve path is simply a array of connected - * curves, but retains the api of a curve - **************************************************************/ - -THREE.CurvePath = function () { - - this.curves = []; - this.bends = []; - - this.autoClose = false; // Automatically closes the path -}; - -THREE.CurvePath.prototype = new THREE.Curve(); -THREE.CurvePath.prototype.constructor = THREE.CurvePath; - -THREE.CurvePath.prototype.add = function ( curve ) { - - this.curves.push( curve ); - -}; - -THREE.CurvePath.prototype.checkConnection = function() { - // TODO - // If the ending of curve is not connected to the starting - // or the next curve, then, this is not a real path -}; - -THREE.CurvePath.prototype.closePath = function() { - // TODO Test - // and verify for vector3 (needs to implement equals) - // Add a line curve if start and end of lines are not connected - var startPoint = this.curves[0].getPoint(0); - var endPoint = this.curves[this.curves.length-1].getPoint(1); - - if (!startPoint.equals(endPoint)) { - this.curves.push( new THREE.LineCurve(endPoint, startPoint) ); - } - -}; - -// 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') - -THREE.CurvePath.prototype.getPoint = function( t ) { - - var d = t * this.getLength(); - var curveLengths = this.getCurveLengths(); - var i = 0, diff, curve; - - // To think about boundaries points. - - while ( i < curveLengths.length ) { - - if ( curveLengths[ i ] >= d ) { - - diff = curveLengths[ i ] - d; - curve = this.curves[ i ]; - - var u = 1 - diff / curve.getLength(); - - return curve.getPointAt( u ); - - break; - } - - i ++; - - } - - return null; - - // loop where sum != 0, sum > d , sum+1 maxX ) maxX = p.x; - else if ( p.x < minX ) minX = p.x; - - if ( p.y > maxY ) maxY = p.y; - else if ( p.y < maxY ) minY = p.y; - - sum.addSelf( p.x, p.y ); - - } - - return { - - minX: minX, - minY: minY, - maxX: maxX, - maxY: maxY, - centroid: sum.divideScalar( il ) - - }; - -}; - -/************************************************************** - * Create Geometries Helpers - **************************************************************/ - -/// Generate geometry from path points (for Line or ParticleSystem objects) - -THREE.CurvePath.prototype.createPointsGeometry = function( divisions ) { - - var pts = this.getPoints( divisions, true ); - return this.createGeometry( pts ); - -}; - -// Generate geometry from equidistance sampling along the path - -THREE.CurvePath.prototype.createSpacedPointsGeometry = function( divisions ) { - - var pts = this.getSpacedPoints( divisions, true ); - return this.createGeometry( pts ); - -}; - -THREE.CurvePath.prototype.createGeometry = function( points ) { - - var geometry = new THREE.Geometry(); - - for( var i = 0; i < points.length; i ++ ) { - - geometry.vertices.push( new THREE.Vertex( new THREE.Vector3( points[ i ].x, points[ i ].y, 0 ) ) ); - - } - - return geometry; - -}; - - -/************************************************************** - * Bend / Wrap Helper Methods - **************************************************************/ - -// Wrap path / Bend modifiers? - -THREE.CurvePath.prototype.addWrapPath = function ( bendpath ) { - - this.bends.push( bendpath ); - -}; - -THREE.CurvePath.prototype.getTransformedPoints = function( segments, bends ) { - - var oldPts = this.getPoints( segments ); // getPoints getSpacedPoints - var i, il; - - if ( !bends ) { - - bends = this.bends; - - } - - for ( i = 0, il = bends.length; i < il; i ++ ) { - - oldPts = this.getWrapPoints( oldPts, bends[ i ] ); - - } - - return oldPts; - -}; - -THREE.CurvePath.prototype.getTransformedSpacedPoints = function( segments, bends ) { - - var oldPts = this.getSpacedPoints( segments ); - - var i, il; - - if ( !bends ) { - - bends = this.bends; - - } - - for ( i = 0, il = bends.length; i < il; i ++ ) { - - oldPts = this.getWrapPoints( oldPts, bends[ i ] ); - - } - - return oldPts; - -}; - -// This returns getPoints() bend/wrapped around the contour of a path. -// Read http://www.planetclegg.com/projects/WarpingTextToSplines.html - -THREE.CurvePath.prototype.getWrapPoints = function ( oldPts, path ) { - - var bounds = this.getBoundingBox(); - - var i, il, p, oldX, oldY, xNorm; - - for ( i = 0, il = oldPts.length; i < il; i ++ ) { - - p = oldPts[ i ]; - - oldX = p.x; - oldY = p.y; - - xNorm = oldX / bounds.maxX; - - // If using actual distance, for length > path, requires line extrusions - //xNorm = path.getUtoTmapping(xNorm, oldX); // 3 styles. 1) wrap stretched. 2) wrap stretch by arc length 3) warp by actual distance - - xNorm = path.getUtoTmapping( xNorm, oldX ); - - // check for out of bounds? - - var pathPt = path.getPoint( xNorm ); - var normal = path.getNormalVector( xNorm ).multiplyScalar( oldY ); - - p.x = pathPt.x + normal.x; - p.y = pathPt.y + normal.y; - - } - - return oldPts; - -}; - -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.Gyroscope = function () { - - THREE.Object3D.call( this ); - -}; - - -THREE.Gyroscope.prototype = new THREE.Object3D(); -THREE.Gyroscope.prototype.constructor = THREE.Gyroscope; - -THREE.Gyroscope.prototype.updateMatrixWorld = function ( force ) { - - this.matrixAutoUpdate && this.updateMatrix(); - - // update matrixWorld - - if ( this.matrixWorldNeedsUpdate || force ) { - - if ( this.parent ) { - - this.matrixWorld.multiply( this.parent.matrixWorld, this.matrix ); - - this.matrixWorld.decompose( this.translationWorld, this.rotationWorld, this.scaleWorld ); - this.matrix.decompose( this.translationObject, this.rotationObject, this.scaleObject ); - - this.matrixWorld.compose( this.translationWorld, this.rotationObject, this.scaleWorld ); - - - } else { - - this.matrixWorld.copy( this.matrix ); - - } - - - this.matrixWorldNeedsUpdate = false; - - force = true; - - } - - // update children - - for ( var i = 0, l = this.children.length; i < l; i ++ ) { - - this.children[ i ].updateMatrixWorld( force ); - - } - -}; - -THREE.Gyroscope.prototype.translationWorld = new THREE.Vector3(); -THREE.Gyroscope.prototype.translationObject = new THREE.Vector3(); -THREE.Gyroscope.prototype.rotationWorld = new THREE.Quaternion(); -THREE.Gyroscope.prototype.rotationObject = new THREE.Quaternion(); -THREE.Gyroscope.prototype.scaleWorld = new THREE.Vector3(); -THREE.Gyroscope.prototype.scaleObject = new THREE.Vector3(); - -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * Creates free form 2d path using series of points, lines or curves. - * - **/ - -THREE.Path = function ( points ) { - - THREE.CurvePath.call(this); - - this.actions = []; - - if ( points ) { - - this.fromPoints( points ); - - } - -}; - -THREE.Path.prototype = new THREE.CurvePath(); -THREE.Path.prototype.constructor = THREE.Path; - - -THREE.PathActions = { - - MOVE_TO: 'moveTo', - LINE_TO: 'lineTo', - QUADRATIC_CURVE_TO: 'quadraticCurveTo', // Bezier quadratic curve - BEZIER_CURVE_TO: 'bezierCurveTo', // Bezier cubic curve - CSPLINE_THRU: 'splineThru', // Catmull-rom spline - ARC: 'arc' // Circle - -}; - -// TODO Clean up PATH API - -// Create path using straight lines to connect all points -// - vectors: array of Vector2 - -THREE.Path.prototype.fromPoints = function ( vectors ) { - - this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); - - for ( var v = 1, vlen = vectors.length; v < vlen; v ++ ) { - - this.lineTo( vectors[ v ].x, vectors[ v ].y ); - - }; - -}; - -// startPath() endPath()? - -THREE.Path.prototype.moveTo = function ( x, y ) { - - var args = Array.prototype.slice.call( arguments ); - this.actions.push( { action: THREE.PathActions.MOVE_TO, args: args } ); - -}; - -THREE.Path.prototype.lineTo = function ( x, y ) { - - var args = Array.prototype.slice.call( arguments ); - - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - var curve = new THREE.LineCurve( new THREE.Vector2( x0, y0 ), new THREE.Vector2( x, y ) ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.LINE_TO, args: args } ); - -}; - -THREE.Path.prototype.quadraticCurveTo = function( aCPx, aCPy, aX, aY ) { - - var args = Array.prototype.slice.call( arguments ); - - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - var curve = new THREE.QuadraticBezierCurve( new THREE.Vector2( x0, y0 ), - new THREE.Vector2( aCPx, aCPy ), - new THREE.Vector2( aX, aY ) ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.QUADRATIC_CURVE_TO, args: args } ); - -}; - -THREE.Path.prototype.bezierCurveTo = function( aCP1x, aCP1y, - aCP2x, aCP2y, - aX, aY ) { - - var args = Array.prototype.slice.call( arguments ); - - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; - - var curve = new THREE.CubicBezierCurve( new THREE.Vector2( x0, y0 ), - new THREE.Vector2( aCP1x, aCP1y ), - new THREE.Vector2( aCP2x, aCP2y ), - new THREE.Vector2( aX, aY ) ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.BEZIER_CURVE_TO, args: args } ); - -}; - -THREE.Path.prototype.splineThru = function( pts /*Array of Vector*/ ) { - - var args = Array.prototype.slice.call( arguments ); - var lastargs = this.actions[ this.actions.length - 1 ].args; - - var x0 = lastargs[ lastargs.length - 2 ]; - var y0 = lastargs[ lastargs.length - 1 ]; -//--- - var npts = [ new THREE.Vector2( x0, y0 ) ]; - Array.prototype.push.apply( npts, pts ); - - var curve = new THREE.SplineCurve( npts ); - this.curves.push( curve ); - - this.actions.push( { action: THREE.PathActions.CSPLINE_THRU, args: args } ); - -}; - -// FUTURE: Change the API or follow canvas API? -// TODO ARC ( x, y, x - radius, y - radius, startAngle, endAngle ) - -THREE.Path.prototype.arc = function ( aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise ) { - - var args = Array.prototype.slice.call( arguments ); - - var curve = new THREE.ArcCurve( aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise ); - this.curves.push( curve ); - - // console.log( 'arc', args ); - - this.actions.push( { action: THREE.PathActions.ARC, args: args } ); - - }; - - -THREE.Path.prototype.getSpacedPoints = function ( divisions, closedPath ) { - - if ( ! divisions ) divisions = 40; - - var points = []; - - for ( var i = 0; i < divisions; i ++ ) { - - points.push( this.getPoint( i / divisions ) ); - - //if( !this.getPoint( i / divisions ) ) throw "DIE"; - - } - - // if ( closedPath ) { - // - // points.push( points[ 0 ] ); - // - // } - - return points; - -}; - -/* Return an array of vectors based on contour of the path */ - -THREE.Path.prototype.getPoints = function( divisions, closedPath ) { - - divisions = divisions || 12; - - var points = []; - - var i, il, item, action, args; - var cpx, cpy, cpx2, cpy2, cpx1, cpy1, cpx0, cpy0, - laste, j, - t, tx, ty; - - for ( i = 0, il = this.actions.length; i < il; i ++ ) { - - item = this.actions[ i ]; - - action = item.action; - args = item.args; - - switch( action ) { - - case THREE.PathActions.MOVE_TO: - - // points.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) ); - - break; - - case THREE.PathActions.LINE_TO: - - points.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) ); - - break; - - case THREE.PathActions.QUADRATIC_CURVE_TO: - - cpx = args[ 2 ]; - cpy = args[ 3 ]; - - cpx1 = args[ 0 ]; - cpy1 = args[ 1 ]; - - if ( points.length > 0 ) { - - laste = points[ points.length - 1 ]; - - cpx0 = laste.x; - cpy0 = laste.y; - - } else { - - laste = this.actions[ i - 1 ].args; - - cpx0 = laste[ laste.length - 2 ]; - cpy0 = laste[ laste.length - 1 ]; - - } - - for ( j = 1; j <= divisions; j ++ ) { - - t = j / divisions; - - tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx ); - ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy ); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - break; - - case THREE.PathActions.BEZIER_CURVE_TO: - - cpx = args[ 4 ]; - cpy = args[ 5 ]; - - cpx1 = args[ 0 ]; - cpy1 = args[ 1 ]; - - cpx2 = args[ 2 ]; - cpy2 = args[ 3 ]; - - if ( points.length > 0 ) { - - laste = points[ points.length - 1 ]; - - cpx0 = laste.x; - cpy0 = laste.y; - - } else { - - laste = this.actions[ i - 1 ].args; - - cpx0 = laste[ laste.length - 2 ]; - cpy0 = laste[ laste.length - 1 ]; - - } - - - for ( j = 1; j <= divisions; j ++ ) { - - t = j / divisions; - - tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx ); - ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy ); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - break; - - case THREE.PathActions.CSPLINE_THRU: - - laste = this.actions[ i - 1 ].args; - - var last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] ); - var spts = [ last ]; - - var n = divisions * args[ 0 ].length; - - spts = spts.concat( args[ 0 ] ); - - var spline = new THREE.SplineCurve( spts ); - - for ( j = 1; j <= n; j ++ ) { - - points.push( spline.getPointAt( j / n ) ) ; - - } - - break; - - case THREE.PathActions.ARC: - - laste = this.actions[ i - 1 ].args; - - var aX = args[ 0 ], aY = args[ 1 ], - aRadius = args[ 2 ], - aStartAngle = args[ 3 ], aEndAngle = args[ 4 ], - aClockwise = !!args[ 5 ]; - - var lastx = laste[ laste.length - 2 ], - lasty = laste[ laste.length - 1 ]; - - if ( laste.length == 0 ) { - - lastx = lasty = 0; - - } - - - var deltaAngle = aEndAngle - aStartAngle; - var angle; - var tdivisions = divisions * 2; - - for ( j = 1; j <= tdivisions; j ++ ) { - - t = j / tdivisions; - - if ( ! aClockwise ) { - - t = 1 - t; - - } - - angle = aStartAngle + t * deltaAngle; - - tx = lastx + aX + aRadius * Math.cos( angle ); - ty = lasty + aY + aRadius * Math.sin( angle ); - - //console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty); - - points.push( new THREE.Vector2( tx, ty ) ); - - } - - //console.log(points); - - break; - - } // end switch - - } - - if ( closedPath ) { - - points.push( points[ 0 ] ); - - } - - return points; - -}; - - - -// This was used for testing purposes. Should be removed soon. - -THREE.Path.prototype.transform = function( path, segments ) { - - var bounds = this.getBoundingBox(); - var oldPts = this.getPoints( segments ); // getPoints getSpacedPoints - - //console.log( path.cacheArcLengths() ); - //path.getLengths(400); - //segments = 40; - - return this.getWrapPoints( oldPts, path ); - -}; - -// Read http://www.tinaja.com/glib/nonlingr.pdf -// nonlinear transforms - -THREE.Path.prototype.nltransform = function( a, b, c, d, e, f ) { - - // a - horizontal size - // b - lean - // c - x offset - // d - vertical size - // e - climb - // f - y offset - - var oldPts = this.getPoints(); - - var i, il, p, oldX, oldY; - - for ( i = 0, il = oldPts.length; i < il; i ++ ) { - - p = oldPts[i]; - - oldX = p.x; - oldY = p.y; - - p.x = a * oldX + b * oldY + c; - p.y = d * oldY + e * oldX + f; - - } - - return oldPts; - -}; - - -// FUTURE Export JSON Format - -/* Draws this path onto a 2d canvas easily */ - -THREE.Path.prototype.debug = function( canvas ) { - - var bounds = this.getBoundingBox(); - - if ( !canvas ) { - - canvas = document.createElement( "canvas" ); - - canvas.setAttribute( 'width', bounds.maxX + 100 ); - canvas.setAttribute( 'height', bounds.maxY + 100 ); - - document.body.appendChild( canvas ); - - } - - var ctx = canvas.getContext( "2d" ); - ctx.fillStyle = "white"; - ctx.fillRect( 0, 0, canvas.width, canvas.height ); - - ctx.strokeStyle = "black"; - ctx.beginPath(); - - var i, il, item, action, args; - - // Debug Path - - for ( i = 0, il = this.actions.length; i < il; i ++ ) { - - item = this.actions[ i ]; - - args = item.args; - action = item.action; - - // Short hand for now - - if ( action != THREE.PathActions.CSPLINE_THRU ) { - - ctx[ action ].apply( ctx, args ); - - } - - /* - switch ( action ) { - - case THREE.PathActions.MOVE_TO: - - ctx[ action ]( args[ 0 ], args[ 1 ] ); - break; - - case THREE.PathActions.LINE_TO: - - ctx[ action ]( args[ 0 ], args[ 1 ] ); - break; - - case THREE.PathActions.QUADRATIC_CURVE_TO: - - ctx[ action ]( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ] ); - break; - - case THREE.PathActions.CUBIC_CURVE_TO: - - ctx[ action ]( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ], args[ 5 ] ); - break; - - } - */ - - } - - ctx.stroke(); - ctx.closePath(); - - // Debug Points - - ctx.strokeStyle = "red"; - - /* TO CLEAN UP */ - - var p, points = this.getPoints(); - - for ( i = 0, il = points.length; i < il; i ++ ) { - - p = points[ i ]; - - ctx.beginPath(); - ctx.arc( p.x, p.y, 1.5, 0, Math.PI * 2, false ); - ctx.stroke(); - ctx.closePath(); - - } - -}; - -// Breaks path into shapes - -THREE.Path.prototype.toShapes = function() { - - var i, il, item, action, args; - - var subPaths = [], lastPath = new THREE.Path(); - - for ( i = 0, il = this.actions.length; i < il; i ++ ) { - - item = this.actions[ i ]; - - args = item.args; - action = item.action; - - if ( action == THREE.PathActions.MOVE_TO ) { - - if ( lastPath.actions.length != 0 ) { - - subPaths.push( lastPath ); - lastPath = new THREE.Path(); - - } - - } - - lastPath[ action ].apply( lastPath, args ); - - } - - if ( lastPath.actions.length != 0 ) { - - subPaths.push( lastPath ); - - } - - // console.log(subPaths); - - if ( subPaths.length == 0 ) return []; - - var tmpPath, tmpShape, shapes = []; - - var holesFirst = !THREE.Shape.Utils.isClockWise( subPaths[ 0 ].getPoints() ); - // console.log("Holes first", holesFirst); - - if ( subPaths.length == 1) { - tmpPath = subPaths[0]; - tmpShape = new THREE.Shape(); - tmpShape.actions = tmpPath.actions; - tmpShape.curves = tmpPath.curves; - shapes.push( tmpShape ); - return shapes; - }; - - if ( holesFirst ) { - - tmpShape = new THREE.Shape(); - - for ( i = 0, il = subPaths.length; i < il; i ++ ) { - - tmpPath = subPaths[ i ]; - - if ( THREE.Shape.Utils.isClockWise( tmpPath.getPoints() ) ) { - - tmpShape.actions = tmpPath.actions; - tmpShape.curves = tmpPath.curves; - - shapes.push( tmpShape ); - tmpShape = new THREE.Shape(); - - //console.log('cw', i); - - } else { - - tmpShape.holes.push( tmpPath ); - - //console.log('ccw', i); - - } - - } - - } else { - - // Shapes first - - for ( i = 0, il = subPaths.length; i < il; i ++ ) { - - tmpPath = subPaths[ i ]; - - if ( THREE.Shape.Utils.isClockWise( tmpPath.getPoints() ) ) { - - - if ( tmpShape ) shapes.push( tmpShape ); - - tmpShape = new THREE.Shape(); - tmpShape.actions = tmpPath.actions; - tmpShape.curves = tmpPath.curves; - - } else { - - tmpShape.holes.push( tmpPath ); - - } - - } - - shapes.push( tmpShape ); - - } - - //console.log("shape", shapes); - - return shapes; - -}; -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * Defines a 2d shape plane using paths. - **/ - -// STEP 1 Create a path. -// STEP 2 Turn path into shape. -// STEP 3 ExtrudeGeometry takes in Shape/Shapes -// STEP 3a - Extract points from each shape, turn to vertices -// STEP 3b - Triangulate each shape, add faces. - -THREE.Shape = function ( ) { - - THREE.Path.apply( this, arguments ); - this.holes = []; - -}; - -THREE.Shape.prototype = new THREE.Path(); -THREE.Shape.prototype.constructor = THREE.Path; - -// Convenience method to return ExtrudeGeometry - -THREE.Shape.prototype.extrude = function ( options ) { - - var extruded = new THREE.ExtrudeGeometry( this, options ); - return extruded; - -}; - -// Get points of holes - -THREE.Shape.prototype.getPointsHoles = function ( divisions ) { - - var i, il = this.holes.length, holesPts = []; - - for ( i = 0; i < il; i ++ ) { - - holesPts[ i ] = this.holes[ i ].getTransformedPoints( divisions, this.bends ); - - } - - return holesPts; - -}; - -// Get points of holes (spaced by regular distance) - -THREE.Shape.prototype.getSpacedPointsHoles = function ( divisions ) { - - var i, il = this.holes.length, holesPts = []; - - for ( i = 0; i < il; i ++ ) { - - holesPts[ i ] = this.holes[ i ].getTransformedSpacedPoints( divisions, this.bends ); - - } - - return holesPts; - -}; - - -// Get points of shape and holes (keypoints based on segments parameter) - -THREE.Shape.prototype.extractAllPoints = function ( divisions ) { - - return { - - shape: this.getTransformedPoints( divisions ), - holes: this.getPointsHoles( divisions ) - - }; - -}; - -// -// THREE.Shape.prototype.extractAllPointsWithBend = function ( divisions, bend ) { -// -// return { -// -// shape: this.transform( bend, divisions ), -// holes: this.getPointsHoles( divisions, bend ) -// -// }; -// -// }; - -// Get points of shape and holes (spaced by regular distance) - -THREE.Shape.prototype.extractAllSpacedPoints = function ( divisions ) { - - return { - - shape: this.getTransformedSpacedPoints( divisions ), - holes: this.getSpacedPointsHoles( divisions ) - - }; - -}; - -/************************************************************** - * Utils - **************************************************************/ - -THREE.Shape.Utils = { - - /* - contour - array of vector2 for contour - holes - array of array of vector2 - */ - - removeHoles: function ( contour, holes ) { - - var shape = contour.concat(); // work on this shape - var allpoints = shape.concat(); - - /* For each isolated shape, find the closest points and break to the hole to allow triangulation */ - - - var prevShapeVert, nextShapeVert, - prevHoleVert, nextHoleVert, - holeIndex, shapeIndex, - shapeId, shapeGroup, - h, h2, - hole, shortest, d, - p, pts1, pts2, - tmpShape1, tmpShape2, - tmpHole1, tmpHole2, - verts = []; - - for ( h = 0; h < holes.length; h ++ ) { - - hole = holes[ h ]; - - /* - shapeholes[ h ].concat(); // preserves original - holes.push( hole ); - */ - - Array.prototype.push.apply( allpoints, hole ); - - shortest = Number.POSITIVE_INFINITY; - - - // Find the shortest pair of pts between shape and hole - - // Note: Actually, I'm not sure now if we could optimize this to be faster than O(m*n) - // Using distanceToSquared() intead of distanceTo() should speed a little - // since running square roots operations are reduced. - - for ( h2 = 0; h2 < hole.length; h2 ++ ) { - - pts1 = hole[ h2 ]; - var dist = []; - - for ( p = 0; p < shape.length; p++ ) { - - pts2 = shape[ p ]; - d = pts1.distanceToSquared( pts2 ); - dist.push( d ); - - if ( d < shortest ) { - - shortest = d; - holeIndex = h2; - shapeIndex = p; - - } - - } - - } - - //console.log("shortest", shortest, dist); - - prevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1; - prevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1; - - var areaapts = [ - - hole[ holeIndex ], - shape[ shapeIndex ], - shape[ prevShapeVert ] - - ]; - - var areaa = THREE.FontUtils.Triangulate.area( areaapts ); - - var areabpts = [ - - hole[ holeIndex ], - hole[ prevHoleVert ], - shape[ shapeIndex ] - - ]; - - var areab = THREE.FontUtils.Triangulate.area( areabpts ); - - var shapeOffset = 1; - var holeOffset = -1; - - var oldShapeIndex = shapeIndex, oldHoleIndex = holeIndex; - shapeIndex += shapeOffset; - holeIndex += holeOffset; - - if ( shapeIndex < 0 ) { shapeIndex += shape.length; } - shapeIndex %= shape.length; - - if ( holeIndex < 0 ) { holeIndex += hole.length; } - holeIndex %= hole.length; - - prevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1; - prevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1; - - areaapts = [ - - hole[ holeIndex ], - shape[ shapeIndex ], - shape[ prevShapeVert ] - - ]; - - var areaa2 = THREE.FontUtils.Triangulate.area( areaapts ); - - areabpts = [ - - hole[ holeIndex ], - hole[ prevHoleVert ], - shape[ shapeIndex ] - - ]; - - var areab2 = THREE.FontUtils.Triangulate.area( areabpts ); - //console.log(areaa,areab ,areaa2,areab2, ( areaa + areab ), ( areaa2 + areab2 )); - - if ( ( areaa + areab ) > ( areaa2 + areab2 ) ) { - - // In case areas are not correct. - //console.log("USE THIS"); - - shapeIndex = oldShapeIndex; - holeIndex = oldHoleIndex ; - - if ( shapeIndex < 0 ) { shapeIndex += shape.length; } - shapeIndex %= shape.length; - - if ( holeIndex < 0 ) { holeIndex += hole.length; } - holeIndex %= hole.length; - - prevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1; - prevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1; - - } else { - - //console.log("USE THAT ") - - } - - tmpShape1 = shape.slice( 0, shapeIndex ); - tmpShape2 = shape.slice( shapeIndex ); - tmpHole1 = hole.slice( holeIndex ); - tmpHole2 = hole.slice( 0, holeIndex ); - - // Should check orders here again? - - var trianglea = [ - - hole[ holeIndex ], - shape[ shapeIndex ], - shape[ prevShapeVert ] - - ]; - - var triangleb = [ - - hole[ holeIndex ] , - hole[ prevHoleVert ], - shape[ shapeIndex ] - - ]; - - verts.push( trianglea ); - verts.push( triangleb ); - - shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); - - } - - return { - - shape:shape, /* shape with no holes */ - isolatedPts: verts, /* isolated faces */ - allpoints: allpoints - - } - - - }, - - triangulateShape: function ( contour, holes ) { - - var shapeWithoutHoles = THREE.Shape.Utils.removeHoles( contour, holes ); - - var shape = shapeWithoutHoles.shape, - allpoints = shapeWithoutHoles.allpoints, - isolatedPts = shapeWithoutHoles.isolatedPts; - - var triangles = THREE.FontUtils.Triangulate( shape, false ); // True returns indices for points of spooled shape - - // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. - - //console.log( "triangles",triangles, triangles.length ); - //console.log( "allpoints",allpoints, allpoints.length ); - - var i, il, f, face, - key, index, - allPointsMap = {}, - isolatedPointsMap = {}; - - // prepare all points map - - for ( i = 0, il = allpoints.length; i < il; i ++ ) { - - key = allpoints[ i ].x + ":" + allpoints[ i ].y; - - if ( allPointsMap[ key ] !== undefined ) { - - console.log( "Duplicate point", key ); - - } - - allPointsMap[ key ] = i; - - } - - // check all face vertices against all points map - - for ( i = 0, il = triangles.length; i < il; i ++ ) { - - face = triangles[ i ]; - - for ( f = 0; f < 3; f ++ ) { - - key = face[ f ].x + ":" + face[ f ].y; - - index = allPointsMap[ key ]; - - if ( index !== undefined ) { - - face[ f ] = index; - - } - - } - - } - - // check isolated points vertices against all points map - - for ( i = 0, il = isolatedPts.length; i < il; i ++ ) { - - face = isolatedPts[ i ]; - - for ( f = 0; f < 3; f ++ ) { - - key = face[ f ].x + ":" + face[ f ].y; - - index = allPointsMap[ key ]; - - if ( index !== undefined ) { - - face[ f ] = index; - - } - - } - - } - - return triangles.concat( isolatedPts ); - - }, // end triangulate shapes - - /* - triangulate2 : function( pts, holes ) { - - // For use with Poly2Tri.js - - var allpts = pts.concat(); - var shape = []; - for (var p in pts) { - shape.push(new js.poly2tri.Point(pts[p].x, pts[p].y)); - } - - var swctx = new js.poly2tri.SweepContext(shape); - - for (var h in holes) { - var aHole = holes[h]; - var newHole = [] - for (i in aHole) { - newHole.push(new js.poly2tri.Point(aHole[i].x, aHole[i].y)); - allpts.push(aHole[i]); - } - swctx.AddHole(newHole); - } - - var find; - var findIndexForPt = function (pt) { - find = new THREE.Vector2(pt.x, pt.y); - var p; - for (p=0, pl = allpts.length; p 1 ) { - - console.log( "THREE.Animation.update: Warning! Scale out of bounds:" + scale + " on bone " + h ); - scale = scale < 0 ? 0 : 1; - - } - - // interpolate - - if ( type === "pos" ) { - - vector = object.position; - - if( this.interpolationType === THREE.AnimationHandler.LINEAR ) { - - vector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale; - vector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale; - vector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale; - - } else if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM || - this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - this.points[ 0 ] = this.getPrevKeyWith( "pos", h, prevKey.index - 1 )[ "pos" ]; - this.points[ 1 ] = prevXYZ; - this.points[ 2 ] = nextXYZ; - this.points[ 3 ] = this.getNextKeyWith( "pos", h, nextKey.index + 1 )[ "pos" ]; - - scale = scale * 0.33 + 0.33; - - currentPoint = this.interpolateCatmullRom( this.points, scale ); - - vector.x = currentPoint[ 0 ]; - vector.y = currentPoint[ 1 ]; - vector.z = currentPoint[ 2 ]; - - if( this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - forwardPoint = this.interpolateCatmullRom( this.points, scale * 1.01 ); - - this.target.set( forwardPoint[ 0 ], forwardPoint[ 1 ], forwardPoint[ 2 ] ); - this.target.subSelf( vector ); - this.target.y = 0; - this.target.normalize(); - - angle = Math.atan2( this.target.x, this.target.z ); - object.rotation.set( 0, angle, 0 ); - - } - - } - - } else if ( type === "rot" ) { - - THREE.Quaternion.slerp( prevXYZ, nextXYZ, object.quaternion, scale ); - - } else if( type === "scl" ) { - - vector = object.scale; - - vector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale; - vector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale; - vector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale; - - } - - } - - } - - } - - // update JIT? - - if ( this.JITCompile ) { - - if ( JIThierarchy[ 0 ][ frame ] === undefined ) { - - this.hierarchy[ 0 ].updateMatrixWorld( true ); - - for ( var h = 0; h < this.hierarchy.length; h++ ) { - - if( this.hierarchy[ h ] instanceof THREE.Bone ) { - - JIThierarchy[ h ][ frame ] = this.hierarchy[ h ].skinMatrix.clone(); - - } else { - - JIThierarchy[ h ][ frame ] = this.hierarchy[ h ].matrix.clone(); - - } - - } - - } - - } - -}; - -// Catmull-Rom spline - -THREE.Animation.prototype.interpolateCatmullRom = function ( points, scale ) { - - var c = [], v3 = [], - point, intPoint, weight, w2, w3, - pa, pb, pc, pd; - - point = ( points.length - 1 ) * scale; - intPoint = Math.floor( point ); - weight = point - intPoint; - - c[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1; - c[ 1 ] = intPoint; - c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1; - c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2; - - pa = points[ c[ 0 ] ]; - pb = points[ c[ 1 ] ]; - pc = points[ c[ 2 ] ]; - pd = points[ c[ 3 ] ]; - - w2 = weight * weight; - w3 = weight * w2; - - v3[ 0 ] = this.interpolate( pa[ 0 ], pb[ 0 ], pc[ 0 ], pd[ 0 ], weight, w2, w3 ); - v3[ 1 ] = this.interpolate( pa[ 1 ], pb[ 1 ], pc[ 1 ], pd[ 1 ], weight, w2, w3 ); - v3[ 2 ] = this.interpolate( pa[ 2 ], pb[ 2 ], pc[ 2 ], pd[ 2 ], weight, w2, w3 ); - - return v3; - -}; - -THREE.Animation.prototype.interpolate = function( p0, p1, p2, p3, t, t2, t3 ) { - - var v0 = ( p2 - p0 ) * 0.5, - v1 = ( p3 - p1 ) * 0.5; - - return ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1; - -}; - - - -// Get next key with - -THREE.Animation.prototype.getNextKeyWith = function( type, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - - if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM || - this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - key = key < keys.length - 1 ? key : keys.length - 1; - - } else { - - key = key % keys.length; - - } - - for ( ; key < keys.length; key++ ) { - - if ( keys[ key ][ type ] !== undefined ) { - - return keys[ key ]; - - } - - } - - return this.data.hierarchy[ h ].keys[ 0 ]; - -}; - -// Get previous key with - -THREE.Animation.prototype.getPrevKeyWith = function( type, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - - if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM || - this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) { - - key = key > 0 ? key : 0; - - } else { - - key = key >= 0 ? key : key + keys.length; - - } - - - for ( ; key >= 0; key-- ) { - - if ( keys[ key ][ type ] !== undefined ) { - - return keys[ key ]; - - } - - } - - return this.data.hierarchy[ h ].keys[ keys.length - 1 ]; - -};/** - * @author mikael emtinger / http://gomo.se/ - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author khang duong - * @author erik kitson - */ - -THREE.KeyFrameAnimation = function( root, data, JITCompile ) { - - this.root = root; - this.data = THREE.AnimationHandler.get( data ); - this.hierarchy = THREE.AnimationHandler.parse( root ); - this.currentTime = 0; - this.timeScale = 0.001; - this.isPlaying = false; - this.isPaused = true; - this.loop = true; - this.JITCompile = JITCompile !== undefined ? JITCompile : true; - - // initialize to first keyframes - - for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) { - - var keys = this.data.hierarchy[h].keys, - sids = this.data.hierarchy[h].sids, - obj = this.hierarchy[h]; - - if ( keys.length && sids ) { - - for ( var s = 0; s < sids.length; s++ ) { - - var sid = sids[ s ], - next = this.getNextKeyWith( sid, h, 0 ); - - if ( next ) { - - next.apply( sid ); - - } - - } - - obj.matrixAutoUpdate = false; - this.data.hierarchy[h].node.updateMatrix(); - obj.matrixWorldNeedsUpdate = true; - - } - - } - -}; - -// Play - -THREE.KeyFrameAnimation.prototype.play = function( loop, startTimeMS ) { - - if( !this.isPlaying ) { - - this.isPlaying = true; - this.loop = loop !== undefined ? loop : true; - this.currentTime = startTimeMS !== undefined ? startTimeMS : 0; - this.startTimeMs = startTimeMS; - this.startTime = 10000000; - this.endTime = -this.startTime; - - - // reset key cache - - var h, hl = this.hierarchy.length, - object, - node; - - for ( h = 0; h < hl; h++ ) { - - object = this.hierarchy[ h ]; - node = this.data.hierarchy[ h ]; - object.useQuaternion = true; - - if ( node.animationCache === undefined ) { - - node.animationCache = {}; - node.animationCache.prevKey = null; - node.animationCache.nextKey = null; - node.animationCache.originalMatrix = object instanceof THREE.Bone ? object.skinMatrix : object.matrix; - - } - - var keys = this.data.hierarchy[h].keys; - - if (keys.length) { - - node.animationCache.prevKey = keys[ 0 ]; - node.animationCache.nextKey = keys[ 1 ]; - - this.startTime = Math.min( keys[0].time, this.startTime ); - this.endTime = Math.max( keys[keys.length - 1].time, this.endTime ); - - } - - } - - this.update( 0 ); - - } - - this.isPaused = false; - - THREE.AnimationHandler.addToUpdate( this ); - -}; - - - -// Pause - -THREE.KeyFrameAnimation.prototype.pause = function() { - - if( this.isPaused ) { - - THREE.AnimationHandler.addToUpdate( this ); - - } else { - - THREE.AnimationHandler.removeFromUpdate( this ); - - } - - this.isPaused = !this.isPaused; - -}; - - -// Stop - -THREE.KeyFrameAnimation.prototype.stop = function() { - - this.isPlaying = false; - this.isPaused = false; - THREE.AnimationHandler.removeFromUpdate( this ); - - - // reset JIT matrix and remove cache - - for ( var h = 0; h < this.hierarchy.length; h++ ) { - - var obj = this.hierarchy[ h ]; - - if ( obj.animationCache !== undefined ) { - - var original = obj.animationCache.originalMatrix; - - if( obj instanceof THREE.Bone ) { - - original.copy( obj.skinMatrix ); - obj.skinMatrix = original; - - } else { - - original.copy( obj.matrix ); - obj.matrix = original; - - } - - delete obj.animationCache; - - } - - } - -}; - - -// Update - -THREE.KeyFrameAnimation.prototype.update = function( deltaTimeMS ) { - - // early out - - if( !this.isPlaying ) return; - - - // vars - - var prevKey, nextKey; - var object; - var node; - var frame; - var JIThierarchy = this.data.JIT.hierarchy; - var currentTime, unloopedCurrentTime; - var looped; - - - // update - - this.currentTime += deltaTimeMS * this.timeScale; - - unloopedCurrentTime = this.currentTime; - currentTime = this.currentTime = this.currentTime % this.data.length; - - // if looped around, the current time should be based on the startTime - if ( currentTime < this.startTimeMs ) { - - currentTime = this.currentTime = this.startTimeMs + currentTime; - - } - - frame = parseInt( Math.min( currentTime * this.data.fps, this.data.length * this.data.fps ), 10 ); - looped = currentTime < unloopedCurrentTime; - - if ( looped && !this.loop ) { - - // Set the animation to the last keyframes and stop - for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) { - - var keys = this.data.hierarchy[h].keys, - sids = this.data.hierarchy[h].sids, - end = keys.length-1, - obj = this.hierarchy[h]; - - if ( keys.length ) { - - for ( var s = 0; s < sids.length; s++ ) { - - var sid = sids[ s ], - prev = this.getPrevKeyWith( sid, h, end ); - - if ( prev ) { - - prev.apply( sid ); - - } - - } - - this.data.hierarchy[h].node.updateMatrix(); - obj.matrixWorldNeedsUpdate = true; - - } - - } - - this.stop(); - return; - - } - - // check pre-infinity - if ( currentTime < this.startTime ) { - - return; - - } - - // update - - for ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) { - - object = this.hierarchy[ h ]; - node = this.data.hierarchy[ h ]; - - var keys = node.keys, - animationCache = node.animationCache; - - // use JIT? - - if ( this.JITCompile && JIThierarchy[ h ][ frame ] !== undefined ) { - - if( object instanceof THREE.Bone ) { - - object.skinMatrix = JIThierarchy[ h ][ frame ]; - object.matrixWorldNeedsUpdate = false; - - } else { - - object.matrix = JIThierarchy[ h ][ frame ]; - object.matrixWorldNeedsUpdate = true; - - } - - // use interpolation - - } else if ( keys.length ) { - - // make sure so original matrix and not JIT matrix is set - - if ( this.JITCompile && animationCache ) { - - if( object instanceof THREE.Bone ) { - - object.skinMatrix = animationCache.originalMatrix; - - } else { - - object.matrix = animationCache.originalMatrix; - - } - - } - - prevKey = animationCache.prevKey; - nextKey = animationCache.nextKey; - - if ( prevKey && nextKey ) { - - // switch keys? - - if ( nextKey.time <= unloopedCurrentTime ) { - - // did we loop? - - if ( looped && this.loop ) { - - prevKey = keys[ 0 ]; - nextKey = keys[ 1 ]; - - while ( nextKey.time < currentTime ) { - - prevKey = nextKey; - nextKey = keys[ prevKey.index + 1 ]; - - } - - } else if ( !looped ) { - - var lastIndex = keys.length - 1; - - while ( nextKey.time < currentTime && nextKey.index !== lastIndex ) { - - prevKey = nextKey; - nextKey = keys[ prevKey.index + 1 ]; - - } - - } - - animationCache.prevKey = prevKey; - animationCache.nextKey = nextKey; - - } - - prevKey.interpolate( nextKey, currentTime ); - - } - - this.data.hierarchy[h].node.updateMatrix(); - object.matrixWorldNeedsUpdate = true; - - } - - } - - // update JIT? - - if ( this.JITCompile ) { - - if ( JIThierarchy[ 0 ][ frame ] === undefined ) { - - this.hierarchy[ 0 ].updateMatrixWorld( true ); - - for ( var h = 0; h < this.hierarchy.length; h++ ) { - - if( this.hierarchy[ h ] instanceof THREE.Bone ) { - - JIThierarchy[ h ][ frame ] = this.hierarchy[ h ].skinMatrix.clone(); - - } else { - - JIThierarchy[ h ][ frame ] = this.hierarchy[ h ].matrix.clone(); - - } - - } - - } - - } - -}; - -// Get next key with - -THREE.KeyFrameAnimation.prototype.getNextKeyWith = function( sid, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - key = key % keys.length; - - for ( ; key < keys.length; key++ ) { - - if ( keys[ key ].hasTarget( sid ) ) { - - return keys[ key ]; - - } - - } - - return keys[ 0 ]; - -}; - -// Get previous key with - -THREE.KeyFrameAnimation.prototype.getPrevKeyWith = function( sid, h, key ) { - - var keys = this.data.hierarchy[ h ].keys; - key = key >= 0 ? key : key + keys.length; - - for ( ; key >= 0; key-- ) { - - if ( keys[ key ].hasTarget( sid ) ) { - - return keys[ key ]; - - } - - } - - return keys[ keys.length - 1 ]; - -}; -/** - * Camera for rendering cube maps - * - renders scene into axis-aligned cube - * - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.CubeCamera = function ( near, far, heightOffset, cubeResolution ) { - - this.heightOffset = heightOffset; - this.position = new THREE.Vector3( 0, heightOffset, 0 ); - - // cameras - - var fov = 90, aspect = 1; - - this.cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far ); - this.cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far ); - - this.cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far ); - this.cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far ); - - this.cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); - this.cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far ); - - this.cameraPX.position = this.position; - this.cameraNX.position = this.position; - - this.cameraPY.position = this.position; - this.cameraNY.position = this.position; - - this.cameraPZ.position = this.position; - this.cameraNZ.position = this.position; - - this.cameraPX.up.set( 0, -1, 0 ); - this.cameraNX.up.set( 0, -1, 0 ); - - this.cameraPY.up.set( 0, 0, 1 ); - this.cameraNY.up.set( 0, 0, -1 ); - - this.cameraPZ.up.set( 0, -1, 0 ); - this.cameraNZ.up.set( 0, -1, 0 ); - - // targets - - this.targetPX = new THREE.Vector3( 0, 0, 0 ); - this.targetNX = new THREE.Vector3( 0, 0, 0 ); - - this.targetPY = new THREE.Vector3( 0, 0, 0 ); - this.targetNY = new THREE.Vector3( 0, 0, 0 ); - - this.targetPZ = new THREE.Vector3( 0, 0, 0 ); - this.targetNZ = new THREE.Vector3( 0, 0, 0 ); - - // cube render target - - this.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter } ); - - this.updatePosition = function ( position ) { - - this.position.copy( position ); - - this.position.y += this.heightOffset; - - this.targetPX.copy( this.position ); - this.targetNX.copy( this.position ); - - this.targetPY.copy( this.position ); - this.targetNY.copy( this.position ); - - this.targetPZ.copy( this.position ); - this.targetNZ.copy( this.position ); - - this.targetPX.x += 1; - this.targetNX.x -= 1; - - this.targetPY.y += 1; - this.targetNY.y -= 1; - - this.targetPZ.z += 1; - this.targetNZ.z -= 1; - - this.cameraPX.lookAt( this.targetPX ); - this.cameraNX.lookAt( this.targetNX ); - - this.cameraPY.lookAt( this.targetPY ); - this.cameraNY.lookAt( this.targetNY ); - - this.cameraPZ.lookAt( this.targetPZ ); - this.cameraNZ.lookAt( this.targetNZ ); - - }; - - this.updateCubeMap = function ( renderer, scene ) { - - var cubeTarget = this.renderTarget; - - cubeTarget.activeCubeFace = 0; - renderer.render( scene, this.cameraPX, cubeTarget ); - - cubeTarget.activeCubeFace = 1; - renderer.render( scene, this.cameraNX, cubeTarget ); - - cubeTarget.activeCubeFace = 2; - renderer.render( scene, this.cameraPY, cubeTarget ); - - cubeTarget.activeCubeFace = 3; - renderer.render( scene, this.cameraNY, cubeTarget ); - - cubeTarget.activeCubeFace = 4; - renderer.render( scene, this.cameraPZ, cubeTarget ); - - cubeTarget.activeCubeFace = 5; - renderer.render( scene, this.cameraNZ, cubeTarget ); - - }; - -};THREE.FirstPersonCamera = function () { - - console.warn( 'DEPRECATED: FirstPersonCamera() is FirstPersonControls().' ); - -}; -THREE.PathCamera = function () { - - console.warn( 'DEPRECATED: PathCamera() is PathControls().' ); - -}; -THREE.FlyCamera = function () { - - console.warn( 'DEPRECATED: FlyCamera() is FlyControls().' ); - -}; -THREE.RollCamera = function () { - - console.warn( 'DEPRECATED: RollCamera() is RollControls().' ); - -}; -THREE.TrackballCamera = function () { - - console.warn( 'DEPRECATED: TrackballCamera() is TrackballControls().' ); - -}; -/* - * @author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog - * - * A handy general perpose camera, for setting FOV, Lens Focal Length, - * and switching between perspective and orthographic views easily. - * - */ - - -THREE.CombinedCamera = function ( width, height, fov, near, far, orthonear, orthofar ) { - - THREE.Camera.call( this ); - - this.fov = fov; - - this.left = -width / 2; - this.right = width / 2 - this.top = height / 2; - this.bottom = -height / 2; - - // We could also handle the projectionMatrix internally, but just wanted to test nested camera objects - this.cameraO = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, orthonear, orthofar ); - this.cameraP = new THREE.PerspectiveCamera( fov, width/height, near, far ); - - this.zoom = 1; - - this.toPerspective(); - - - var aspect = width/height; - - - - -}; - -THREE.CombinedCamera.prototype = new THREE.Camera(); -THREE.CombinedCamera.prototype.constructor = THREE.CoolCamera; - -THREE.CombinedCamera.prototype.toPerspective = function () { - - this.near = this.cameraP.near; - this.far = this.cameraP.far; - this.cameraP.fov = this.fov / this.zoom ; - this.cameraP.updateProjectionMatrix(); - this.projectionMatrix = this.cameraP.projectionMatrix; - - this.inPersepectiveMode = true; - this.inOrthographicMode = false; - -}; - -THREE.CombinedCamera.prototype.toOrthographic = function () { - - // Orthographic from Perspective - var fov = this.fov; - var aspect = this.cameraP.aspect; - var near = this.cameraP.near; - var far = this.cameraP.far; - - - // Just pretend we want the mid plane of the viewing frustum - var hyperfocus = ( near + far ) / 2; - - var halfHeight = Math.tan( fov / 2 ) * hyperfocus; - var planeHeight = 2 * halfHeight; - var planeWidth = planeHeight * aspect; - var halfWidth = planeWidth / 2; - - halfHeight /= this.zoom; - halfWidth /= this.zoom; - - this.cameraO.left = -halfWidth; - this.cameraO.right = halfWidth; - this.cameraO.top = halfHeight; - this.cameraO.bottom = -halfHeight; - - // this.cameraO.left = -farHalfWidth; - // this.cameraO.right = farHalfWidth; - // this.cameraO.top = farHalfHeight; - // this.cameraO.bottom = -farHalfHeight; - - // this.cameraO.left = this.left / this.zoom; - // this.cameraO.right = this.right / this.zoom; - // this.cameraO.top = this.top / this.zoom; - // this.cameraO.bottom = this.bottom / this.zoom; - - this.cameraO.updateProjectionMatrix(); - - this.near = this.cameraO.near; - this.far = this.cameraO.far; - this.projectionMatrix = this.cameraO.projectionMatrix; - - this.inPersepectiveMode = false; - this.inOrthographicMode = true; - -}; - -THREE.CombinedCamera.prototype.setFov = function(fov) { - this.fov = fov; - - if (this.inPersepectiveMode) { - this.toPerspective(); - } else { - this.toOrthographic(); - } - -}; - -/* -* Uses Focal Length (in mm) to estimate and set FOV -* 35mm (fullframe) camera is used if frame size is not specified; -* Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html -*/ -THREE.CombinedCamera.prototype.setLens = function(focalLength, framesize) { - - if (!framesize) framesize = 43.25; // 36x24mm - - var fov = 2 * Math.atan( framesize / (focalLength * 2)); - fov = 180 / Math.PI * fov; - this.setFov(fov); - - return fov; -}; - - -THREE.CombinedCamera.prototype.setZoom = function(zoom) { - - this.zoom = zoom; - - if (this.inPersepectiveMode) { - this.toPerspective(); - } else { - this.toOrthographic(); - } - - -}; - -THREE.CombinedCamera.prototype.toFrontView = function() { - this.rotation.x = 0; - this.rotation.y = 0; - this.rotation.z = 0; - - //TODO: Better way to disable camera.lookAt()? - this.rotationAutoUpdate = false; -}; - -THREE.CombinedCamera.prototype.toBackView = function() { - this.rotation.x = 0; - this.rotation.y = Math.PI; - this.rotation.z = 0; - this.rotationAutoUpdate = false; -}; - -THREE.CombinedCamera.prototype.toLeftView = function() { - this.rotation.x = 0; - this.rotation.y = - Math.PI / 2; - this.rotation.z = 0; - this.rotationAutoUpdate = false; -}; - -THREE.CombinedCamera.prototype.toRightView = function() { - this.rotation.x = 0; - this.rotation.y = Math.PI / 2; - this.rotation.z = 0; - this.rotationAutoUpdate = false; -}; - -THREE.CombinedCamera.prototype.toTopView = function() { - this.rotation.x = - Math.PI / 2; - this.rotation.y = 0; - this.rotation.z = 0; - this.rotationAutoUpdate = false; -}; - -THREE.CombinedCamera.prototype.toBottomView = function() { - this.rotation.x = Math.PI / 2; - this.rotation.y = 0; - this.rotation.z = 0; - this.rotationAutoUpdate = false; -}; - -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - * @author paulirish / http://paulirish.com/ - */ - -THREE.FirstPersonControls = function ( object, domElement ) { - - this.object = object; - this.target = new THREE.Vector3( 0, 0, 0 ); - - this.domElement = ( domElement !== undefined ) ? domElement : document; - - this.movementSpeed = 1.0; - this.lookSpeed = 0.005; - - this.noFly = false; - this.lookVertical = true; - this.autoForward = false; - - this.activeLook = true; - - this.heightSpeed = false; - this.heightCoef = 1.0; - this.heightMin = 0.0; - - this.constrainVertical = false; - this.verticalMin = 0; - this.verticalMax = Math.PI; - - this.autoSpeedFactor = 0.0; - - this.mouseX = 0; - this.mouseY = 0; - - this.lat = 0; - this.lon = 0; - this.phi = 0; - this.theta = 0; - - this.moveForward = false; - this.moveBackward = false; - this.moveLeft = false; - this.moveRight = false; - this.freeze = false; - - this.mouseDragOn = false; - - if ( this.domElement === document ) { - - this.viewHalfX = window.innerWidth / 2; - this.viewHalfY = window.innerHeight / 2; - - } else { - - this.viewHalfX = this.domElement.offsetWidth / 2; - this.viewHalfY = this.domElement.offsetHeight / 2; - this.domElement.setAttribute( 'tabindex', -1 ); - - } - - this.onMouseDown = function ( event ) { - - if ( this.domElement !== document ) { - - this.domElement.focus(); - - } - - event.preventDefault(); - event.stopPropagation(); - - if ( this.activeLook ) { - - switch ( event.button ) { - - case 0: this.moveForward = true; break; - case 2: this.moveBackward = true; break; - - } - - } - - this.mouseDragOn = true; - - }; - - this.onMouseUp = function ( event ) { - - event.preventDefault(); - event.stopPropagation(); - - if ( this.activeLook ) { - - switch ( event.button ) { - - case 0: this.moveForward = false; break; - case 2: this.moveBackward = false; break; - - } - - } - - this.mouseDragOn = false; - - }; - - this.onMouseMove = function ( event ) { - - if ( this.domElement === document ) { - - this.mouseX = event.pageX - this.viewHalfX; - this.mouseY = event.pageY - this.viewHalfY; - - } else { - - this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX; - this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY; - - } - - }; - - this.onKeyDown = function ( event ) { - - switch( event.keyCode ) { - - case 38: /*up*/ - case 87: /*W*/ this.moveForward = true; break; - - case 37: /*left*/ - case 65: /*A*/ this.moveLeft = true; break; - - case 40: /*down*/ - case 83: /*S*/ this.moveBackward = true; break; - - case 39: /*right*/ - case 68: /*D*/ this.moveRight = true; break; - - case 82: /*R*/ this.moveUp = true; break; - case 70: /*F*/ this.moveDown = true; break; - - case 81: /*Q*/ this.freeze = !this.freeze; break; - - } - - }; - - this.onKeyUp = function ( event ) { - - switch( event.keyCode ) { - - case 38: /*up*/ - case 87: /*W*/ this.moveForward = false; break; - - case 37: /*left*/ - case 65: /*A*/ this.moveLeft = false; break; - - case 40: /*down*/ - case 83: /*S*/ this.moveBackward = false; break; - - case 39: /*right*/ - case 68: /*D*/ this.moveRight = false; break; - - case 82: /*R*/ this.moveUp = false; break; - case 70: /*F*/ this.moveDown = false; break; - - } - - }; - - this.update = function( delta ) { - var actualMoveSpeed = 0; - - if ( this.freeze ) { - - return; - - } else { - - if ( this.heightSpeed ) { - - var y = THREE.Math.clamp( this.object.position.y, this.heightMin, this.heightMax ); - var heightDelta = y - this.heightMin; - - this.autoSpeedFactor = delta * ( heightDelta * this.heightCoef ); - - } else { - - this.autoSpeedFactor = 0.0; - - } - - actualMoveSpeed = delta * this.movementSpeed; - - if ( this.moveForward || ( this.autoForward && !this.moveBackward ) ) this.object.translateZ( - ( actualMoveSpeed + this.autoSpeedFactor ) ); - if ( this.moveBackward ) this.object.translateZ( actualMoveSpeed ); - - if ( this.moveLeft ) this.object.translateX( - actualMoveSpeed ); - if ( this.moveRight ) this.object.translateX( actualMoveSpeed ); - - if ( this.moveUp ) this.object.translateY( actualMoveSpeed ); - if ( this.moveDown ) this.object.translateY( - actualMoveSpeed ); - - var actualLookSpeed = delta * this.lookSpeed; - - if ( !this.activeLook ) { - - actualLookSpeed = 0; - - } - - this.lon += this.mouseX * actualLookSpeed; - if( this.lookVertical ) this.lat -= this.mouseY * actualLookSpeed; - - this.lat = Math.max( - 85, Math.min( 85, this.lat ) ); - this.phi = ( 90 - this.lat ) * Math.PI / 180; - this.theta = this.lon * Math.PI / 180; - - var targetPosition = this.target, - position = this.object.position; - - targetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ); - targetPosition.y = position.y + 100 * Math.cos( this.phi ); - targetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ); - - } - - var verticalLookRatio = 1; - - if ( this.constrainVertical ) { - - verticalLookRatio = Math.PI / ( this.verticalMax - this.verticalMin ); - - } - - this.lon += this.mouseX * actualLookSpeed; - if( this.lookVertical ) this.lat -= this.mouseY * actualLookSpeed * verticalLookRatio; - - this.lat = Math.max( - 85, Math.min( 85, this.lat ) ); - this.phi = ( 90 - this.lat ) * Math.PI / 180; - - this.theta = this.lon * Math.PI / 180; - - if ( this.constrainVertical ) { - - this.phi = THREE.Math.mapLinear( this.phi, 0, Math.PI, this.verticalMin, this.verticalMax ); - - } - - var targetPosition = this.target, - position = this.object.position; - - targetPosition.x = position.x + 100 * Math.sin( this.phi ) * Math.cos( this.theta ); - targetPosition.y = position.y + 100 * Math.cos( this.phi ); - targetPosition.z = position.z + 100 * Math.sin( this.phi ) * Math.sin( this.theta ); - - this.object.lookAt( targetPosition ); - - }; - - - this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); - - this.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false ); - this.domElement.addEventListener( 'mousedown', bind( this, this.onMouseDown ), false ); - this.domElement.addEventListener( 'mouseup', bind( this, this.onMouseUp ), false ); - this.domElement.addEventListener( 'keydown', bind( this, this.onKeyDown ), false ); - this.domElement.addEventListener( 'keyup', bind( this, this.onKeyUp ), false ); - - function bind( scope, fn ) { - - return function () { - - fn.apply( scope, arguments ); - - }; - - }; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.PathControls = function ( object, domElement ) { - - this.object = object; - this.domElement = ( domElement !== undefined ) ? domElement : document; - - this.id = "PathControls" + THREE.PathControlsIdCounter ++; - - // API - - this.duration = 10 * 1000; // milliseconds - this.waypoints = []; - - this.useConstantSpeed = true; - this.resamplingCoef = 50; - - this.debugPath = new THREE.Object3D(); - this.debugDummy = new THREE.Object3D(); - - this.animationParent = new THREE.Object3D(); - - this.lookSpeed = 0.005; - this.lookVertical = true; - this.lookHorizontal = true; - this.verticalAngleMap = { srcRange: [ 0, 2 * Math.PI ], dstRange: [ 0, 2 * Math.PI ] }; - this.horizontalAngleMap = { srcRange: [ 0, 2 * Math.PI ], dstRange: [ 0, 2 * Math.PI ] }; - - // internals - - this.target = new THREE.Object3D(); - - this.mouseX = 0; - this.mouseY = 0; - - this.lat = 0; - this.lon = 0; - - this.phi = 0; - this.theta = 0; - - if ( this.domElement === document ) { - - this.viewHalfX = window.innerWidth / 2; - this.viewHalfY = window.innerHeight / 2; - - } else { - - this.viewHalfX = this.domElement.offsetWidth / 2; - this.viewHalfY = this.domElement.offsetHeight / 2; - this.domElement.setAttribute( 'tabindex', -1 ); - - } - - var PI2 = Math.PI * 2, - PI180 = Math.PI / 180; - - // methods - - this.update = function ( delta ) { - - var srcRange, dstRange; - - if( this.lookHorizontal ) this.lon += this.mouseX * this.lookSpeed * delta; - if( this.lookVertical ) this.lat -= this.mouseY * this.lookSpeed * delta; - - this.lon = Math.max( 0, Math.min( 360, this.lon ) ); - this.lat = Math.max( - 85, Math.min( 85, this.lat ) ); - - this.phi = ( 90 - this.lat ) * PI180; - this.theta = this.lon * PI180; - - this.phi = normalize_angle_rad( this.phi ); - - // constrain vertical look angle - - srcRange = this.verticalAngleMap.srcRange; - dstRange = this.verticalAngleMap.dstRange; - - var tmpPhi = THREE.Math.mapLinear( this.phi, srcRange[ 0 ], srcRange[ 1 ], dstRange[ 0 ], dstRange[ 1 ] ); - var tmpPhiFullRange = dstRange[ 1 ] - dstRange[ 0 ]; - var tmpPhiNormalized = ( tmpPhi - dstRange[ 0 ] ) / tmpPhiFullRange; - - this.phi = QuadraticEaseInOut( tmpPhiNormalized ) * tmpPhiFullRange + dstRange[ 0 ]; - - // constrain horizontal look angle - - srcRange = this.horizontalAngleMap.srcRange; - dstRange = this.horizontalAngleMap.dstRange; - - var tmpTheta = THREE.Math.mapLinear( this.theta, srcRange[ 0 ], srcRange[ 1 ], dstRange[ 0 ], dstRange[ 1 ] ); - var tmpThetaFullRange = dstRange[ 1 ] - dstRange[ 0 ]; - var tmpThetaNormalized = ( tmpTheta - dstRange[ 0 ] ) / tmpThetaFullRange; - - this.theta = QuadraticEaseInOut( tmpThetaNormalized ) * tmpThetaFullRange + dstRange[ 0 ]; - - var targetPosition = this.target.position, - position = this.object.position; - - targetPosition.x = 100 * Math.sin( this.phi ) * Math.cos( this.theta ); - targetPosition.y = 100 * Math.cos( this.phi ); - targetPosition.z = 100 * Math.sin( this.phi ) * Math.sin( this.theta ); - - this.object.lookAt( this.target.position ); - - }; - - this.onMouseMove = function ( event ) { - - if ( this.domElement === document ) { - - this.mouseX = event.pageX - this.viewHalfX; - this.mouseY = event.pageY - this.viewHalfY; - - } else { - - this.mouseX = event.pageX - this.domElement.offsetLeft - this.viewHalfX; - this.mouseY = event.pageY - this.domElement.offsetTop - this.viewHalfY; - - } - - }; - - // utils - - function normalize_angle_rad( a ) { - - var b = a % PI2; - return b >= 0 ? b : b + PI2; - - }; - - function distance( a, b ) { - - var dx = a[ 0 ] - b[ 0 ], - dy = a[ 1 ] - b[ 1 ], - dz = a[ 2 ] - b[ 2 ]; - - return Math.sqrt( dx * dx + dy * dy + dz * dz ); - - }; - - function QuadraticEaseInOut ( k ) { - - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k; - return - 0.5 * ( --k * ( k - 2 ) - 1 ); - - }; - - function bind( scope, fn ) { - - return function () { - - fn.apply( scope, arguments ); - - }; - - }; - - function initAnimationPath( parent, spline, name, duration ) { - - var animationData = { - - name: name, - fps: 0.6, - length: duration, - - hierarchy: [] - - }; - - var i, - parentAnimation, childAnimation, - path = spline.getControlPointsArray(), - sl = spline.getLength(), - pl = path.length, - t = 0, - first = 0, - last = pl - 1; - - parentAnimation = { parent: -1, keys: [] }; - parentAnimation.keys[ first ] = { time: 0, pos: path[ first ], rot: [ 0, 0, 0, 1 ], scl: [ 1, 1, 1 ] }; - parentAnimation.keys[ last ] = { time: duration, pos: path[ last ], rot: [ 0, 0, 0, 1 ], scl: [ 1, 1, 1 ] }; - - for ( i = 1; i < pl - 1; i++ ) { - - // real distance (approximation via linear segments) - - t = duration * sl.chunks[ i ] / sl.total; - - // equal distance - - //t = duration * ( i / pl ); - - // linear distance - - //t += duration * distance( path[ i ], path[ i - 1 ] ) / sl.total; - - parentAnimation.keys[ i ] = { time: t, pos: path[ i ] }; - - } - - animationData.hierarchy[ 0 ] = parentAnimation; - - THREE.AnimationHandler.add( animationData ); - - return new THREE.Animation( parent, name, THREE.AnimationHandler.CATMULLROM_FORWARD, false ); - - }; - - - function createSplineGeometry( spline, n_sub ) { - - var i, index, position, - geometry = new THREE.Geometry(); - - for ( i = 0; i < spline.points.length * n_sub; i ++ ) { - - index = i / ( spline.points.length * n_sub ); - position = spline.getPoint( index ); - - geometry.vertices[ i ] = new THREE.Vertex( new THREE.Vector3( position.x, position.y, position.z ) ); - - } - - return geometry; - - }; - - function createPath( parent, spline ) { - - var lineGeo = createSplineGeometry( spline, 10 ), - particleGeo = createSplineGeometry( spline, 10 ), - lineMat = new THREE.LineBasicMaterial( { color: 0xff0000, linewidth: 3 } ), - lineObj = new THREE.Line( lineGeo, lineMat ), - particleObj = new THREE.ParticleSystem( particleGeo, new THREE.ParticleBasicMaterial( { color: 0xffaa00, size: 3 } ) ); - - lineObj.scale.set( 1, 1, 1 ); - parent.add( lineObj ); - - particleObj.scale.set( 1, 1, 1 ); - parent.add( particleObj ); - - var waypoint, - geo = new THREE.SphereGeometry( 1, 16, 8 ), - mat = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); - - for ( var i = 0; i < spline.points.length; i ++ ) { - - waypoint = new THREE.Mesh( geo, mat ); - waypoint.position.copy( spline.points[ i ] ); - parent.add( waypoint ); - - } - - }; - - this.init = function ( ) { - - // constructor - - this.spline = new THREE.Spline(); - this.spline.initFromArray( this.waypoints ); - - if ( this.useConstantSpeed ) { - - this.spline.reparametrizeByArcLength( this.resamplingCoef ); - - } - - if ( this.createDebugDummy ) { - - var dummyParentMaterial = new THREE.MeshLambertMaterial( { color: 0x0077ff } ), - dummyChildMaterial = new THREE.MeshLambertMaterial( { color: 0x00ff00 } ), - dummyParentGeo = new THREE.CubeGeometry( 10, 10, 20 ), - dummyChildGeo = new THREE.CubeGeometry( 2, 2, 10 ); - - this.animationParent = new THREE.Mesh( dummyParentGeo, dummyParentMaterial ); - - var dummyChild = new THREE.Mesh( dummyChildGeo, dummyChildMaterial ); - dummyChild.position.set( 0, 10, 0 ); - - this.animation = initAnimationPath( this.animationParent, this.spline, this.id, this.duration ); - - this.animationParent.add( this.object ); - this.animationParent.add( this.target ); - this.animationParent.add( dummyChild ); - - } else { - - this.animation = initAnimationPath( this.animationParent, this.spline, this.id, this.duration ); - this.animationParent.add( this.target ); - this.animationParent.add( this.object ); - - } - - if ( this.createDebugPath ) { - - createPath( this.debugPath, this.spline ); - - } - - this.domElement.addEventListener( 'mousemove', bind( this, this.onMouseMove ), false ); - - }; - -}; - -THREE.PathControlsIdCounter = 0; -/** - * @author James Baicoianu / http://www.baicoianu.com/ - */ - -THREE.FlyControls = function ( object, domElement ) { - - this.object = object; - - this.domElement = ( domElement !== undefined ) ? domElement : document; - if ( domElement ) this.domElement.setAttribute( 'tabindex', -1 ); - - // API - - this.movementSpeed = 1.0; - this.rollSpeed = 0.005; - - this.dragToLook = false; - this.autoForward = false; - - // disable default target object behavior - - this.object.useQuaternion = true; - - // internals - - this.tmpQuaternion = new THREE.Quaternion(); - - this.mouseStatus = 0; - - this.moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0, pitchUp: 0, pitchDown: 0, yawLeft: 0, yawRight: 0, rollLeft: 0, rollRight: 0 }; - this.moveVector = new THREE.Vector3( 0, 0, 0 ); - this.rotationVector = new THREE.Vector3( 0, 0, 0 ); - - this.handleEvent = function ( event ) { - - if ( typeof this[ event.type ] == 'function' ) { - - this[ event.type ]( event ); - - } - - }; - - this.keydown = function( event ) { - - if ( event.altKey ) { - - return; - - } - - switch( event.keyCode ) { - - case 16: /* shift */ this.movementSpeedMultiplier = .1; break; - - case 87: /*W*/ this.moveState.forward = 1; break; - case 83: /*S*/ this.moveState.back = 1; break; - - case 65: /*A*/ this.moveState.left = 1; break; - case 68: /*D*/ this.moveState.right = 1; break; - - case 82: /*R*/ this.moveState.up = 1; break; - case 70: /*F*/ this.moveState.down = 1; break; - - case 38: /*up*/ this.moveState.pitchUp = 1; break; - case 40: /*down*/ this.moveState.pitchDown = 1; break; - - case 37: /*left*/ this.moveState.yawLeft = 1; break; - case 39: /*right*/ this.moveState.yawRight = 1; break; - - case 81: /*Q*/ this.moveState.rollLeft = 1; break; - case 69: /*E*/ this.moveState.rollRight = 1; break; - - } - - this.updateMovementVector(); - this.updateRotationVector(); - - }; - - this.keyup = function( event ) { - - switch( event.keyCode ) { - - case 16: /* shift */ this.movementSpeedMultiplier = 1; break; - - case 87: /*W*/ this.moveState.forward = 0; break; - case 83: /*S*/ this.moveState.back = 0; break; - - case 65: /*A*/ this.moveState.left = 0; break; - case 68: /*D*/ this.moveState.right = 0; break; - - case 82: /*R*/ this.moveState.up = 0; break; - case 70: /*F*/ this.moveState.down = 0; break; - - case 38: /*up*/ this.moveState.pitchUp = 0; break; - case 40: /*down*/ this.moveState.pitchDown = 0; break; - - case 37: /*left*/ this.moveState.yawLeft = 0; break; - case 39: /*right*/ this.moveState.yawRight = 0; break; - - case 81: /*Q*/ this.moveState.rollLeft = 0; break; - case 69: /*E*/ this.moveState.rollRight = 0; break; - - } - - this.updateMovementVector(); - this.updateRotationVector(); - - }; - - this.mousedown = function( event ) { - - if ( this.domElement !== document ) { - - this.domElement.focus(); - - } - - event.preventDefault(); - event.stopPropagation(); - - if ( this.dragToLook ) { - - this.mouseStatus ++; - - } else { - - switch ( event.button ) { - - case 0: this.object.moveForward = true; break; - case 2: this.object.moveBackward = true; break; - - } - - } - - }; - - this.mousemove = function( event ) { - - if ( !this.dragToLook || this.mouseStatus > 0 ) { - - var container = this.getContainerDimensions(); - var halfWidth = container.size[ 0 ] / 2; - var halfHeight = container.size[ 1 ] / 2; - - this.moveState.yawLeft = - ( ( event.pageX - container.offset[ 0 ] ) - halfWidth ) / halfWidth; - this.moveState.pitchDown = ( ( event.pageY - container.offset[ 1 ] ) - halfHeight ) / halfHeight; - - this.updateRotationVector(); - - } - - }; - - this.mouseup = function( event ) { - - event.preventDefault(); - event.stopPropagation(); - - if ( this.dragToLook ) { - - this.mouseStatus --; - - this.moveState.yawLeft = this.moveState.pitchDown = 0; - - } else { - - switch ( event.button ) { - - case 0: this.moveForward = false; break; - case 2: this.moveBackward = false; break; - - } - - } - - this.updateRotationVector(); - - }; - - this.update = function( delta ) { - - var moveMult = delta * this.movementSpeed; - var rotMult = delta * this.rollSpeed; - - this.object.translateX( this.moveVector.x * moveMult ); - this.object.translateY( this.moveVector.y * moveMult ); - this.object.translateZ( this.moveVector.z * moveMult ); - - this.tmpQuaternion.set( this.rotationVector.x * rotMult, this.rotationVector.y * rotMult, this.rotationVector.z * rotMult, 1 ).normalize(); - this.object.quaternion.multiplySelf( this.tmpQuaternion ); - - this.object.matrix.setPosition( this.object.position ); - this.object.matrix.setRotationFromQuaternion( this.object.quaternion ); - this.object.matrixWorldNeedsUpdate = true; - - - }; - - this.updateMovementVector = function() { - - var forward = ( this.moveState.forward || ( this.autoForward && !this.moveState.back ) ) ? 1 : 0; - - this.moveVector.x = ( -this.moveState.left + this.moveState.right ); - this.moveVector.y = ( -this.moveState.down + this.moveState.up ); - this.moveVector.z = ( -forward + this.moveState.back ); - - //console.log( 'move:', [ this.moveVector.x, this.moveVector.y, this.moveVector.z ] ); - - }; - - this.updateRotationVector = function() { - - this.rotationVector.x = ( -this.moveState.pitchDown + this.moveState.pitchUp ); - this.rotationVector.y = ( -this.moveState.yawRight + this.moveState.yawLeft ); - this.rotationVector.z = ( -this.moveState.rollRight + this.moveState.rollLeft ); - - //console.log( 'rotate:', [ this.rotationVector.x, this.rotationVector.y, this.rotationVector.z ] ); - - }; - - this.getContainerDimensions = function() { - - if ( this.domElement != document ) { - - return { - size : [ this.domElement.offsetWidth, this.domElement.offsetHeight ], - offset : [ this.domElement.offsetLeft, this.domElement.offsetTop ] - }; - - } else { - - return { - size : [ window.innerWidth, window.innerHeight ], - offset : [ 0, 0 ] - }; - - } - - }; - - function bind( scope, fn ) { - - return function () { - - fn.apply( scope, arguments ); - - }; - - }; - - this.domElement.addEventListener( 'mousemove', bind( this, this.mousemove ), false ); - this.domElement.addEventListener( 'mousedown', bind( this, this.mousedown ), false ); - this.domElement.addEventListener( 'mouseup', bind( this, this.mouseup ), false ); - - this.domElement.addEventListener( 'keydown', bind( this, this.keydown ), false ); - this.domElement.addEventListener( 'keyup', bind( this, this.keyup ), false ); - - this.updateMovementVector(); - this.updateRotationVector(); - -}; -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.RollControls = function ( object, domElement ) { - - this.object = object; - this.domElement = ( domElement !== undefined ) ? domElement : document; - - // API - - this.mouseLook = true; - this.autoForward = false; - - this.lookSpeed = 1; - this.movementSpeed = 1; - this.rollSpeed = 1; - - this.constrainVertical = [ -0.9, 0.9 ]; - - // disable default target object behavior - - this.object.matrixAutoUpdate = false; - - // internals - - this.forward = new THREE.Vector3( 0, 0, 1 ); - this.roll = 0; - - var xTemp = new THREE.Vector3(); - var yTemp = new THREE.Vector3(); - var zTemp = new THREE.Vector3(); - var rollMatrix = new THREE.Matrix4(); - - var doRoll = false, rollDirection = 1, forwardSpeed = 0, sideSpeed = 0, upSpeed = 0; - - var mouseX = 0, mouseY = 0; - - var windowHalfX = window.innerWidth / 2; - var windowHalfY = window.innerHeight / 2; - - // custom update - - this.update = function ( delta ) { - - if ( this.mouseLook ) { - - var actualLookSpeed = delta * this.lookSpeed; - - this.rotateHorizontally( actualLookSpeed * mouseX ); - this.rotateVertically( actualLookSpeed * mouseY ); - - } - - var actualSpeed = delta * this.movementSpeed; - var forwardOrAuto = ( forwardSpeed > 0 || ( this.autoForward && ! ( forwardSpeed < 0 ) ) ) ? 1 : forwardSpeed; - - this.object.translateZ( -actualSpeed * forwardOrAuto ); - this.object.translateX( actualSpeed * sideSpeed ); - this.object.translateY( actualSpeed * upSpeed ); - - if( doRoll ) { - - this.roll += this.rollSpeed * delta * rollDirection; - - } - - // cap forward up / down - - if( this.forward.y > this.constrainVertical[ 1 ] ) { - - this.forward.y = this.constrainVertical[ 1 ]; - this.forward.normalize(); - - } else if( this.forward.y < this.constrainVertical[ 0 ] ) { - - this.forward.y = this.constrainVertical[ 0 ]; - this.forward.normalize(); - - } - - - // construct unrolled camera matrix - - zTemp.copy( this.forward ); - yTemp.set( 0, 1, 0 ); - - xTemp.cross( yTemp, zTemp ).normalize(); - yTemp.cross( zTemp, xTemp ).normalize(); - - this.object.matrix.n11 = xTemp.x; this.object.matrix.n12 = yTemp.x; this.object.matrix.n13 = zTemp.x; - this.object.matrix.n21 = xTemp.y; this.object.matrix.n22 = yTemp.y; this.object.matrix.n23 = zTemp.y; - this.object.matrix.n31 = xTemp.z; this.object.matrix.n32 = yTemp.z; this.object.matrix.n33 = zTemp.z; - - // calculate roll matrix - - rollMatrix.identity(); - rollMatrix.n11 = Math.cos( this.roll ); rollMatrix.n12 = -Math.sin( this.roll ); - rollMatrix.n21 = Math.sin( this.roll ); rollMatrix.n22 = Math.cos( this.roll ); - - // multiply camera with roll - - this.object.matrix.multiplySelf( rollMatrix ); - this.object.matrixWorldNeedsUpdate = true; - - // set position - - this.object.matrix.n14 = this.object.position.x; - this.object.matrix.n24 = this.object.position.y; - this.object.matrix.n34 = this.object.position.z; - - - }; - - this.translateX = function ( distance ) { - - this.object.position.x += this.object.matrix.n11 * distance; - this.object.position.y += this.object.matrix.n21 * distance; - this.object.position.z += this.object.matrix.n31 * distance; - - }; - - this.translateY = function ( distance ) { - - this.object.position.x += this.object.matrix.n12 * distance; - this.object.position.y += this.object.matrix.n22 * distance; - this.object.position.z += this.object.matrix.n32 * distance; - - }; - - this.translateZ = function ( distance ) { - - this.object.position.x -= this.object.matrix.n13 * distance; - this.object.position.y -= this.object.matrix.n23 * distance; - this.object.position.z -= this.object.matrix.n33 * distance; - - }; - - - this.rotateHorizontally = function ( amount ) { - - // please note that the amount is NOT degrees, but a scale value - - xTemp.set( this.object.matrix.n11, this.object.matrix.n21, this.object.matrix.n31 ); - xTemp.multiplyScalar( amount ); - - this.forward.subSelf( xTemp ); - this.forward.normalize(); - - }; - - this.rotateVertically = function ( amount ) { - - // please note that the amount is NOT degrees, but a scale value - - yTemp.set( this.object.matrix.n12, this.object.matrix.n22, this.object.matrix.n32 ); - yTemp.multiplyScalar( amount ); - - this.forward.addSelf( yTemp ); - this.forward.normalize(); - - }; - - function onKeyDown( event ) { - - switch( event.keyCode ) { - - case 38: /*up*/ - case 87: /*W*/ forwardSpeed = 1; break; - - case 37: /*left*/ - case 65: /*A*/ sideSpeed = -1; break; - - case 40: /*down*/ - case 83: /*S*/ forwardSpeed = -1; break; - - case 39: /*right*/ - case 68: /*D*/ sideSpeed = 1; break; - - case 81: /*Q*/ doRoll = true; rollDirection = 1; break; - case 69: /*E*/ doRoll = true; rollDirection = -1; break; - - case 82: /*R*/ upSpeed = 1; break; - case 70: /*F*/ upSpeed = -1; break; - - } - - }; - - function onKeyUp( event ) { - - switch( event.keyCode ) { - - case 38: /*up*/ - case 87: /*W*/ forwardSpeed = 0; break; - - case 37: /*left*/ - case 65: /*A*/ sideSpeed = 0; break; - - case 40: /*down*/ - case 83: /*S*/ forwardSpeed = 0; break; - - case 39: /*right*/ - case 68: /*D*/ sideSpeed = 0; break; - - case 81: /*Q*/ doRoll = false; break; - case 69: /*E*/ doRoll = false; break; - - case 82: /*R*/ upSpeed = 0; break; - case 70: /*F*/ upSpeed = 0; break; - - } - - }; - - function onMouseMove( event ) { - - mouseX = ( event.clientX - windowHalfX ) / window.innerWidth; - mouseY = ( event.clientY - windowHalfY ) / window.innerHeight; - - }; - - function onMouseDown ( event ) { - - event.preventDefault(); - event.stopPropagation(); - - switch ( event.button ) { - - case 0: forwardSpeed = 1; break; - case 2: forwardSpeed = -1; break; - - } - - }; - - function onMouseUp ( event ) { - - event.preventDefault(); - event.stopPropagation(); - - switch ( event.button ) { - - case 0: forwardSpeed = 0; break; - case 2: forwardSpeed = 0; break; - - } - - }; - - this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); - - this.domElement.addEventListener( 'mousemove', onMouseMove, false ); - this.domElement.addEventListener( 'mousedown', onMouseDown, false ); - this.domElement.addEventListener( 'mouseup', onMouseUp, false ); - this.domElement.addEventListener( 'keydown', onKeyDown, false ); - this.domElement.addEventListener( 'keyup', onKeyUp, false ); - -}; -/** - * @author Eberhard Graether / http://egraether.com/ - */ - -THREE.TrackballControls = function ( object, domElement ) { - - var _this = this, - STATE = { NONE : -1, ROTATE : 0, ZOOM : 1, PAN : 2 }; - - this.object = object; - this.domElement = ( domElement !== undefined ) ? domElement : document; - - // API - - this.enabled = true; - - this.screen = { width: window.innerWidth, height: window.innerHeight, offsetLeft: 0, offsetTop: 0 }; - this.radius = ( this.screen.width + this.screen.height ) / 4; - - this.rotateSpeed = 1.0; - this.zoomSpeed = 1.2; - this.panSpeed = 0.3; - - this.noRotate = false; - this.noZoom = false; - this.noPan = false; - - this.staticMoving = false; - this.dynamicDampingFactor = 0.2; - - this.minDistance = 0; - this.maxDistance = Infinity; - - this.keys = [ 65 /*A*/, 83 /*S*/, 68 /*D*/ ]; - - // internals - - this.target = new THREE.Vector3( 0, 0, 0 ); - - var _keyPressed = false, - _state = STATE.NONE, - - _eye = new THREE.Vector3(), - - _rotateStart = new THREE.Vector3(), - _rotateEnd = new THREE.Vector3(), - - _zoomStart = new THREE.Vector2(), - _zoomEnd = new THREE.Vector2(), - - _panStart = new THREE.Vector2(), - _panEnd = new THREE.Vector2(); - - - // methods - - this.handleEvent = function ( event ) { - - if ( typeof this[ event.type ] == 'function' ) { - - this[ event.type ]( event ); - - } - - }; - - this.getMouseOnScreen = function( clientX, clientY ) { - - return new THREE.Vector2( - ( clientX - _this.screen.offsetLeft ) / _this.radius * 0.5, - ( clientY - _this.screen.offsetTop ) / _this.radius * 0.5 - ); - - }; - - this.getMouseProjectionOnBall = function( clientX, clientY ) { - - var mouseOnBall = new THREE.Vector3( - ( clientX - _this.screen.width * 0.5 - _this.screen.offsetLeft ) / _this.radius, - ( _this.screen.height * 0.5 + _this.screen.offsetTop - clientY ) / _this.radius, - 0.0 - ); - - var length = mouseOnBall.length(); - - if ( length > 1.0 ) { - - mouseOnBall.normalize(); - - } else { - - mouseOnBall.z = Math.sqrt( 1.0 - length * length ); - - } - - _eye.copy( _this.object.position ).subSelf( _this.target ); - - var projection = _this.object.up.clone().setLength( mouseOnBall.y ); - projection.addSelf( _this.object.up.clone().crossSelf( _eye ).setLength( mouseOnBall.x ) ); - projection.addSelf( _eye.setLength( mouseOnBall.z ) ); - - return projection; - - }; - - this.rotateCamera = function() { - - var angle = Math.acos( _rotateStart.dot( _rotateEnd ) / _rotateStart.length() / _rotateEnd.length() ); - - if ( angle ) { - - var axis = ( new THREE.Vector3() ).cross( _rotateStart, _rotateEnd ).normalize(), - quaternion = new THREE.Quaternion(); - - angle *= _this.rotateSpeed; - - quaternion.setFromAxisAngle( axis, -angle ); - - quaternion.multiplyVector3( _eye ); - quaternion.multiplyVector3( _this.object.up ); - - quaternion.multiplyVector3( _rotateEnd ); - - if ( _this.staticMoving ) { - - _rotateStart = _rotateEnd; - - } else { - - quaternion.setFromAxisAngle( axis, angle * ( _this.dynamicDampingFactor - 1.0 ) ); - quaternion.multiplyVector3( _rotateStart ); - - } - - } - - }; - - this.zoomCamera = function() { - - var factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed; - - if ( factor !== 1.0 && factor > 0.0 ) { - - _eye.multiplyScalar( factor ); - - if ( _this.staticMoving ) { - - _zoomStart = _zoomEnd; - - } else { - - _zoomStart.y += ( _zoomEnd.y - _zoomStart.y ) * this.dynamicDampingFactor; - - } - - } - - }; - - this.panCamera = function() { - - var mouseChange = _panEnd.clone().subSelf( _panStart ); - - if ( mouseChange.lengthSq() ) { - - mouseChange.multiplyScalar( _eye.length() * _this.panSpeed ); - - var pan = _eye.clone().crossSelf( _this.object.up ).setLength( mouseChange.x ); - pan.addSelf( _this.object.up.clone().setLength( mouseChange.y ) ); - - _this.object.position.addSelf( pan ); - _this.target.addSelf( pan ); - - if ( _this.staticMoving ) { - - _panStart = _panEnd; - - } else { - - _panStart.addSelf( mouseChange.sub( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) ); - - } - - } - - }; - - this.checkDistances = function() { - - if ( !_this.noZoom || !_this.noPan ) { - - if ( _this.object.position.lengthSq() > _this.maxDistance * _this.maxDistance ) { - - _this.object.position.setLength( _this.maxDistance ); - - } - - if ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) { - - _this.object.position.add( _this.target, _eye.setLength( _this.minDistance ) ); - - } - - } - - }; - - this.update = function() { - - _eye.copy( _this.object.position ).subSelf( this.target ); - - if ( !_this.noRotate ) { - - _this.rotateCamera(); - - } - - if ( !_this.noZoom ) { - - _this.zoomCamera(); - - } - - if ( !_this.noPan ) { - - _this.panCamera(); - - } - - _this.object.position.add( _this.target, _eye ); - - _this.checkDistances(); - - _this.object.lookAt( _this.target ); - - }; - - - // listeners - - function keydown( event ) { - - if ( ! _this.enabled ) return; - - if ( _state !== STATE.NONE ) { - - return; - - } else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && !_this.noRotate ) { - - _state = STATE.ROTATE; - - } else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && !_this.noZoom ) { - - _state = STATE.ZOOM; - - } else if ( event.keyCode === _this.keys[ STATE.PAN ] && !_this.noPan ) { - - _state = STATE.PAN; - - } - - if ( _state !== STATE.NONE ) { - - _keyPressed = true; - - } - - }; - - function keyup( event ) { - - if ( ! _this.enabled ) return; - - if ( _state !== STATE.NONE ) { - - _state = STATE.NONE; - - } - - }; - - function mousedown( event ) { - - if ( ! _this.enabled ) return; - - event.preventDefault(); - event.stopPropagation(); - - if ( _state === STATE.NONE ) { - - _state = event.button; - - if ( _state === STATE.ROTATE && !_this.noRotate ) { - - _rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY ); - - } else if ( _state === STATE.ZOOM && !_this.noZoom ) { - - _zoomStart = _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY ); - - } else if ( !this.noPan ) { - - _panStart = _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY ); - - } - - } - - }; - - function mousemove( event ) { - - if ( ! _this.enabled ) return; - - if ( _keyPressed ) { - - _rotateStart = _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY ); - _zoomStart = _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY ); - _panStart = _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY ); - - _keyPressed = false; - - } - - if ( _state === STATE.NONE ) { - - return; - - } else if ( _state === STATE.ROTATE && !_this.noRotate ) { - - _rotateEnd = _this.getMouseProjectionOnBall( event.clientX, event.clientY ); - - } else if ( _state === STATE.ZOOM && !_this.noZoom ) { - - _zoomEnd = _this.getMouseOnScreen( event.clientX, event.clientY ); - - } else if ( _state === STATE.PAN && !_this.noPan ) { - - _panEnd = _this.getMouseOnScreen( event.clientX, event.clientY ); - - } - - }; - - function mouseup( event ) { - - if ( ! _this.enabled ) return; - - event.preventDefault(); - event.stopPropagation(); - - _state = STATE.NONE; - - }; - - this.domElement.addEventListener( 'contextmenu', function ( event ) { event.preventDefault(); }, false ); - - this.domElement.addEventListener( 'mousemove', mousemove, false ); - this.domElement.addEventListener( 'mousedown', mousedown, false ); - this.domElement.addEventListener( 'mouseup', mouseup, false ); - - window.addEventListener( 'keydown', keydown, false ); - window.addEventListener( 'keyup', keyup, false ); - -}; -/** - * @author mr.doob / http://mrdoob.com/ - * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as - */ - -THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides ) { - - THREE.Geometry.call( this ); - - var scope = this, - width_half = width / 2, - height_half = height / 2, - depth_half = depth / 2; - - var mpx, mpy, mpz, mnx, mny, mnz; - - if ( materials !== undefined ) { - - if ( materials instanceof Array ) { - - this.materials = materials; - - } else { - - this.materials = []; - - for ( var i = 0; i < 6; i ++ ) { - - this.materials.push( materials ); - - } - - } - - mpx = 0; mnx = 1; mpy = 2; mny = 3; mpz = 4; mnz = 5; - - } else { - - this.materials = []; - - } - - this.sides = { px: true, nx: true, py: true, ny: true, pz: true, nz: true }; - - if ( sides != undefined ) { - - for ( var s in sides ) { - - if ( this.sides[ s ] !== undefined ) { - - this.sides[ s ] = sides[ s ]; - - } - - } - - } - - this.sides.px && buildPlane( 'z', 'y', - 1, - 1, depth, height, width_half, mpx ); // px - this.sides.nx && buildPlane( 'z', 'y', 1, - 1, depth, height, - width_half, mnx ); // nx - this.sides.py && buildPlane( 'x', 'z', 1, 1, width, depth, height_half, mpy ); // py - this.sides.ny && buildPlane( 'x', 'z', 1, - 1, width, depth, - height_half, mny ); // ny - this.sides.pz && buildPlane( 'x', 'y', 1, - 1, width, height, depth_half, mpz ); // pz - this.sides.nz && buildPlane( 'x', 'y', - 1, - 1, width, height, - depth_half, mnz ); // nz - - function buildPlane( u, v, udir, vdir, width, height, depth, material ) { - - var w, ix, iy, - gridX = segmentsWidth || 1, - gridY = segmentsHeight || 1, - width_half = width / 2, - height_half = height / 2, - offset = scope.vertices.length; - - if ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) { - - w = 'z'; - - } else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) { - - w = 'y'; - gridY = segmentsDepth || 1; - - } else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) { - - w = 'x'; - gridX = segmentsDepth || 1; - - } - - var gridX1 = gridX + 1, - gridY1 = gridY + 1, - segment_width = width / gridX, - segment_height = height / gridY, - normal = new THREE.Vector3(); - - normal[ w ] = depth > 0 ? 1 : - 1; - - for ( iy = 0; iy < gridY1; iy ++ ) { - - for ( ix = 0; ix < gridX1; ix ++ ) { - - var vector = new THREE.Vector3(); - vector[ u ] = ( ix * segment_width - width_half ) * udir; - vector[ v ] = ( iy * segment_height - height_half ) * vdir; - vector[ w ] = depth; - - scope.vertices.push( new THREE.Vertex( vector ) ); - - } - - } - - for ( iy = 0; iy < gridY; iy++ ) { - - for ( ix = 0; ix < gridX; ix++ ) { - - var a = ix + gridX1 * iy; - var b = ix + gridX1 * ( iy + 1 ); - var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); - var d = ( ix + 1 ) + gridX1 * iy; - - var face = new THREE.Face4( a + offset, b + offset, c + offset, d + offset ); - face.normal.copy( normal ); - face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() ); - face.materialIndex = material; - - scope.faces.push( face ); - scope.faceVertexUvs[ 0 ].push( [ - new THREE.UV( ix / gridX, iy / gridY ), - new THREE.UV( ix / gridX, ( iy + 1 ) / gridY ), - new THREE.UV( ( ix + 1 ) / gridX, ( iy + 1 ) / gridY ), - new THREE.UV( ( ix + 1 ) / gridX, iy / gridY ) - ] ); - - } - - } - - } - - this.computeCentroids(); - this.mergeVertices(); - -}; - -THREE.CubeGeometry.prototype = new THREE.Geometry(); -THREE.CubeGeometry.prototype.constructor = THREE.CubeGeometry; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, segmentsRadius, segmentsHeight, openEnded ) { - - THREE.Geometry.call( this ); - - radiusTop = radiusTop !== undefined ? radiusTop : 20; - radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; - height = height !== undefined ? height : 100; - - var heightHalf = height / 2; - var segmentsX = segmentsRadius || 8; - var segmentsY = segmentsHeight || 1; - - var x, y, vertices = [], uvs = []; - - for ( y = 0; y <= segmentsY; y ++ ) { - - var verticesRow = []; - var uvsRow = []; - - var v = y / segmentsY; - var radius = v * ( radiusBottom - radiusTop ) + radiusTop; - - for ( x = 0; x <= segmentsX; x ++ ) { - - var u = x / segmentsX; - - var xpos = radius * Math.sin( u * Math.PI * 2 ); - var ypos = - v * height + heightHalf; - var zpos = radius * Math.cos( u * Math.PI * 2 ); - - this.vertices.push( new THREE.Vertex( new THREE.Vector3( xpos, ypos, zpos ) ) ); - - verticesRow.push( this.vertices.length - 1 ); - uvsRow.push( new THREE.UV( u, v ) ); - - } - - vertices.push( verticesRow ); - uvs.push( uvsRow ); - - } - - for ( y = 0; y < segmentsY; y ++ ) { - - for ( x = 0; x < segmentsX; x ++ ) { - - var v1 = vertices[ y ][ x ]; - var v2 = vertices[ y + 1 ][ x ]; - var v3 = vertices[ y + 1 ][ x + 1 ]; - var v4 = vertices[ y ][ x + 1 ]; - - // FIXME: These normals aren't right for cones. - - var n1 = this.vertices[ v1 ].position.clone().setY( 0 ).normalize(); - var n2 = this.vertices[ v2 ].position.clone().setY( 0 ).normalize(); - var n3 = this.vertices[ v3 ].position.clone().setY( 0 ).normalize(); - var n4 = this.vertices[ v4 ].position.clone().setY( 0 ).normalize(); - - var uv1 = uvs[ y ][ x ].clone(); - var uv2 = uvs[ y + 1 ][ x ].clone(); - var uv3 = uvs[ y + 1 ][ x + 1 ].clone(); - var uv4 = uvs[ y ][ x + 1 ].clone(); - - this.faces.push( new THREE.Face4( v1, v2, v3, v4, [ n1, n2, n3, n4 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3, uv4 ] ); - - } - - } - - // top cap - - if ( !openEnded && radiusTop > 0 ) { - - this.vertices.push( new THREE.Vertex( new THREE.Vector3( 0, heightHalf, 0 ) ) ); - - for ( x = 0; x < segmentsX; x ++ ) { - - var v1 = vertices[ 0 ][ x ]; - var v2 = vertices[ 0 ][ x + 1 ]; - var v3 = this.vertices.length - 1; - - var n1 = new THREE.Vector3( 0, 1, 0 ); - var n2 = new THREE.Vector3( 0, 1, 0 ); - var n3 = new THREE.Vector3( 0, 1, 0 ); - - var uv1 = uvs[ 0 ][ x ].clone(); - var uv2 = uvs[ 0 ][ x + 1 ].clone(); - var uv3 = new THREE.UV( uv2.u, 0 ); - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); - - } - - } - - // bottom cap - - if ( !openEnded && radiusBottom > 0 ) { - - this.vertices.push( new THREE.Vertex( new THREE.Vector3( 0, - heightHalf, 0 ) ) ); - - for ( x = 0; x < segmentsX; x ++ ) { - - var v1 = vertices[ y ][ x + 1 ]; - var v2 = vertices[ y ][ x ]; - var v3 = this.vertices.length - 1; - - var n1 = new THREE.Vector3( 0, - 1, 0 ); - var n2 = new THREE.Vector3( 0, - 1, 0 ); - var n3 = new THREE.Vector3( 0, - 1, 0 ); - - var uv1 = uvs[ y ][ x + 1 ].clone(); - var uv2 = uvs[ y ][ x ].clone(); - var uv3 = new THREE.UV( uv2.u, 1 ); - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); - - } - - } - - this.computeCentroids(); - this.computeFaceNormals(); - -} -THREE.CylinderGeometry.prototype = new THREE.Geometry(); -THREE.CylinderGeometry.prototype.constructor = THREE.CylinderGeometry; -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * - * Creates extruded geometry from a path shape. - * - * parameters = { - * - * size: , // size of the text - * height: , // thickness to extrude text - * curveSegments: , // number of points on the curves - * steps: , // number of points for z-side extrusions - * - * font: , // font name - * weight: , // font weight (normal, bold) - * style: , // font style (normal, italics) - * - * bevelEnabled: , // turn on bevel - * bevelThickness: , // how deep into text bevel goes - * bevelSize: , // how far from text outline is bevel - * bevelSegments: , // number of bevel layers - * - * extrudePath: // path to extrude shape along - * bendPath: // path to bend the geometry around - * - * material: // material index for front and back faces - * extrudeMaterial: // material index for extrusion and beveled faces - * - * } - **/ - -THREE.ExtrudeGeometry = function( shapes, options ) { - - if ( typeof( shapes ) === "undefined" ) { - - shapes = []; - return; - - } - - THREE.Geometry.call( this ); - - shapes = shapes instanceof Array ? shapes : [ shapes ]; - - var shape, s, sl = shapes.length; - - this.shapebb = shapes[ sl - 1 ].getBoundingBox(); - - for ( s = 0; s < sl; s ++ ) { - - shape = shapes[ s ]; - - this.addShape( shape, options ); - - } - - - this.computeCentroids(); - this.computeFaceNormals(); - - // can't really use automatic vertex normals - // as then front and back sides get smoothed too - // should do separate smoothing just for sides - - //this.computeVertexNormals(); - - //console.log( "took", ( Date.now() - startTime ) ); - -}; - -THREE.ExtrudeGeometry.prototype = new THREE.Geometry(); -THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry; - - -THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) { - - var amount = options.amount !== undefined ? options.amount : 100; - - var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 - var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 - var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; - - var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false - - var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; - - var steps = options.steps !== undefined ? options.steps : 1; - - var bendPath = options.bendPath; - - var extrudePath = options.extrudePath; - var extrudePts, extrudeByPath = false; - - var useSpacedPoints = options.useSpacedPoints !== undefined ? options.useSpacedPoints : false; - - var material = options.material; - var extrudeMaterial = options.extrudeMaterial; - - var shapebb = this.shapebb; - //shapebb = shape.getBoundingBox(); - - - if ( extrudePath ) { - - extrudePts = extrudePath.getPoints( curveSegments ); - steps = extrudePts.length; - extrudeByPath = true; - bevelEnabled = false; // bevels not supported for path extrusion - - } - - // Safeguards if bevels are not enabled - - if ( ! bevelEnabled ) { - - bevelSegments = 0; - bevelThickness = 0; - bevelSize = 0; - - } - - - // TODO, extrude by path's tangents? also via 3d path? - - // Variables initalization - - var ahole, h, hl; // looping of holes - var scope = this; - var bevelPoints = []; - - var shapesOffset = this.vertices.length; - - if ( bendPath ) { - - shape.addWrapPath( bendPath ); - - } - - var shapePoints; - - if ( ! useSpacedPoints ) { - - shapePoints = shape.extractAllPoints( curveSegments ); // - - } else { - - // QN - Would it be better to pass useSpacePoints parameter to shape, just like bendpath ? - - shapePoints = shape.extractAllSpacedPoints( curveSegments ) // for points with equal divisions - - } - - var vertices = shapePoints.shape; - var holes = shapePoints.holes; - - var reverse = !THREE.Shape.Utils.isClockWise( vertices ) ; - - if ( reverse ) { - - vertices = vertices.reverse(); - - // Maybe we should also check if holes are in the opposite direction, just to be safe ... - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - - if ( THREE.Shape.Utils.isClockWise( ahole ) ) { - - holes[ h ] = ahole.reverse(); - - } - - } - - reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! - - } - - - var faces = THREE.Shape.Utils.triangulateShape ( vertices, holes ); - //var faces = THREE.Shape.Utils.triangulate2( vertices, holes ); - - // Would it be better to move points after triangulation? - // shapePoints = shape.extractAllPointsWithBend( curveSegments, bendPath ); - // vertices = shapePoints.shape; - // holes = shapePoints.holes; - - //console.log(faces); - - //// - /// Handle Vertices - //// - - var contour = vertices; // vertices has all points but contour has only points of circumference - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - - vertices = vertices.concat( ahole ); - - } - - - function scalePt2 ( pt, vec, size ) { - - if ( !vec ) console.log( "die" ); - - return vec.clone().multiplyScalar( size ).addSelf( pt ); - - } - - var b, bs, t, z, - vert, vlen = vertices.length, - face, flen = faces.length, - cont, clen = contour.length; - - - //------ - // Find directions for point movement - // - - var RAD_TO_DEGREES = 180 / Math.PI; - - - function getBevelVec( pt_i, pt_j, pt_k ) { - - // Algorithm 2 - - return getBevelVec2( pt_i, pt_j, pt_k ); - - } - - function getBevelVec1( pt_i, pt_j, pt_k ) { - - var anglea = Math.atan2( pt_j.y - pt_i.y, pt_j.x - pt_i.x ); - var angleb = Math.atan2( pt_k.y - pt_i.y, pt_k.x - pt_i.x ); - - if ( anglea > angleb ) { - - angleb += Math.PI * 2; - - } - - var anglec = ( anglea + angleb ) / 2; - - - //console.log('angle1', anglea * RAD_TO_DEGREES,'angle2', angleb * RAD_TO_DEGREES, 'anglec', anglec *RAD_TO_DEGREES); - - var x = - Math.cos( anglec ); - var y = - Math.sin( anglec ); - - var vec = new THREE.Vector2( x, y ); //.normalize(); - - return vec; - - } - - function getBevelVec2( pt_i, pt_j, pt_k ) { - - var a = THREE.ExtrudeGeometry.__v1, - b = THREE.ExtrudeGeometry.__v2, - v_hat = THREE.ExtrudeGeometry.__v3, - w_hat = THREE.ExtrudeGeometry.__v4, - p = THREE.ExtrudeGeometry.__v5, - q = THREE.ExtrudeGeometry.__v6, - v, w, - v_dot_w_hat, q_sub_p_dot_w_hat, - s, intersection; - - // good reading for line-line intersection - // http://sputsoft.com/blog/2010/03/line-line-intersection.html - - // define a as vector j->i - // define b as vectot k->i - - a.set( pt_i.x - pt_j.x, pt_i.y - pt_j.y ); - b.set( pt_i.x - pt_k.x, pt_i.y - pt_k.y ); - - // get unit vectors - - v = a.normalize(); - w = b.normalize(); - - // normals from pt i - - v_hat.set( -v.y, v.x ); - w_hat.set( w.y, -w.x ); - - // pts from i - - p.copy( pt_i ).addSelf( v_hat ); - q.copy( pt_i ).addSelf( w_hat ); - - if ( p.equals( q ) ) { - - //console.log("Warning: lines are straight"); - return w_hat.clone(); - - } - - // Points from j, k. helps prevents points cross overover most of the time - - p.copy( pt_j ).addSelf( v_hat ); - q.copy( pt_k ).addSelf( w_hat ); - - v_dot_w_hat = v.dot( w_hat ); - q_sub_p_dot_w_hat = q.subSelf( p ).dot( w_hat ); - - // We should not reach these conditions - - if ( v_dot_w_hat === 0 ) { - - console.log( "Either infinite or no solutions!" ); - - if ( q_sub_p_dot_w_hat === 0 ) { - - console.log( "Its finite solutions." ); - - } else { - - console.log( "Too bad, no solutions." ); - - } - - } - - s = q_sub_p_dot_w_hat / v_dot_w_hat; - - if ( s < 0 ) { - - // in case of emergecy, revert to algorithm 1. - - return getBevelVec1( pt_i, pt_j, pt_k ); - - } - - intersection = v.multiplyScalar( s ).addSelf( p ); - - return intersection.subSelf( pt_i ).clone(); // Don't normalize!, otherwise sharp corners become ugly - - } - - var contourMovements = []; - - for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { - - if ( j === il ) j = 0; - if ( k === il ) k = 0; - - // (j)---(i)---(k) - // console.log('i,j,k', i, j , k) - - var pt_i = contour[ i ]; - var pt_j = contour[ j ]; - var pt_k = contour[ k ]; - - contourMovements[ i ]= getBevelVec( contour[ i ], contour[ j ], contour[ k ] ); - - } - - var holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat(); - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - - oneHoleMovements = []; - - for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) { - - if ( j === il ) j = 0; - if ( k === il ) k = 0; - - // (j)---(i)---(k) - oneHoleMovements[ i ]= getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] ); - - } - - holesMovements.push( oneHoleMovements ); - verticesMovements = verticesMovements.concat( oneHoleMovements ); - - } - - - // Loop bevelSegments, 1 for the front, 1 for the back - - for ( b = 0; b < bevelSegments; b ++ ) { - //for ( b = bevelSegments; b > 0; b -- ) { - - t = b / bevelSegments; - z = bevelThickness * ( 1 - t ); - - //z = bevelThickness * t; - bs = bevelSize * ( Math.sin ( t * Math.PI/2 ) ) ; // curved - //bs = bevelSize * t ; // linear - - // contract shape - - for ( i = 0, il = contour.length; i < il; i ++ ) { - - vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); - //vert = scalePt( contour[ i ], contourCentroid, bs, false ); - v( vert.x, vert.y, - z ); - - } - - // expand holes - - for ( h = 0, hl = holes.length; h < hl; h++ ) { - - ahole = holes[ h ]; - oneHoleMovements = holesMovements[ h ]; - - for ( i = 0, il = ahole.length; i < il; i++ ) { - - vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); - //vert = scalePt( ahole[ i ], holesCentroids[ h ], bs, true ); - - v( vert.x, vert.y, -z ); - - } - - } - - } - - bs = bevelSize; - - // Back facing vertices - - for ( i = 0; i < vlen; i ++ ) { - - vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; - - if ( !extrudeByPath ) { - - v( vert.x, vert.y, 0 ); - - } else { - - v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x ); - - } - - } - - // Add stepped vertices... - // Including front facing vertices - - var s; - - for ( s = 1; s <= steps; s ++ ) { - - for ( i = 0; i < vlen; i ++ ) { - - vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ]; - - if ( !extrudeByPath ) { - - v( vert.x, vert.y, amount / steps * s ); - - } else { - - v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x ); - - } - - } - - } - - - // Add bevel segments planes - - //for ( b = 1; b <= bevelSegments; b ++ ) { - for ( b = bevelSegments - 1; b >= 0; b -- ) { - - t = b / bevelSegments; - z = bevelThickness * ( 1 - t ); - //bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) ); - bs = bevelSize * Math.sin ( t * Math.PI/2 ) ; - - // contract shape - - for ( i = 0, il = contour.length; i < il; i ++ ) { - - vert = scalePt2( contour[ i ], contourMovements[ i ], bs ); - v( vert.x, vert.y, amount + z ); - - } - - // expand holes - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - oneHoleMovements = holesMovements[ h ]; - - for ( i = 0, il = ahole.length; i < il; i++ ) { - - vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs ); - - if ( !extrudeByPath ) { - - v( vert.x, vert.y, amount + z ); - - } else { - - v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z ); - - } - - } - - } - - } - - - //// - /// Handle Faces - //// - - // Bottom faces - - if ( bevelEnabled ) { - - var layer = 0 ; // steps + 1 - var offset = vlen * layer; - - for ( i = 0; i < flen; i ++ ) { - - face = faces[ i ]; - f3( face[ 2 ]+ offset, face[ 1 ]+ offset, face[ 0 ] + offset ); - - } - - layer = steps + bevelSegments * 2; - offset = vlen * layer; - - // Top faces - - for ( i = 0; i < flen; i ++ ) { - - face = faces[ i ]; - f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset ); - - } - - } else { - - for ( i = 0; i < flen; i++ ) { - - face = faces[ i ]; - f3( face[ 2 ], face[ 1 ], face[ 0 ] ); - - } - - // Top faces - - for ( i = 0; i < flen; i ++ ) { - - face = faces[ i ]; - f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps ); - - } - - } - - var tmpPt; - var j, k, l, m; - - var layeroffset = 0; - - // Sides faces - - sidewalls( contour ); - layeroffset += contour.length; - - for ( h = 0, hl = holes.length; h < hl; h ++ ) { - - ahole = holes[ h ]; - sidewalls( ahole ); - - //, true - layeroffset += ahole.length; - - } - - // Create faces for the z-sides of the shape - - function sidewalls( contour ) { - - i = contour.length; - - while ( --i >= 0 ) { - - tmpPt = contour[ i ]; - - j = i; - k = i - 1; - - if ( k < 0 ) k = contour.length - 1; - - //console.log('b', i,j, i-1, k,vertices.length); - - var s = 0, sl = steps + bevelSegments * 2; - - for ( s = 0; s < sl; s ++ ) { - - var slen1 = vlen * s; - var slen2 = vlen * ( s + 1 ); - var a = layeroffset + j + slen1, - b = layeroffset + k + slen1, - c = layeroffset + k + slen2, - d = layeroffset + j + slen2; - - f4( a, b, c, d ); - - if ( extrudeMaterial !== undefined ) { - - var v1 = s / sl; - var v2 = ( s + 1 ) / sl; - - var ztol = ( amount + bevelThickness * 2 ); - - var u1 = ( scope.vertices[ a ].position.z + bevelThickness ) / ztol; - var u2 = ( scope.vertices[ d ].position.z + bevelThickness ) / ztol; - - //console.log(vy1, vy2); - - scope.faceVertexUvs[ 0 ].push( [ - new THREE.UV( u1, v1 ), - new THREE.UV( u2, v1 ), - new THREE.UV( u2, v2 ), - new THREE.UV( u1, v2 ) - ] ); - } - - - } - - } - - } - - - function v( x, y, z ) { - - scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ); - - } - - function f3( a, b, c ) { - - a += shapesOffset; - b += shapesOffset; - c += shapesOffset; - - scope.faces.push( new THREE.Face3( a, b, c, null, null, material ) ); - //normal, color, materials - - if ( material !== undefined ) { - - var mx = shapebb.minX, my = shapebb.minY; - - var uy = shapebb.maxY; // - shapebb.minY; - var ux = shapebb.maxX; // - shapebb.minX; - - var ax = scope.vertices[ a ].position.x - mx, - ay = scope.vertices[ a ].position.y - my, - - bx = scope.vertices[ b ].position.x - mx, - by = scope.vertices[ b ].position.y - my, - - cx = scope.vertices[ c ].position.x - mx, - cy = scope.vertices[ c ].position.y - my; - - scope.faceVertexUvs[ 0 ].push( [ - - new THREE.UV( ax / ux, ay / uy ), - new THREE.UV( bx / ux, by / uy ), - new THREE.UV( cx / ux, cy / uy ) - - ] ); - } - - } - - function f4( a, b, c, d ) { - - a += shapesOffset; - b += shapesOffset; - c += shapesOffset; - d += shapesOffset; - - scope.faces.push( new THREE.Face4( a, b, c, d, null, null, extrudeMaterial ) ); - - } - -}; - - -THREE.ExtrudeGeometry.__v1 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v2 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v3 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v4 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v5 = new THREE.Vector2(); -THREE.ExtrudeGeometry.__v6 = new THREE.Vector2(); -/** - * @author oosmoxiecode - * - * uvs are messed up in this one, and commented away for now. There is an ugly "seam" by the shared vertices - * when it "wraps" around, that needs to be fixed. It's because they share the first and the last vertices - * so it draws the entire texture on the seam-faces, I think... - */ - -THREE.IcosahedronGeometry = function ( subdivisions ) { - - var scope = this; - var tempScope = new THREE.Geometry(); - var tempFaces; - this.subdivisions = subdivisions || 0; - - THREE.Geometry.call( this ); - - // create 12 vertices of a Icosahedron - - var t = ( 1 + Math.sqrt( 5 ) ) / 2; - - v(-1, t, 0); - v( 1, t, 0); - v(-1, -t, 0); - v( 1, -t, 0); - - v( 0, -1, t); - v( 0, 1, t); - v( 0, -1, -t); - v( 0, 1, -t); - - v( t, 0, -1); - v( t, 0, 1); - v(-t, 0, -1); - v(-t, 0, 1); - - // 5 faces around point 0 - - f3(0, 11, 5, tempScope); - f3(0, 5, 1, tempScope); - f3(0, 1, 7, tempScope); - f3(0, 7, 10, tempScope); - f3(0, 10, 11, tempScope); - - // 5 adjacent faces - - f3(1, 5, 9, tempScope); - f3(5, 11, 4, tempScope); - f3(11, 10, 2, tempScope); - f3(10, 7, 6, tempScope); - f3(7, 1, 8, tempScope); - - // 5 faces around point 3 - - f3(3, 9, 4, tempScope); - f3(3, 4, 2, tempScope); - f3(3, 2, 6, tempScope); - f3(3, 6, 8, tempScope); - f3(3, 8, 9, tempScope); - - // 5 adjacent faces - - f3(4, 9, 5, tempScope); - f3(2, 4, 11, tempScope); - f3(6, 2, 10, tempScope); - f3(8, 6, 7, tempScope); - f3(9, 8, 1, tempScope); - - // subdivide faces to refine the triangles - - for ( var i = 0; i < this.subdivisions; i ++ ) { - - tempFaces = new THREE.Geometry(); - - for ( var i = 0, l = tempScope.faces.length; i < l; i ++ ) { - - // replace each triangle by 4 triangles - - var face = tempScope.faces[ i ]; - - var a = getMiddlePoint( face.a, face.b ); - var b = getMiddlePoint( face.b, face.c ); - var c = getMiddlePoint( face.c, face.a ); - - f3( face.a, a, c, tempFaces ); - f3( face.b, b, a, tempFaces ); - f3( face.c, c, b, tempFaces ); - f3( a, b, c, tempFaces ); - - } - - tempScope.faces = tempFaces.faces; - tempScope.faceVertexUvs[ 0 ] = tempFaces.faceVertexUvs[ 0 ]; - - } - - scope.faces = tempScope.faces; - scope.faceVertexUvs[ 0 ] = tempScope.faceVertexUvs[ 0 ]; - - this.mergeVertices(); - this.computeCentroids(); - this.computeFaceNormals(); - - function v( x, y, z ) { - - var length = Math.sqrt( x * x + y * y + z * z ); - var i = scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x/length, y/length, z/length ) ) ); - - return i-1; - } - - function f3( a, b, c, inscope ) { - - var v1 = scope.vertices[ a ].position; - var v2 = scope.vertices[ b ].position; - var v3 = scope.vertices[ c ].position; - - var face = new THREE.Face3( a, b, c ); - face.vertexNormals.push( v1.clone().normalize(), v2.clone().normalize(), v3.clone().normalize() ); - - inscope.faces.push( face ); - - inscope.faceVertexUvs[ 0 ].push( [ - new THREE.UV( 1 - ( ( ( Math.atan2( v1.z, v1.x ) + Math.PI ) % Math.PI ) / Math.PI * 0.5 ), 0.5 - v1.y / 2 ), - new THREE.UV( 1 - ( ( ( Math.atan2( v2.z, v2.x ) + Math.PI ) % Math.PI ) / Math.PI * 0.5 ), 0.5 - v2.y / 2 ), - new THREE.UV( 1 - ( ( ( Math.atan2( v3.z, v3.x ) + Math.PI ) % Math.PI ) / Math.PI * 0.5 ), 0.5 - v3.y / 2 ) - ] ); - - } - - function getMiddlePoint( p1, p2 ) { - - var pos1 = scope.vertices[ p1 ].position; - var pos2 = scope.vertices[ p2 ].position; - - var x = ( pos1.x + pos2.x ) / 2; - var y = ( pos1.y + pos2.y ) / 2; - var z = ( pos1.z + pos2.z ) / 2; - - var i = v(x, y, z); - return i; - - } - -} - -THREE.IcosahedronGeometry.prototype = new THREE.Geometry(); -THREE.IcosahedronGeometry.prototype.constructor = THREE.IcosahedronGeometry; -/** - * @author astrodud / http://astrodud.isgreat.org/ - */ - -THREE.LatheGeometry = function ( points, steps, angle ) { - - THREE.Geometry.call( this ); - - this.steps = steps || 12; - this.angle = angle || 2 * Math.PI; - - var stepSize = this.angle / this.steps, - newV = [], oldInds = [], newInds = [], startInds = [], - matrix = new THREE.Matrix4().setRotationZ( stepSize ); - - for ( var j = 0; j < points.length; j ++ ) { - - this.vertices.push( new THREE.Vertex( points[ j ] ) ); - - newV[ j ] = points[ j ].clone(); - oldInds[ j ] = this.vertices.length - 1; - - } - - for ( var r = 0; r <= this.angle + 0.001; r += stepSize ) { // need the +0.001 for it go up to angle - - for ( var j = 0; j < newV.length; j ++ ) { - - if ( r < this.angle ) { - - newV[ j ] = matrix.multiplyVector3( newV[ j ].clone() ); - this.vertices.push( new THREE.Vertex( newV[ j ] ) ); - newInds[ j ] = this.vertices.length - 1; - - } else { - - newInds = startInds; // wrap it up! - - } - - } - - if ( r == 0 ) startInds = oldInds; - - for ( var j = 0; j < oldInds.length - 1; j ++ ) { - - this.faces.push( new THREE.Face4( newInds[ j ], newInds[ j + 1 ], oldInds[ j + 1 ], oldInds[ j ] ) ); - this.faceVertexUvs[ 0 ].push( [ - - new THREE.UV( 1 - r / this.angle, j / points.length ), - new THREE.UV( 1 - r / this.angle, ( j + 1 ) / points.length ), - new THREE.UV( 1 - ( r - stepSize ) / this.angle, ( j + 1 ) / points.length ), - new THREE.UV( 1 - ( r - stepSize ) / this.angle, j / points.length ) - - ] ); - - } - - oldInds = newInds; - newInds = []; - - } - - this.computeCentroids(); - this.computeFaceNormals(); - this.computeVertexNormals(); - -}; - -THREE.LatheGeometry.prototype = new THREE.Geometry(); -THREE.LatheGeometry.prototype.constructor = THREE.LatheGeometry; -/** - * Octahedrons have 8 sides. This octahedron supports subdivision. - * - * Vertices have 'smooth' normals, - * to make a sharp edge choose a material that uses face normals instead. - * - * @author daniel.deady@knectar.com - * @param radius - * @param detail Final number of triangles = 4^detail * 8 - */ - -THREE.OctahedronGeometry = function ( radius, detail ) { - - THREE.Geometry.call( this ); - - detail = detail || 0; - - var that = this; // ugly scope hack - - prepare( new THREE.Vector3( +1, 0, 0 ) ); // right - prepare( new THREE.Vector3( -1, 0, 0 ) ); // left - prepare( new THREE.Vector3( 0, +1, 0 ) ); // up - prepare( new THREE.Vector3( 0, -1, 0 ) ); // down - prepare( new THREE.Vector3( 0, 0, +1 ) ); // front - prepare( new THREE.Vector3( 0, 0, -1 ) ); // back - var midpoints = [], p = this.vertices; - - // careful to output faces counter-clockwise, that is required for meshes - make( p[0], p[2], p[4], detail ); - make( p[0], p[4], p[3], detail ); - make( p[0], p[3], p[5], detail ); - make( p[0], p[5], p[2], detail ); - make( p[1], p[2], p[5], detail ); - make( p[1], p[5], p[3], detail ); - make( p[1], p[3], p[4], detail ); - make( p[1], p[4], p[2], detail ); - - /** - * Project vector onto sphere's surface - */ - function prepare( vector ) { - - var normal = vector.clone().normalize(); - var vertex = new THREE.Vertex( normal.clone().multiplyScalar( radius ) ); - vertex.index = that.vertices.push( vertex ) - 1; - - // Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle. - var u = azimuth( vector ) / 2 / Math.PI + 0.5; - var v = inclination( vector ) / Math.PI + 0.5; - vertex.uv = new THREE.UV( u, v ); - - return vertex; - - } - - /** - * Approximate a curved face with recursively sub-divided triangles. - */ - function make( v1, v2, v3, detail ) { - - if ( detail < 1 ) { - - var face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.position, v2.position, v3.position ] ); - face.centroid.addSelf( v1.position ).addSelf( v2.position ).addSelf( v3.position ).divideScalar( 3 ); - face.normal = face.centroid.clone().normalize(); - that.faces.push( face ); - - var azi = azimuth( face.centroid ); - that.faceVertexUvs[ 0 ].push( [ - correctUV( v1.uv, v1.position, azi ), - correctUV( v2.uv, v2.position, azi ), - correctUV( v3.uv, v3.position, azi ) - ] ); - - } - else { - - detail -= 1; - // split triangle into 4 smaller triangles - make( v1, midpoint( v1, v2 ), midpoint( v1, v3 ), detail ); // top quadrant - make( midpoint( v1, v2 ), v2, midpoint( v2, v3 ), detail ); // left quadrant - make( midpoint( v1, v3 ), midpoint( v2, v3 ), v3, detail ); // right quadrant - make( midpoint( v1, v2 ), midpoint( v2, v3 ), midpoint( v1, v3 ), detail ); // center quadrant - - } - - } - - function midpoint( v1, v2 ) { - - if ( !midpoints[ v1.index ] ) midpoints[ v1.index ] = []; - if ( !midpoints[ v2.index ] ) midpoints[ v2.index ] = []; - var mid = midpoints[ v1.index ][ v2.index ]; - if ( mid === undefined ) { - // generate mean point and project to surface with prepare() - midpoints[ v1.index ][ v2.index ] = midpoints[ v2.index ][ v1.index ] = mid = prepare( - new THREE.Vector3().add( v1.position, v2.position ).divideScalar( 2 ) - ); - } - return mid; - - } - - /** - * Angle around the Y axis, counter-clockwise when looking from above. - */ - function azimuth( vector ) { - - return Math.atan2( vector.z, -vector.x ); - - } - - /** - * Angle above the XZ plane. - */ - function inclination( vector ) { - - return Math.atan2( -vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) ); - - } - - /** - * Texture fixing helper. Spheres have some odd behaviours. - */ - function correctUV( uv, vector, azimuth ) { - - if ( (azimuth < 0) && (uv.u === 1) ) uv = new THREE.UV( uv.u - 1, uv.v ); - if ( (vector.x === 0) && (vector.z === 0) ) uv = new THREE.UV( azimuth / 2 / Math.PI + 0.5, uv.v ); - return uv; - - } - - this.boundingSphere = { radius: radius }; - -}; - -THREE.OctahedronGeometry.prototype = new THREE.Geometry(); -THREE.OctahedronGeometry.prototype.constructor = THREE.OctahedronGeometry; -/** - * @author mr.doob / http://mrdoob.com/ - * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as - */ - -THREE.PlaneGeometry = function ( width, height, segmentsWidth, segmentsHeight ) { - - THREE.Geometry.call( this ); - - var ix, iy, - width_half = width / 2, - height_half = height / 2, - gridX = segmentsWidth || 1, - gridY = segmentsHeight || 1, - gridX1 = gridX + 1, - gridY1 = gridY + 1, - segment_width = width / gridX, - segment_height = height / gridY, - normal = new THREE.Vector3( 0, 0, 1 ); - - for ( iy = 0; iy < gridY1; iy++ ) { - - for ( ix = 0; ix < gridX1; ix++ ) { - - var x = ix * segment_width - width_half; - var y = iy * segment_height - height_half; - - this.vertices.push( new THREE.Vertex( new THREE.Vector3( x, - y, 0 ) ) ); - - } - - } - - for ( iy = 0; iy < gridY; iy++ ) { - - for ( ix = 0; ix < gridX; ix++ ) { - - var a = ix + gridX1 * iy; - var b = ix + gridX1 * ( iy + 1 ); - var c = ( ix + 1 ) + gridX1 * ( iy + 1 ); - var d = ( ix + 1 ) + gridX1 * iy; - - var face = new THREE.Face4( a, b, c, d ); - face.normal.copy( normal ); - face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() ); - - this.faces.push( face ); - this.faceVertexUvs[ 0 ].push( [ - new THREE.UV( ix / gridX, iy / gridY ), - new THREE.UV( ix / gridX, ( iy + 1 ) / gridY ), - new THREE.UV( ( ix + 1 ) / gridX, ( iy + 1 ) / gridY ), - new THREE.UV( ( ix + 1 ) / gridX, iy / gridY ) - ] ); - - } - - } - - this.computeCentroids(); - -}; - -THREE.PlaneGeometry.prototype = new THREE.Geometry(); -THREE.PlaneGeometry.prototype.constructor = THREE.PlaneGeometry; -/** - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.SphereGeometry = function ( radius, segmentsWidth, segmentsHeight, phiStart, phiLength, thetaStart, thetaLength ) { - - THREE.Geometry.call( this ); - - radius = radius || 50; - - phiStart = phiStart !== undefined ? phiStart : 0; - phiLength = phiLength !== undefined ? phiLength : Math.PI * 2; - - thetaStart = thetaStart !== undefined ? thetaStart : 0; - thetaLength = thetaLength !== undefined ? thetaLength : Math.PI; - - var segmentsX = Math.max( 3, Math.floor( segmentsWidth ) || 8 ); - var segmentsY = Math.max( 2, Math.floor( segmentsHeight ) || 6 ); - - var x, y, vertices = [], uvs = []; - - for ( y = 0; y <= segmentsY; y ++ ) { - - var verticesRow = []; - var uvsRow = []; - - for ( x = 0; x <= segmentsX; x ++ ) { - - var u = x / segmentsX; - var v = y / segmentsY; - - var xpos = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); - var ypos = radius * Math.cos( thetaStart + v * thetaLength ); - var zpos = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength ); - - this.vertices.push( new THREE.Vertex( new THREE.Vector3( xpos, ypos, zpos ) ) ); - - verticesRow.push( this.vertices.length - 1 ); - uvsRow.push( new THREE.UV( u, v ) ); - - } - - vertices.push( verticesRow ); - uvs.push( uvsRow ); - - } - - for ( y = 0; y < segmentsY; y ++ ) { - - for ( x = 0; x < segmentsX; x ++ ) { - - var v1 = vertices[ y ][ x + 1 ]; - var v2 = vertices[ y ][ x ]; - var v3 = vertices[ y + 1 ][ x ]; - var v4 = vertices[ y + 1 ][ x + 1 ]; - - var n1 = this.vertices[ v1 ].position.clone().normalize(); - var n2 = this.vertices[ v2 ].position.clone().normalize(); - var n3 = this.vertices[ v3 ].position.clone().normalize(); - var n4 = this.vertices[ v4 ].position.clone().normalize(); - - var uv1 = uvs[ y ][ x + 1 ].clone(); - var uv2 = uvs[ y ][ x ].clone(); - var uv3 = uvs[ y + 1 ][ x ].clone(); - var uv4 = uvs[ y + 1 ][ x + 1 ].clone(); - - if ( Math.abs( this.vertices[ v1 ].position.y ) == radius ) { - - this.faces.push( new THREE.Face3( v1, v3, v4, [ n1, n3, n4 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv3, uv4 ] ); - - } else if ( Math.abs( this.vertices[ v3 ].position.y ) == radius ) { - - this.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] ); - - } else { - - this.faces.push( new THREE.Face4( v1, v2, v3, v4, [ n1, n2, n3, n4 ] ) ); - this.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3, uv4 ] ); - - } - - } - - } - - this.computeCentroids(); - this.computeFaceNormals(); - - this.boundingSphere = { radius: radius }; - -}; - -THREE.SphereGeometry.prototype = new THREE.Geometry(); -THREE.SphereGeometry.prototype.constructor = THREE.SphereGeometry; -/** - * @author zz85 / http://www.lab4games.net/zz85/blog - * @author alteredq / http://alteredqualia.com/ - * - * For creating 3D text geometry in three.js - * - * Text = 3D Text - * - * parameters = { - * size: , // size of the text - * height: , // thickness to extrude text - * curveSegments: , // number of points on the curves - * - * font: , // font name - * weight: , // font weight (normal, bold) - * style: , // font style (normal, italics) - * - * bevelEnabled: , // turn on bevel - * bevelThickness: , // how deep into text bevel goes - * bevelSize: , // how far from text outline is bevel - * - * bend: // bend according to hardcoded curve (generates bendPath) - * bendPath: // wraps text according to bend Path - * } - * - * It uses techniques used in: - * - * typeface.js and canvastext - * For converting fonts and rendering with javascript - * http://typeface.neocracy.org - * - * Triangulation ported from AS3 - * Simple Polygon Triangulation - * http://actionsnippet.com/?p=1462 - * - * A Method to triangulate shapes with holes - * http://www.sakri.net/blog/2009/06/12/an-approach-to-triangulating-polygons-with-holes/ - * - */ -/* Usage Examples - - // TextGeometry wrapper - - var text3d = new TextGeometry( text, options ); - - // Complete manner - - var textPath = new THREE.TextPath( text, options ); - var textShapes = textPath.toShapes(); - var text3d = new ExtrudeGeometry( textShapes, options ); - -*/ - - -THREE.TextGeometry = function ( text, parameters ) { - - var textPath = new THREE.TextPath( text, parameters ); - var textShapes = textPath.toShapes(); - - // translate parameters to ExtrudeGeometry API - - parameters.amount = parameters.height !== undefined ? parameters.height : 50; - - // defaults - - if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10; - if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8; - if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false; - - if ( parameters.bend ) { - - var b = textShapes[ textShapes.length - 1 ].getBoundingBox(); - var max = b.maxX; - - parameters.bendPath = new THREE.QuadraticBezierCurve( new THREE.Vector2( 0, 0 ), - new THREE.Vector2( max / 2, 120 ), - new THREE.Vector2( max, 0 ) ); - - } - - THREE.ExtrudeGeometry.call( this, textShapes, parameters ); - -}; - -THREE.TextGeometry.prototype = new THREE.ExtrudeGeometry(); -THREE.TextGeometry.prototype.constructor = THREE.TextGeometry; - - -THREE.FontUtils = { - - faces : {}, - - // Just for now. face[weight][style] - - face : "helvetiker", - weight: "normal", - style : "normal", - size : 150, - divisions : 10, - - getFace : function() { - - return this.faces[ this.face ][ this.weight ][ this.style ]; - - }, - - loadFace : function( data ) { - - var family = data.familyName.toLowerCase(); - - var ThreeFont = this; - - ThreeFont.faces[ family ] = ThreeFont.faces[ family ] || {}; - - ThreeFont.faces[ family ][ data.cssFontWeight ] = ThreeFont.faces[ family ][ data.cssFontWeight ] || {}; - ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data; - - var face = ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data; - - return data; - - }, - - drawText : function( text ) { - - var characterPts = [], allPts = []; - - // RenderText - - var i, p, - face = this.getFace(), - scale = this.size / face.resolution, - offset = 0, - chars = String( text ).split( '' ), - length = chars.length; - - var fontPaths = []; - - for ( i = 0; i < length; i ++ ) { - - var path = new THREE.Path(); - - var ret = this.extractGlyphPoints( chars[ i ], face, scale, offset, path ); - offset += ret.offset; - //characterPts.push( ret.points ); - //allPts = allPts.concat( ret.points ); - fontPaths.push( ret.path ); - - } - - // get the width - - var width = offset / 2; - // - // for ( p = 0; p < allPts.length; p++ ) { - // - // allPts[ p ].x -= width; - // - // } - - //var extract = this.extractPoints( allPts, characterPts ); - //extract.contour = allPts; - - //extract.paths = fontPaths; - //extract.offset = width; - - return { paths : fontPaths, offset : width }; - - }, - - - - - extractGlyphPoints : function( c, face, scale, offset, path ) { - - var pts = []; - - var i, i2, divisions, - outline, action, length, - scaleX, scaleY, - x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, - laste, - glyph = face.glyphs[ c ] || face.glyphs[ '?' ]; - - if ( !glyph ) return; - - if ( glyph.o ) { - - outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) ); - length = outline.length; - - scaleX = scale; - scaleY = scale; - - for ( i = 0; i < length; ) { - - action = outline[ i ++ ]; - - //console.log( action ); - - switch( action ) { - - case 'm': - - // Move To - - x = outline[ i++ ] * scaleX + offset; - y = outline[ i++ ] * scaleY; - - pts.push( new THREE.Vector2( x, y ) ); - - path.moveTo( x, y ); - break; - - case 'l': - - // Line To - - x = outline[ i++ ] * scaleX + offset; - y = outline[ i++ ] * scaleY; - pts.push( new THREE.Vector2( x, y ) ); - path.lineTo(x,y); - break; - - case 'q': - - // QuadraticCurveTo - - cpx = outline[ i++ ] * scaleX + offset; - cpy = outline[ i++ ] * scaleY; - cpx1 = outline[ i++ ] * scaleX + offset; - cpy1 = outline[ i++ ] * scaleY; - - path.quadraticCurveTo(cpx1, cpy1, cpx, cpy); - - laste = pts[ pts.length - 1 ]; - - if ( laste ) { - - cpx0 = laste.x; - cpy0 = laste.y; - - for ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) { - - var t = i2 / divisions; - var tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx ); - var ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy ); - pts.push( new THREE.Vector2( tx, ty ) ); - - } - - } - - break; - - case 'b': - - // Cubic Bezier Curve - - cpx = outline[ i++ ] * scaleX + offset; - cpy = outline[ i++ ] * scaleY; - cpx1 = outline[ i++ ] * scaleX + offset; - cpy1 = outline[ i++ ] * -scaleY; - cpx2 = outline[ i++ ] * scaleX + offset; - cpy2 = outline[ i++ ] * -scaleY; - - path.bezierCurveTo( cpx, cpy, cpx1, cpy1, cpx2, cpy2 ); - - laste = pts[ pts.length - 1 ]; - - if ( laste ) { - - cpx0 = laste.x; - cpy0 = laste.y; - - for ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) { - - var t = i2 / divisions; - var tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx ); - var ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy ); - pts.push( new THREE.Vector2( tx, ty ) ); - - } - - } - - break; - - } - - } - } - - - - return { offset: glyph.ha*scale, points:pts, path:path}; - } - -}; - - - -/** - * This code is a quick port of code written in C++ which was submitted to - * flipcode.com by John W. Ratcliff // July 22, 2000 - * See original code and more information here: - * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml - * - * ported to actionscript by Zevan Rosser - * www.actionsnippet.com - * - * ported to javascript by Joshua Koo - * http://www.lab4games.net/zz85/blog - * - */ - - -( function( namespace ) { - - var EPSILON = 0.0000000001; - - // takes in an contour array and returns - - var process = function( contour, indices ) { - - var n = contour.length; - - if ( n < 3 ) return null; - - var result = [], - verts = [], - vertIndices = []; - - /* we want a counter-clockwise polygon in verts */ - - var u, v, w; - - if ( area( contour ) > 0.0 ) { - - for ( v = 0; v < n; v++ ) verts[ v ] = v; - - } else { - - for ( v = 0; v < n; v++ ) verts[ v ] = ( n - 1 ) - v; - - } - - var nv = n; - - /* remove nv - 2 vertices, creating 1 triangle every time */ - - var count = 2 * nv; /* error detection */ - - for( v = nv - 1; nv > 2; ) { - - /* if we loop, it is probably a non-simple polygon */ - - if ( ( count-- ) <= 0 ) { - - //** Triangulate: ERROR - probable bad polygon! - - //throw ( "Warning, unable to triangulate polygon!" ); - //return null; - // Sometimes warning is fine, especially polygons are triangulated in reverse. - console.log( "Warning, unable to triangulate polygon!" ); - - if ( indices ) return vertIndices; - return result; - - } - - /* three consecutive vertices in current polygon, */ - - u = v; if ( nv <= u ) u = 0; /* previous */ - v = u + 1; if ( nv <= v ) v = 0; /* new v */ - w = v + 1; if ( nv <= w ) w = 0; /* next */ - - if ( snip( contour, u, v, w, nv, verts ) ) { - - var a, b, c, s, t; - - /* true names of the vertices */ - - a = verts[ u ]; - b = verts[ v ]; - c = verts[ w ]; - - /* output Triangle */ - - /* - result.push( contour[ a ] ); - result.push( contour[ b ] ); - result.push( contour[ c ] ); - */ - result.push( [ contour[ a ], - contour[ b ], - contour[ c ] ] ); - - - vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); - - /* remove v from the remaining polygon */ - - for( s = v, t = v + 1; t < nv; s++, t++ ) { - - verts[ s ] = verts[ t ]; - - } - - nv--; - - /* reset error detection counter */ - - count = 2 * nv; - - } - - } - - if ( indices ) return vertIndices; - return result; - - }; - - // calculate area of the contour polygon - - var area = function ( contour ) { - - var n = contour.length; - var a = 0.0; - - for( var 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; - - }; - - // see if p is inside triangle abc - - var insideTriangle = function( ax, ay, - bx, by, - cx, cy, - px, py ) { - - var aX, aY, bX, bY; - var cX, cY, apx, apy; - var bpx, bpy, cpx, cpy; - var cCROSSap, bCROSScp, aCROSSbp; - - aX = cx - bx; aY = cy - by; - bX = ax - cx; bY = ay - cy; - cX = bx - ax; cY = by - ay; - apx= px -ax; apy= py - ay; - bpx= px - bx; bpy= py - by; - cpx= px - cx; cpy= py - cy; - - aCROSSbp = aX*bpy - aY*bpx; - cCROSSap = cX*apy - cY*apx; - bCROSScp = bX*cpy - bY*cpx; - - return ( (aCROSSbp >= 0.0) && (bCROSScp >= 0.0) && (cCROSSap >= 0.0) ); - - }; - - - var snip = function ( contour, u, v, w, n, verts ) { - - var p; - var ax, ay, bx, by; - var cx, cy, px, py; - - ax = contour[ verts[ u ] ].x; - ay = contour[ verts[ u ] ].y; - - bx = contour[ verts[ v ] ].x; - by = contour[ verts[ v ] ].y; - - cx = contour[ verts[ w ] ].x; - cy = contour[ verts[ w ] ].y; - - if ( EPSILON > (((bx-ax)*(cy-ay)) - ((by-ay)*(cx-ax))) ) return false; - - for ( p = 0; p < n; p++ ) { - - if( (p == u) || (p == v) || (p == w) ) continue; - - px = contour[ verts[ p ] ].x - py = contour[ verts[ p ] ].y - - if ( insideTriangle( ax, ay, bx, by, cx, cy, px, py ) ) return false; - - } - - return true; - - }; - - - namespace.Triangulate = process; - namespace.Triangulate.area = area; - - return namespace; - -})(THREE.FontUtils); - -// To use the typeface.js face files, hook up the API -self._typeface_js = { faces: THREE.FontUtils.faces, loadFace: THREE.FontUtils.loadFace }; -/** - * @author oosmoxiecode - * @author mr.doob / http://mrdoob.com/ - * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888 - */ - -THREE.TorusGeometry = function ( radius, tube, segmentsR, segmentsT, arc ) { - - THREE.Geometry.call( this ); - - var scope = this; - - this.radius = radius || 100; - this.tube = tube || 40; - this.segmentsR = segmentsR || 8; - this.segmentsT = segmentsT || 6; - this.arc = arc || Math.PI * 2; - - var center = new THREE.Vector3(), uvs = [], normals = []; - - for ( var j = 0; j <= this.segmentsR; j ++ ) { - - for ( var i = 0; i <= this.segmentsT; i ++ ) { - - var u = i / this.segmentsT * this.arc; - var v = j / this.segmentsR * Math.PI * 2; - - center.x = this.radius * Math.cos( u ); - center.y = this.radius * Math.sin( u ); - - var vector = new THREE.Vector3(); - vector.x = ( this.radius + this.tube * Math.cos( v ) ) * Math.cos( u ); - vector.y = ( this.radius + this.tube * Math.cos( v ) ) * Math.sin( u ); - vector.z = this.tube * Math.sin( v ); - - this.vertices.push( new THREE.Vertex( vector ) ); - - uvs.push( new THREE.UV( i / this.segmentsT, 1 - j / this.segmentsR ) ); - normals.push( vector.clone().subSelf( center ).normalize() ); - - } - } - - - for ( var j = 1; j <= this.segmentsR; j ++ ) { - - for ( var i = 1; i <= this.segmentsT; i ++ ) { - - var a = ( this.segmentsT + 1 ) * j + i - 1; - var b = ( this.segmentsT + 1 ) * ( j - 1 ) + i - 1; - var c = ( this.segmentsT + 1 ) * ( j - 1 ) + i; - var d = ( this.segmentsT + 1 ) * j + i; - - var face = new THREE.Face4( a, b, c, d, [ normals[ a ], normals[ b ], normals[ c ], normals[ d ] ] ); - face.normal.addSelf( normals[ a ] ); - face.normal.addSelf( normals[ b ] ); - face.normal.addSelf( normals[ c ] ); - face.normal.addSelf( normals[ d ] ); - face.normal.normalize(); - - this.faces.push( face ); - - this.faceVertexUvs[ 0 ].push( [ uvs[ a ].clone(), uvs[ b ].clone(), uvs[ c ].clone(), uvs[ d ].clone() ] ); - } - - } - - this.computeCentroids(); - -}; - -THREE.TorusGeometry.prototype = new THREE.Geometry(); -THREE.TorusGeometry.prototype.constructor = THREE.TorusGeometry; -/** - * @author oosmoxiecode - * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473 - */ - -THREE.TorusKnotGeometry = function ( radius, tube, segmentsR, segmentsT, p, q, heightScale ) { - - THREE.Geometry.call( this ); - - var scope = this; - - this.radius = radius || 200; - this.tube = tube || 40; - this.segmentsR = segmentsR || 64; - this.segmentsT = segmentsT || 8; - this.p = p || 2; - this.q = q || 3; - this.heightScale = heightScale || 1; - this.grid = new Array(this.segmentsR); - - var tang = new THREE.Vector3(); - var n = new THREE.Vector3(); - var bitan = new THREE.Vector3(); - - for ( var i = 0; i < this.segmentsR; ++ i ) { - - this.grid[ i ] = new Array( this.segmentsT ); - - for ( var j = 0; j < this.segmentsT; ++ j ) { - - var u = i / this.segmentsR * 2 * this.p * Math.PI; - var v = j / this.segmentsT * 2 * Math.PI; - var p1 = getPos( u, v, this.q, this.p, this.radius, this.heightScale ); - var p2 = getPos( u + 0.01, v, this.q, this.p, this.radius, this.heightScale ); - var cx, cy; - - tang.sub( p2, p1 ); - n.add( p2, p1 ); - - bitan.cross( tang, n ); - n.cross( bitan, tang ); - bitan.normalize(); - n.normalize(); - - cx = - this.tube * Math.cos( v ); // TODO: Hack: Negating it so it faces outside. - cy = this.tube * Math.sin( v ); - - p1.x += cx * n.x + cy * bitan.x; - p1.y += cx * n.y + cy * bitan.y; - p1.z += cx * n.z + cy * bitan.z; - - this.grid[ i ][ j ] = vert( p1.x, p1.y, p1.z ); - - } - - } - - for ( var i = 0; i < this.segmentsR; ++ i ) { - - for ( var j = 0; j < this.segmentsT; ++ j ) { - - var ip = ( i + 1 ) % this.segmentsR; - var jp = ( j + 1 ) % this.segmentsT; - - var a = this.grid[ i ][ j ]; - var b = this.grid[ ip ][ j ]; - var c = this.grid[ ip ][ jp ]; - var d = this.grid[ i ][ jp ]; - - var uva = new THREE.UV( i / this.segmentsR, j / this.segmentsT ); - var uvb = new THREE.UV( ( i + 1 ) / this.segmentsR, j / this.segmentsT ); - var uvc = new THREE.UV( ( i + 1 ) / this.segmentsR, ( j + 1 ) / this.segmentsT ); - var uvd = new THREE.UV( i / this.segmentsR, ( j + 1 ) / this.segmentsT ); - - this.faces.push( new THREE.Face4( a, b, c, d ) ); - this.faceVertexUvs[ 0 ].push( [ uva,uvb,uvc, uvd ] ); - - } - } - - this.computeCentroids(); - this.computeFaceNormals(); - this.computeVertexNormals(); - - function vert( x, y, z ) { - - return scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ) - 1; - - } - - function getPos( u, v, in_q, in_p, radius, heightScale ) { - - var cu = Math.cos( u ); - var cv = Math.cos( v ); - var su = Math.sin( u ); - var quOverP = in_q / in_p * u; - var cs = Math.cos( quOverP ); - - var tx = radius * ( 2 + cs ) * 0.5 * cu; - var ty = radius * ( 2 + cs ) * su * 0.5; - var tz = heightScale * radius * Math.sin( quOverP ) * 0.5; - - return new THREE.Vector3( tx, ty, tz ); - - } - -}; - -THREE.TorusKnotGeometry.prototype = new THREE.Geometry(); -THREE.TorusKnotGeometry.prototype.constructor = THREE.TorusKnotGeometry; -/** - * @author sroucheray / http://sroucheray.org/ - * @author mr.doob / http://mrdoob.com/ - */ - -THREE.AxisHelper = function () { - - THREE.Object3D.call( this ); - - var lineGeometry = new THREE.Geometry(); - lineGeometry.vertices.push( new THREE.Vertex() ); - lineGeometry.vertices.push( new THREE.Vertex( new THREE.Vector3( 0, 100, 0 ) ) ); - - var coneGeometry = new THREE.CylinderGeometry( 0, 5, 25, 5, 1 ); - - var line, cone; - - // x - - line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color : 0xff0000 } ) ); - line.rotation.z = - Math.PI / 2; - this.add( line ); - - cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color : 0xff0000 } ) ); - cone.position.x = 100; - cone.rotation.z = - Math.PI / 2; - this.add( cone ); - - // y - - line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color : 0x00ff00 } ) ); - this.add( line ); - - cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color : 0x00ff00 } ) ); - cone.position.y = 100; - this.add( cone ); - - // z - - line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color : 0x0000ff } ) ); - line.rotation.x = Math.PI / 2; - this.add( line ); - - cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color : 0x0000ff } ) ); - cone.position.z = 100; - cone.rotation.x = Math.PI / 2; - this.add( cone ); - -}; - -THREE.AxisHelper.prototype = new THREE.Object3D(); -THREE.AxisHelper.prototype.constructor = THREE.AxisHelper; -/** - * @author alteredq / http://alteredqualia.com/ - * - * - shows frustum, line of sight and up of the camera - * - suitable for fast updates - * - based on frustum visualization in lightgl.js shadowmap example - * http://evanw.github.com/lightgl.js/tests/shadowmap.html - */ - -THREE.CameraHelper = function ( camera ) { - - THREE.Object3D.call( this ); - - var _this = this; - - this.lineGeometry = new THREE.Geometry(); - this.lineMaterial = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } ); - - this.pointMap = {}; - - // colors - - var hexFrustum = 0xffaa00, - hexCone = 0xff0000, - hexUp = 0x00aaff, - hexTarget = 0xffffff, - hexCross = 0x333333; - - // near - - addLine( "n1", "n2", hexFrustum ); - addLine( "n2", "n4", hexFrustum ); - addLine( "n4", "n3", hexFrustum ); - addLine( "n3", "n1", hexFrustum ); - - // far - - addLine( "f1", "f2", hexFrustum ); - addLine( "f2", "f4", hexFrustum ); - addLine( "f4", "f3", hexFrustum ); - addLine( "f3", "f1", hexFrustum ); - - // sides - - addLine( "n1", "f1", hexFrustum ); - addLine( "n2", "f2", hexFrustum ); - addLine( "n3", "f3", hexFrustum ); - addLine( "n4", "f4", hexFrustum ); - - // cone - - addLine( "p", "n1", hexCone ); - addLine( "p", "n2", hexCone ); - addLine( "p", "n3", hexCone ); - addLine( "p", "n4", hexCone ); - - // up - - addLine( "u1", "u2", hexUp ); - addLine( "u2", "u3", hexUp ); - addLine( "u3", "u1", hexUp ); - - // target - - addLine( "c", "t", hexTarget ); - addLine( "p", "c", hexCross ); - - // cross - - addLine( "cn1", "cn2", hexCross ); - addLine( "cn3", "cn4", hexCross ); - - addLine( "cf1", "cf2", hexCross ); - addLine( "cf3", "cf4", hexCross ); - - function addLine( a, b, hex ) { - - addPoint( a, hex ); - addPoint( b, hex ); - - } - - function addPoint( id, hex ) { - - _this.lineGeometry.vertices.push( new THREE.Vertex( new THREE.Vector3() ) ); - _this.lineGeometry.colors.push( new THREE.Color( hex ) ); - - if ( _this.pointMap[ id ] === undefined ) _this.pointMap[ id ] = []; - _this.pointMap[ id ].push( _this.lineGeometry.vertices.length - 1 ); - - } - - this.update( camera ); - - this.lines = new THREE.Line( this.lineGeometry, this.lineMaterial, THREE.LinePieces ); - this.add( this.lines ); - -}; - -THREE.CameraHelper.prototype = new THREE.Object3D(); -THREE.CameraHelper.prototype.constructor = THREE.CameraHelper; - -THREE.CameraHelper.prototype.update = function ( camera ) { - - var w = 1; - var h = 1; - - var _this = this; - - // we need just camera projection matrix - // world matrix must be identity - - THREE.CameraHelper.__c.projectionMatrix.copy( camera.projectionMatrix ); - - // center / target - - setPoint( "c", 0, 0, -1 ); - setPoint( "t", 0, 0, 1 ); - - // near - - setPoint( "n1", -w, -h, -1 ); - setPoint( "n2", w, -h, -1 ); - setPoint( "n3", -w, h, -1 ); - setPoint( "n4", w, h, -1 ); - - // far - - setPoint( "f1", -w, -h, 1 ); - setPoint( "f2", w, -h, 1 ); - setPoint( "f3", -w, h, 1 ); - setPoint( "f4", w, h, 1 ); - - // up - - setPoint( "u1", w * 0.7, h * 1.1, -1 ); - setPoint( "u2", -w * 0.7, h * 1.1, -1 ); - setPoint( "u3", 0, h * 2, -1 ); - - // cross - - setPoint( "cf1", -w, 0, 1 ); - setPoint( "cf2", w, 0, 1 ); - setPoint( "cf3", 0, -h, 1 ); - setPoint( "cf4", 0, h, 1 ); - - setPoint( "cn1", -w, 0, -1 ); - setPoint( "cn2", w, 0, -1 ); - setPoint( "cn3", 0, -h, -1 ); - setPoint( "cn4", 0, h, -1 ); - - function setPoint( point, x, y, z ) { - - THREE.CameraHelper.__v.set( x, y, z ); - THREE.CameraHelper.__projector.unprojectVector( THREE.CameraHelper.__v, THREE.CameraHelper.__c ); - - var points = _this.pointMap[ point ]; - - if ( points !== undefined ) { - - for ( var i = 0, il = points.length; i < il; i ++ ) { - - var j = points[ i ]; - _this.lineGeometry.vertices[ j ].position.copy( THREE.CameraHelper.__v ); - - } - - } - - } - - this.lineGeometry.__dirtyVertices = true; - -}; - -THREE.CameraHelper.__projector = new THREE.Projector(); -THREE.CameraHelper.__v = new THREE.Vector3(); -THREE.CameraHelper.__c = new THREE.Camera(); - -/* - * @author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog - * - * Subdivision Geometry Modifier - * using Catmull-Clark Subdivision Surfaces - * for creating smooth geometry meshes - * - * Note: a modifier modifies vertices and faces of geometry, - * so use THREE.GeometryUtils.clone() if orignal geoemtry needs to be retained - * - * Readings: - * http://en.wikipedia.org/wiki/Catmull%E2%80%93Clark_subdivision_surface - * http://www.rorydriscoll.com/2008/08/01/catmull-clark-subdivision-the-basics/ - * http://xrt.wikidot.com/blog:31 - * "Subdivision Surfaces in Character Animation" - * - * Supports: - * Closed and Open geometries. - * - * TODO: - * crease vertex and "semi-sharp" features - * selective subdivision - */ - -THREE.SubdivisionModifier = function( subdivisions ) { - - this.subdivisions = (subdivisions === undefined ) ? 1 : subdivisions; - - // Settings - this.useOldVertexColors = false; - this.supportUVs = true; - -}; - -//THREE.SubdivisionModifier.prototype = new THREE.Modifier(); - -THREE.SubdivisionModifier.prototype.constructor = THREE.SubdivisionModifier; - -// Applies the "modify" pattern -THREE.SubdivisionModifier.prototype.modify = function ( geometry ) { - - var repeats = this.subdivisions; - - while ( repeats-- > 0 ) { - this.smooth( geometry ); - } - -}; - -// Performs an iteration of Catmull-Clark Subdivision -THREE.SubdivisionModifier.prototype.smooth = function ( oldGeometry ) { - - //console.log( 'running smooth' ); - - // New set of vertices, faces and uvs - var newVertices = [], newFaces = [], newUVs = []; - - function v( x, y, z ) { - newVertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ); - } - - var scope = this; - - function f4( a, b, c, d, oldFace, orders ) { - - // TODO move vertex selection over here! - - var newFace = new THREE.Face4( a, b, c, d, null, oldFace.color, oldFace.material ); - - if (scope.useOldVertexColors) { - - newFace.vertexColors = []; - - var color, tmpColor, order; - for (var i=0;i<4;i++) { - order = orders[i]; - - color = new THREE.Color(), - color.setRGB(0,0,0); - - for (var j=0, jl=0; j face map - - for( i = 0, il = geometry.faces.length; i < il; i ++ ) { - - face = geometry.faces[ i ]; - - if ( face instanceof THREE.Face3 ) { - - hash = edge_hash( face.a, face.b ); - addToMap( vfMap, hash, i ); - - hash = edge_hash( face.b, face.c ); - addToMap( vfMap, hash, i ); - - hash = edge_hash( face.c, face.a ); - addToMap( vfMap, hash, i ); - - } else if ( face instanceof THREE.Face4 ) { - - hash = edge_hash( face.a, face.b ); - addToMap( vfMap, hash, i ); - - hash = edge_hash( face.b, face.c ); - addToMap( vfMap, hash, i ); - - hash = edge_hash( face.c, face.d ); - addToMap( vfMap, hash, i ); - - hash = edge_hash( face.d, face.a ); - addToMap( vfMap, hash, i ); - - } - - } - - // extract faces - - // var edges = []; - // - // var numOfEdges = 0; - // for (i in vfMap) { - // numOfEdges++; - // - // edge = vfMap[i]; - // edges.push(edge); - // - // } - - //console.log('vfMap', vfMap, 'geometry.edges',geometry.edges, 'numOfEdges', numOfEdges); - - return vfMap; - - }; - - var originalPoints = oldGeometry.vertices; - var originalFaces = oldGeometry.faces; - - var newPoints = originalPoints.concat(); // Vertices - - var facePoints = [], edgePoints = {}; - - var sharpEdges = {}, sharpVertices = [], sharpFaces = []; - - var uvForVertices = []; - - // Step 1 - // For each face, add a face point - // Set each face point to be the centroid of all original points for the respective face. - - var i, il, j, jl, face; - - // For Uvs - var uvs = oldGeometry.faceVertexUvs[0]; - var abcd = 'abcd', vertice; - - for (i=0, il = uvs.length; i2) { - // TODO - } - */ - - F.divideScalar(f); - - - - for (j=0; j= 0 ) { - - var inv = skin.invBindMatrices[ found ]; - - bone.invBindMatrix = inv; - bone.skinningMatrix = new THREE.Matrix4(); - bone.skinningMatrix.multiply(bone.world, inv); // (IBMi * JMi) - - bone.weights = []; - - for ( var j = 0; j < skin.weights.length; j ++ ) { - - for (var k = 0; k < skin.weights[ j ].length; k ++) { - - var w = skin.weights[ j ][ k ]; - - if ( w.joint == found ) { - - bone.weights.push( w ); - - } - - } - - } - - } else { - - throw 'ColladaLoader: Could not find joint \'' + bone.sid + '\'.'; - - } - - } - - }; - - function applySkin ( geometry, instanceCtrl, frame ) { - - var skinController = controllers[ instanceCtrl.url ]; - - frame = frame !== undefined ? frame : 40; - - if ( !skinController || !skinController.skin ) { - - console.log( 'ColladaLoader: Could not find skin controller.' ); - return; - - } - - if ( !instanceCtrl.skeleton || !instanceCtrl.skeleton.length ) { - - console.log( 'ColladaLoader: Could not find the skeleton for the skin. ' ); - return; - - } - - var animationBounds = calcAnimationBounds(); - var skeleton = daeScene.getChildById( instanceCtrl.skeleton[0], true ) || - daeScene.getChildBySid( instanceCtrl.skeleton[0], true ); - - var i, j, w, vidx, weight; - var v = new THREE.Vector3(), o, s; - - // move vertices to bind shape - - for ( i = 0; i < geometry.vertices.length; i ++ ) { - - skinController.skin.bindShapeMatrix.multiplyVector3( geometry.vertices[i].position ); - - } - - // process animation, or simply pose the rig if no animation - - for ( frame = 0; frame < animationBounds.frames; frame ++ ) { - - var bones = []; - var skinned = []; - - // zero skinned vertices - - for ( i = 0; i < geometry.vertices.length; i++ ) { - - skinned.push( new THREE.Vertex( new THREE.Vector3() ) ); - - } - - // process the frame and setup the rig with a fresh - // transform, possibly from the bone's animation channel(s) - - setupSkeleton( skeleton, bones, frame ); - setupSkinningMatrices( bones, skinController.skin ); - - // skin 'm - - for ( i = 0; i < bones.length; i ++ ) { - - if ( bones[ i ].type != 'JOINT' ) continue; - - for ( j = 0; j < bones[ i ].weights.length; j ++ ) { - - w = bones[ i ].weights[ j ]; - vidx = w.index; - weight = w.weight; - - o = geometry.vertices[vidx]; - s = skinned[vidx]; - - v.x = o.position.x; - v.y = o.position.y; - v.z = o.position.z; - - bones[i].skinningMatrix.multiplyVector3(v); - - s.position.x += (v.x * weight); - s.position.y += (v.y * weight); - s.position.z += (v.z * weight); - - } - - } - - geometry.morphTargets.push( { name: "target_" + frame, vertices: skinned } ); - - } - - }; - - function createSceneGraph ( node, parent ) { - - var obj = new THREE.Object3D(); - var skinned = false; - var skinController; - var morphController; - var i, j; - - // FIXME: controllers - - for ( i = 0; i < node.controllers.length; i ++ ) { - - var controller = controllers[ node.controllers[ i ].url ]; - - switch ( controller.type ) { - - case 'skin': - - if ( geometries[ controller.skin.source ] ) { - - var inst_geom = new InstanceGeometry(); - - inst_geom.url = controller.skin.source; - inst_geom.instance_material = node.controllers[ i ].instance_material; - - node.geometries.push( inst_geom ); - skinned = true; - skinController = node.controllers[ i ]; - - } else if ( controllers[ controller.skin.source ] ) { - - // urgh: controller can be chained - // handle the most basic case... - - var second = controllers[ controller.skin.source ]; - morphController = second; - // skinController = node.controllers[i]; - - if ( second.morph && geometries[ second.morph.source ] ) { - - var inst_geom = new InstanceGeometry(); - - inst_geom.url = second.morph.source; - inst_geom.instance_material = node.controllers[ i ].instance_material; - - node.geometries.push( inst_geom ); - - } - - } - - break; - - case 'morph': - - if ( geometries[ controller.morph.source ] ) { - - var inst_geom = new InstanceGeometry(); - - inst_geom.url = controller.morph.source; - inst_geom.instance_material = node.controllers[ i ].instance_material; - - node.geometries.push( inst_geom ); - morphController = node.controllers[ i ]; - - } - - console.log( 'ColladaLoader: Morph-controller partially supported.' ); - - default: - break; - - } - - } - - // FIXME: multi-material mesh? - // geometries - - for ( i = 0; i < node.geometries.length; i ++ ) { - - var instance_geometry = node.geometries[i]; - var instance_materials = instance_geometry.instance_material; - var geometry = geometries[instance_geometry.url]; - var used_materials = {}; - var used_materials_array = []; - var num_materials = 0; - var first_material; - - if ( geometry ) { - - if ( !geometry.mesh || !geometry.mesh.primitives ) - continue; - - if ( obj.name.length == 0 ) { - - obj.name = geometry.id; - - } - - // collect used fx for this geometry-instance - - if ( instance_materials ) { - - for ( j = 0; j < instance_materials.length; j ++ ) { - - var inst_material = instance_materials[j]; - var effect_id = materials[inst_material.target].instance_effect.url; - var shader = effects[effect_id].shader; - - shader.material.opacity = !shader.material.opacity ? 1 : shader.material.opacity; - used_materials[inst_material.symbol] = num_materials; - used_materials_array.push(shader.material) - first_material = shader.material; - num_materials ++; - - } - - } - - var mesh; - var material = first_material || new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.FlatShading } ); - var geom = geometry.mesh.geometry3js; - - if ( num_materials > 1 ) { - - material = new THREE.MeshFaceMaterial(); - geom.materials = used_materials_array; - - for ( j = 0; j < geom.faces.length; j ++ ) { - - var face = geom.faces[ j ]; - face.materialIndex = used_materials[ face.daeMaterial ] - - } - - } - - if ( skinController !== undefined) { - - applySkin( geom, skinController ); - - material.morphTargets = true; - - mesh = new THREE.SkinnedMesh( geom, material ); - mesh.skeleton = skinController.skeleton; - mesh.skinController = controllers[ skinController.url ]; - mesh.skinInstanceController = skinController; - mesh.name = 'skin_' + skins.length; - - skins.push( mesh ); - - } else if ( morphController !== undefined ) { - - createMorph( geom, morphController ); - - material.morphTargets = true; - - mesh = new THREE.Mesh( geom, material ); - mesh.name = 'morph_' + morphs.length; - - morphs.push( mesh ); - - } else { - - mesh = new THREE.Mesh( geom, material ); - // mesh.geom.name = geometry.id; - - } - - node.geometries.length > 1 ? obj.add( mesh ) : obj = mesh; - - } - - } - - obj.name = node.id || ""; - obj.matrix = node.matrix; - var props = node.matrix.decompose(); - obj.position = props[ 0 ]; - obj.quaternion = props[ 1 ]; - obj.useQuaternion = true; - obj.scale = props[ 2 ]; - - if ( options.centerGeometry && obj.geometry ) { - - var delta = THREE.GeometryUtils.center( obj.geometry ); - obj.quaternion.multiplyVector3( delta.multiplySelf( obj.scale ) ); - obj.position.subSelf( delta ); - - } - - for ( i = 0; i < node.nodes.length; i ++ ) { - - obj.add( createSceneGraph( node.nodes[i], node ) ); - - } - - return obj; - - }; - - function getJointId( skin, id ) { - - for ( var i = 0; i < skin.joints.length; i ++ ) { - - if ( skin.joints[ i ] == id ) { - - return i; - - } - - } - - }; - - function getLibraryNode( id ) { - - return COLLADA.evaluate( './/dae:library_nodes//dae:node[@id=\'' + id + '\']', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext(); - - }; - - function getChannelsForNode (node ) { - - var channels = []; - var startTime = 1000000; - var endTime = -1000000; - - for ( var id in animations ) { - - var animation = animations[id]; - - for ( var i = 0; i < animation.channel.length; i ++ ) { - - var channel = animation.channel[i]; - var sampler = animation.sampler[i]; - var id = channel.target.split('/')[0]; - - if ( id == node.id ) { - - sampler.create(); - channel.sampler = sampler; - startTime = Math.min(startTime, sampler.startTime); - endTime = Math.max(endTime, sampler.endTime); - channels.push(channel); - - } - - } - - } - - if ( channels.length ) { - - node.startTime = startTime; - node.endTime = endTime; - - } - - return channels; - - }; - - function calcFrameDuration( node ) { - - var minT = 10000000; - - for ( var i = 0; i < node.channels.length; i ++ ) { - - var sampler = node.channels[i].sampler; - - for ( var j = 0; j < sampler.input.length - 1; j ++ ) { - - var t0 = sampler.input[ j ]; - var t1 = sampler.input[ j + 1 ]; - minT = Math.min( minT, t1 - t0 ); - - } - } - - return minT; - - }; - - function calcMatrixAt( node, t ) { - - var animated = {}; - - var i, j; - - for ( i = 0; i < node.channels.length; i ++ ) { - - var channel = node.channels[ i ]; - animated[ channel.sid ] = channel; - - } - - var matrix = new THREE.Matrix4(); - - for ( i = 0; i < node.transforms.length; i ++ ) { - - var transform = node.transforms[ i ]; - var channel = animated[ transform.sid ]; - - if ( channel !== undefined ) { - - var sampler = channel.sampler; - var value; - - for ( j = 0; j < sampler.input.length - 1; j ++ ) { - - if ( sampler.input[ j + 1 ] > t ) { - - value = sampler.output[ j ]; - //console.log(value.flatten) - break; - - } - - } - - if ( value !== undefined ) { - - if ( value instanceof THREE.Matrix4 ) { - - matrix = matrix.multiply( matrix, value ); - - } else { - - // FIXME: handle other types - - matrix = matrix.multiply( matrix, transform.matrix ); - - } - - } else { - - matrix = matrix.multiply( matrix, transform.matrix ); - - } - - } else { - - matrix = matrix.multiply( matrix, transform.matrix ); - - } - - } - - return matrix; - - }; - - function bakeAnimations ( node ) { - - if ( node.channels && node.channels.length ) { - - var keys = [], - sids = []; - - for ( var i = 0, il = node.channels.length; i < il; i++ ) { - - var channel = node.channels[i], - fullSid = channel.fullSid, - member = getConvertedMember( channel.member ), - sampler = channel.sampler, - input = sampler.input, - transform = node.getTransformBySid( channel.sid ); - - if ( transform ) { - - if ( sids.indexOf( fullSid ) === -1 ) { - - sids.push( fullSid ); - - } - - for ( var j = 0, jl = input.length; j < jl; j++ ) { - - var time = input[j], - data = sampler.getData( transform.type, j ), - key = findKey( keys, time ); - - if ( !key ) { - - key = new Key( time ); - var timeNdx = findTimeNdx( keys, time ); - keys.splice( timeNdx == -1 ? keys.length : timeNdx, 0, key ); - - } - - key.addTarget( fullSid, transform, member, data ); - - } - - } else { - - console.log( 'Could not find transform "' + channel.sid + '" in node ' + node.id ); - - } - - } - - // post process - for ( var i = 0; i < sids.length; i++ ) { - - var sid = sids[ i ]; - - for ( var j = 0; j < keys.length; j++ ) { - - var key = keys[ j ]; - - if ( !key.hasTarget( sid ) ) { - - interpolateKeys( keys, key, j, sid ); - - } - - } - - } - - node.keys = keys; - node.sids = sids; - - } - - }; - - function findKey ( keys, time) { - - var retVal = null; - - for ( var i = 0, il = keys.length; i < il && retVal == null; i++ ) { - - var key = keys[i]; - - if ( key.time === time ) { - - retVal = key; - - } else if ( key.time > time ) { - - break; - - } - - } - - return retVal; - - }; - - function findTimeNdx ( keys, time) { - - var ndx = -1; - - for ( var i = 0, il = keys.length; i < il && ndx == -1; i++ ) { - - var key = keys[i]; - - if ( key.time >= time ) { - - ndx = i; - - } - - } - - return ndx; - - }; - - function interpolateKeys ( keys, key, ndx, fullSid ) { - - var prevKey = getPrevKeyWith( keys, fullSid, ndx ? ndx-1 : 0 ), - nextKey = getNextKeyWith( keys, fullSid, ndx+1 ); - - if ( prevKey && nextKey ) { - - var scale = (key.time - prevKey.time) / (nextKey.time - prevKey.time), - prevTarget = prevKey.getTarget( fullSid ), - nextData = nextKey.getTarget( fullSid ).data, - prevData = prevTarget.data, - data; - - if ( prevData.length ) { - - data = []; - - for ( var i = 0; i < prevData.length; ++i ) { - - data[ i ] = prevData[ i ] + ( nextData[ i ] - prevData[ i ] ) * scale; - - } - - } else { - - data = prevData + ( nextData - prevData ) * scale; - - } - - key.addTarget( fullSid, prevTarget.transform, prevTarget.member, data ); - - } - - }; - - // Get next key with given sid - - function getNextKeyWith( keys, fullSid, ndx ) { - - for ( ; ndx < keys.length; ndx++ ) { - - var key = keys[ ndx ]; - - if ( key.hasTarget( fullSid ) ) { - - return key; - - } - - } - - return null; - - }; - - // Get previous key with given sid - - function getPrevKeyWith( keys, fullSid, ndx ) { - - ndx = ndx >= 0 ? ndx : ndx + keys.length; - - for ( ; ndx >= 0; ndx-- ) { - - var key = keys[ ndx ]; - - if ( key.hasTarget( fullSid ) ) { - - return key; - - } - - } - - return null; - - }; - - function _Image() { - - this.id = ""; - this.init_from = ""; - - }; - - _Image.prototype.parse = function(element) { - - this.id = element.getAttribute('id'); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - if ( child.nodeName == 'init_from' ) { - - this.init_from = child.textContent; - - } - - } - - return this; - - }; - - function Controller() { - - this.id = ""; - this.name = ""; - this.type = ""; - this.skin = null; - this.morph = null; - - }; - - Controller.prototype.parse = function( element ) { - - this.id = element.getAttribute('id'); - this.name = element.getAttribute('name'); - this.type = "none"; - - for ( var i = 0; i < element.childNodes.length; i++ ) { - - var child = element.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'skin': - - this.skin = (new Skin()).parse(child); - this.type = child.nodeName; - break; - - case 'morph': - - this.morph = (new Morph()).parse(child); - this.type = child.nodeName; - break; - - default: - break; - - } - } - - return this; - - }; - - function Morph() { - - this.method = null; - this.source = null; - this.targets = null; - this.weights = null; - - }; - - Morph.prototype.parse = function( element ) { - - var sources = {}; - var inputs = []; - var i; - - this.method = element.getAttribute( 'method' ); - this.source = element.getAttribute( 'source' ).replace( /^#/, '' ); - - for ( i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'source': - - var source = ( new Source() ).parse( child ); - sources[ source.id ] = source; - break; - - case 'targets': - - inputs = this.parseInputs( child ); - break; - - default: - - console.log( child.nodeName ); - break; - - } - - } - - for ( i = 0; i < inputs.length; i ++ ) { - - var input = inputs[ i ]; - var source = sources[ input.source ]; - - switch ( input.semantic ) { - - case 'MORPH_TARGET': - - this.targets = source.read(); - break; - - case 'MORPH_WEIGHT': - - this.weights = source.read(); - break; - - default: - break; - - } - } - - return this; - - }; - - Morph.prototype.parseInputs = function(element) { - - var inputs = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - if ( child.nodeType != 1) continue; - - switch ( child.nodeName ) { - - case 'input': - - inputs.push( (new Input()).parse(child) ); - break; - - default: - break; - } - } - - return inputs; - - }; - - function Skin() { - - this.source = ""; - this.bindShapeMatrix = null; - this.invBindMatrices = []; - this.joints = []; - this.weights = []; - - }; - - Skin.prototype.parse = function( element ) { - - var sources = {}; - var joints, weights; - - this.source = element.getAttribute( 'source' ).replace( /^#/, '' ); - this.invBindMatrices = []; - this.joints = []; - this.weights = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'bind_shape_matrix': - - var f = _floats(child.textContent); - this.bindShapeMatrix = getConvertedMat4( f ); - break; - - case 'source': - - var src = new Source().parse(child); - sources[ src.id ] = src; - break; - - case 'joints': - - joints = child; - break; - - case 'vertex_weights': - - weights = child; - break; - - default: - - console.log( child.nodeName ); - break; - - } - } - - this.parseJoints( joints, sources ); - this.parseWeights( weights, sources ); - - return this; - - }; - - Skin.prototype.parseJoints = function ( element, sources ) { - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - - var input = ( new Input() ).parse( child ); - var source = sources[ input.source ]; - - if ( input.semantic == 'JOINT' ) { - - this.joints = source.read(); - - } else if ( input.semantic == 'INV_BIND_MATRIX' ) { - - this.invBindMatrices = source.read(); - - } - - break; - - default: - break; - } - - } - - }; - - Skin.prototype.parseWeights = function ( element, sources ) { - - var v, vcount, inputs = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - - inputs.push( ( new Input() ).parse( child ) ); - break; - - case 'v': - - v = _ints( child.textContent ); - break; - - case 'vcount': - - vcount = _ints( child.textContent ); - break; - - default: - break; - - } - - } - - var index = 0; - - for ( var i = 0; i < vcount.length; i ++ ) { - - var numBones = vcount[i]; - var vertex_weights = []; - - for ( var j = 0; j < numBones; j++ ) { - - var influence = {}; - - for ( var k = 0; k < inputs.length; k ++ ) { - - var input = inputs[ k ]; - var value = v[ index + input.offset ]; - - switch ( input.semantic ) { - - case 'JOINT': - - influence.joint = value;//this.joints[value]; - break; - - case 'WEIGHT': - - influence.weight = sources[ input.source ].data[ value ]; - break; - - default: - break; - - } - - } - - vertex_weights.push( influence ); - index += inputs.length; - } - - for ( var j = 0; j < vertex_weights.length; j ++ ) { - - vertex_weights[ j ].index = i; - - } - - this.weights.push( vertex_weights ); - - } - - }; - - function VisualScene () { - - this.id = ""; - this.name = ""; - this.nodes = []; - this.scene = new THREE.Object3D(); - - }; - - VisualScene.prototype.getChildById = function( id, recursive ) { - - for ( var i = 0; i < this.nodes.length; i ++ ) { - - var node = this.nodes[ i ].getChildById( id, recursive ); - - if ( node ) { - - return node; - - } - - } - - return null; - - }; - - VisualScene.prototype.getChildBySid = function( sid, recursive ) { - - for ( var i = 0; i < this.nodes.length; i ++ ) { - - var node = this.nodes[ i ].getChildBySid( sid, recursive ); - - if ( node ) { - - return node; - - } - - } - - return null; - - }; - - VisualScene.prototype.parse = function( element ) { - - this.id = element.getAttribute( 'id' ); - this.name = element.getAttribute( 'name' ); - this.nodes = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'node': - - this.nodes.push( ( new Node() ).parse( child ) ); - break; - - default: - break; - - } - - } - - return this; - - }; - - function Node() { - - this.id = ""; - this.name = ""; - this.sid = ""; - this.nodes = []; - this.controllers = []; - this.transforms = []; - this.geometries = []; - this.channels = []; - this.matrix = new THREE.Matrix4(); - - }; - - Node.prototype.getChannelForTransform = function( transformSid ) { - - for ( var i = 0; i < this.channels.length; i ++ ) { - - var channel = this.channels[i]; - var parts = channel.target.split('/'); - var id = parts.shift(); - var sid = parts.shift(); - var dotSyntax = (sid.indexOf(".") >= 0); - var arrSyntax = (sid.indexOf("(") >= 0); - var arrIndices; - var member; - - if ( dotSyntax ) { - - parts = sid.split("."); - sid = parts.shift(); - member = parts.shift(); - - } else if ( arrSyntax ) { - - arrIndices = sid.split("("); - sid = arrIndices.shift(); - - for ( var j = 0; j < arrIndices.length; j ++ ) { - - arrIndices[ j ] = parseInt( arrIndices[ j ].replace( /\)/, '' ) ); - - } - - } - - if ( sid == transformSid ) { - - channel.info = { sid: sid, dotSyntax: dotSyntax, arrSyntax: arrSyntax, arrIndices: arrIndices }; - return channel; - - } - - } - - return null; - - }; - - Node.prototype.getChildById = function ( id, recursive ) { - - if ( this.id == id ) { - - return this; - - } - - if ( recursive ) { - - for ( var i = 0; i < this.nodes.length; i ++ ) { - - var n = this.nodes[ i ].getChildById( id, recursive ); - - if ( n ) { - - return n; - - } - - } - - } - - return null; - - }; - - Node.prototype.getChildBySid = function ( sid, recursive ) { - - if ( this.sid == sid ) { - - return this; - - } - - if ( recursive ) { - - for ( var i = 0; i < this.nodes.length; i ++ ) { - - var n = this.nodes[ i ].getChildBySid( sid, recursive ); - - if ( n ) { - - return n; - - } - - } - } - - return null; - - }; - - Node.prototype.getTransformBySid = function ( sid ) { - - for ( var i = 0; i < this.transforms.length; i ++ ) { - - if ( this.transforms[ i ].sid == sid ) return this.transforms[ i ]; - - } - - return null; - - }; - - Node.prototype.parse = function( element ) { - - var url; - - this.id = element.getAttribute('id'); - this.sid = element.getAttribute('sid'); - this.name = element.getAttribute('name'); - this.type = element.getAttribute('type'); - - this.type = this.type == 'JOINT' ? this.type : 'NODE'; - - this.nodes = []; - this.transforms = []; - this.geometries = []; - this.controllers = []; - this.matrix = new THREE.Matrix4(); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'node': - - this.nodes.push( ( new Node() ).parse( child ) ); - break; - - case 'instance_camera': - - break; - - case 'instance_controller': - - this.controllers.push( ( new InstanceController() ).parse( child ) ); - break; - - case 'instance_geometry': - - this.geometries.push( ( new InstanceGeometry() ).parse( child ) ); - break; - - case 'instance_light': - - break; - - case 'instance_node': - - url = child.getAttribute( 'url' ).replace( /^#/, '' ); - var iNode = getLibraryNode( url ); - - if ( iNode ) { - - this.nodes.push( ( new Node() ).parse( iNode )) ; - - } - - break; - - case 'rotate': - case 'translate': - case 'scale': - case 'matrix': - case 'lookat': - case 'skew': - - this.transforms.push( ( new Transform() ).parse( child ) ); - break; - - case 'extra': - break; - - default: - - console.log( child.nodeName ); - break; - - } - - } - - this.channels = getChannelsForNode( this ); - bakeAnimations( this ); - - this.updateMatrix(); - - return this; - - }; - - Node.prototype.updateMatrix = function () { - - this.matrix.identity(); - - for ( var i = 0; i < this.transforms.length; i ++ ) { - - this.transforms[ i ].apply( this.matrix ); - - } - - }; - - function Transform () { - - this.sid = ""; - this.type = ""; - this.data = []; - this.obj = null; - - }; - - Transform.prototype.parse = function ( element ) { - - this.sid = element.getAttribute( 'sid' ); - this.type = element.nodeName; - this.data = _floats( element.textContent ); - this.convert(); - - return this; - - }; - - Transform.prototype.convert = function () { - - switch ( this.type ) { - - case 'matrix': - - this.obj = getConvertedMat4( this.data ); - break; - - case 'rotate': - - this.angle = this.data[3] * TO_RADIANS; - - case 'translate': - - fixCoords( this.data, -1 ); - this.obj = new THREE.Vector3( this.data[ 0 ], this.data[ 1 ], this.data[ 2 ] ); - break; - - case 'scale': - - fixCoords( this.data, 1 ); - this.obj = new THREE.Vector3( this.data[ 0 ], this.data[ 1 ], this.data[ 2 ] ); - break; - - default: - console.log( 'Can not convert Transform of type ' + this.type ); - break; - - } - - }; - - Transform.prototype.apply = function ( matrix ) { - - switch ( this.type ) { - - case 'matrix': - - matrix.multiplySelf( this.obj ); - break; - - case 'translate': - - matrix.translate( this.obj ); - break; - - case 'rotate': - - matrix.rotateByAxis( this.obj, this.angle ); - break; - - case 'scale': - - matrix.scale( this.obj ); - break; - - } - - }; - - Transform.prototype.update = function ( data, member ) { - - switch ( this.type ) { - - case 'matrix': - - console.log( 'Currently not handling matrix transform updates' ); - break; - - case 'translate': - case 'scale': - - switch ( member ) { - - case 'X': - - this.obj.x = data; - break; - - case 'Y': - - this.obj.y = data; - break; - - case 'Z': - - this.obj.z = data; - break; - - default: - - this.obj.x = data[ 0 ]; - this.obj.y = data[ 1 ]; - this.obj.z = data[ 2 ]; - break; - - } - - break; - - case 'rotate': - - switch ( member ) { - - case 'X': - - this.obj.x = data; - break; - - case 'Y': - - this.obj.y = data; - break; - - case 'Z': - - this.obj.z = data; - break; - - case 'ANGLE': - - this.angle = data * TO_RADIANS; - break; - - default: - - this.obj.x = data[ 0 ]; - this.obj.y = data[ 1 ]; - this.obj.z = data[ 2 ]; - this.angle = data[ 3 ] * TO_RADIANS; - break; - - } - break; - - } - - }; - - function InstanceController() { - - this.url = ""; - this.skeleton = []; - this.instance_material = []; - - }; - - InstanceController.prototype.parse = function ( element ) { - - this.url = element.getAttribute('url').replace(/^#/, ''); - this.skeleton = []; - this.instance_material = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - if (child.nodeType != 1) continue; - - switch ( child.nodeName ) { - - case 'skeleton': - - this.skeleton.push( child.textContent.replace(/^#/, '') ); - break; - - case 'bind_material': - - var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); - - if ( instances ) { - - var instance = instances.iterateNext(); - - while ( instance ) { - - this.instance_material.push((new InstanceMaterial()).parse(instance)); - instance = instances.iterateNext(); - - } - - } - - break; - - case 'extra': - break; - - default: - break; - - } - } - - return this; - - }; - - function InstanceMaterial () { - - this.symbol = ""; - this.target = ""; - - }; - - InstanceMaterial.prototype.parse = function ( element ) { - - this.symbol = element.getAttribute('symbol'); - this.target = element.getAttribute('target').replace(/^#/, ''); - return this; - - }; - - function InstanceGeometry() { - - this.url = ""; - this.instance_material = []; - - }; - - InstanceGeometry.prototype.parse = function ( element ) { - - this.url = element.getAttribute('url').replace(/^#/, ''); - this.instance_material = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - if ( child.nodeType != 1 ) continue; - - if ( child.nodeName == 'bind_material' ) { - - var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); - - if ( instances ) { - - var instance = instances.iterateNext(); - - while ( instance ) { - - this.instance_material.push( (new InstanceMaterial()).parse(instance) ); - instance = instances.iterateNext(); - - } - - } - - break; - - } - - } - - return this; - - }; - - function Geometry() { - - this.id = ""; - this.mesh = null; - - }; - - Geometry.prototype.parse = function ( element ) { - - this.id = element.getAttribute('id'); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - - switch ( child.nodeName ) { - - case 'mesh': - - this.mesh = (new Mesh(this)).parse(child); - break; - - case 'extra': - - // console.log( child ); - break; - - default: - break; - } - } - - return this; - - }; - - function Mesh( geometry ) { - - this.geometry = geometry.id; - this.primitives = []; - this.vertices = null; - this.geometry3js = null; - - }; - - Mesh.prototype.parse = function( element ) { - - this.primitives = []; - - var i, j; - - for ( i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'source': - - _source( child ); - break; - - case 'vertices': - - this.vertices = ( new Vertices() ).parse( child ); - break; - - case 'triangles': - - this.primitives.push( ( new Triangles().parse( child ) ) ); - break; - - case 'polygons': - - console.warn( 'polygon holes not yet supported!' ); - - case 'polylist': - - this.primitives.push( ( new Polylist().parse( child ) ) ); - break; - - default: - break; - - } - - } - - this.geometry3js = new THREE.Geometry(); - - var vertexData = sources[ this.vertices.input['POSITION'].source ].data; - - for ( i = 0; i < vertexData.length; i += 3 ) { - - var v = new THREE.Vertex( getConvertedVec3( vertexData, i ) ); - this.geometry3js.vertices.push( v ); - - } - - for ( i = 0; i < this.primitives.length; i ++ ) { - - var primitive = this.primitives[ i ]; - primitive.setVertices( this.vertices ); - this.handlePrimitive( primitive, this.geometry3js ); - - } - - this.geometry3js.computeCentroids(); - this.geometry3js.computeFaceNormals(); - this.geometry3js.computeVertexNormals(); - this.geometry3js.computeBoundingBox(); - - return this; - - }; - - Mesh.prototype.handlePrimitive = function( primitive, geom ) { - - var i = 0, j, k, p = primitive.p, inputs = primitive.inputs; - var input, index, idx32; - var source, numParams; - var vcIndex = 0, vcount = 3; - var texture_sets = []; - - for ( j = 0; j < inputs.length; j ++ ) { - - input = inputs[ j ]; - - switch ( input.semantic ) { - - case 'TEXCOORD': - texture_sets.push( input.set ); - break; - - } - - } - - while ( i < p.length ) { - - var vs = []; - var ns = []; - var ts = {}; - var cs = []; - - if ( primitive.vcount ) { - - vcount = primitive.vcount[ vcIndex ++ ]; - - } - - for ( j = 0; j < vcount; j ++ ) { - - for ( k = 0; k < inputs.length; k ++ ) { - - input = inputs[ k ]; - source = sources[ input.source ]; - - index = p[ i + ( j * inputs.length ) + input.offset ]; - numParams = source.accessor.params.length; - idx32 = index * numParams; - - switch ( input.semantic ) { - - case 'VERTEX': - - vs.push( index ); - - break; - - case 'NORMAL': - - ns.push( getConvertedVec3( source.data, idx32 ) ); - - break; - - case 'TEXCOORD': - - if ( ts[ input.set ] === undefined ) ts[ input.set ] = []; - // invert the V - ts[ input.set ].push( new THREE.UV( source.data[ idx32 ], 1.0 - source.data[ idx32 + 1 ] ) ); - - break; - - case 'COLOR': - - cs.push( new THREE.Color().setRGB( source.data[ idx32 ], source.data[ idx32 + 1 ], source.data[ idx32 + 2 ] ) ); - - break; - - default: - break; - - } - - } - - } - - - var face = null, faces = [], uv, uvArr; - - if ( vcount === 3 ) { - - faces.push( new THREE.Face3( vs[0], vs[1], vs[2], [ ns[0], ns[1], ns[2] ], cs.length ? cs : new THREE.Color() ) ); - - } else if ( vcount === 4 ) { - - faces.push( new THREE.Face4( vs[0], vs[1], vs[2], vs[3], [ ns[0], ns[1], ns[2], ns[3] ], cs.length ? cs : new THREE.Color() ) ); - - } else if ( vcount > 4 && options.subdivideFaces ) { - - var clr = cs.length ? cs : new THREE.Color(), - vec1, vec2, vec3, v1, v2, norm; - - // subdivide into multiple Face3s - for ( k = 1; k < vcount-1; ) { - - // FIXME: normals don't seem to be quite right - faces.push( new THREE.Face3( vs[0], vs[k], vs[k+1], [ ns[0], ns[k++], ns[k] ], clr ) ); - - } - - } - - if ( faces.length ) { - - for (var ndx = 0, len = faces.length; ndx < len; ndx++) { - - face = faces[ndx]; - face.daeMaterial = primitive.material; - geom.faces.push( face ); - - for ( k = 0; k < texture_sets.length; k++ ) { - - uv = ts[ texture_sets[k] ]; - - if ( vcount > 4 ) { - - // Grab the right UVs for the vertices in this face - uvArr = [ uv[0], uv[ndx+1], uv[ndx+2] ]; - - } else if ( vcount === 4 ) { - - uvArr = [ uv[0], uv[1], uv[2], uv[3] ]; - - } else { - - uvArr = [ uv[0], uv[1], uv[2] ]; - - } - - if ( !geom.faceVertexUvs[k] ) { - - geom.faceVertexUvs[k] = []; - - } - - geom.faceVertexUvs[k].push( uvArr ); - - } - - } - - } else { - - console.log( 'dropped face with vcount ' + vcount + ' for geometry with id: ' + geom.id ); - - } - - i += inputs.length * vcount; - - } - - }; - - - function Polylist () { - }; - - Polylist.prototype = new Triangles(); - Polylist.prototype.constructor = Polylist; - - function Triangles( flip_uv ) { - - this.material = ""; - this.count = 0; - this.inputs = []; - this.vcount = null; - this.p = []; - this.geometry = new THREE.Geometry(); - - }; - - Triangles.prototype.setVertices = function ( vertices ) { - - for ( var i = 0; i < this.inputs.length; i ++ ) { - - if ( this.inputs[ i ].source == vertices.id ) { - - this.inputs[ i ].source = vertices.input[ 'POSITION' ].source; - - } - - } - - }; - - Triangles.prototype.parse = function ( element ) { - - this.inputs = []; - this.material = element.getAttribute( 'material' ); - this.count = _attr_as_int( element, 'count', 0 ); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'input': - - this.inputs.push( ( new Input() ).parse( element.childNodes[ i ] ) ); - break; - - case 'vcount': - - this.vcount = _ints( child.textContent ); - break; - - case 'p': - - this.p = _ints( child.textContent ); - break; - - default: - break; - - } - - } - - return this; - - }; - - function Accessor() { - - this.source = ""; - this.count = 0; - this.stride = 0; - this.params = []; - - }; - - Accessor.prototype.parse = function ( element ) { - - this.params = []; - this.source = element.getAttribute( 'source' ); - this.count = _attr_as_int( element, 'count', 0 ); - this.stride = _attr_as_int( element, 'stride', 0 ); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - if ( child.nodeName == 'param' ) { - - var param = {}; - param[ 'name' ] = child.getAttribute( 'name' ); - param[ 'type' ] = child.getAttribute( 'type' ); - this.params.push( param ); - - } - - } - - return this; - - }; - - function Vertices() { - - this.input = {}; - - }; - - Vertices.prototype.parse = function ( element ) { - - this.id = element.getAttribute('id'); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - if ( element.childNodes[i].nodeName == 'input' ) { - - var input = ( new Input() ).parse( element.childNodes[ i ] ); - this.input[ input.semantic ] = input; - - } - - } - - return this; - - }; - - function Input () { - - this.semantic = ""; - this.offset = 0; - this.source = ""; - this.set = 0; - - }; - - Input.prototype.parse = function ( element ) { - - this.semantic = element.getAttribute('semantic'); - this.source = element.getAttribute('source').replace(/^#/, ''); - this.set = _attr_as_int(element, 'set', -1); - this.offset = _attr_as_int(element, 'offset', 0); - - if ( this.semantic == 'TEXCOORD' && this.set < 0 ) { - - this.set = 0; - - } - - return this; - - }; - - function Source ( id ) { - - this.id = id; - this.type = null; - - }; - - Source.prototype.parse = function ( element ) { - - this.id = element.getAttribute( 'id' ); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - - switch ( child.nodeName ) { - - case 'bool_array': - - this.data = _bools( child.textContent ); - this.type = child.nodeName; - break; - - case 'float_array': - - this.data = _floats( child.textContent ); - this.type = child.nodeName; - break; - - case 'int_array': - - this.data = _ints( child.textContent ); - this.type = child.nodeName; - break; - - case 'IDREF_array': - case 'Name_array': - - this.data = _strings( child.textContent ); - this.type = child.nodeName; - break; - - case 'technique_common': - - for ( var j = 0; j < child.childNodes.length; j ++ ) { - - if ( child.childNodes[ j ].nodeName == 'accessor' ) { - - this.accessor = ( new Accessor() ).parse( child.childNodes[ j ] ); - break; - - } - } - break; - - default: - // console.log(child.nodeName); - break; - - } - - } - - return this; - - }; - - Source.prototype.read = function () { - - var result = []; - - //for (var i = 0; i < this.accessor.params.length; i++) { - - var param = this.accessor.params[ 0 ]; - - //console.log(param.name + " " + param.type); - - switch ( param.type ) { - - case 'IDREF': - case 'Name': case 'name': - case 'float': - - return this.data; - - case 'float4x4': - - for ( var j = 0; j < this.data.length; j += 16 ) { - - var s = this.data.slice( j, j + 16 ); - var m = getConvertedMat4( s ); - result.push( m ); - } - - break; - - default: - - console.log( 'ColladaLoader: Source: Read dont know how to read ' + param.type + '.' ); - break; - - } - - //} - - return result; - - }; - - function Material () { - - this.id = ""; - this.name = ""; - this.instance_effect = null; - - }; - - Material.prototype.parse = function ( element ) { - - this.id = element.getAttribute( 'id' ); - this.name = element.getAttribute( 'name' ); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - if ( element.childNodes[ i ].nodeName == 'instance_effect' ) { - - this.instance_effect = ( new InstanceEffect() ).parse( element.childNodes[ i ] ); - break; - - } - - } - - return this; - - }; - - function ColorOrTexture () { - - this.color = new THREE.Color( 0 ); - this.color.setRGB( Math.random(), Math.random(), Math.random() ); - this.color.a = 1.0; - - this.texture = null; - this.texcoord = null; - this.texOpts = null; - - }; - - ColorOrTexture.prototype.isColor = function () { - - return ( this.texture == null ); - - }; - - ColorOrTexture.prototype.isTexture = function () { - - return ( this.texture != null ); - - }; - - ColorOrTexture.prototype.parse = function ( element ) { - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'color': - - var rgba = _floats( child.textContent ); - this.color = new THREE.Color(0); - this.color.setRGB( rgba[0], rgba[1], rgba[2] ); - this.color.a = rgba[3]; - break; - - case 'texture': - - this.texture = child.getAttribute('texture'); - this.texcoord = child.getAttribute('texcoord'); - // Defaults from: - // https://collada.org/mediawiki/index.php/Maya_texture_placement_MAYA_extension - this.texOpts = { - offsetU: 0, - offsetV: 0, - repeatU: 1, - repeatV: 1, - wrapU: 1, - wrapV: 1, - }; - this.parseTexture( child ); - break; - - default: - break; - - } - - } - - return this; - - }; - - ColorOrTexture.prototype.parseTexture = function ( element ) { - - if ( ! element.childNodes ) return this; - - // This should be supported by Maya, 3dsMax, and MotionBuilder - - if ( element.childNodes[1] && element.childNodes[1].nodeName === 'extra' ) { - - element = element.childNodes[1]; - - if ( element.childNodes[1] && element.childNodes[1].nodeName === 'technique' ) { - - element = element.childNodes[1]; - - } - - } - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - switch ( child.nodeName ) { - - case 'offsetU': - case 'offsetV': - case 'repeatU': - case 'repeatV': - - this.texOpts[ child.nodeName ] = parseFloat( child.textContent ); - break; - - case 'wrapU': - case 'wrapV': - - this.texOpts[ child.nodeName ] = parseInt( child.textContent ); - break; - - default: - this.texOpts[ child.nodeName ] = child.textContent; - break; - - } - - } - - return this; - - }; - - function Shader ( type, effect ) { - - this.type = type; - this.effect = effect; - this.material = null; - - }; - - Shader.prototype.parse = function ( element ) { - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'ambient': - case 'emission': - case 'diffuse': - case 'specular': - case 'transparent': - - this[ child.nodeName ] = ( new ColorOrTexture() ).parse( child ); - break; - - case 'shininess': - case 'reflectivity': - case 'transparency': - - var f = evaluateXPath( child, './/dae:float' ); - - if ( f.length > 0 ) - this[ child.nodeName ] = parseFloat( f[ 0 ].textContent ); - - break; - - default: - break; - - } - - } - - this.create(); - return this; - - }; - - Shader.prototype.create = function() { - - var props = {}; - var transparent = ( this['transparency'] !== undefined && this['transparency'] < 1.0 ); - - for ( var prop in this ) { - - switch ( prop ) { - - case 'ambient': - case 'emission': - case 'diffuse': - case 'specular': - - var cot = this[prop]; - - if ( cot instanceof ColorOrTexture ) { - - if ( cot.isTexture() ) { - - if ( this.effect.sampler && this.effect.surface ) { - - if ( this.effect.sampler.source == this.effect.surface.sid ) { - - var image = images[this.effect.surface.init_from]; - - if ( image ) { - - var texture = THREE.ImageUtils.loadTexture(baseUrl + image.init_from); - texture.wrapS = cot.texOpts.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; - texture.wrapT = cot.texOpts.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping; - texture.offset.x = cot.texOpts.offsetU; - texture.offset.y = cot.texOpts.offsetV; - texture.repeat.x = cot.texOpts.repeatU; - texture.repeat.y = cot.texOpts.repeatV; - props['map'] = texture; - - } - - } - - } - - } else { - - if ( prop == 'diffuse' ) { - - props[ 'color' ] = cot.color.getHex(); - - } else if ( !transparent ) { - - props[ prop ] = cot.color.getHex(); - - } - - } - - } - - break; - - case 'shininess': - case 'reflectivity': - - props[ prop ] = this[ prop ]; - break; - - case 'transparency': - - if ( transparent ) { - - props[ 'transparent' ] = true; - props[ 'opacity' ] = this[ prop ]; - transparent = true; - - } - - break; - - default: - break; - - } - - } - - props[ 'shading' ] = preferredShading; - this.material = new THREE.MeshLambertMaterial( props ); - - switch ( this.type ) { - - case 'constant': - case 'lambert': - break; - - case 'phong': - case 'blinn': - - default: - - /* - if ( !transparent ) { - - // this.material = new THREE.MeshPhongMaterial(props); - - } - */ - - break; - - } - - return this.material; - - }; - - function Surface ( effect ) { - - this.effect = effect; - this.init_from = null; - this.format = null; - - }; - - Surface.prototype.parse = function ( element ) { - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'init_from': - - this.init_from = child.textContent; - break; - - case 'format': - - this.format = child.textContent; - break; - - default: - - console.log( "unhandled Surface prop: " + child.nodeName ); - break; - - } - - } - - return this; - - }; - - function Sampler2D ( effect ) { - - this.effect = effect; - this.source = null; - this.wrap_s = null; - this.wrap_t = null; - this.minfilter = null; - this.magfilter = null; - this.mipfilter = null; - - }; - - Sampler2D.prototype.parse = function ( element ) { - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'source': - - this.source = child.textContent; - break; - - case 'minfilter': - - this.minfilter = child.textContent; - break; - - case 'magfilter': - - this.magfilter = child.textContent; - break; - - case 'mipfilter': - - this.mipfilter = child.textContent; - break; - - case 'wrap_s': - - this.wrap_s = child.textContent; - break; - - case 'wrap_t': - - this.wrap_t = child.textContent; - break; - - default: - - console.log( "unhandled Sampler2D prop: " + child.nodeName ); - break; - - } - - } - - return this; - - }; - - function Effect () { - - this.id = ""; - this.name = ""; - this.shader = null; - this.surface = null; - this.sampler = null; - - }; - - Effect.prototype.create = function () { - - if ( this.shader == null ) { - - return null; - - } - - }; - - Effect.prototype.parse = function ( element ) { - - this.id = element.getAttribute( 'id' ); - this.name = element.getAttribute( 'name' ); - this.shader = null; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'profile_COMMON': - - this.parseTechnique( this.parseProfileCOMMON( child ) ); - break; - - default: - break; - - } - - } - - return this; - - }; - - Effect.prototype.parseNewparam = function ( element ) { - - var sid = element.getAttribute( 'sid' ); - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'surface': - - this.surface = ( new Surface( this ) ).parse( child ); - this.surface.sid = sid; - break; - - case 'sampler2D': - - this.sampler = ( new Sampler2D( this ) ).parse( child ); - this.sampler.sid = sid; - break; - - case 'extra': - - break; - - default: - - console.log( child.nodeName ); - break; - - } - - } - - }; - - Effect.prototype.parseProfileCOMMON = function ( element ) { - - var technique; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'profile_COMMON': - - this.parseProfileCOMMON( child ); - break; - - case 'technique': - - technique = child; - break; - - case 'newparam': - - this.parseNewparam( child ); - break; - - case 'extra': - break; - - default: - - console.log( child.nodeName ); - break; - - } - - } - - return technique; - - }; - - Effect.prototype.parseTechnique= function ( element ) { - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[i]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'constant': - case 'lambert': - case 'blinn': - case 'phong': - - this.shader = ( new Shader( child.nodeName, this ) ).parse( child ); - break; - - default: - break; - - } - - } - - }; - - function InstanceEffect () { - - this.url = ""; - - }; - - InstanceEffect.prototype.parse = function ( element ) { - - this.url = element.getAttribute( 'url' ).replace( /^#/, '' ); - return this; - - }; - - function Animation() { - - this.id = ""; - this.name = ""; - this.source = {}; - this.sampler = []; - this.channel = []; - - }; - - Animation.prototype.parse = function ( element ) { - - this.id = element.getAttribute( 'id' ); - this.name = element.getAttribute( 'name' ); - this.source = {}; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'source': - - var src = ( new Source() ).parse( child ); - this.source[ src.id ] = src; - break; - - case 'sampler': - - this.sampler.push( ( new Sampler( this ) ).parse( child ) ); - break; - - case 'channel': - - this.channel.push( ( new Channel( this ) ).parse( child ) ); - break; - - default: - break; - - } - - } - - return this; - - }; - - function Channel( animation ) { - - this.animation = animation; - this.source = ""; - this.target = ""; - this.fullSid = null; - this.sid = null; - this.dotSyntax = null; - this.arrSyntax = null; - this.arrIndices = null; - this.member = null; - - }; - - Channel.prototype.parse = function ( element ) { - - this.source = element.getAttribute( 'source' ).replace( /^#/, '' ); - this.target = element.getAttribute( 'target' ); - - var parts = this.target.split( '/' ); - - var id = parts.shift(); - var sid = parts.shift(); - - var dotSyntax = ( sid.indexOf(".") >= 0 ); - var arrSyntax = ( sid.indexOf("(") >= 0 ); - - if ( dotSyntax ) { - - parts = sid.split("."); - this.sid = parts.shift(); - this.member = parts.shift(); - - } else if ( arrSyntax ) { - - var arrIndices = sid.split("("); - this.sid = arrIndices.shift(); - - for (var j = 0; j < arrIndices.length; j ++ ) { - - arrIndices[j] = parseInt( arrIndices[j].replace(/\)/, '') ); - - } - - this.arrIndices = arrIndices; - - } else { - - this.sid = sid; - - } - - this.fullSid = sid; - this.dotSyntax = dotSyntax; - this.arrSyntax = arrSyntax; - - return this; - - }; - - function Sampler ( animation ) { - - this.id = ""; - this.animation = animation; - this.inputs = []; - this.input = null; - this.output = null; - this.strideOut = null; - this.interpolation = null; - this.startTime = null; - this.endTime = null; - this.duration = 0; - - }; - - Sampler.prototype.parse = function ( element ) { - - this.id = element.getAttribute( 'id' ); - this.inputs = []; - - for ( var i = 0; i < element.childNodes.length; i ++ ) { - - var child = element.childNodes[ i ]; - if ( child.nodeType != 1 ) continue; - - switch ( child.nodeName ) { - - case 'input': - - this.inputs.push( (new Input()).parse( child ) ); - break; - - default: - break; - - } - - } - - return this; - - }; - - Sampler.prototype.create = function () { - - for ( var i = 0; i < this.inputs.length; i ++ ) { - - var input = this.inputs[ i ]; - var source = this.animation.source[ input.source ]; - - switch ( input.semantic ) { - - case 'INPUT': - - this.input = source.read(); - break; - - case 'OUTPUT': - - this.output = source.read(); - this.strideOut = source.accessor.stride; - break; - - case 'INTERPOLATION': - - this.interpolation = source.read(); - break; - - case 'IN_TANGENT': - - break; - - case 'OUT_TANGENT': - - break; - - default: - - console.log(input.semantic); - break; - - } - - } - - this.startTime = 0; - this.endTime = 0; - this.duration = 0; - - if ( this.input.length ) { - - this.startTime = 100000000; - this.endTime = -100000000; - - for ( var i = 0; i < this.input.length; i ++ ) { - - this.startTime = Math.min( this.startTime, this.input[ i ] ); - this.endTime = Math.max( this.endTime, this.input[ i ] ); - - } - - this.duration = this.endTime - this.startTime; - - } - - }; - - Sampler.prototype.getData = function ( type, ndx ) { - - var data; - - if ( this.strideOut > 1 ) { - - data = []; - ndx *= this.strideOut; - - for ( var i = 0; i < this.strideOut; ++i ) { - - data[ i ] = this.output[ ndx + i ]; - - } - - if ( this.strideOut === 3 ) { - - switch ( type ) { - - case 'rotate': - case 'translate': - - fixCoords( data, -1 ); - break; - - case 'scale': - - fixCoords( data, 1 ); - break; - - } - - } - - } else { - - data = this.output[ ndx ]; - - } - - return data; - - }; - - function Key ( time ) { - - this.targets = []; - this.time = time; - - }; - - Key.prototype.addTarget = function ( fullSid, transform, member, data ) { - - this.targets.push( { - sid: fullSid, - member: member, - transform: transform, - data: data - } ); - - }; - - Key.prototype.apply = function ( opt_sid ) { - - for ( var i = 0; i < this.targets.length; ++i ) { - - var target = this.targets[ i ]; - - if ( !opt_sid || target.sid === opt_sid ) { - - target.transform.update( target.data, target.member ); - - } - - } - - }; - - Key.prototype.getTarget = function ( fullSid ) { - - for ( var i = 0; i < this.targets.length; ++i ) { - - if ( this.targets[ i ].sid === fullSid ) { - - return this.targets[ i ]; - - } - - } - - return null; - - }; - - Key.prototype.hasTarget = function ( fullSid ) { - - for ( var i = 0; i < this.targets.length; ++i ) { - - if ( this.targets[ i ].sid === fullSid ) { - - return true; - - } - - } - - return false; - - }; - - // TODO: Currently only doing linear interpolation. Should support full COLLADA spec. - Key.prototype.interpolate = function ( nextKey, time ) { - - for ( var i = 0; i < this.targets.length; ++i ) { - - var target = this.targets[ i ], - nextTarget = nextKey.getTarget( target.sid ), - data; - - if ( nextTarget ) { - - var scale = ( time - this.time ) / ( nextKey.time - this.time ), - nextData = nextTarget.data, - prevData = target.data; - - // check scale error - - if ( scale < 0 || scale > 1 ) { - - console.log( "Key.interpolate: Warning! Scale out of bounds:" + scale ); - scale = scale < 0 ? 0 : 1; - - } - - if ( prevData.length ) { - - data = []; - - for ( var j = 0; j < prevData.length; ++j ) { - - data[ j ] = prevData[ j ] + ( nextData[ j ] - prevData[ j ] ) * scale; - - } - - } else { - - data = prevData + ( nextData - prevData ) * scale; - - } - - } else { - - data = target.data; - - } - - target.transform.update( data, target.member ); - - } - - }; - - function _source ( element ) { - - var id = element.getAttribute( 'id' ); - - if ( sources[ id ] != undefined ) { - - return sources[ id ]; - - } - - sources[ id ] = ( new Source(id )).parse( element ); - return sources[ id ]; - - }; - - function _nsResolver ( nsPrefix ) { - - if ( nsPrefix == "dae" ) { - - return "http://www.collada.org/2005/11/COLLADASchema"; - - } - - return null; - - }; - - function _bools ( str ) { - - var raw = _strings( str ); - var data = []; - - for ( var i = 0; i < raw.length; i ++ ) { - - data.push( (raw[i] == 'true' || raw[i] == '1') ? true : false ); - - } - - return data; - - }; - - function _floats ( str ) { - - var raw = _strings(str); - var data = []; - - for ( var i = 0; i < raw.length; i ++ ) { - - data.push( parseFloat( raw[ i ] ) ); - - } - - return data; - - }; - - function _ints ( str ) { - - var raw = _strings( str ); - var data = []; - - for ( var i = 0; i < raw.length; i ++ ) { - - data.push( parseInt( raw[ i ], 10 ) ); - - } - - return data; - - }; - - function _strings ( str ) { - - return _trimString( str ).split( /\s+/ ); - - }; - - function _trimString ( str ) { - - return str.replace( /^\s+/, "" ).replace( /\s+$/, "" ); - - }; - - function _attr_as_float ( element, name, defaultValue ) { - - if ( element.hasAttribute( name ) ) { - - return parseFloat( element.getAttribute( name ) ); - - } else { - - return defaultValue; - - } - - }; - - function _attr_as_int ( element, name, defaultValue ) { - - if ( element.hasAttribute( name ) ) { - - return parseInt( element.getAttribute( name ), 10) ; - - } else { - - return defaultValue; - - } - - }; - - function _attr_as_string ( element, name, defaultValue ) { - - if ( element.hasAttribute( name ) ) { - - return element.getAttribute( name ); - - } else { - - return defaultValue; - - } - - }; - - function _format_float ( f, num ) { - - if ( f === undefined ) { - - var s = '0.'; - - while ( s.length < num + 2 ) { - - s += '0'; - - } - - return s; - - } - - num = num || 2; - - var parts = f.toString().split( '.' ); - parts[ 1 ] = parts.length > 1 ? parts[ 1 ].substr( 0, num ) : "0"; - - while( parts[ 1 ].length < num ) { - - parts[ 1 ] += '0'; - - } - - return parts.join( '.' ); - - }; - - function evaluateXPath ( node, query ) { - - var instances = COLLADA.evaluate( query, node, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ); - - var inst = instances.iterateNext(); - var result = []; - - while ( inst ) { - - result.push( inst ); - inst = instances.iterateNext(); - - } - - return result; - - }; - - // Up axis conversion - - function setUpConversion () { - - if ( !options.convertUpAxis || colladaUp === options.upAxis ) { - - upConversion = null; - - } else { - - switch ( colladaUp ) { - - case 'X': - - upConversion = options.upAxis === 'Y' ? 'XtoY' : 'XtoZ'; - break; - - case 'Y': - - upConversion = options.upAxis === 'X' ? 'YtoX' : 'YtoZ'; - break; - - case 'Z': - - upConversion = options.upAxis === 'X' ? 'ZtoX' : 'ZtoY'; - break; - - } - - } - - }; - - function fixCoords ( data, sign ) { - - if ( !options.convertUpAxis || colladaUp === options.upAxis ) { - - return; - - } - - switch ( upConversion ) { - - case 'XtoY': - - var tmp = data[ 0 ]; - data[ 0 ] = sign * data[ 1 ]; - data[ 1 ] = tmp; - break; - - case 'XtoZ': - - var tmp = data[ 2 ]; - data[ 2 ] = data[ 1 ]; - data[ 1 ] = data[ 0 ]; - data[ 0 ] = tmp; - break; - - case 'YtoX': - - var tmp = data[ 0 ]; - data[ 0 ] = data[ 1 ]; - data[ 1 ] = sign * tmp; - break; - - case 'YtoZ': - - var tmp = data[ 1 ]; - data[ 1 ] = sign * data[ 2 ]; - data[ 2 ] = tmp; - break; - - case 'ZtoX': - - var tmp = data[ 0 ]; - data[ 0 ] = data[ 1 ]; - data[ 1 ] = data[ 2 ]; - data[ 2 ] = tmp; - break; - - case 'ZtoY': - - var tmp = data[ 1 ]; - data[ 1 ] = data[ 2 ]; - data[ 2 ] = sign * tmp; - break; - - } - - }; - - function getConvertedVec3 ( data, offset ) { - - var arr = [ data[ offset ], data[ offset + 1 ], data[ offset + 2 ] ]; - fixCoords( arr, -1 ); - return new THREE.Vector3( arr[ 0 ], arr[ 1 ], arr[ 2 ] ); - - }; - - function getConvertedMat4 ( data ) { - - if ( options.convertUpAxis ) { - - // First fix rotation and scale - - // Columns first - var arr = [ data[ 0 ], data[ 4 ], data[ 8 ] ]; - fixCoords( arr, -1 ); - data[ 0 ] = arr[ 0 ]; - data[ 4 ] = arr[ 1 ]; - data[ 8 ] = arr[ 2 ]; - arr = [ data[ 1 ], data[ 5 ], data[ 9 ] ]; - fixCoords( arr, -1 ); - data[ 1 ] = arr[ 0 ]; - data[ 5 ] = arr[ 1 ]; - data[ 9 ] = arr[ 2 ]; - arr = [ data[ 2 ], data[ 6 ], data[ 10 ] ]; - fixCoords( arr, -1 ); - data[ 2 ] = arr[ 0 ]; - data[ 6 ] = arr[ 1 ]; - data[ 10 ] = arr[ 2 ]; - // Rows second - arr = [ data[ 0 ], data[ 1 ], data[ 2 ] ]; - fixCoords( arr, -1 ); - data[ 0 ] = arr[ 0 ]; - data[ 1 ] = arr[ 1 ]; - data[ 2 ] = arr[ 2 ]; - arr = [ data[ 4 ], data[ 5 ], data[ 6 ] ]; - fixCoords( arr, -1 ); - data[ 4 ] = arr[ 0 ]; - data[ 5 ] = arr[ 1 ]; - data[ 6 ] = arr[ 2 ]; - arr = [ data[ 8 ], data[ 9 ], data[ 10 ] ]; - fixCoords( arr, -1 ); - data[ 8 ] = arr[ 0 ]; - data[ 9 ] = arr[ 1 ]; - data[ 10 ] = arr[ 2 ]; - - // Now fix translation - arr = [ data[ 3 ], data[ 7 ], data[ 11 ] ]; - fixCoords( arr, -1 ); - data[ 3 ] = arr[ 0 ]; - data[ 7 ] = arr[ 1 ]; - data[ 11 ] = arr[ 2 ]; - - } - - return new THREE.Matrix4( - data[0], data[1], data[2], data[3], - data[4], data[5], data[6], data[7], - data[8], data[9], data[10], data[11], - data[12], data[13], data[14], data[15] - ); - - }; - - function getConvertedMember ( member ) { - - if ( options.convertUpAxis ) { - - switch ( member ) { - - case 'X': - - switch ( upConversion ) { - - case 'XtoY': - case 'XtoZ': - case 'YtoX': - - member = 'Y'; - break; - - case 'ZtoX': - - member = 'Z'; - break; - - } - - break; - - case 'Y': - - switch ( upConversion ) { - - case 'XtoY': - case 'YtoX': - case 'ZtoX': - - member = 'X'; - break; - - case 'XtoZ': - case 'YtoZ': - case 'ZtoY': - - member = 'Z'; - break; - - } - - break; - - case 'Z': - - switch ( upConversion ) { - - case 'XtoZ': - - member = 'X'; - break; - - case 'YtoZ': - case 'ZtoX': - case 'ZtoY': - - member = 'Y'; - break; - - } - - break; - - } - - } - - return member; - - }; - - return { - - load: load, - parse: parse, - setPreferredShading: setPreferredShading, - applySkin: applySkin, - geometries : geometries, - options: options - - }; - -}; -/** - * @author mrdoob / http://mrdoob.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.JSONLoader = function ( showStatus ) { - - THREE.Loader.call( this, showStatus ); - -}; - -THREE.JSONLoader.prototype = new THREE.Loader(); -THREE.JSONLoader.prototype.constructor = THREE.JSONLoader; -THREE.JSONLoader.prototype.supr = THREE.Loader.prototype; - -THREE.JSONLoader.prototype.load = function ( url, callback, texturePath ) { - - var worker, scope = this; - - if ( url instanceof Object ) { - - console.warn( 'DEPRECATED: JSONLoader( parameters ) is now JSONLoader( url, callback, texturePath ).' ); - - var parameters = url; - - url = parameters.model; - callback = parameters.callback; - texturePath = parameters.texture_path; - - } - - texturePath = texturePath ? texturePath : this.extractUrlbase( url ); - - this.onLoadStart(); - this.loadAjaxJSON( this, url, callback, texturePath ); - -}; - -THREE.JSONLoader.prototype.loadAjaxJSON = function( context, url, callback, texturePath, callbackProgress ) { - - var xhr = new XMLHttpRequest(); - - var length = 0; - - xhr.onreadystatechange = function() { - - if ( xhr.readyState == 4 ) { - - if ( xhr.status == 200 || xhr.status == 0 ) { - - try { - - var jsonObject = JSON.parse( xhr.responseText ); - - } catch ( error ) { - - console.warn( "DEPRECATED: [" + url + "] seems to be using old model format" ); - - } - - context.createModel( jsonObject, callback, texturePath ); - context.onLoadComplete(); - - } else { - - console.error( "Couldn't load [" + url + "] [" + xhr.status + "]" ); - - } - - } else if ( xhr.readyState == 3 ) { - - if ( callbackProgress ) { - - if ( length == 0 ) { - - length = xhr.getResponseHeader( "Content-Length" ); - - } - - callbackProgress( { total: length, loaded: xhr.responseText.length } ); - - } - - } else if ( xhr.readyState == 2 ) { - - length = xhr.getResponseHeader( "Content-Length" ); - - } - - }; - - xhr.open( "GET", url, true ); - if ( xhr.overrideMimeType ) xhr.overrideMimeType( "text/plain; charset=x-user-defined" ); - xhr.setRequestHeader( "Content-Type", "text/plain" ); - xhr.send( null ); - -}; - -THREE.JSONLoader.prototype.createModel = function ( json, callback, texture_path ) { - - var scope = this, - geometry = new THREE.Geometry(), - scale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0; - - this.initMaterials( geometry, json.materials, texture_path ); - - parseModel( scale ); - - parseSkin(); - parseMorphing( scale ); - - geometry.computeCentroids(); - geometry.computeFaceNormals(); - - if ( this.hasNormals( geometry ) ) geometry.computeTangents(); - - - function parseModel( scale ) { - - if ( json.metadata === undefined || json.metadata.formatVersion === undefined || json.metadata.formatVersion !== 3 ) { - - console.error( 'Deprecated file format.' ); - return; - - } - - function isBitSet( value, position ) { - - return value & ( 1 << position ); - - }; - - var i, j, fi, - - offset, zLength, nVertices, - - colorIndex, normalIndex, uvIndex, materialIndex, - - type, - isQuad, - hasMaterial, - hasFaceUv, hasFaceVertexUv, - hasFaceNormal, hasFaceVertexNormal, - hasFaceColor, hasFaceVertexColor, - - vertex, face, color, normal, - - uvLayer, uvs, u, v, - - faces = json.faces, - vertices = json.vertices, - normals = json.normals, - colors = json.colors, - - nUvLayers = 0; - - // disregard empty arrays - - for ( i = 0; i < json.uvs.length; i++ ) { - - if ( json.uvs[ i ].length ) nUvLayers ++; - - } - - for ( i = 0; i < nUvLayers; i++ ) { - - geometry.faceUvs[ i ] = []; - geometry.faceVertexUvs[ i ] = []; - - } - - offset = 0; - zLength = vertices.length; - - while ( offset < zLength ) { - - vertex = new THREE.Vertex(); - - vertex.position.x = vertices[ offset ++ ] * scale; - vertex.position.y = vertices[ offset ++ ] * scale; - vertex.position.z = vertices[ offset ++ ] * scale; - - geometry.vertices.push( vertex ); - - } - - offset = 0; - zLength = faces.length; - - while ( offset < zLength ) { - - type = faces[ offset ++ ]; - - - isQuad = isBitSet( type, 0 ); - hasMaterial = isBitSet( type, 1 ); - hasFaceUv = isBitSet( type, 2 ); - hasFaceVertexUv = isBitSet( type, 3 ); - hasFaceNormal = isBitSet( type, 4 ); - hasFaceVertexNormal = isBitSet( type, 5 ); - hasFaceColor = isBitSet( type, 6 ); - hasFaceVertexColor = isBitSet( type, 7 ); - - //console.log("type", type, "bits", isQuad, hasMaterial, hasFaceUv, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor); - - if ( isQuad ) { - - face = new THREE.Face4(); - - face.a = faces[ offset ++ ]; - face.b = faces[ offset ++ ]; - face.c = faces[ offset ++ ]; - face.d = faces[ offset ++ ]; - - nVertices = 4; - - } else { - - face = new THREE.Face3(); - - face.a = faces[ offset ++ ]; - face.b = faces[ offset ++ ]; - face.c = faces[ offset ++ ]; - - nVertices = 3; - - } - - if ( hasMaterial ) { - - materialIndex = faces[ offset ++ ]; - face.materialIndex = materialIndex; - - } - - // to get face <=> uv index correspondence - - fi = geometry.faces.length; - - if ( hasFaceUv ) { - - for ( i = 0; i < nUvLayers; i++ ) { - - uvLayer = json.uvs[ i ]; - - uvIndex = faces[ offset ++ ]; - - u = uvLayer[ uvIndex * 2 ]; - v = uvLayer[ uvIndex * 2 + 1 ]; - - geometry.faceUvs[ i ][ fi ] = new THREE.UV( u, v ); - - } - - } - - if ( hasFaceVertexUv ) { - - for ( i = 0; i < nUvLayers; i++ ) { - - uvLayer = json.uvs[ i ]; - - uvs = []; - - for ( j = 0; j < nVertices; j ++ ) { - - uvIndex = faces[ offset ++ ]; - - u = uvLayer[ uvIndex * 2 ]; - v = uvLayer[ uvIndex * 2 + 1 ]; - - uvs[ j ] = new THREE.UV( u, v ); - - } - - geometry.faceVertexUvs[ i ][ fi ] = uvs; - - } - - } - - if ( hasFaceNormal ) { - - normalIndex = faces[ offset ++ ] * 3; - - normal = new THREE.Vector3(); - - normal.x = normals[ normalIndex ++ ]; - normal.y = normals[ normalIndex ++ ]; - normal.z = normals[ normalIndex ]; - - face.normal = normal; - - } - - if ( hasFaceVertexNormal ) { - - for ( i = 0; i < nVertices; i++ ) { - - normalIndex = faces[ offset ++ ] * 3; - - normal = new THREE.Vector3(); - - normal.x = normals[ normalIndex ++ ]; - normal.y = normals[ normalIndex ++ ]; - normal.z = normals[ normalIndex ]; - - face.vertexNormals.push( normal ); - - } - - } - - - if ( hasFaceColor ) { - - colorIndex = faces[ offset ++ ]; - - color = new THREE.Color( colors[ colorIndex ] ); - face.color = color; - - } - - - if ( hasFaceVertexColor ) { - - for ( i = 0; i < nVertices; i++ ) { - - colorIndex = faces[ offset ++ ]; - - color = new THREE.Color( colors[ colorIndex ] ); - face.vertexColors.push( color ); - - } - - } - - geometry.faces.push( face ); - - } - - }; - - function parseSkin() { - - var i, l, x, y, z, w, a, b, c, d; - - if ( json.skinWeights ) { - - for ( i = 0, l = json.skinWeights.length; i < l; i += 2 ) { - - x = json.skinWeights[ i ]; - y = json.skinWeights[ i + 1 ]; - z = 0; - w = 0; - - geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) ); - - } - - } - - if ( json.skinIndices ) { - - for ( i = 0, l = json.skinIndices.length; i < l; i += 2 ) { - - a = json.skinIndices[ i ]; - b = json.skinIndices[ i + 1 ]; - c = 0; - d = 0; - - geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) ); - - } - - } - - geometry.bones = json.bones; - geometry.animation = json.animation; - - }; - - function parseMorphing( scale ) { - - if ( json.morphTargets !== undefined ) { - - var i, l, v, vl, x, y, z, dstVertices, srcVertices; - - for ( i = 0, l = json.morphTargets.length; i < l; i++ ) { - - geometry.morphTargets[ i ] = {}; - geometry.morphTargets[ i ].name = json.morphTargets[ i ].name; - geometry.morphTargets[ i ].vertices = []; - - dstVertices = geometry.morphTargets[ i ].vertices; - srcVertices = json.morphTargets [ i ].vertices; - - - for( v = 0, vl = srcVertices.length; v < vl; v += 3 ) { - - x = srcVertices[ v ] * scale; - y = srcVertices[ v + 1 ] * scale; - z = srcVertices[ v + 2 ] * scale; - - dstVertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ); - - } - - } - - } - - if ( json.morphColors !== undefined ) { - - var i, l, c, cl, dstColors, srcColors, color; - - for ( i = 0, l = json.morphColors.length; i < l; i++ ) { - - geometry.morphColors[ i ] = {}; - geometry.morphColors[ i ].name = json.morphColors[ i ].name; - geometry.morphColors[ i ].colors = []; - - dstColors = geometry.morphColors[ i ].colors; - srcColors = json.morphColors [ i ].colors; - - for ( c = 0, cl = srcColors.length; c < cl; c += 3 ) { - - color = new THREE.Color( 0xffaa00 ); - color.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] ); - dstColors.push( color ); - - } - - } - - } - - }; - - callback( geometry ); - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SceneLoader = function () { - - this.onLoadStart = function () {}; - this.onLoadProgress = function() {}; - this.onLoadComplete = function () {}; - - this.callbackSync = function () {}; - this.callbackProgress = function () {}; - -}; - -THREE.SceneLoader.prototype.constructor = THREE.SceneLoader; - -THREE.SceneLoader.prototype.load = function( url, callbackFinished ) { - - var context = this; - - var xhr = new XMLHttpRequest(); - - xhr.onreadystatechange = function() { - - if ( xhr.readyState == 4 ) { - - if ( xhr.status == 200 || xhr.status == 0 ) { - - try { - - var json = JSON.parse( xhr.responseText ); - - if ( json.metadata === undefined || json.metadata.formatVersion === undefined || json.metadata.formatVersion !== 3 ) { - - console.error( 'Deprecated file format.' ); - return; - - } - - context.createScene( json, callbackFinished, url ); - - } catch ( error ) { - - console.error( error ); - console.warn( "DEPRECATED: [" + url + "] seems to be using old model format" ); - - } - - } else { - - console.error( "Couldn't load [" + url + "] [" + xhr.status + "]" ); - - } - - } - - }; - - xhr.open( "GET", url, true ); - if ( xhr.overrideMimeType ) xhr.overrideMimeType( "text/plain; charset=x-user-defined" ); - xhr.setRequestHeader( "Content-Type", "text/plain" ); - xhr.send( null ); - -}; - -THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url ) { - - var scope = this; - - var urlBase = THREE.Loader.prototype.extractUrlbase( url ); - - var dg, dm, dd, dl, dc, df, dt, - g, o, m, l, d, p, r, q, s, c, t, f, tt, pp, u, - geometry, material, camera, fog, - texture, images, - materials, light, - data, binLoader, jsonLoader, - counter_models, counter_textures, - total_models, total_textures, - result; - - data = json; - - binLoader = new THREE.BinaryLoader(); - jsonLoader = new THREE.JSONLoader(); - - counter_models = 0; - counter_textures = 0; - - result = { - - scene: new THREE.Scene(), - geometries: {}, - materials: {}, - textures: {}, - objects: {}, - cameras: {}, - lights: {}, - fogs: {}, - triggers: {}, - empties: {} - - }; - - // find out if there are some colliders - - var hasColliders = false; - - for( dd in data.objects ) { - - o = data.objects[ dd ]; - - if ( o.meshCollider ) { - - hasColliders = true; - break; - - } - - } - - if ( hasColliders ) { - - result.scene.collisions = new THREE.CollisionSystem(); - - } - - if ( data.transform ) { - - var position = data.transform.position, - rotation = data.transform.rotation, - scale = data.transform.scale; - - if ( position ) - result.scene.position.set( position[ 0 ], position[ 1 ], position [ 2 ] ); - - if ( rotation ) - result.scene.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation [ 2 ] ); - - if ( scale ) - result.scene.scale.set( scale[ 0 ], scale[ 1 ], scale [ 2 ] ); - - if ( position || rotation || scale ) - result.scene.updateMatrix(); - - } - - function get_url( source_url, url_type ) { - - if ( url_type == "relativeToHTML" ) { - - return source_url; - - } else { - - return urlBase + "/" + source_url; - - } - - }; - - function handle_objects() { - - var object; - - for( dd in data.objects ) { - - if ( !result.objects[ dd ] ) { - - o = data.objects[ dd ]; - - if ( o.geometry !== undefined ) { - - geometry = result.geometries[ o.geometry ]; - - // geometry already loaded - - if ( geometry ) { - - var hasNormals = false; - - // not anymore support for multiple materials - // shouldn't really be array - - for( i = 0; i < o.materials.length; i ++ ) { - - materials = result.materials[ o.materials[ i ] ]; - - hasNormals = materials instanceof THREE.ShaderMaterial; - - } - - if ( hasNormals ) { - - geometry.computeTangents(); - - } - - p = o.position; - r = o.rotation; - q = o.quaternion; - s = o.scale; - - // turn off quaternions, for the moment - - q = 0; - - if ( materials.length == 0 ) { - - materials = new THREE.MeshFaceMaterial(); - - } - - // dirty hack to handle meshes with multiple materials - // just use face materials defined in model - - if ( materials.length > 1 ) { - - materials = new THREE.MeshFaceMaterial(); - - } - - object = new THREE.Mesh( geometry, materials ); - object.name = dd; - object.position.set( p[0], p[1], p[2] ); - - if ( q ) { - - object.quaternion.set( q[0], q[1], q[2], q[3] ); - object.useQuaternion = true; - - } else { - - object.rotation.set( r[0], r[1], r[2] ); - - } - - object.scale.set( s[0], s[1], s[2] ); - object.visible = o.visible; - - result.scene.add( object ); - - result.objects[ dd ] = object; - - if ( o.meshCollider ) { - - var meshCollider = THREE.CollisionUtils.MeshColliderWBox( object ); - result.scene.collisions.colliders.push( meshCollider ); - - } - - if ( o.castsShadow ) { - - //object.visible = true; - //object.materials = [ new THREE.MeshBasicMaterial( { color: 0xff0000 } ) ]; - - var shadow = new THREE.ShadowVolume( geometry ) - result.scene.add( shadow ); - - shadow.position = object.position; - shadow.rotation = object.rotation; - shadow.scale = object.scale; - - } - - if ( o.trigger && o.trigger.toLowerCase() != "none" ) { - - var trigger = { - "type" : o.trigger, - "object" : o - }; - - result.triggers[ object.name ] = trigger; - - } - - } - - // pure Object3D - - } else { - - p = o.position; - r = o.rotation; - q = o.quaternion; - s = o.scale; - - // turn off quaternions, for the moment - - q = 0; - - object = new THREE.Object3D(); - object.name = dd; - object.position.set( p[0], p[1], p[2] ); - - if ( q ) { - - object.quaternion.set( q[0], q[1], q[2], q[3] ); - object.useQuaternion = true; - - } else { - - object.rotation.set( r[0], r[1], r[2] ); - - } - - object.scale.set( s[0], s[1], s[2] ); - object.visible = ( o.visible !== undefined ) ? o.visible : false; - - result.scene.add( object ); - - result.objects[ dd ] = object; - result.empties[ dd ] = object; - - if ( o.trigger && o.trigger.toLowerCase() != "none" ) { - - var trigger = { - "type" : o.trigger, - "object" : o - }; - - result.triggers[ object.name ] = trigger; - - } - - } - - } - - } - - }; - - function handle_mesh( geo, id ) { - - result.geometries[ id ] = geo; - handle_objects(); - - }; - - function create_callback( id ) { - - return function( geo ) { - - handle_mesh( geo, id ); - - counter_models -= 1; - - scope.onLoadComplete(); - - async_callback_gate(); - - } - - }; - - function create_callback_embed( id ) { - - return function( geo ) { - - result.geometries[ id ] = geo; - - } - - }; - - function async_callback_gate() { - - var progress = { - - totalModels : total_models, - totalTextures : total_textures, - loadedModels : total_models - counter_models, - loadedTextures : total_textures - counter_textures - - }; - - scope.callbackProgress( progress, result ); - - scope.onLoadProgress(); - - if( counter_models == 0 && counter_textures == 0 ) { - - callbackFinished( result ); - - } - - }; - - var callbackTexture = function( images ) { - - counter_textures -= 1; - async_callback_gate(); - - scope.onLoadComplete(); - - }; - - // first go synchronous elements - - // cameras - - for( dc in data.cameras ) { - - c = data.cameras[ dc ]; - - if ( c.type == "perspective" ) { - - camera = new THREE.PerspectiveCamera( c.fov, c.aspect, c.near, c.far ); - - } else if ( c.type == "ortho" ) { - - camera = new THREE.OrthographicCamera( c.left, c.right, c.top, c.bottom, c.near, c.far ); - - } - - p = c.position; - t = c.target; - u = c.up; - - camera.position.set( p[0], p[1], p[2] ); - camera.target = new THREE.Vector3( t[0], t[1], t[2] ); - if ( u ) camera.up.set( u[0], u[1], u[2] ); - - result.cameras[ dc ] = camera; - - } - - // lights - - var hex, intensity; - - for ( dl in data.lights ) { - - l = data.lights[ dl ]; - - hex = ( l.color !== undefined ) ? l.color : 0xffffff; - intensity = ( l.intensity !== undefined ) ? l.intensity : 1; - - if ( l.type == "directional" ) { - - p = l.direction; - - light = new THREE.DirectionalLight( hex, intensity ); - light.position.set( p[0], p[1], p[2] ); - light.position.normalize(); - - } else if ( l.type == "point" ) { - - p = l.position; - d = l.distance; - - light = new THREE.PointLight( hex, intensity, d ); - light.position.set( p[0], p[1], p[2] ); - - } else if ( l.type == "ambient" ) { - - light = new THREE.AmbientLight( hex ); - - } - - result.scene.add( light ); - - result.lights[ dl ] = light; - - } - - // fogs - - for( df in data.fogs ) { - - f = data.fogs[ df ]; - - if ( f.type == "linear" ) { - - fog = new THREE.Fog( 0x000000, f.near, f.far ); - - } else if ( f.type == "exp2" ) { - - fog = new THREE.FogExp2( 0x000000, f.density ); - - } - - c = f.color; - fog.color.setRGB( c[0], c[1], c[2] ); - - result.fogs[ df ] = fog; - - } - - // defaults - - if ( result.cameras && data.defaults.camera ) { - - result.currentCamera = result.cameras[ data.defaults.camera ]; - - } - - if ( result.fogs && data.defaults.fog ) { - - result.scene.fog = result.fogs[ data.defaults.fog ]; - - } - - c = data.defaults.bgcolor; - result.bgColor = new THREE.Color(); - result.bgColor.setRGB( c[0], c[1], c[2] ); - - result.bgColorAlpha = data.defaults.bgalpha; - - // now come potentially asynchronous elements - - // geometries - - // count how many models will be loaded asynchronously - - for( dg in data.geometries ) { - - g = data.geometries[ dg ]; - - if ( g.type == "bin_mesh" || g.type == "ascii_mesh" ) { - - counter_models += 1; - - scope.onLoadStart(); - - } - - } - - total_models = counter_models; - - for ( dg in data.geometries ) { - - g = data.geometries[ dg ]; - - if ( g.type == "cube" ) { - - geometry = new THREE.CubeGeometry( g.width, g.height, g.depth, g.segmentsWidth, g.segmentsHeight, g.segmentsDepth, null, g.flipped, g.sides ); - result.geometries[ dg ] = geometry; - - } else if ( g.type == "plane" ) { - - geometry = new THREE.PlaneGeometry( g.width, g.height, g.segmentsWidth, g.segmentsHeight ); - result.geometries[ dg ] = geometry; - - } else if ( g.type == "sphere" ) { - - geometry = new THREE.SphereGeometry( g.radius, g.segmentsWidth, g.segmentsHeight ); - result.geometries[ dg ] = geometry; - - } else if ( g.type == "cylinder" ) { - - geometry = new THREE.CylinderGeometry( g.topRad, g.botRad, g.height, g.radSegs, g.heightSegs ); - result.geometries[ dg ] = geometry; - - } else if ( g.type == "torus" ) { - - geometry = new THREE.TorusGeometry( g.radius, g.tube, g.segmentsR, g.segmentsT ); - result.geometries[ dg ] = geometry; - - } else if ( g.type == "icosahedron" ) { - - geometry = new THREE.IcosahedronGeometry( g.subdivisions ); - result.geometries[ dg ] = geometry; - - } else if ( g.type == "bin_mesh" ) { - - binLoader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ) ); - - } else if ( g.type == "ascii_mesh" ) { - - jsonLoader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ) ); - - } else if ( g.type == "embedded_mesh" ) { - - var modelJson = data.embeds[ g.id ], - texture_path = ""; - - if ( modelJson ) { - - jsonLoader.createModel( modelJson, create_callback_embed( dg ), texture_path ); - - } - - } - - } - - // textures - - // count how many textures will be loaded asynchronously - - for( dt in data.textures ) { - - tt = data.textures[ dt ]; - - if( tt.url instanceof Array ) { - - counter_textures += tt.url.length; - - for( var n = 0; n < tt.url.length; n ++ ) { - - scope.onLoadStart(); - - } - - } else { - - counter_textures += 1; - - scope.onLoadStart(); - - } - - } - - total_textures = counter_textures; - - for( dt in data.textures ) { - - tt = data.textures[ dt ]; - - if ( tt.mapping != undefined && THREE[ tt.mapping ] != undefined ) { - - tt.mapping = new THREE[ tt.mapping ](); - - } - - if( tt.url instanceof Array ) { - - var url_array = []; - - for( var i = 0; i < tt.url.length; i ++ ) { - - url_array[ i ] = get_url( tt.url[ i ], data.urlBaseType ); - - } - - texture = THREE.ImageUtils.loadTextureCube( url_array, tt.mapping, callbackTexture ); - - } else { - - texture = THREE.ImageUtils.loadTexture( get_url( tt.url, data.urlBaseType ), tt.mapping, callbackTexture ); - - if ( THREE[ tt.minFilter ] != undefined ) - texture.minFilter = THREE[ tt.minFilter ]; - - if ( THREE[ tt.magFilter ] != undefined ) - texture.magFilter = THREE[ tt.magFilter ]; - - - if ( tt.repeat ) { - - texture.repeat.set( tt.repeat[ 0 ], tt.repeat[ 1 ] ); - - if ( tt.repeat[ 0 ] != 1 ) texture.wrapS = THREE.RepeatWrapping; - if ( tt.repeat[ 1 ] != 1 ) texture.wrapT = THREE.RepeatWrapping; - - } - - if ( tt.offset ) { - - texture.offset.set( tt.offset[ 0 ], tt.offset[ 1 ] ); - - } - - // handle wrap after repeat so that default repeat can be overriden - - if ( tt.wrap ) { - - var wrapMap = { - "repeat" : THREE.RepeatWrapping, - "mirror" : THREE.MirroredRepeatWrapping - } - - if ( wrapMap[ tt.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ tt.wrap[ 0 ] ]; - if ( wrapMap[ tt.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ tt.wrap[ 1 ] ]; - - } - - } - - result.textures[ dt ] = texture; - - } - - // materials - - for ( dm in data.materials ) { - - m = data.materials[ dm ]; - - for ( pp in m.parameters ) { - - if ( pp == "envMap" || pp == "map" || pp == "lightMap" ) { - - m.parameters[ pp ] = result.textures[ m.parameters[ pp ] ]; - - } else if ( pp == "shading" ) { - - m.parameters[ pp ] = ( m.parameters[ pp ] == "flat" ) ? THREE.FlatShading : THREE.SmoothShading; - - } else if ( pp == "blending" ) { - - m.parameters[ pp ] = THREE[ m.parameters[ pp ] ] ? THREE[ m.parameters[ pp ] ] : THREE.NormalBlending; - - } else if ( pp == "combine" ) { - - m.parameters[ pp ] = ( m.parameters[ pp ] == "MixOperation" ) ? THREE.MixOperation : THREE.MultiplyOperation; - - } else if ( pp == "vertexColors" ) { - - if ( m.parameters[ pp ] == "face" ) { - - m.parameters[ pp ] = THREE.FaceColors; - - // default to vertex colors if "vertexColors" is anything else face colors or 0 / null / false - - } else if ( m.parameters[ pp ] ) { - - m.parameters[ pp ] = THREE.VertexColors; - - } - - } - - } - - if ( m.parameters.opacity !== undefined && m.parameters.opacity < 1.0 ) { - - m.parameters.transparent = true; - - } - - if ( m.parameters.normalMap ) { - - var shader = THREE.ShaderUtils.lib[ "normal" ]; - var uniforms = THREE.UniformsUtils.clone( shader.uniforms ); - - var diffuse = m.parameters.color; - var specular = m.parameters.specular; - var ambient = m.parameters.ambient; - var shininess = m.parameters.shininess; - - uniforms[ "tNormal" ].texture = result.textures[ m.parameters.normalMap ]; - - if ( m.parameters.normalMapFactor ) { - - uniforms[ "uNormalScale" ].value = m.parameters.normalMapFactor; - - } - - if ( m.parameters.map ) { - - uniforms[ "tDiffuse" ].texture = m.parameters.map; - uniforms[ "enableDiffuse" ].value = true; - - } - - if ( m.parameters.lightMap ) { - - uniforms[ "tAO" ].texture = m.parameters.lightMap; - uniforms[ "enableAO" ].value = true; - - } - - if ( m.parameters.specularMap ) { - - uniforms[ "tSpecular" ].texture = result.textures[ m.parameters.specularMap ]; - uniforms[ "enableSpecular" ].value = true; - - } - - uniforms[ "uDiffuseColor" ].value.setHex( diffuse ); - uniforms[ "uSpecularColor" ].value.setHex( specular ); - uniforms[ "uAmbientColor" ].value.setHex( ambient ); - - uniforms[ "uShininess" ].value = shininess; - - if ( m.parameters.opacity ) { - - uniforms[ "uOpacity" ].value = m.parameters.opacity; - - } - - var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true }; - - material = new THREE.ShaderMaterial( parameters ); - - } else { - - material = new THREE[ m.type ]( m.parameters ); - - } - - result.materials[ dm ] = material; - - } - - // objects ( synchronous init of procedural primitives ) - - handle_objects(); - - // synchronous callback - - scope.callbackSync( result ); - - // just in case there are no async elements: - async_callback_gate(); - - -}; -/** - * Loader for UTF8 encoded models generated by: - * http://code.google.com/p/webgl-loader/ - * - * Limitations: - * - number of vertices < 65536 (this is after optimizations in compressor, input OBJ may have even less) - * - models must have normals and texture coordinates - * - texture coordinates must be only from <0,1> - * - no materials support yet - * - models are scaled and offset (copy numbers from compressor and use them as parameters in UTF8Loader.load() ) - * - * @author alteredq / http://alteredqualia.com/ - * @author won3d / http://twitter.com/won3d - */ - -THREE.UTF8Loader = function ( ) { - -}; - -THREE.UTF8Loader.prototype = new THREE.UTF8Loader(); -THREE.UTF8Loader.prototype.constructor = THREE.UTF8Loader; - - -// Load UTF8 compressed models generated by objcompress -// - parameters -// - url (required) -// - callback (required) -// - metaData (optional) - -THREE.UTF8Loader.prototype.load = function( url, callback, metaData ) { - - if ( url instanceof Object ) { - - console.warn( 'DEPRECATED: UTF8Loader( parameters ) is now UTF8Loader( url, callback, metaData ).' ); - - var parameters = url; - - url = parameters.model; - callback = parameters.callback; - metaData = { scale: parameters.scale, offsetX: parameters.offsetX, offsetY: parameters.offsetY, offsetZ: parameters.offsetZ }; - - } - - var xhr = new XMLHttpRequest(), - callbackProgress = null, - - scale = metaData.scale !== undefined ? metaData.scale : 1, - offsetX = metaData.offsetX !== undefined ? metaData.offsetX : 0, - offsetY = metaData.offsetY !== undefined ? metaData.offsetY : 0, - offsetZ = metaData.offsetZ !== undefined ? metaData.offsetZ : 0; - - var length = 0; - - xhr.onreadystatechange = function() { - - if ( xhr.readyState == 4 ) { - - if ( xhr.status == 200 || xhr.status == 0 ) { - - THREE.UTF8Loader.prototype.createModel( xhr.responseText, callback, scale, offsetX, offsetY, offsetZ ); - - } else { - - alert( "Couldn't load [" + url + "] [" + xhr.status + "]" ); - - } - - } else if ( xhr.readyState == 3 ) { - - if ( callbackProgress ) { - - if ( length == 0 ) { - - length = xhr.getResponseHeader( "Content-Length" ); - - } - - callbackProgress( { total: length, loaded: xhr.responseText.length } ); - - } - - } else if ( xhr.readyState == 2 ) { - - length = xhr.getResponseHeader( "Content-Length" ); - - } - - } - - xhr.open( "GET", url, true ); - xhr.send( null ); - -}; - -// UTF-8 decoder from webgl-loader -// http://code.google.com/p/webgl-loader/ - -// Copyright 2011 Google Inc. 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. - -THREE.UTF8Loader.prototype.decompressMesh = function ( str ) { - - var num_verts = str.charCodeAt( 0 ); - - if ( num_verts >= 0xE000 ) { - - num_verts -= 0x0800; - - } - - num_verts ++; - - var attribs_out = new Float32Array( 8 * num_verts ); - - var offset = 1; - - for ( var i = 0; i < 8; i ++ ) { - - var prev_attrib = 0; - - for ( var j = 0; j < num_verts; ++ j ) { - - var code = str.charCodeAt( j + offset ); - - prev_attrib += ( code >> 1 ) ^ ( - ( code & 1 ) ); - - attribs_out[ 8 * j + i ] = prev_attrib; - - } - - offset += num_verts; - - } - - var num_indices = str.length - offset; - - var indices_out = new Uint16Array( num_indices ); - - var index_high_water_mark = 0; - - for ( var i = 0; i < num_indices; i ++ ) { - - var code = str.charCodeAt( i + offset ); - - indices_out[ i ] = index_high_water_mark - code; - - if ( code == 0 ) { - - index_high_water_mark ++; - - } - - } - - return [ attribs_out, indices_out ]; - -}; - -THREE.UTF8Loader.prototype.createModel = function ( data, callback, scale, offsetX, offsetY, offsetZ ) { - - var Model = function ( texture_path ) { - - //var s = (new Date).getTime(); - - var scope = this; - - scope.materials = []; - - THREE.Geometry.call( this ); - - var buffers = THREE.UTF8Loader.prototype.decompressMesh( data ); - - var normals = [], - uvs = []; - - init_vertices( buffers[ 0 ], 8, 0 ); - init_uvs( buffers[ 0 ], 8, 3 ); - init_normals( buffers[ 0 ], 8, 5 ); - - init_faces( buffers[ 1 ] ); - - this.computeCentroids(); - this.computeFaceNormals(); - //this.computeTangents(); - - //var e = (new Date).getTime(); - - //console.log( "utf8 data parse time: " + (e-s) + " ms" ); - - function init_vertices( data, stride, offset ) { - - var i, x, y, z, - end = data.length; - - for( i = offset; i < end; i += stride ) { - - x = data[ i ]; - y = data[ i + 1 ]; - z = data[ i + 2 ]; - - // fix scale and offsets - - x = ( x / 16383 ) * scale; - y = ( y / 16383 ) * scale; - z = ( z / 16383 ) * scale; - - x += offsetX; - y += offsetY; - z += offsetZ; - - vertex( scope, x, y, z ); - - } - - }; - - function init_normals( data, stride, offset ) { - - var i, x, y, z, - end = data.length; - - for( i = offset; i < end; i += stride ) { - - x = data[ i ]; - y = data[ i + 1 ]; - z = data[ i + 2 ]; - - // normalize to <-1,1> - - x = ( x - 512 ) / 511; - y = ( y - 512 ) / 511; - z = ( z - 512 ) / 511; - - normals.push( x, y, z ); - - } - - }; - - function init_uvs( data, stride, offset ) { - - var i, u, v, - end = data.length; - - for( i = offset; i < end; i += stride ) { - - u = data[ i ]; - v = data[ i + 1 ]; - - // normalize to <0,1> - - u /= 1023; - v /= 1023; - - uvs.push( u, 1 - v ); - - } - - }; - - function init_faces( indices ) { - - var i, - a, b, c, - u1, v1, u2, v2, u3, v3, - m, - end = indices.length; - - m = 0; // all faces defaulting to material 0 - - for( i = 0; i < end; i += 3 ) { - - a = indices[ i ]; - b = indices[ i + 1 ]; - c = indices[ i + 2 ]; - - f3n( scope, normals, a, b, c, m, a, b, c ); - - u1 = uvs[ a * 2 ]; - v1 = uvs[ a * 2 + 1 ]; - - u2 = uvs[ b * 2 ]; - v2 = uvs[ b * 2 + 1 ]; - - u3 = uvs[ c * 2 ]; - v3 = uvs[ c * 2 + 1 ]; - - uv3( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3 ); - - } - - - } - - }; - - function vertex ( scope, x, y, z ) { - - scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) ); - - }; - - function f3n ( scope, normals, a, b, c, mi, nai, nbi, nci ) { - - var nax = normals[ nai * 3 ], - nay = normals[ nai * 3 + 1 ], - naz = normals[ nai * 3 + 2 ], - - nbx = normals[ nbi * 3 ], - nby = normals[ nbi * 3 + 1 ], - nbz = normals[ nbi * 3 + 2 ], - - ncx = normals[ nci * 3 ], - ncy = normals[ nci * 3 + 1 ], - ncz = normals[ nci * 3 + 2 ]; - - var na = new THREE.Vector3( nax, nay, naz ), - nb = new THREE.Vector3( nbx, nby, nbz ), - nc = new THREE.Vector3( ncx, ncy, ncz ); - - scope.faces.push( new THREE.Face3( a, b, c, [ na, nb, nc ], null, mi ) ); - - }; - - function uv3 ( where, u1, v1, u2, v2, u3, v3 ) { - - var uv = []; - uv.push( new THREE.UV( u1, v1 ) ); - uv.push( new THREE.UV( u2, v2 ) ); - uv.push( new THREE.UV( u3, v3 ) ); - where.push( uv ); - - }; - - - Model.prototype = new THREE.Geometry(); - Model.prototype.constructor = Model; - - callback( new Model() ); - -}; -/** - * @author alteredq / http://alteredqualia.com/ - * - * Port of greggman's ThreeD version of marching cubes to Three.js - * http://webglsamples.googlecode.com/hg/blob/blob.html - */ - -THREE.MarchingCubes = function ( resolution, material ) { - - THREE.Object3D.call( this ); - - this.material = material; - - // functions have to be object properties - // prototype functions kill performance - // (tested and it was 4x slower !!!) - - this.init = function( resolution ) { - - this.resolution = resolution; - - // parameters - - this.isolation = 80.0; - - // size of field, 32 is pushing it in Javascript :) - - this.size = resolution; - this.size2 = this.size * this.size; - this.size3 = this.size2 * this.size; - this.halfsize = this.size / 2.0; - - // deltas - - this.delta = 2.0 / this.size; - this.yd = this.size; - this.zd = this.size2; - - this.field = new Float32Array( this.size3 ); - this.normal_cache = new Float32Array( this.size3 * 3 ); - - // temp buffers used in polygonize - - this.vlist = new Float32Array( 12 * 3 ); - this.nlist = new Float32Array( 12 * 3 ); - - this.firstDraw = true; - - // immediate render mode simulator - - this.maxCount = 4096; // TODO: find the fastest size for this buffer - this.count = 0; - this.hasPos = false; - this.hasNormal = false; - - this.positionArray = new Float32Array( this.maxCount * 3 ); - this.normalArray = new Float32Array( this.maxCount * 3 ); - - }; - - /////////////////////// - // Polygonization - /////////////////////// - - this.lerp = function( a, b, t ) { return a + ( b - a ) * t; }; - - this.VIntX = function( q, pout, nout, offset, isol, x, y, z, valp1, valp2 ) { - - var mu = ( isol - valp1 ) / ( valp2 - valp1 ), - nc = this.normal_cache; - - pout[ offset ] = x + mu * this.delta; - pout[ offset + 1 ] = y; - pout[ offset + 2 ] = z; - - nout[ offset ] = this.lerp( nc[ q ], nc[ q + 3 ], mu ); - nout[ offset + 1 ] = this.lerp( nc[ q + 1 ], nc[ q + 4 ], mu ); - nout[ offset + 2 ] = this.lerp( nc[ q + 2 ], nc[ q + 5 ], mu ); - - }; - - this.VIntY = function( q, pout, nout, offset, isol, x, y, z, valp1, valp2 ) { - - var mu = ( isol - valp1 ) / ( valp2 - valp1 ), - nc = this.normal_cache; - - pout[ offset ] = x; - pout[ offset + 1 ] = y + mu * this.delta; - pout[ offset + 2 ] = z; - - var q2 = q + this.yd * 3; - - nout[ offset ] = this.lerp( nc[ q ], nc[ q2 ], mu ); - nout[ offset + 1 ] = this.lerp( nc[ q + 1 ], nc[ q2 + 1 ], mu ); - nout[ offset + 2 ] = this.lerp( nc[ q + 2 ], nc[ q2 + 2 ], mu ); - - }; - - this.VIntZ = function( q, pout, nout, offset, isol, x, y, z, valp1, valp2 ) { - - var mu = ( isol - valp1 ) / ( valp2 - valp1 ), - nc = this.normal_cache; - - pout[ offset ] = x; - pout[ offset + 1 ] = y; - pout[ offset + 2 ] = z + mu * this.delta; - - var q2 = q + this.zd * 3; - - nout[ offset ] = this.lerp( nc[ q ], nc[ q2 ], mu ); - nout[ offset + 1 ] = this.lerp( nc[ q + 1 ], nc[ q2 + 1 ], mu ); - nout[ offset + 2 ] = this.lerp( nc[ q + 2 ], nc[ q2 + 2 ], mu ); - - }; - - this.compNorm = function( q ) { - - var q3 = q * 3; - - if ( this.normal_cache [ q3 ] === 0.0 ) { - - this.normal_cache[ q3 ] = this.field[ q - 1 ] - this.field[ q + 1 ]; - this.normal_cache[ q3 + 1 ] = this.field[ q - this.yd ] - this.field[ q + this.yd ]; - this.normal_cache[ q3 + 2 ] = this.field[ q - this.zd ] - this.field[ q + this.zd ]; - - } - - }; - - // Returns total number of triangles. Fills triangles. - // (this is where most of time is spent - it's inner work of O(n3) loop ) - - this.polygonize = function( fx, fy, fz, q, isol, render_callback ) { - - // cache indices - var q1 = q + 1, - qy = q + this.yd, - qz = q + this.zd, - q1y = q1 + this.yd, - q1z = q1 + this.zd, - qyz = q + this.yd + this.zd, - q1yz = q1 + this.yd + this.zd; - - var cubeindex = 0, - field0 = this.field[ q ], - field1 = this.field[ q1 ], - field2 = this.field[ qy ], - field3 = this.field[ q1y ], - field4 = this.field[ qz ], - field5 = this.field[ q1z ], - field6 = this.field[ qyz ], - field7 = this.field[ q1yz ]; - - if ( field0 < isol ) cubeindex |= 1; - if ( field1 < isol ) cubeindex |= 2; - if ( field2 < isol ) cubeindex |= 8; - if ( field3 < isol ) cubeindex |= 4; - if ( field4 < isol ) cubeindex |= 16; - if ( field5 < isol ) cubeindex |= 32; - if ( field6 < isol ) cubeindex |= 128; - if ( field7 < isol ) cubeindex |= 64; - - // if cube is entirely in/out of the surface - bail, nothing to draw - - var bits = THREE.edgeTable[ cubeindex ]; - if ( bits === 0 ) return 0; - - var d = this.delta, - fx2 = fx + d, - fy2 = fy + d, - fz2 = fz + d; - - // top of the cube - - if ( bits & 1 ) { - - this.compNorm( q ); - this.compNorm( q1 ); - this.VIntX( q * 3, this.vlist, this.nlist, 0, isol, fx, fy, fz, field0, field1 ); - - }; - - if ( bits & 2 ) { - - this.compNorm( q1 ); - this.compNorm( q1y ); - this.VIntY( q1 * 3, this.vlist, this.nlist, 3, isol, fx2, fy, fz, field1, field3 ); - - }; - - if ( bits & 4 ) { - - this.compNorm( qy ); - this.compNorm( q1y ); - this.VIntX( qy * 3, this.vlist, this.nlist, 6, isol, fx, fy2, fz, field2, field3 ); - - }; - - if ( bits & 8 ) { - - this.compNorm( q ); - this.compNorm( qy ); - this.VIntY( q * 3, this.vlist, this.nlist, 9, isol, fx, fy, fz, field0, field2 ); - - }; - - // bottom of the cube - - if ( bits & 16 ) { - - this.compNorm( qz ); - this.compNorm( q1z ); - this.VIntX( qz * 3, this.vlist, this.nlist, 12, isol, fx, fy, fz2, field4, field5 ); - - }; - - if ( bits & 32 ) { - - this.compNorm( q1z ); - this.compNorm( q1yz ); - this.VIntY( q1z * 3, this.vlist, this.nlist, 15, isol, fx2, fy, fz2, field5, field7 ); - - }; - - if ( bits & 64 ) { - - this.compNorm( qyz ); - this.compNorm( q1yz ); - this.VIntX( qyz * 3, this.vlist, this.nlist, 18, isol, fx, fy2, fz2, field6, field7 ); - - }; - - if ( bits & 128 ) { - - this.compNorm( qz ); - this.compNorm( qyz ); - this.VIntY( qz * 3, this.vlist, this.nlist, 21, isol, fx, fy, fz2, field4, field6 ); - - }; - - // vertical lines of the cube - - if ( bits & 256 ) { - - this.compNorm( q ); - this.compNorm( qz ); - this.VIntZ( q * 3, this.vlist, this.nlist, 24, isol, fx, fy, fz, field0, field4 ); - - }; - - if ( bits & 512 ) { - - this.compNorm( q1 ); - this.compNorm( q1z ); - this.VIntZ( q1 * 3, this.vlist, this.nlist, 27, isol, fx2, fy, fz, field1, field5 ); - - }; - - if ( bits & 1024 ) { - - this.compNorm( q1y ); - this.compNorm( q1yz ); - this.VIntZ( q1y * 3, this.vlist, this.nlist, 30, isol, fx2, fy2, fz, field3, field7 ); - - }; - - if ( bits & 2048 ) { - - this.compNorm( qy ); - this.compNorm( qyz ); - this.VIntZ( qy * 3, this.vlist, this.nlist, 33, isol, fx, fy2, fz, field2, field6 ); - - }; - - cubeindex <<= 4; // re-purpose cubeindex into an offset into triTable - - var o1, o2, o3, numtris = 0, i = 0; - - // here is where triangles are created - - while ( THREE.triTable[ cubeindex + i ] != -1 ) { - - o1 = cubeindex + i; - o2 = o1 + 1; - o3 = o1 + 2; - - this.posnormtriv( this.vlist, this.nlist, - 3 * THREE.triTable[ o1 ], - 3 * THREE.triTable[ o2 ], - 3 * THREE.triTable[ o3 ], - render_callback ); - - i += 3; - numtris ++; - - } - - return numtris; - - }; - - ///////////////////////////////////// - // Immediate render mode simulator - ///////////////////////////////////// - - this.posnormtriv = function( pos, norm, o1, o2, o3, render_callback ) { - - var c = this.count * 3; - - this.positionArray[ c ] = pos[ o1 ]; - this.positionArray[ c + 1 ] = pos[ o1 + 1 ]; - this.positionArray[ c + 2 ] = pos[ o1 + 2 ]; - - this.positionArray[ c + 3 ] = pos[ o2 ]; - this.positionArray[ c + 4 ] = pos[ o2 + 1 ]; - this.positionArray[ c + 5 ] = pos[ o2 + 2 ]; - - this.positionArray[ c + 6 ] = pos[ o3 ]; - this.positionArray[ c + 7 ] = pos[ o3 + 1 ]; - this.positionArray[ c + 8 ] = pos[ o3 + 2 ]; - - this.normalArray[ c ] = norm[ o1 ]; - this.normalArray[ c + 1 ] = norm[ o1 + 1 ]; - this.normalArray[ c + 2 ] = norm[ o1 + 2 ]; - - this.normalArray[ c + 3 ] = norm[ o2 ]; - this.normalArray[ c + 4 ] = norm[ o2 + 1 ]; - this.normalArray[ c + 5 ] = norm[ o2 + 2 ]; - - this.normalArray[ c + 6 ] = norm[ o3 ]; - this.normalArray[ c + 7 ] = norm[ o3 + 1 ]; - this.normalArray[ c + 8 ] = norm[ o3 + 2 ]; - - this.hasPos = true; - this.hasNormal = true; - - this.count += 3; - - if ( this.count >= this.maxCount - 3 ) { - - render_callback( this ); - - } - - }; - - this.begin = function( ) { - - this.count = 0; - this.hasPos = false; - this.hasNormal = false; - - }; - - this.end = function( render_callback ) { - - if ( this.count === 0 ) - return; - - for ( var i = this.count * 3; i < this.positionArray.length; i++ ) - this.positionArray[ i ] = 0.0; - - render_callback( this ); - - }; - - ///////////////////////////////////// - // Metaballs - ///////////////////////////////////// - - // Adds a reciprocal ball (nice and blobby) that, to be fast, fades to zero after - // a fixed distance, determined by strength and subtract. - - this.addBall = function( ballx, bally, ballz, strength, subtract ) { - - // Let's solve the equation to find the radius: - // 1.0 / (0.000001 + radius^2) * strength - subtract = 0 - // strength / (radius^2) = subtract - // strength = subtract * radius^2 - // radius^2 = strength / subtract - // radius = sqrt(strength / subtract) - - var radius = this.size * Math.sqrt( strength / subtract ), - zs = ballz * this.size, - ys = bally * this.size, - xs = ballx * this.size; - - var min_z = Math.floor( zs - radius ); if ( min_z < 1 ) min_z = 1; - var max_z = Math.floor( zs + radius ); if ( max_z > this.size - 1 ) max_z = this.size - 1; - var min_y = Math.floor( ys - radius ); if ( min_y < 1 ) min_y = 1; - var max_y = Math.floor( ys + radius ); if ( max_y > this.size - 1 ) max_y = this.size - 1; - var min_x = Math.floor( xs - radius ); if ( min_x < 1 ) min_x = 1; - var max_x = Math.floor( xs + radius ); if ( max_x > this.size - 1 ) max_x = this.size - 1; - - - // Don't polygonize in the outer layer because normals aren't - // well-defined there. - - var x, y, z, y_offset, z_offset, fx, fy, fz, fz2, fy2, val; - - for ( z = min_z; z < max_z; z++ ) { - - z_offset = this.size2 * z, - fz = z / this.size - ballz, - fz2 = fz * fz; - - for ( y = min_y; y < max_y; y++ ) { - - y_offset = z_offset + this.size * y; - fy = y / this.size - bally; - fy2 = fy * fy; - - for ( x = min_x; x < max_x; x++ ) { - - fx = x / this.size - ballx; - val = strength / ( 0.000001 + fx*fx + fy2 + fz2 ) - subtract; - if ( val > 0.0 ) this.field[ y_offset + x ] += val; - - } - - } - - } - - }; - - this.addPlaneX = function( strength, subtract ) { - - var x, y, z, xx, val, xdiv, cxy, - - // cache attribute lookups - size = this.size, - yd = this.yd, - zd = this.zd, - field = this.field, - - dist = size * Math.sqrt( strength / subtract ); - - if ( dist > size ) dist = size; - - for ( x = 0; x < dist; x++ ) { - - xdiv = x / size; - xx = xdiv * xdiv; - val = strength / ( 0.0001 + xx ) - subtract; - - if ( val > 0.0 ) { - - for ( y = 0; y < size; y++ ) { - - cxy = x + y * yd; - - for ( z = 0; z < size; z++ ) { - - field[ zd * z + cxy ] += val; - - } - - } - - } - - } - - }; - - this.addPlaneY = function( strength, subtract ) { - - var x, y, z, yy, val, ydiv, cy, cxy, - - // cache attribute lookups - size = this.size, - yd = this.yd, - zd = this.zd, - field = this.field, - - dist = size * Math.sqrt( strength / subtract ); - - if ( dist > size ) dist = size; - - for ( y = 0; y < dist; y++ ) { - - ydiv = y / size; - yy = ydiv * ydiv; - val = strength / ( 0.0001 + yy ) - subtract; - - if ( val > 0.0 ) { - - cy = y * yd; - - for ( x = 0; x < size; x++ ) { - - cxy = cy + x; - - for ( z = 0; z < size; z++ ) - field[ zd * z + cxy ] += val; - - } - - } - - } - - }; - - this.addPlaneZ = function( strength, subtract ) { - - var x, y, z, zz, val, zdiv, cz, cyz, - - // cache attribute lookups - size = this.size, - yd = this.yd, - zd = this.zd, - field = this.field, - - dist = size * Math.sqrt( strength / subtract ); - - if ( dist > size ) dist = size; - - for ( z = 0; z < dist; z++ ) { - - zdiv = z / size; - zz = zdiv * zdiv; - val = strength / ( 0.0001 + zz ) - subtract; - if ( val > 0.0 ) { - - cz = zd * z; - - for ( y = 0; y < size; y++ ) { - - cyz = cz + y * yd; - - for ( x = 0; x < size; x++ ) - field[ cyz + x ] += val; - - } - - } - - } - - }; - - ///////////////////////////////////// - // Updates - ///////////////////////////////////// - - this.reset = function() { - - var i; - - // wipe the normal cache - - for ( i = 0; i < this.size3; i++ ) { - - this.normal_cache[ i * 3 ] = 0.0; - this.field[ i ] = 0.0; - - } - - }; - - this.render = function( render_callback ) { - - this.begin(); - - // Triangulate. Yeah, this is slow. - - var q, x, y, z, fx, fy, fz, y_offset, z_offset, smin2 = this.size - 2; - - for ( z = 1; z < smin2; z++ ) { - - z_offset = this.size2 * z; - fz = ( z - this.halfsize ) / this.halfsize; //+ 1 - - for ( y = 1; y < smin2; y++ ) { - - y_offset = z_offset + this.size * y; - fy = ( y - this.halfsize ) / this.halfsize; //+ 1 - - for ( x = 1; x < smin2; x++ ) { - - fx = ( x - this.halfsize ) / this.halfsize; //+ 1 - q = y_offset + x; - - this.polygonize( fx, fy, fz, q, this.isolation, render_callback ); - - } - - } - - } - - this.end( render_callback ); - - }; - - this.generateGeometry = function() { - - var start = 0, geo = new THREE.Geometry(); - var normals = []; - - var geo_callback = function( object ) { - - var i, x, y, z, vertex, position, normal, - face, a, b, c, na, nb, nc, nfaces; - - - for ( i = 0; i < object.count; i++ ) { - - a = i * 3; - b = a + 1; - c = a + 2; - - x = object.positionArray[ a ]; - y = object.positionArray[ b ]; - z = object.positionArray[ c ]; - position = new THREE.Vector3( x, y, z ); - - x = object.normalArray[ a ]; - y = object.normalArray[ b ]; - z = object.normalArray[ c ]; - normal = new THREE.Vector3( x, y, z ); - normal.normalize(); - - vertex = new THREE.Vertex( position ); - - geo.vertices.push( vertex ); - normals.push( normal ); - - } - - nfaces = object.count / 3; - - for ( i = 0; i < nfaces; i++ ) { - - a = ( start + i ) * 3; - b = a + 1; - c = a + 2; - - na = normals[ a ]; - nb = normals[ b ]; - nc = normals[ c ]; - - face = new THREE.Face3( a, b, c, [ na, nb, nc ] ); - - geo.faces.push( face ); - - } - - start += nfaces; - object.count = 0; - - }; - - this.render( geo_callback ); - - // console.log( "generated " + geo.faces.length + " triangles" ); - - return geo; - - }; - - this.init( resolution ); - -}; - -THREE.MarchingCubes.prototype = new THREE.Object3D(); -THREE.MarchingCubes.prototype.constructor = THREE.MarchingCubes; - - -///////////////////////////////////// -// Marching cubes lookup tables -///////////////////////////////////// - -// These tables are straight from Paul Bourke's page: -// http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ -// who in turn got them from Cory Gene Bloyd. - -THREE.edgeTable = new Int32Array([ -0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, -0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, -0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, -0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, -0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, -0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, -0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, -0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, -0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, -0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, -0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, -0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, -0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, -0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, -0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , -0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, -0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, -0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, -0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, -0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, -0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, -0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, -0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, -0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, -0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, -0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, -0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, -0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, -0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, -0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, -0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, -0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0]) - -THREE.triTable = new Int32Array([ --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1, -3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1, -3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1, -3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1, -9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1, -8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1, -9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1, -3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1, -1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1, -4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1, -4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1, -9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1, -1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1, -5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1, -2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1, -9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1, -0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1, -10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1, -5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1, -5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1, -0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1, -10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1, -8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1, -2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1, -2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1, -11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1, -9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1, -5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1, -11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1, -11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1, -9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1, -5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1, -2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1, -6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1, -0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1, -3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1, -6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1, -5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1, -1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1, -6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1, -8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1, -7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1, -3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1, -0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1, -8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1, -5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1, -0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1, -6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1, -10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1, -8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1, -1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1, -3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1, -0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1, -0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1, -3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1, -6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1, -9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1, -8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1, -3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1, -6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1, -10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1, -10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1, -2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1, -7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1, -7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1, -2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1, -1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1, -11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1, -8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1, -0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1, -7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1, -7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1, -2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1, -10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1, -10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1, -0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1, -7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1, -6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1, -8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1, -9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1, -6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1, -4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1, -10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1, -8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1, -1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1, -8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1, -10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1, -4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1, -10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1, -9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1, -7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1, -3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1, -7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1, -9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1, -3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1, -6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1, -9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1, -1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1, -4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1, -7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1, -6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1, -3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1, -0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1, -6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1, -0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1, -11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1, -6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1, -5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1, -9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1, -1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1, -10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1, -0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1, -5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1, -10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1, -11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1, -0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1, -9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1, -7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1, -2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1, -9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1, -9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1, -1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1, -9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1, -9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1, -0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1, -10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1, -2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1, -0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1, -0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1, -9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1, -5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1, -3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1, -5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1, -8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1, -0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1, -9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1, -1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1, -3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1, -4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1, -9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1, -11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1, -11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1, -2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1, -9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1, -3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1, -1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1, -4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1, -4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1, -0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1, -3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1, -3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1, -0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1, -9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1, -1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]); -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.LensFlare = function ( texture, size, distance, blending, color ) { - - THREE.Object3D.call( this ); - - this.lensFlares = []; - - this.positionScreen = new THREE.Vector3(); - this.customUpdateCallback = undefined; - - if( texture !== undefined ) { - - this.add( texture, size, distance, blending, color ); - - } - -}; - -THREE.LensFlare.prototype = new THREE.Object3D(); -THREE.LensFlare.prototype.constructor = THREE.LensFlare; -THREE.LensFlare.prototype.supr = THREE.Object3D.prototype; - - -/* - * Add: adds another flare - */ - -THREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) { - - if( size === undefined ) size = -1; - if( distance === undefined ) distance = 0; - if( opacity === undefined ) opacity = 1; - if( color === undefined ) color = new THREE.Color( 0xffffff ); - if( blending === undefined ) blending = THREE.NormalBlending; - - distance = Math.min( distance, Math.max( 0, distance ) ); - - this.lensFlares.push( { texture: texture, // THREE.Texture - size: size, // size in pixels (-1 = use texture.width) - distance: distance, // distance (0-1) from light source (0=at light source) - x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is ontop z = 1 is back - scale: 1, // scale - rotation: 1, // rotation - opacity: opacity, // opacity - color: color, // color - blending: blending } ); // blending - -}; - - -/* - * Update lens flares update positions on all flares based on the screen position - * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. - */ - -THREE.LensFlare.prototype.updateLensFlares = function () { - - var f, fl = this.lensFlares.length; - var flare; - var vecX = -this.positionScreen.x * 2; - var vecY = -this.positionScreen.y * 2; - - for( f = 0; f < fl; f ++ ) { - - flare = this.lensFlares[ f ]; - - flare.x = this.positionScreen.x + vecX * flare.distance; - flare.y = this.positionScreen.y + vecY * flare.distance; - - flare.wantedRotation = flare.x * Math.PI * 0.25; - flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; - - } - -}; - - - - - - - - - - - - -/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.LensFlarePlugin = function ( ) { - - var _gl, _renderer, _lensFlare = {}; - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - _lensFlare.vertices = new Float32Array( 8 + 8 ); - _lensFlare.faces = new Uint16Array( 6 ); - - var i = 0; - _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = -1; // vertex - _lensFlare.vertices[ i++ ] = 0; _lensFlare.vertices[ i++ ] = 0; // uv... etc. - - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = -1; - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 0; - - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 1; - _lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 1; - - _lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = 1; - _lensFlare.vertices[ i++ ] = 0; _lensFlare.vertices[ i++ ] = 1; - - i = 0; - _lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 1; _lensFlare.faces[ i++ ] = 2; - _lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 2; _lensFlare.faces[ i++ ] = 3; - - // buffers - - _lensFlare.vertexBuffer = _gl.createBuffer(); - _lensFlare.elementBuffer = _gl.createBuffer(); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, _lensFlare.vertices, _gl.STATIC_DRAW ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.faces, _gl.STATIC_DRAW ); - - // textures - - _lensFlare.tempTexture = _gl.createTexture(); - _lensFlare.occlusionTexture = _gl.createTexture(); - - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, 16, 16, 0, _gl.RGB, _gl.UNSIGNED_BYTE, null ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); - - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); - _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, 16, 16, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST ); - _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST ); - - if ( _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) <= 0 ) { - - _lensFlare.hasVertexTexture = false; - _lensFlare.program = createProgram( THREE.ShaderFlares[ "lensFlare" ] ); - - } else { - - _lensFlare.hasVertexTexture = true; - _lensFlare.program = createProgram( THREE.ShaderFlares[ "lensFlareVertexTexture" ] ); - - } - - _lensFlare.attributes = {}; - _lensFlare.uniforms = {}; - - _lensFlare.attributes.vertex = _gl.getAttribLocation ( _lensFlare.program, "position" ); - _lensFlare.attributes.uv = _gl.getAttribLocation ( _lensFlare.program, "uv" ); - - _lensFlare.uniforms.renderType = _gl.getUniformLocation( _lensFlare.program, "renderType" ); - _lensFlare.uniforms.map = _gl.getUniformLocation( _lensFlare.program, "map" ); - _lensFlare.uniforms.occlusionMap = _gl.getUniformLocation( _lensFlare.program, "occlusionMap" ); - _lensFlare.uniforms.opacity = _gl.getUniformLocation( _lensFlare.program, "opacity" ); - _lensFlare.uniforms.color = _gl.getUniformLocation( _lensFlare.program, "color" ); - _lensFlare.uniforms.scale = _gl.getUniformLocation( _lensFlare.program, "scale" ); - _lensFlare.uniforms.rotation = _gl.getUniformLocation( _lensFlare.program, "rotation" ); - _lensFlare.uniforms.screenPosition = _gl.getUniformLocation( _lensFlare.program, "screenPosition" ); - - _lensFlare.attributesEnabled = false; - - }; - - - /* - * Render lens flares - * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, - * reads these back and calculates occlusion. - * Then _lensFlare.update_lensFlares() is called to re-position and - * update transparency of flares. Then they are rendered. - * - */ - - this.render = function ( scene, camera, viewportWidth, viewportHeight ) { - - var flares = scene.__webglFlares, - nFlares = flares.length; - - if ( ! nFlares ) return; - - var tempPosition = new THREE.Vector3(); - - var invAspect = viewportHeight / viewportWidth, - halfViewportWidth = viewportWidth * 0.5, - halfViewportHeight = viewportHeight * 0.5; - - var size = 16 / viewportHeight, - scale = new THREE.Vector2( size * invAspect, size ); - - var screenPosition = new THREE.Vector3( 1, 1, 0 ), - screenPositionPixels = new THREE.Vector2( 1, 1 ); - - var uniforms = _lensFlare.uniforms, - attributes = _lensFlare.attributes; - - // set _lensFlare program and reset blending - - _gl.useProgram( _lensFlare.program ); - - if ( ! _lensFlare.attributesEnabled ) { - - _gl.enableVertexAttribArray( _lensFlare.attributes.vertex ); - _gl.enableVertexAttribArray( _lensFlare.attributes.uv ); - - _lensFlare.attributesEnabled = true; - - } - - // loop through all lens flares to update their occlusion and positions - // setup gl and common used attribs/unforms - - _gl.uniform1i( uniforms.occlusionMap, 0 ); - _gl.uniform1i( uniforms.map, 1 ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer ); - _gl.vertexAttribPointer( attributes.vertex, 2, _gl.FLOAT, false, 2 * 8, 0 ); - _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer ); - - _gl.disable( _gl.CULL_FACE ); - _gl.depthMask( false ); - - var i, j, jl, flare, sprite; - - for ( i = 0; i < nFlares; i ++ ) { - - size = 16 / viewportHeight; - scale.set( size * invAspect, size ); - - // calc object screen position - - flare = flares[ i ]; - - tempPosition.set( flare.matrixWorld.n14, flare.matrixWorld.n24, flare.matrixWorld.n34 ); - - camera.matrixWorldInverse.multiplyVector3( tempPosition ); - camera.projectionMatrix.multiplyVector3( tempPosition ); - - // setup arrays for gl programs - - screenPosition.copy( tempPosition ) - - screenPositionPixels.x = screenPosition.x * halfViewportWidth + halfViewportWidth; - screenPositionPixels.y = screenPosition.y * halfViewportHeight + halfViewportHeight; - - // screen cull - - if ( _lensFlare.hasVertexTexture || ( - screenPositionPixels.x > 0 && - screenPositionPixels.x < viewportWidth && - screenPositionPixels.y > 0 && - screenPositionPixels.y < viewportHeight ) ) { - - // save current RGB to temp texture - - _gl.activeTexture( _gl.TEXTURE1 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); - - - // render pink quad - - _gl.uniform1i( uniforms.renderType, 0 ); - _gl.uniform2f( uniforms.scale, scale.x, scale.y ); - _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); - - _gl.disable( _gl.BLEND ); - _gl.enable( _gl.DEPTH_TEST ); - - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - - // copy result to occlusionMap - - _gl.activeTexture( _gl.TEXTURE0 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture ); - _gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 ); - - - // restore graphics - - _gl.uniform1i( uniforms.renderType, 1 ); - _gl.disable( _gl.DEPTH_TEST ); - - _gl.activeTexture( _gl.TEXTURE1 ); - _gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture ); - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - - // update object positions - - flare.positionScreen.copy( screenPosition ) - - if ( flare.customUpdateCallback ) { - - flare.customUpdateCallback( flare ); - - } else { - - flare.updateLensFlares(); - - } - - // render flares - - _gl.uniform1i( uniforms.renderType, 2 ); - _gl.enable( _gl.BLEND ); - - for ( j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { - - sprite = flare.lensFlares[ j ]; - - if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { - - screenPosition.x = sprite.x; - screenPosition.y = sprite.y; - screenPosition.z = sprite.z; - - size = sprite.size * sprite.scale / viewportHeight; - - scale.x = size * invAspect; - scale.y = size; - - _gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); - _gl.uniform2f( uniforms.scale, scale.x, scale.y ); - _gl.uniform1f( uniforms.rotation, sprite.rotation ); - - _gl.uniform1f( uniforms.opacity, sprite.opacity ); - _gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); - - _renderer.setBlending( sprite.blending ); - _renderer.setTexture( sprite.texture, 1 ); - - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - } - - } - - } - - } - - // restore gl - - _gl.enable( _gl.CULL_FACE ); - _gl.enable( _gl.DEPTH_TEST ); - _gl.depthMask( true ); - - }; - - function createProgram ( shader ) { - - var program = _gl.createProgram(); - - var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER ); - var vertexShader = _gl.createShader( _gl.VERTEX_SHADER ); - - _gl.shaderSource( fragmentShader, shader.fragmentShader ); - _gl.shaderSource( vertexShader, shader.vertexShader ); - - _gl.compileShader( fragmentShader ); - _gl.compileShader( vertexShader ); - - _gl.attachShader( program, fragmentShader ); - _gl.attachShader( program, vertexShader ); - - _gl.linkProgram( program ); - - return program; - - }; - -};/** - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.ShadowMapPlugin = function ( ) { - - var _gl, - _renderer, - _depthMaterial, _depthMaterialMorph, - - _frustum = new THREE.Frustum(), - _projScreenMatrix = new THREE.Matrix4(); - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - var depthShader = THREE.ShaderLib[ "depthRGBA" ]; - var depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms ); - - _depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } ); - _depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } ); - - _depthMaterial._shadowPass = true; - _depthMaterialMorph._shadowPass = true; - - }; - - this.render = function ( scene, camera ) { - - if ( ! ( _renderer.shadowMapEnabled && _renderer.shadowMapAutoUpdate ) ) return; - - this.update( scene, camera ); - - }; - - this.update = function ( scene, camera ) { - - var i, il, j, jl, - - shadowMap, shadowMatrix, shadowCamera, - program, buffer, material, - webglObject, object, light, - renderList, - - lights = scene.lights, - fog = null; - - // set GL state for depth map - - _gl.clearColor( 1, 1, 1, 1 ); - _gl.disable( _gl.BLEND ); - if ( _renderer.shadowMapCullFrontFaces ) _gl.cullFace( _gl.FRONT ); - - _renderer.setDepthTest( true ); - - // render depth map - - for ( i = 0, il = lights.length; i < il; i ++ ) { - - light = lights[ i ]; - - if ( ! light.castShadow ) continue; - - if ( ! light.shadowMap ) { - - var pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat }; - - light.shadowMap = new THREE.WebGLRenderTarget( light.shadowMapWidth, light.shadowMapHeight, pars ); - light.shadowMapSize = new THREE.Vector2( light.shadowMapWidth, light.shadowMapHeight ); - - light.shadowMatrix = new THREE.Matrix4(); - - } - - if ( ! light.shadowCamera ) { - - if ( light instanceof THREE.SpotLight ) { - - light.shadowCamera = new THREE.PerspectiveCamera( light.shadowCameraFov, light.shadowMapWidth / light.shadowMapHeight, light.shadowCameraNear, light.shadowCameraFar ); - - } else if ( light instanceof THREE.DirectionalLight ) { - - light.shadowCamera = new THREE.OrthographicCamera( light.shadowCameraLeft, light.shadowCameraRight, light.shadowCameraTop, light.shadowCameraBottom, light.shadowCameraNear, light.shadowCameraFar ); - - } else { - - console.error( "Unsupported light type for shadow" ); - continue; - - } - - scene.add( light.shadowCamera ); - - if ( _renderer.autoUpdateScene ) scene.updateMatrixWorld(); - - } - - - if ( light.shadowCameraVisible && ! light.cameraHelper ) { - - light.cameraHelper = new THREE.CameraHelper( light.shadowCamera ); - light.shadowCamera.add( light.cameraHelper ); - - } - - shadowMap = light.shadowMap; - shadowMatrix = light.shadowMatrix; - shadowCamera = light.shadowCamera; - - shadowCamera.position.copy( light.matrixWorld.getPosition() ); - shadowCamera.lookAt( light.target.matrixWorld.getPosition() ); - shadowCamera.updateMatrixWorld(); - - shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); - - if ( light.cameraHelper ) light.cameraHelper.lines.visible = light.shadowCameraVisible; - if ( light.shadowCameraVisible ) light.cameraHelper.update( light.shadowCamera ); - - // compute shadow matrix - - 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.multiplySelf( shadowCamera.projectionMatrix ); - shadowMatrix.multiplySelf( shadowCamera.matrixWorldInverse ); - - // render shadow map - - if ( ! shadowCamera._viewMatrixArray ) shadowCamera._viewMatrixArray = new Float32Array( 16 ); - shadowCamera.matrixWorldInverse.flattenToArray( shadowCamera._viewMatrixArray ); - - if ( ! shadowCamera._projectionMatrixArray ) shadowCamera._projectionMatrixArray = new Float32Array( 16 ); - shadowCamera.projectionMatrix.flattenToArray( shadowCamera._projectionMatrixArray ); - - _projScreenMatrix.multiply( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); - _frustum.setFromMatrix( _projScreenMatrix ); - - _renderer.setRenderTarget( shadowMap ); - _renderer.clear(); - - // set matrices & frustum culling - - renderList = scene.__webglObjects; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - object = webglObject.object; - - webglObject.render = false; - - if ( object.visible && object.castShadow ) { - - if ( ! ( object instanceof THREE.Mesh ) || ! ( object.frustumCulled ) || _frustum.contains( object ) ) { - - object.matrixWorld.flattenToArray( object._objectMatrixArray ); - object._modelViewMatrix.multiplyToArray( shadowCamera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray ); - - webglObject.render = true; - - } - - } - - } - - // render regular objects - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - - if ( webglObject.render ) { - - object = webglObject.object; - buffer = webglObject.buffer; - - _renderer.setObjectFaces( object ); - - if ( object.customDepthMaterial ) { - - material = object.customDepthMaterial; - - } else if ( object.geometry.morphTargets.length ) { - - material = _depthMaterialMorph; - - } else { - - material = _depthMaterial; - - } - - if ( buffer instanceof THREE.BufferGeometry ) { - - _renderer.renderBufferDirect( shadowCamera, lights, fog, material, buffer, object ); - - } else { - - _renderer.renderBuffer( shadowCamera, lights, fog, material, buffer, object ); - - } - - } - - } - - // set matrices and render immediate objects - - renderList = scene.__webglObjectsImmediate; - - for ( j = 0, jl = renderList.length; j < jl; j ++ ) { - - webglObject = renderList[ j ]; - object = webglObject.object; - - if ( object.visible && object.castShadow ) { - - if( object.matrixAutoUpdate ) { - - object.matrixWorld.flattenToArray( object._objectMatrixArray ); - - } - - object._modelViewMatrix.multiplyToArray( shadowCamera.matrixWorldInverse, object.matrixWorld, object._modelViewMatrixArray ); - - _renderer.renderImmediateObject( shadowCamera, lights, fog, _depthMaterial, object ); - - } - - } - - } - - // restore GL state - - var clearColor = _renderer.getClearColor(), - clearAlpha = _renderer.getClearAlpha(); - - _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha ); - _gl.enable( _gl.BLEND ); - if ( _renderer.shadowMapCullFrontFaces ) _gl.cullFace( _gl.BACK ); - - }; - -};/** - * @author mikael emtinger / http://gomo.se/ - * @author alteredq / http://alteredqualia.com/ - */ - -THREE.SpritePlugin = function ( ) { - - var _gl, _renderer, _sprite = {}; - - this.init = function ( renderer ) { - - _gl = renderer.context; - _renderer = renderer; - - _sprite.vertices = new Float32Array( 8 + 8 ); - _sprite.faces = new Uint16Array( 6 ); - - var i = 0; - - _sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = -1; // vertex 0 - _sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 1; // uv 0 - - _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = -1; // vertex 1 - _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1; // uv 1 - - _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1; // vertex 2 - _sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 0; // uv 2 - - _sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = 1; // vertex 3 - _sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 0; // uv 3 - - i = 0; - - _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 1; _sprite.faces[ i++ ] = 2; - _sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 2; _sprite.faces[ i++ ] = 3; - - _sprite.vertexBuffer = _gl.createBuffer(); - _sprite.elementBuffer = _gl.createBuffer(); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer ); - _gl.bufferData( _gl.ARRAY_BUFFER, _sprite.vertices, _gl.STATIC_DRAW ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer ); - _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _sprite.faces, _gl.STATIC_DRAW ); - - _sprite.program = createProgram( THREE.ShaderSprite[ "sprite" ] ); - - _sprite.attributes = {}; - _sprite.uniforms = {}; - - _sprite.attributes.position = _gl.getAttribLocation ( _sprite.program, "position" ); - _sprite.attributes.uv = _gl.getAttribLocation ( _sprite.program, "uv" ); - - _sprite.uniforms.uvOffset = _gl.getUniformLocation( _sprite.program, "uvOffset" ); - _sprite.uniforms.uvScale = _gl.getUniformLocation( _sprite.program, "uvScale" ); - - _sprite.uniforms.rotation = _gl.getUniformLocation( _sprite.program, "rotation" ); - _sprite.uniforms.scale = _gl.getUniformLocation( _sprite.program, "scale" ); - _sprite.uniforms.alignment = _gl.getUniformLocation( _sprite.program, "alignment" ); - - _sprite.uniforms.color = _gl.getUniformLocation( _sprite.program, "color" ); - _sprite.uniforms.map = _gl.getUniformLocation( _sprite.program, "map" ); - _sprite.uniforms.opacity = _gl.getUniformLocation( _sprite.program, "opacity" ); - - _sprite.uniforms.useScreenCoordinates = _gl.getUniformLocation( _sprite.program, "useScreenCoordinates" ); - _sprite.uniforms.affectedByDistance = _gl.getUniformLocation( _sprite.program, "affectedByDistance" ); - _sprite.uniforms.screenPosition = _gl.getUniformLocation( _sprite.program, "screenPosition" ); - _sprite.uniforms.modelViewMatrix = _gl.getUniformLocation( _sprite.program, "modelViewMatrix" ); - _sprite.uniforms.projectionMatrix = _gl.getUniformLocation( _sprite.program, "projectionMatrix" ); - - _sprite.attributesEnabled = false; - - }; - - this.render = function ( scene, camera, viewportWidth, viewportHeight ) { - - var sprites = scene.__webglSprites, - nSprites = sprites.length; - - if ( ! nSprites ) return; - - var attributes = _sprite.attributes, - uniforms = _sprite.uniforms; - - var invAspect = viewportHeight / viewportWidth; - - var halfViewportWidth = viewportWidth * 0.5, - halfViewportHeight = viewportHeight * 0.5; - - var mergeWith3D = true; - - // setup gl - - _gl.useProgram( _sprite.program ); - - if ( ! _sprite.attributesEnabled ) { - - _gl.enableVertexAttribArray( attributes.position ); - _gl.enableVertexAttribArray( attributes.uv ); - - _sprite.attributesEnabled = true; - - } - - _gl.disable( _gl.CULL_FACE ); - _gl.enable( _gl.BLEND ); - _gl.depthMask( true ); - - _gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer ); - _gl.vertexAttribPointer( attributes.position, 2, _gl.FLOAT, false, 2 * 8, 0 ); - _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 ); - - _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer ); - - _gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera._projectionMatrixArray ); - - _gl.activeTexture( _gl.TEXTURE0 ); - _gl.uniform1i( uniforms.map, 0 ); - - // update positions and sort - - var i, sprite, screenPosition, size, scale = []; - - for( i = 0; i < nSprites; i ++ ) { - - sprite = sprites[ i ]; - - if ( ! sprite.visible || sprite.opacity === 0 ) continue; - - if( ! sprite.useScreenCoordinates ) { - - sprite._modelViewMatrix.multiplyToArray( camera.matrixWorldInverse, sprite.matrixWorld, sprite._modelViewMatrixArray ); - sprite.z = - sprite._modelViewMatrix.n34; - - } else { - - sprite.z = - sprite.position.z; - - } - - } - - sprites.sort( painterSort ); - - // render all sprites - - for( i = 0; i < nSprites; i ++ ) { - - sprite = sprites[ i ]; - - if ( ! sprite.visible || sprite.opacity === 0 ) continue; - - if ( sprite.map && sprite.map.image && sprite.map.image.width ) { - - if ( sprite.useScreenCoordinates ) { - - _gl.uniform1i( uniforms.useScreenCoordinates, 1 ); - _gl.uniform3f( uniforms.screenPosition, ( sprite.position.x - halfViewportWidth ) / halfViewportWidth, - ( halfViewportHeight - sprite.position.y ) / halfViewportHeight, - Math.max( 0, Math.min( 1, sprite.position.z ) ) ); - - } else { - - _gl.uniform1i( uniforms.useScreenCoordinates, 0 ); - _gl.uniform1i( uniforms.affectedByDistance, sprite.affectedByDistance ? 1 : 0 ); - _gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite._modelViewMatrixArray ); - - } - - size = sprite.map.image.width / ( sprite.scaleByViewport ? viewportHeight : 1 ); - - scale[ 0 ] = size * invAspect * sprite.scale.x; - scale[ 1 ] = size * sprite.scale.y; - - _gl.uniform2f( uniforms.uvScale, sprite.uvScale.x, sprite.uvScale.y ); - _gl.uniform2f( uniforms.uvOffset, sprite.uvOffset.x, sprite.uvOffset.y ); - _gl.uniform2f( uniforms.alignment, sprite.alignment.x, sprite.alignment.y ); - - _gl.uniform1f( uniforms.opacity, sprite.opacity ); - _gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); - - _gl.uniform1f( uniforms.rotation, sprite.rotation ); - _gl.uniform2fv( uniforms.scale, scale ); - - if ( sprite.mergeWith3D && !mergeWith3D ) { - - _gl.enable( _gl.DEPTH_TEST ); - mergeWith3D = true; - - } else if ( ! sprite.mergeWith3D && mergeWith3D ) { - - _gl.disable( _gl.DEPTH_TEST ); - mergeWith3D = false; - - } - - _renderer.setBlending( sprite.blending ); - _renderer.setTexture( sprite.map, 0 ); - - _gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 ); - - } - - } - - // restore gl - - _gl.enable( _gl.CULL_FACE ); - _gl.enable( _gl.DEPTH_TEST ); - _gl.depthMask( true ); - - }; - - function createProgram ( shader ) { - - var program = _gl.createProgram(); - - var fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER ); - var vertexShader = _gl.createShader( _gl.VERTEX_SHADER ); - - _gl.shaderSource( fragmentShader, shader.fragmentShader ); - _gl.shaderSource( vertexShader, shader.vertexShader ); - - _gl.compileShader( fragmentShader ); - _gl.compileShader( vertexShader ); - - _gl.attachShader( program, fragmentShader ); - _gl.attachShader( program, vertexShader ); - - _gl.linkProgram( program ); - - return program; - - }; - - function painterSort ( a, b ) { - - return b.z - a.z; - - }; - -};/** - * @author mrdoob / http://mrdoob.com/ - * @author marklundin / http://mark-lundin.com/ - * @author alteredq / http://alteredqualia.com/ - */ - -if ( THREE.WebGLRenderer ) { - - THREE.AnaglyphWebGLRenderer = function ( parameters ) { - - THREE.WebGLRenderer.call( this, parameters ); - - this.autoUpdateScene = false; - - var _this = this, _setSize = this.setSize, _render = this.render; - - var _cameraL = new THREE.PerspectiveCamera(), - _cameraR = new THREE.PerspectiveCamera(); - - var eyeRight = new THREE.Matrix4(), - eyeLeft = new THREE.Matrix4(), - focalLength = 125, - _aspect, _near, _far, _fov; - - _cameraL.matrixAutoUpdate = _cameraR.matrixAutoUpdate = false; - - var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat }; - - var _renderTargetL = new THREE.WebGLRenderTarget( 512, 512, _params ), - _renderTargetR = new THREE.WebGLRenderTarget( 512, 512, _params ); - - var _camera = new THREE.PerspectiveCamera( 53, 1, 1, 10000 ); - _camera.position.z = 2; - - var _material = new THREE.ShaderMaterial( { - - uniforms: { - - "mapLeft": { type: "t", value: 0, texture: _renderTargetL }, - "mapRight": { type: "t", value: 1, texture: _renderTargetR } - - }, - - vertexShader: [ - - "varying vec2 vUv;", - - "void main() {", - - "vUv = vec2( uv.x, 1.0 - uv.y );", - "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", - - "}" - - ].join("\n"), - - fragmentShader: [ - - "uniform sampler2D mapLeft;", - "uniform sampler2D mapRight;", - "varying vec2 vUv;", - - "void main() {", - - "vec4 colorL, colorR;", - "vec2 uv = vUv;", - - "colorL = texture2D( mapLeft, uv );", - "colorR = texture2D( mapRight, uv );", - - // http://3dtv.at/Knowhow/AnaglyphComparison_en.aspx - - "gl_FragColor = vec4( colorL.g * 0.7 + colorL.b * 0.3, colorR.g, colorR.b, colorL.a + colorR.a ) * 1.1;", - - "}" - - ].join("\n") - - } ); - - var _scene = new THREE.Scene(); - _scene.add( new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), _material ) ); - - _scene.add( _camera ); - - this.setSize = function ( width, height ) { - - _setSize.call( _this, width, height ); - - _renderTargetL.width = width; - _renderTargetL.height = height; - - _renderTargetR.width = width; - _renderTargetR.height = height; - - }; - - /* - * Renderer now uses an asymmetric perspective projection (http://paulbourke.net/miscellaneous/stereographics/stereorender/). - * Each camera is offset by the eye seperation and its projection matrix is also skewed asymetrically back to converge on the same - * projection plane. Added a focal length parameter to, this is where the parallax is equal to 0. - */ - - this.render = function ( scene, camera, renderTarget, forceClear ) { - - scene.updateMatrixWorld(); - - var hasCameraChanged = ( _aspect !== camera.aspect ) || ( _near !== camera.near ) || ( _far !== camera.far ) || ( _fov !== camera.fov ); - - if( hasCameraChanged ) { - - _aspect = camera.aspect; - _near = camera.near; - _far = camera.far; - _fov = camera.fov; - - var projectionMatrix = camera.projectionMatrix.clone(), - eyeSep = focalLength / 30 * 0.5, - eyeSepOnProjection = eyeSep * _near / focalLength, - ymax = _near * Math.tan( _fov * Math.PI / 360 ), - xmin, xmax; - - // translate xOffset - - eyeRight.n14 = eyeSep; - eyeLeft.n14 = -eyeSep; - - // for left eye - - xmin = -ymax * _aspect + eyeSepOnProjection; - xmax = ymax * _aspect + eyeSepOnProjection; - - projectionMatrix.n11 = 2 * _near / ( xmax - xmin ); - projectionMatrix.n13 = ( xmax + xmin ) / ( xmax - xmin ); - - _cameraL.projectionMatrix.copy( projectionMatrix ); - - // for right eye - - xmin = -ymax * _aspect - eyeSepOnProjection; - xmax = ymax * _aspect - eyeSepOnProjection; - - projectionMatrix.n11 = 2 * _near / ( xmax - xmin ); - projectionMatrix.n13 = ( xmax + xmin ) / ( xmax - xmin ); - - _cameraR.projectionMatrix.copy( projectionMatrix ); - - } - - _cameraL.matrixWorld.copy( camera.matrixWorld ).multiplySelf( eyeLeft ); - _cameraL.position.copy( camera.position ); - _cameraL.near = camera.near; - _cameraL.far = camera.far; - - _render.call( _this, scene, _cameraL, _renderTargetL, true ); - - _cameraR.matrixWorld.copy( camera.matrixWorld ).multiplySelf( eyeRight ); - _cameraR.position.copy( camera.position ); - _cameraR.near = camera.near; - _cameraR.far = camera.far; - - _render.call( _this, scene, _cameraR, _renderTargetR, true ); - - _scene.updateMatrixWorld(); - _render.call( _this, _scene, _camera ); - - }; - - }; - -}; -/** - * @author alteredq / http://alteredqualia.com/ - */ - -if ( THREE.WebGLRenderer ) { - - THREE.CrosseyedWebGLRenderer = function ( parameters ) { - - THREE.WebGLRenderer.call( this, parameters ); - - this.autoClear = false; - - var _this = this, _setSize = this.setSize, _render = this.render; - - var _width, _height; - - var _cameraL = new THREE.PerspectiveCamera(); - _cameraL.target = new THREE.Vector3( 0, 0, 0 ); - - var _cameraR = new THREE.PerspectiveCamera(); - _cameraR.target = new THREE.Vector3( 0, 0, 0 ); - - _this.separation = 10; - if ( parameters && parameters.separation !== undefined ) _this.separation = parameters.separation; - - var SCREEN_WIDTH = window.innerWidth; - var SCREEN_HEIGHT = window.innerHeight; - var HALF_WIDTH = SCREEN_WIDTH / 2; - - this.setSize = function ( width, height ) { - - _setSize.call( _this, width, height ); - - _width = width/2; - _height = height; - - }; - - this.render = function ( scene, camera, renderTarget, forceClear ) { - - this.clear(); - - _cameraL.fov = camera.fov; - _cameraL.aspect = 0.5 * camera.aspect; - _cameraL.near = camera.near; - _cameraL.far = camera.far; - _cameraL.updateProjectionMatrix(); - - _cameraL.position.copy( camera.position ); - _cameraL.target.copy( camera.target ); - _cameraL.translateX( _this.separation ); - _cameraL.lookAt( _cameraL.target ); - - _cameraR.projectionMatrix = _cameraL.projectionMatrix; - - _cameraR.position.copy( camera.position ); - _cameraR.target.copy( camera.target ); - _cameraR.translateX( - _this.separation ); - _cameraR.lookAt( _cameraR.target ); - - this.setViewport( 0, 0, _width, _height ); - _render.call( _this, scene, _cameraL ); - - this.setViewport( _width, 0, _width, _height ); - _render.call( _this, scene, _cameraR, false ); - - }; - - }; - -} -/** - * @author mikael emtinger / http://gomo.se/ - * - */ - -THREE.ShaderFlares = { - - 'lensFlareVertexTexture': { - - vertexShader: [ - - "uniform vec3 screenPosition;", - "uniform vec2 scale;", - "uniform float rotation;", - "uniform int renderType;", - - "uniform sampler2D occlusionMap;", - - "attribute vec2 position;", - "attribute vec2 uv;", - - "varying vec2 vUV;", - "varying float vVisibility;", - - "void main() {", - - "vUV = uv;", - - "vec2 pos = position;", - - "if( renderType == 2 ) {", - - "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +", - "texture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +", - "texture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +", - "texture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +", - "texture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +", - "texture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +", - "texture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +", - "texture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +", - "texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", - - "vVisibility = ( visibility.r / 9.0 ) *", - "( 1.0 - visibility.g / 9.0 ) *", - "( visibility.b / 9.0 ) *", - "( 1.0 - visibility.a / 9.0 );", - - "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", - "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", - - "}", - - "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", - - "}" - - ].join( "\n" ), - - fragmentShader: [ - - "precision mediump float;", - - "uniform sampler2D map;", - "uniform float opacity;", - "uniform int renderType;", - "uniform vec3 color;", - - "varying vec2 vUV;", - "varying float vVisibility;", - - "void main() {", - - // pink square - - "if( renderType == 0 ) {", - - "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", - - // restore - - "} else if( renderType == 1 ) {", - - "gl_FragColor = texture2D( map, vUV );", - - // flare - - "} else {", - - "vec4 texture = texture2D( map, vUV );", - "texture.a *= opacity * vVisibility;", - "gl_FragColor = texture;", - "gl_FragColor.rgb *= color;", - - "}", - - "}" - ].join( "\n" ) - - }, - - - 'lensFlare': { - - vertexShader: [ - - "uniform vec3 screenPosition;", - "uniform vec2 scale;", - "uniform float rotation;", - "uniform int renderType;", - - "attribute vec2 position;", - "attribute vec2 uv;", - - "varying vec2 vUV;", - - "void main() {", - - "vUV = uv;", - - "vec2 pos = position;", - - "if( renderType == 2 ) {", - - "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", - "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", - - "}", - - "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", - - "}" - - ].join( "\n" ), - - fragmentShader: [ - - "precision mediump float;", - - "uniform sampler2D map;", - "uniform sampler2D occlusionMap;", - "uniform float opacity;", - "uniform int renderType;", - "uniform vec3 color;", - - "varying vec2 vUV;", - - "void main() {", - - // pink square - - "if( renderType == 0 ) {", - - "gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );", - - // restore - - "} else if( renderType == 1 ) {", - - "gl_FragColor = texture2D( map, vUV );", - - // flare - - "} else {", - - "float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +", - "texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +", - "texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +", - "texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;", - - "visibility = ( 1.0 - visibility / 4.0 );", - - "vec4 texture = texture2D( map, vUV );", - "texture.a *= opacity * visibility;", - "gl_FragColor = texture;", - "gl_FragColor.rgb *= color;", - - "}", - - "}" - - ].join( "\n" ) - - } - -}; -/** - * @author mikael emtinger / http://gomo.se/ - * - */ - -THREE.ShaderSprite = { - - 'sprite': { - - vertexShader: [ - - "uniform int useScreenCoordinates;", - "uniform int affectedByDistance;", - "uniform vec3 screenPosition;", - "uniform mat4 modelViewMatrix;", - "uniform mat4 projectionMatrix;", - "uniform float rotation;", - "uniform vec2 scale;", - "uniform vec2 alignment;", - "uniform vec2 uvOffset;", - "uniform vec2 uvScale;", - - "attribute vec2 position;", - "attribute vec2 uv;", - - "varying vec2 vUV;", - - "void main() {", - - "vUV = uvOffset + uv * uvScale;", - - "vec2 alignedPosition = position + alignment;", - - "vec2 rotatedPosition;", - "rotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;", - "rotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;", - - "vec4 finalPosition;", - - "if( useScreenCoordinates != 0 ) {", - - "finalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );", - - "} else {", - - "finalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );", - "finalPosition.xy += rotatedPosition * ( affectedByDistance == 1 ? 1.0 : finalPosition.z );", - - "}", - - "gl_Position = finalPosition;", - - "}" - - ].join( "\n" ), - - fragmentShader: [ - - "precision mediump float;", - - "uniform vec3 color;", - "uniform sampler2D map;", - "uniform float opacity;", - - "varying vec2 vUV;", - - "void main() {", - - "vec4 texture = texture2D( map, vUV );", - "gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );", - - "}" - - ].join( "\n" ) - - } - -}; diff --git a/js/Tween.js b/js/Tween.js deleted file mode 100755 index fc1d26c..0000000 --- a/js/Tween.js +++ /dev/null @@ -1,530 +0,0 @@ -/** - * @author sole / http://soledadpenades.com - * @author mr.doob / http://mrdoob.com - * @author Robert Eisele / http://www.xarg.org - * @author Philippe / http://philippe.elsass.me - * @author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html - * @author Paul Lewis / http://www.aerotwist.com/ - * @author lechecacharro - * @author Josh Faul / http://jocafa.com/ - */ - -var TWEEN = TWEEN || ( function () { - - var i, tl, interval, time, fps = 60, autostart = false, tweens = [], num_tweens; - - return { - - setFPS: function ( f ) { - - fps = f || 60; - - }, - - start: function ( f ) { - - if( arguments.length != 0 ) { - this.setFPS( f ); - } - - interval = setInterval( this.update, 1000 / fps ); - - }, - - stop: function () { - - clearInterval( interval ); - - }, - - setAutostart: function ( value ) { - - autostart = value; - - if(autostart && !interval) { - this.start(); - } - - }, - - add: function ( tween ) { - - tweens.push( tween ); - - if (autostart && !interval) { - - this.start(); - - } - - }, - - getAll: function() { - - return tweens; - - }, - - removeAll: function() { - - tweens = []; - - }, - - remove: function ( tween ) { - - i = tweens.indexOf( tween ); - - if ( i !== -1 ) { - - tweens.splice( i, 1 ); - - } - - }, - - update: function (_time) { - - i = 0; num_tweens = tweens.length; - var time = _time || Date.now(); - - while ( i < num_tweens ) { - - if ( tweens[ i ].update( time ) ) { - - i++; - - } else { - - tweens.splice( i, 1 ); - num_tweens--; - - } - - } - - if (num_tweens == 0 && autostart == true) { - - this.stop(); - - } - - } - - }; - -} )(); - -TWEEN.Tween = function ( object ) { - - var _object = object, - _valuesStart = {}, - _valuesDelta = {}, - _valuesEnd = {}, - _duration = 1000, - _delayTime = 0, - _startTime = null, - _easingFunction = TWEEN.Easing.Linear.EaseNone, - _chainedTween = null, - _onUpdateCallback = null, - _onCompleteCallback = null; - - this.to = function ( properties, duration ) { - - if( duration !== null ) { - - _duration = duration; - - } - - for ( var property in properties ) { - - // This prevents the engine from interpolating null values - if ( _object[ property ] === null ) { - - continue; - - } - - // The current values are read when the tween starts; - // here we only store the final desired values - _valuesEnd[ property ] = properties[ property ]; - - } - - return this; - - }; - - this.start = function (_time) { - - TWEEN.add( this ); - - _startTime = _time ? _time + _delayTime : Date.now() + _delayTime; - - for ( var property in _valuesEnd ) { - - // Again, prevent dealing with null values - if ( _object[ property ] === null ) { - - continue; - - } - - _valuesStart[ property ] = _object[ property ]; - _valuesDelta[ property ] = _valuesEnd[ property ] - _object[ property ]; - - } - - return this; - }; - - this.stop = function () { - - TWEEN.remove( this ); - return this; - - }; - - this.delay = function ( amount ) { - - _delayTime = amount; - return this; - - }; - - this.easing = function ( easing ) { - - _easingFunction = easing; - return this; - - }; - - this.chain = function ( chainedTween ) { - - _chainedTween = chainedTween; - - }; - - this.onUpdate = function ( onUpdateCallback ) { - - _onUpdateCallback = onUpdateCallback; - return this; - - }; - - this.onComplete = function ( onCompleteCallback ) { - - _onCompleteCallback = onCompleteCallback; - return this; - - }; - - this.update = function ( time ) { - - var property, elapsed, value; - - if ( time < _startTime ) { - - return true; - - } - - elapsed = ( time - _startTime ) / _duration; - elapsed = elapsed > 1 ? 1 : elapsed; - - value = _easingFunction( elapsed ); - - for ( property in _valuesDelta ) { - - _object[ property ] = _valuesStart[ property ] + _valuesDelta[ property ] * value; - - } - - if ( _onUpdateCallback !== null ) { - - _onUpdateCallback.call( _object, value ); - - } - - if ( elapsed == 1 ) { - - if ( _onCompleteCallback !== null ) { - - _onCompleteCallback.call( _object ); - - } - - if ( _chainedTween !== null ) { - - _chainedTween.start(); - - } - - return false; - - } - - return true; - - }; - - /* - this.destroy = function () { - - TWEEN.remove( this ); - - }; - */ -} - -TWEEN.Easing = { Linear: {}, Quadratic: {}, Cubic: {}, Quartic: {}, Quintic: {}, Sinusoidal: {}, Exponential: {}, Circular: {}, Elastic: {}, Back: {}, Bounce: {} }; - - -TWEEN.Easing.Linear.EaseNone = function ( k ) { - - return k; - -}; - -// - -TWEEN.Easing.Quadratic.EaseIn = function ( k ) { - - return k * k; - -}; - -TWEEN.Easing.Quadratic.EaseOut = function ( k ) { - - return - k * ( k - 2 ); - -}; - -TWEEN.Easing.Quadratic.EaseInOut = function ( k ) { - - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k; - return - 0.5 * ( --k * ( k - 2 ) - 1 ); - -}; - -// - -TWEEN.Easing.Cubic.EaseIn = function ( k ) { - - return k * k * k; - -}; - -TWEEN.Easing.Cubic.EaseOut = function ( k ) { - - return --k * k * k + 1; - -}; - -TWEEN.Easing.Cubic.EaseInOut = function ( k ) { - - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k; - return 0.5 * ( ( k -= 2 ) * k * k + 2 ); - -}; - -// - -TWEEN.Easing.Quartic.EaseIn = function ( k ) { - - return k * k * k * k; - -}; - -TWEEN.Easing.Quartic.EaseOut = function ( k ) { - - return - ( --k * k * k * k - 1 ); - -} - -TWEEN.Easing.Quartic.EaseInOut = function ( k ) { - - if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k; - return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 ); - -}; - -// - -TWEEN.Easing.Quintic.EaseIn = function ( k ) { - - return k * k * k * k * k; - -}; - -TWEEN.Easing.Quintic.EaseOut = function ( k ) { - - return ( k = k - 1 ) * k * k * k * k + 1; - -}; - -TWEEN.Easing.Quintic.EaseInOut = function ( k ) { - - if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k; - return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 ); - -}; - -// - -TWEEN.Easing.Sinusoidal.EaseIn = function ( k ) { - - return - Math.cos( k * Math.PI / 2 ) + 1; - -}; - -TWEEN.Easing.Sinusoidal.EaseOut = function ( k ) { - - return Math.sin( k * Math.PI / 2 ); - -}; - -TWEEN.Easing.Sinusoidal.EaseInOut = function ( k ) { - - return - 0.5 * ( Math.cos( Math.PI * k ) - 1 ); - -}; - -// - -TWEEN.Easing.Exponential.EaseIn = function ( k ) { - - return k == 0 ? 0 : Math.pow( 2, 10 * ( k - 1 ) ); - -}; - -TWEEN.Easing.Exponential.EaseOut = function ( k ) { - - return k == 1 ? 1 : - Math.pow( 2, - 10 * k ) + 1; - -}; - -TWEEN.Easing.Exponential.EaseInOut = function ( k ) { - - if ( k == 0 ) return 0; - if ( k == 1 ) return 1; - if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 2, 10 * ( k - 1 ) ); - return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 ); - -}; - -// - -TWEEN.Easing.Circular.EaseIn = function ( k ) { - - return - ( Math.sqrt( 1 - k * k ) - 1); - -}; - -TWEEN.Easing.Circular.EaseOut = function ( k ) { - - return Math.sqrt( 1 - --k * k ); - -}; - -TWEEN.Easing.Circular.EaseInOut = function ( k ) { - - if ( ( k /= 0.5 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1); - return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1); - -}; - -// - -TWEEN.Easing.Elastic.EaseIn = function( k ) { - - var s, a = 0.1, p = 0.4; - if ( k == 0 ) return 0; if ( k == 1 ) return 1; if ( !p ) p = 0.3; - if ( !a || a < 1 ) { a = 1; s = p / 4; } - else s = p / ( 2 * Math.PI ) * Math.asin( 1 / a ); - return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) ); - -}; - -TWEEN.Easing.Elastic.EaseOut = function( k ) { - - var s, a = 0.1, p = 0.4; - if ( k == 0 ) return 0; if ( k == 1 ) return 1; if ( !p ) p = 0.3; - if ( !a || a < 1 ) { a = 1; s = p / 4; } - else s = p / ( 2 * Math.PI ) * Math.asin( 1 / a ); - return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 ); - -}; - -TWEEN.Easing.Elastic.EaseInOut = function( k ) { - - var s, a = 0.1, p = 0.4; - if ( k == 0 ) return 0; if ( k == 1 ) return 1; if ( !p ) p = 0.3; - if ( !a || a < 1 ) { a = 1; s = p / 4; } - else s = p / ( 2 * Math.PI ) * Math.asin( 1 / a ); - if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) ); - return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1; - -}; - -// - -TWEEN.Easing.Back.EaseIn = function( k ) { - - var s = 1.70158; - return k * k * ( ( s + 1 ) * k - s ); - -}; - -TWEEN.Easing.Back.EaseOut = function( k ) { - - var s = 1.70158; - return ( k = k - 1 ) * k * ( ( s + 1 ) * k + s ) + 1; - -}; - -TWEEN.Easing.Back.EaseInOut = function( k ) { - - var s = 1.70158 * 1.525; - if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) ); - return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 ); - -}; - -// - -TWEEN.Easing.Bounce.EaseIn = function( k ) { - - return 1 - TWEEN.Easing.Bounce.EaseOut( 1 - k ); - -}; - -TWEEN.Easing.Bounce.EaseOut = function( k ) { - - if ( ( k /= 1 ) < ( 1 / 2.75 ) ) { - - return 7.5625 * k * k; - - } else if ( k < ( 2 / 2.75 ) ) { - - return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75; - - } else if ( k < ( 2.5 / 2.75 ) ) { - - return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375; - - } else { - - return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375; - - } - -}; - -TWEEN.Easing.Bounce.EaseInOut = function( k ) { - - if ( k < 0.5 ) return TWEEN.Easing.Bounce.EaseIn( k * 2 ) * 0.5; - return TWEEN.Easing.Bounce.EaseOut( k * 2 - 1 ) * 0.5 + 0.5; - -}; diff --git a/js/camerastates.js b/js/camerastates.js deleted file mode 100644 index 5af6d43..0000000 --- a/js/camerastates.js +++ /dev/null @@ -1,5 +0,0 @@ -var cameraStates = new Object(); -var currentCameraState = null; -var targetCameraState = null; - -var defaultCameraState; \ No newline at end of file diff --git a/js/canvg.js b/js/canvg.js deleted file mode 100755 index 7b24a38..0000000 --- a/js/canvg.js +++ /dev/null @@ -1,2620 +0,0 @@ -/* - * canvg.js - Javascript SVG parser and renderer on Canvas - * MIT Licensed - * Gabe Lerner (gabelerner@gmail.com) - * http://code.google.com/p/canvg/ - * - * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/ - */ -if(!window.console) { - window.console = {}; - window.console.log = function(str) {}; - window.console.dir = function(str) {}; -} - -if(!Array.prototype.indexOf){ - Array.prototype.indexOf = function(obj){ - for(var i=0; i ignore mouse events - // ignoreAnimation: true => ignore animations - // ignoreDimensions: true => does not try to resize canvas - // ignoreClear: true => does not clear canvas - // offsetX: int => draws at a x offset - // offsetY: int => draws at a y offset - // scaleWidth: int => scales horizontally to width - // scaleHeight: int => scales vertically to height - // renderCallback: function => will call the function after the first render is completed - // forceRedraw: function => will call the function on every frame, if it returns true, will redraw - this.canvg = function (target, s, opts) { - // no parameters - if (target == null && s == null && opts == null) { - var svgTags = document.getElementsByTagName('svg'); - for (var i=0; i]*>/, ''); - var xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); - xmlDoc.async = 'false'; - xmlDoc.loadXML(xml); - return xmlDoc; - } - } - - svg.Property = function(name, value) { - this.name = name; - this.value = value; - - this.hasValue = function() { - return (this.value != null && this.value !== ''); - } - - // return the numerical value of the property - this.numValue = function() { - if (!this.hasValue()) return 0; - - var n = parseFloat(this.value); - if ((this.value + '').match(/%$/)) { - n = n / 100.0; - } - return n; - } - - this.valueOrDefault = function(def) { - if (this.hasValue()) return this.value; - return def; - } - - this.numValueOrDefault = function(def) { - if (this.hasValue()) return this.numValue(); - return def; - } - - /* EXTENSIONS */ - var that = this; - - // color extensions - this.Color = { - // augment the current color value with the opacity - addOpacity: function(opacity) { - var newValue = that.value; - if (opacity != null && opacity != '') { - var color = new RGBColor(that.value); - if (color.ok) { - newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')'; - } - } - return new svg.Property(that.name, newValue); - } - } - - // definition extensions - this.Definition = { - // get the definition from the definitions table - getDefinition: function() { - var name = that.value.replace(/^(url\()?#([^\)]+)\)?$/, '$2'); - return svg.Definitions[name]; - }, - - isUrl: function() { - return that.value.indexOf('url(') == 0 - }, - - getFillStyle: function(e) { - var def = this.getDefinition(); - - // gradient - if (def != null && def.createGradient) { - return def.createGradient(svg.ctx, e); - } - - // pattern - if (def != null && def.createPattern) { - return def.createPattern(svg.ctx, e); - } - - return null; - } - } - - // length extensions - this.Length = { - DPI: function(viewPort) { - return 96.0; // TODO: compute? - }, - - EM: function(viewPort) { - var em = 12; - - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - if (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort); - - return em; - }, - - // get the length as pixels - toPixels: function(viewPort) { - if (!that.hasValue()) return 0; - var s = that.value+''; - if (s.match(/em$/)) return that.numValue() * this.EM(viewPort); - if (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0; - if (s.match(/px$/)) return that.numValue(); - if (s.match(/pt$/)) return that.numValue() * 1.25; - if (s.match(/pc$/)) return that.numValue() * 15; - if (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54; - if (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4; - if (s.match(/in$/)) return that.numValue() * this.DPI(viewPort); - if (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort); - return that.numValue(); - } - } - - // time extensions - this.Time = { - // get the time as milliseconds - toMilliseconds: function() { - if (!that.hasValue()) return 0; - var s = that.value+''; - if (s.match(/s$/)) return that.numValue() * 1000; - if (s.match(/ms$/)) return that.numValue(); - return that.numValue(); - } - } - - // angle extensions - this.Angle = { - // get the angle as radians - toRadians: function() { - if (!that.hasValue()) return 0; - var s = that.value+''; - if (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0); - if (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0); - if (s.match(/rad$/)) return that.numValue(); - return that.numValue() * (Math.PI / 180.0); - } - } - } - - // fonts - svg.Font = new (function() { - this.Styles = ['normal','italic','oblique','inherit']; - this.Variants = ['normal','small-caps','inherit']; - this.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit']; - - this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { - var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); - return { - fontFamily: fontFamily || f.fontFamily, - fontSize: fontSize || f.fontSize, - fontStyle: fontStyle || f.fontStyle, - fontWeight: fontWeight || f.fontWeight, - fontVariant: fontVariant || f.fontVariant, - toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } - } - } - - var that = this; - this.Parse = function(s) { - var f = {}; - var d = svg.trim(svg.compressSpaces(s || '')).split(' '); - var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false } - var ff = ''; - for (var i=0; i this.x2) this.x2 = x; - } - - if (y != null) { - if (isNaN(this.y1) || isNaN(this.y2)) { - this.y1 = y; - this.y2 = y; - } - if (y < this.y1) this.y1 = y; - if (y > this.y2) this.y2 = y; - } - } - this.addX = function(x) { this.addPoint(x, null); } - this.addY = function(y) { this.addPoint(null, y); } - - this.addBoundingBox = function(bb) { - this.addPoint(bb.x1, bb.y1); - this.addPoint(bb.x2, bb.y2); - } - - this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) { - var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) - var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) - var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) - var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) - this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); - } - - this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { - // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html - var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y]; - this.addPoint(p0[0], p0[1]); - this.addPoint(p3[0], p3[1]); - - for (i=0; i<=1; i++) { - var f = function(t) { - return Math.pow(1-t, 3) * p0[i] - + 3 * Math.pow(1-t, 2) * t * p1[i] - + 3 * (1-t) * Math.pow(t, 2) * p2[i] - + Math.pow(t, 3) * p3[i]; - } - - var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; - var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; - var c = 3 * p1[i] - 3 * p0[i]; - - if (a == 0) { - if (b == 0) continue; - var t = -c / b; - if (0 < t && t < 1) { - if (i == 0) this.addX(f(t)); - if (i == 1) this.addY(f(t)); - } - continue; - } - - var b2ac = Math.pow(b, 2) - 4 * c * a; - if (b2ac < 0) continue; - var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); - if (0 < t1 && t1 < 1) { - if (i == 0) this.addX(f(t1)); - if (i == 1) this.addY(f(t1)); - } - var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); - if (0 < t2 && t2 < 1) { - if (i == 0) this.addX(f(t2)); - if (i == 1) this.addY(f(t2)); - } - } - } - - this.isPointInBox = function(x, y) { - return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2); - } - - this.addPoint(x1, y1); - this.addPoint(x2, y2); - } - - // transforms - svg.Transform = function(v) { - var that = this; - this.Type = {} - - // translate - this.Type.translate = function(s) { - this.p = svg.CreatePoint(s); - this.apply = function(ctx) { - ctx.translate(this.p.x || 0.0, this.p.y || 0.0); - } - this.applyToPoint = function(p) { - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - } - } - - // rotate - this.Type.rotate = function(s) { - var a = svg.ToNumberArray(s); - this.angle = new svg.Property('angle', a[0]); - this.cx = a[1] || 0; - this.cy = a[2] || 0; - this.apply = function(ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(this.angle.Angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - } - this.applyToPoint = function(p) { - var a = this.angle.Angle.toRadians(); - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]); - p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); - } - } - - this.Type.scale = function(s) { - this.p = svg.CreatePoint(s); - this.apply = function(ctx) { - ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); - } - this.applyToPoint = function(p) { - p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); - } - } - - this.Type.matrix = function(s) { - this.m = svg.ToNumberArray(s); - this.apply = function(ctx) { - ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); - } - this.applyToPoint = function(p) { - p.applyTransform(this.m); - } - } - - this.Type.SkewBase = function(s) { - this.base = that.Type.matrix; - this.base(s); - this.angle = new svg.Property('angle', s); - } - this.Type.SkewBase.prototype = new this.Type.matrix; - - this.Type.skewX = function(s) { - this.base = that.Type.SkewBase; - this.base(s); - this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0]; - } - this.Type.skewX.prototype = new this.Type.SkewBase; - - this.Type.skewY = function(s) { - this.base = that.Type.SkewBase; - this.base(s); - this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0]; - } - this.Type.skewY.prototype = new this.Type.SkewBase; - - this.transforms = []; - - this.apply = function(ctx) { - for (var i=0; i= this.tokens.length - 1; - } - - this.isCommandOrEnd = function() { - if (this.isEnd()) return true; - return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null; - } - - this.isRelativeCommand = function() { - return this.command == this.command.toLowerCase(); - } - - this.getToken = function() { - this.i = this.i + 1; - return this.tokens[this.i]; - } - - this.getScalar = function() { - return parseFloat(this.getToken()); - } - - this.nextCommand = function() { - this.previousCommand = this.command; - this.command = this.getToken(); - } - - this.getPoint = function() { - var p = new svg.Point(this.getScalar(), this.getScalar()); - return this.makeAbsolute(p); - } - - this.getAsControlPoint = function() { - var p = this.getPoint(); - this.control = p; - return p; - } - - this.getAsCurrentPoint = function() { - var p = this.getPoint(); - this.current = p; - return p; - } - - this.getReflectedControlPoint = function() { - if (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') { - return this.current; - } - - // reflect point - var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); - return p; - } - - this.makeAbsolute = function(p) { - if (this.isRelativeCommand()) { - p.x = this.current.x + p.x; - p.y = this.current.y + p.y; - } - return p; - } - - this.addMarker = function(p, from, priorTo) { - // if the last angle isn't filled in because we didn't have this point yet ... - if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) { - this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo); - } - this.addMarkerAngle(p, from == null ? null : from.angleTo(p)); - } - - this.addMarkerAngle = function(p, a) { - this.points.push(p); - this.angles.push(a); - } - - this.getMarkerPoints = function() { return this.points; } - this.getMarkerAngles = function() { - for (var i=0; i 1) { - rx *= Math.sqrt(l); - ry *= Math.sqrt(l); - } - // cx', cy' - var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt( - ((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) / - (Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2)) - ); - if (isNaN(s)) s = 0; - var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); - // cx, cy - var centp = new svg.Point( - (curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, - (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y - ); - // vector magnitude - var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); } - // ratio between two vectors - var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) } - // angle between two vectors - var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); } - // initial angle - var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]); - // angle delta - var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]; - var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry]; - var ad = a(u, v); - if (r(u,v) <= -1) ad = Math.PI; - if (r(u,v) >= 1) ad = 0; - - if (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI; - if (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI; - - // for markers - var halfWay = new svg.Point( - centp.x - rx * Math.cos((a1 + ad) / 2), - centp.y - ry * Math.sin((a1 + ad) / 2) - ); - pp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2); - pp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2); - - bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better - if (ctx != null) { - var r = rx > ry ? rx : ry; - var sx = rx > ry ? 1 : rx / ry; - var sy = rx > ry ? ry / rx : 1; - - ctx.translate(centp.x, centp.y); - ctx.rotate(xAxisRotation); - ctx.scale(sx, sy); - ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag); - ctx.scale(1/sx, 1/sy); - ctx.rotate(-xAxisRotation); - ctx.translate(-centp.x, -centp.y); - } - } - break; - case 'Z': - if (ctx != null) ctx.closePath(); - pp.current = pp.start; - } - } - - return bb; - } - - this.getMarkers = function() { - var points = this.PathParser.getMarkerPoints(); - var angles = this.PathParser.getMarkerAngles(); - - var markers = []; - for (var i=0; i this.maxDuration) { - // loop for indefinitely repeating animations - if (this.attribute('repeatCount').value == 'indefinite') { - this.duration = 0.0 - } - else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) { - this.removed = true; - this.getProperty().value = this.initialValue; - return true; - } - else { - return false; // no updates made - } - } - this.duration = this.duration + delta; - - // if we're past the begin time - var updated = false; - if (this.begin < this.duration) { - var newValue = this.calcValue(); // tween - - if (this.attribute('type').hasValue()) { - // for transform, etc. - var type = this.attribute('type').value; - newValue = type + '(' + newValue + ')'; - } - - this.getProperty().value = newValue; - updated = true; - } - - return updated; - } - - // fraction of duration we've covered - this.progress = function() { - return ((this.duration - this.begin) / (this.maxDuration - this.begin)); - } - } - svg.Element.AnimateBase.prototype = new svg.Element.ElementBase; - - // animate element - svg.Element.animate = function(node) { - this.base = svg.Element.AnimateBase; - this.base(node); - - this.calcValue = function() { - var from = this.attribute('from').numValue(); - var to = this.attribute('to').numValue(); - - // tween value linearly - return from + (to - from) * this.progress(); - }; - } - svg.Element.animate.prototype = new svg.Element.AnimateBase; - - // animate color element - svg.Element.animateColor = function(node) { - this.base = svg.Element.AnimateBase; - this.base(node); - - this.calcValue = function() { - var from = new RGBColor(this.attribute('from').value); - var to = new RGBColor(this.attribute('to').value); - - if (from.ok && to.ok) { - // tween color linearly - var r = from.r + (to.r - from.r) * this.progress(); - var g = from.g + (to.g - from.g) * this.progress(); - var b = from.b + (to.b - from.b) * this.progress(); - return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')'; - } - return this.attribute('from').value; - }; - } - svg.Element.animateColor.prototype = new svg.Element.AnimateBase; - - // animate transform element - svg.Element.animateTransform = function(node) { - this.base = svg.Element.animate; - this.base(node); - } - svg.Element.animateTransform.prototype = new svg.Element.animate; - - // font element - svg.Element.font = function(node) { - this.base = svg.Element.ElementBase; - this.base(node); - - this.horizAdvX = this.attribute('horiz-adv-x').numValue(); - - this.isRTL = false; - this.isArabic = false; - this.fontFace = null; - this.missingGlyph = null; - this.glyphs = []; - for (var i=0; i0 && text[i-1]!=' ' && i0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial'; - if (typeof(font.glyphs[c]) != 'undefined') { - glyph = font.glyphs[c][arabicForm]; - if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c]; - } - } - else { - glyph = font.glyphs[c]; - } - if (glyph == null) glyph = font.missingGlyph; - return glyph; - } - - this.renderChildren = function(ctx) { - var customFont = this.parent.style('font-family').Definition.getDefinition(); - if (customFont != null) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); - var text = this.getText(); - if (customFont.isRTL) text = text.split("").reverse().join(""); - - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - for (var i=0; i 0 ? node.childNodes[0].nodeValue : // element - node.text; - this.getText = function() { - return this.text; - } - } - svg.Element.tspan.prototype = new svg.Element.TextElementBase; - - // tref - svg.Element.tref = function(node) { - this.base = svg.Element.TextElementBase; - this.base(node); - - this.getText = function() { - var element = this.attribute('xlink:href').Definition.getDefinition(); - if (element != null) return element.children[0].getText(); - } - } - svg.Element.tref.prototype = new svg.Element.TextElementBase; - - // a element - svg.Element.a = function(node) { - this.base = svg.Element.TextElementBase; - this.base(node); - - this.hasText = true; - for (var i=0; i 1 ? node.childNodes[1].nodeValue : ''); - css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments - css = svg.compressSpaces(css); // replace whitespace - var cssDefs = css.split('}'); - for (var i=0; i 0) { - var urlStart = srcs[s].indexOf('url'); - var urlEnd = srcs[s].indexOf(')', urlStart); - var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6); - var doc = svg.parseXml(svg.ajax(url)); - var fonts = doc.getElementsByTagName('font'); - for (var f=0; f=0?a.substring(b):(b=a.length,""),d=[];while(b>0)d.push(a.substring(b-=3,b+3));return d.reverse().join(",")+c}function H(a,b){var c=Math.pow(10,Math.abs(8-b)*3);return{scale:b>8?function(a){return a/c}:function(a){return a*c},symbol:a}}function N(a){return function(b){return b<=0?0:b>=1?1:a(b)}}function O(a){return function(b){return 1-a(1-b)}}function P(a){return function(b){return.5*(b<.5?a(2*b):2-a(2-2*b))}}function Q(a){return a}function R(a){return function(b){return Math.pow(b,a)}}function S(a){return 1-Math.cos(a*Math.PI/2)}function T(a){return Math.pow(2,10*(a-1))}function U(a){return 1-Math.sqrt(1-a*a)}function V(a,b){var c;return arguments.length<2&&(b=.45),arguments.length<1?(a=1,c=b/4):c=b/(2*Math.PI)*Math.asin(1/a),function(d){return 1+a*Math.pow(2,10*-d)*Math.sin((d-c)*2*Math.PI/b)}}function W(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function X(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function Y(){d3.event.stopPropagation(),d3.event.preventDefault()}function Z(){var a=d3.event,b;while(b=a.sourceEvent)a=b;return a}function $(a){var b=new z,c=0,d=arguments.length;while(++c360?a-=360:a<0&&(a+=360),a<60?d+(e-d)*a/60:a<180?e:a<240?d+(e-d)*(240-a)/60:d}function g(a){return Math.round(f(a)*255)}var d,e;return a%=360,a<0&&(a+=360),b=b<0?0:b>1?1:b,c=c<0?0:c>1?1:c,e=c<=.5?c*(1+b):c+b-c*b,d=2*c-e,bd(g(a+120),g(a),g(a-120))}function bn(a){return i(a,bt),a}function bu(a){return function(){return bo(a,this)}}function bv(a){return function(){return bp(a,this)}}function bw(a,b){function f(){if(b=this.classList)return b.add(a);var b=this.className,d=b.baseVal!=null,e=d?b.baseVal:b;c.lastIndex=0,c.test(e)||(e=v(e+" "+a),d?b.baseVal=e:this.className=e)}function g(){if(b=this.classList)return b.remove(a);var b=this.className,d=b.baseVal!=null,e=d?b.baseVal:b;e=v(e.replace(c," ")),d?b.baseVal=e:this.className=e}function h(){(b.apply(this,arguments)?f:g).call(this)}var c=new RegExp("(^|\\s+)"+d3.requote(a)+"(\\s+|$)","g");if(arguments.length<2){var d=this.node();if(e=d.classList)return e.contains(a);var e=d.className;return c.lastIndex=0,c.test(e.baseVal!=null?e.baseVal:e)}return this.each(typeof b=="function"?h:b?f:g)}function bx(a){return{__data__:a}}function by(a){return function(){return bs(this,a)}}function bz(a){return arguments.length||(a=d3.ascending),function(b,c){return a(b&&b.__data__,c&&c.__data__)}}function bA(a,b){for(var c=0,d=a.length;cb?q():(m.active=b,d.forEach(function(b,c){(c=c.call(a,n,h))&&j.push(c)}),e.start.call(a,n,h),p(f)||d3.timer(p,0,c),1)}function p(c){if(m.active!==b)return q();var d=(c-k)/l,g=f(d),i=j.length;while(i>0)j[--i].call(a,g);if(d>=1)return q(),bK=b,e.end.call(a,n,h),bK=0,1}function q(){return--m.count||delete a.__transition__,1}var j=[],k=a.delay,l=a.duration,m=(a=a.node).__transition__||(a.__transition__={active:0,count:0}),n=a.__data__;++m.count,k<=g?o(g):d3.timer(o,k,c)})},0,c),a}function bG(a,b,c){return c!=""&&bF}function bH(a,b){function d(a,d,e){var f=b.call(this,a,d);return f==null?e!=""&&bF:e!=f&&c(e,f)}function e(a,d,e){return e!=b&&c(e,b)}var c=ba(a);return typeof b=="function"?d:b==null?bG:(b+="",e)}function bR(a){var b=bK,c=bQ,d=bO,e=bP;return bK=this.id,bQ=this.ease(),bA(this,function(b,c,d){bO=b.delay,bP=b.duration,a.call(b=b.node,b.__data__,c,d)}),bK=b,bQ=c,bO=d,bP=e,this}function bV(){var a,b=Date.now(),c=bS;while(c)a=b-c.then,a>=c.delay&&(c.flush=c.callback(a)),c=c.next;var d=bW()-b;d>24?(isFinite(d)&&(clearTimeout(bU),bU=setTimeout(bV,d)),bT=0):(bT=1,bX(bV))}function bW(){var a=null,b=bS,c=Infinity;while(b)b.flush?b=a?a.next=b.next:bS=b.next:(c=Math.min(c,b.then+b.delay),b=(a=b).next);return c}function bY(a){var b=[a.a,a.b],c=[a.c,a.d],d=b$(b),e=bZ(b,c),f=b$(b_(c,b,-e))||0;b[0]*c[1]2?cp:co,i=d?bc:bb;return e=g(a,b,i,c),f=g(b,a,i,d3.interpolate),h}function h(a){return e(a)}var e,f;return h.invert=function(a){return f(a)},h.domain=function(b){return arguments.length?(a=b.map(Number),g()):a},h.range=function(a){return arguments.length?(b=a,g()):b},h.rangeRound=function(a){return h.range(a).interpolate(d3.interpolateRound)},h.clamp=function(a){return arguments.length?(d=a,g()):d},h.interpolate=function(a){return arguments.length?(c=a,g()):c},h.ticks=function(b){return cm(a,b)},h.tickFormat=function(b){return cn(a,b)},h.nice=function(){return cg(a,ck),g()},h.copy=function(){return ci(a,b,c,d)},g()}function cj(a,b){return d3.rebind(a,b,"range","rangeRound","interpolate","clamp")}function ck(a){return a=Math.pow(10,Math.round(Math.log(a)/Math.LN10)-1),{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}}function cl(a,b){var c=ce(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return f<=.15?e*=10:f<=.35?e*=5:f<=.75&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+e*.5,c[2]=e,c}function cm(a,b){return d3.range.apply(d3,cl(a,b))}function cn(a,b){return d3.format(",."+Math.max(0,-Math.floor(Math.log(cl(a,b)[2])/Math.LN10+.01))+"f")}function co(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function cp(a,b,c,d){var e=[],f=[],g=0,h=Math.min(a.length,b.length)-1;a[h]0;j--)e.push(c(f)*j)}else{for(;fi;g--);e=e.slice(f,g)}return e},d.tickFormat=function(a,e){arguments.length<2&&(e=cr);if(arguments.length<1)return e;var f=Math.max(.1,a/d.ticks().length),g=b===ct?(h=-1e-12,Math.floor):(h=1e-12,Math.ceil),h;return function(a){return a/c(g(b(a)+h))<=f?e(a):""}},d.copy=function(){return cq(a.copy(),b)},cj(d,a)}function cs(a){return Math.log(a<0?0:a)/Math.LN10}function ct(a){return-Math.log(a>0?0:-a)/Math.LN10}function cu(a,b){function e(b){return a(c(b))}var c=cv(b),d=cv(1/b);return e.invert=function(b){return d(a.invert(b))},e.domain=function(b){return arguments.length?(a.domain(b.map(c)),e):a.domain().map(d)},e.ticks=function(a){return cm(e.domain(),a)},e.tickFormat=function(a){return cn(e.domain(),a)},e.nice=function(){return e.domain(cg(e.domain(),ck))},e.exponent=function(a){if(!arguments.length)return b;var f=e.domain();return c=cv(b=a),d=cv(1/b),e.domain(f)},e.copy=function(){return cu(a.copy(),b)},cj(e,a)}function cv(a){return function(b){return b<0?-Math.pow(-b,a):Math.pow(b,a)}}function cw(a,b){function f(b){return d[((c.get(b)||c.set(b,a.push(b)))-1)%d.length]}function g(b,c){return d3.range(a.length).map(function(a){return b+c*a})}var c,d,e;return f.domain=function(d){if(!arguments.length)return a;a=[],c=new j;var e=-1,g=d.length,h;while(++e1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j9&&(f=c*3/Math.sqrt(f),g[h]=f*d,g[h+1]=f*e));h=-1;while(++h<=i)f=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),b.push([f||0,g[h]*f||0]);return b}function dh(a){return a.length<3?cP(a):a[0]+cV(a,dg(a))}function di(a){var b,c=-1,d=a.length,e,f;while(++c1){var d=ce(a.domain()),e,f=-1,g=b.length,h=(b[1]-b[0])/++c,i,j;while(++f0;)(j=+b[f]-i*h)>=d[0]&&e.push(j);for(--f,i=0;++id&&(c=b,d=e);return c}function d_(a){return a.reduce(ea,0)}function ea(a,b){return a+b[1]}function eb(a,b){return ec(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function ec(a,b){var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];while(++c<=b)f[c]=e*c+d;return f}function ed(a){return[d3.min(a),d3.max(a)]}function ee(a,b){return d3.rebind(a,b,"sort","children","value"),a.links=ei,a.nodes=function(b){return ej=!0,(a.nodes=a)(b)},a}function ef(a){return a.children}function eg(a){return a.value}function eh(a,b){return b.value-a.value}function ei(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function ek(a,b){return a.value-b.value}function el(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function em(a,b){a._pack_next=b,b._pack_prev=a}function en(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return e*e-c*c-d*d>.001}function eo(a){function l(a){b=Math.min(a.x-a.r,b),c=Math.max(a.x+a.r,c),d=Math.min(a.y-a.r,d),e=Math.max(a.y+a.r,e)}var b=Infinity,c=-Infinity,d=Infinity,e=-Infinity,f=a.length,g,h,i,j,k;a.forEach(ep),g=a[0],g.x=-g.r,g.y=0,l(g);if(f>1){h=a[1],h.x=h.r,h.y=0,l(h);if(f>2){i=a[2],et(g,h,i),l(i),el(g,i),g._pack_prev=i,el(i,h),h=g._pack_next;for(var m=3;m0&&(a=d)}return a}function eC(a,b){return a.x-b.x}function eD(a,b){return b.x-a.x}function eE(a,b){return a.depth-b.depth}function eF(a,b){function c(a,d){var e=a.children;if(e&&(i=e.length)){var f,g=null,h=-1,i;while(++h=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function eH(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function eI(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function eJ(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function eK(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return e<0&&(c+=e/2,e=0),f<0&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}function eL(a){return a.map(eM).join(",")}function eM(a){return/[",\n]/.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}function eO(a,b){return function(c){return c&&a.hasOwnProperty(c.type)?a[c.type](c):b}}function eP(a){return"m0,"+a+"a"+a+","+a+" 0 1,1 0,"+ -2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function eQ(a,b){eR.hasOwnProperty(a.type)&&eR[a.type](a,b)}function eS(a,b){eQ(a.geometry,b)}function eT(a,b){for(var c=a.features,d=0,e=c.length;d0}function fg(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function fh(a,b,c,d){var e=a[0],f=b[0],g=c[0],h=d[0],i=a[1],j=b[1],k=c[1],l=d[1],m=e-g,n=f-e,o=h-g,p=i-k,q=j-i,r=l-k,s=(o*p-r*m)/(r*n-o*q);return[e+s*n,i+s*q]}function fj(a,b){var c={list:a.map(function(a,b){return{index:b,x:a[0],y:a[1]}}).sort(function(a,b){return a.yb.y?1:a.xb.x?1:0}),bottomSite:null},d={list:[],leftEnd:null,rightEnd:null,init:function(){d.leftEnd=d.createHalfEdge(null,"l"),d.rightEnd=d.createHalfEdge(null,"l"),d.leftEnd.r=d.rightEnd,d.rightEnd.l=d.leftEnd,d.list.unshift(d.leftEnd,d.rightEnd)},createHalfEdge:function(a,b){return{edge:a,side:b,vertex:null,l:null,r:null}},insert:function(a,b){b.l=a,b.r=a.r,a.r.l=b,a.r=b},leftBound:function(a){var b=d.leftEnd;do b=b.r;while(b!=d.rightEnd&&e.rightOf(b,a));return b=b.l,b},del:function(a){a.l.r=a.r,a.r.l=a.l,a.edge=null},right:function(a){return a.r},left:function(a){return a.l},leftRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[a.side]},rightRegion:function(a){return a.edge==null?c.bottomSite:a.edge.region[fi[a.side]]}},e={bisect:function(a,b){var c={region:{l:a,r:b},ep:{l:null,r:null}},d=b.x-a.x,e=b.y-a.y,f=d>0?d:-d,g=e>0?e:-e;return c.c=a.x*d+a.y*e+(d*d+e*e)*.5,f>g?(c.a=1,c.b=e/d,c.c/=d):(c.b=1,c.a=d/e,c.c/=e),c},intersect:function(a,b){var c=a.edge,d=b.edge;if(!c||!d||c.region.r==d.region.r)return null;var e=c.a*d.b-c.b*d.a;if(Math.abs(e)<1e-10)return null;var f=(c.c*d.b-d.c*c.b)/e,g=(d.c*c.a-c.c*d.a)/e,h=c.region.r,i=d.region.r,j,k;h.y=k.region.r.x;return l&&j.side==="l"||!l&&j.side==="r"?null:{x:f,y:g}},rightOf:function(a,b){var c=a.edge,d=c.region.r,e=b.x>d.x;if(e&&a.side==="l")return 1;if(!e&&a.side==="r")return 0;if(c.a===1){var f=b.y-d.y,g=b.x-d.x,h=0,i=0;!e&&c.b<0||e&&c.b>=0?i=h=f>=c.b*g:(i=b.x+b.y*c.b>c.c,c.b<0&&(i=!i),i||(h=1));if(!h){var j=d.x-c.region.l.x;i=c.b*(g*g-f*f)m*m+n*n}return a.side==="l"?i:!i},endPoint:function(a,c,d){a.ep[c]=d;if(!a.ep[fi[c]])return;b(a)},distance:function(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}},f={list:[],insert:function(a,b,c){a.vertex=b,a.ystar=b.y+c;for(var d=0,e=f.list,g=e.length;dh.ystar||a.ystar==h.ystar&&b.x>h.vertex.x)continue;break}e.splice(d,0,a)},del:function(a){for(var b=0,c=f.list,d=c.length;bo.y&&(p=n,n=o,o=p,t="r"),s=e.bisect(n,o),m=d.createHalfEdge(s,t),d.insert(k,m),e.endPoint(s,fi[t],r),q=e.intersect(k,m),q&&(f.del(k),f.insert(k,q,e.distance(q,n))),q=e.intersect(m,l),q&&f.insert(m,q,e.distance(q,n));else break}for(i=d.right(d.leftEnd);i!=d.rightEnd;i=d.right(i))b(i.edge)}function fk(){return{leaf:!0,nodes:[],point:null}}function fl(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=(c+e)*.5,h=(d+f)*.5,i=b.nodes;i[0]&&fl(a,i[0],c,d,g,h),i[1]&&fl(a,i[1],g,d,e,h),i[2]&&fl(a,i[2],c,h,g,f),i[3]&&fl(a,i[3],g,h,e,f)}}function fm(a){return{x:a[0],y:a[1]}}function fo(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function fq(a,b,c,d){var e,f,g=0,h=b.length,i=c.length;while(g=i)return-1;e=b.charCodeAt(g++);if(e==37){f=fw[b.charAt(g++)];if(!f||(d=f(a,c,d))<0)return-1}else if(e!=c.charCodeAt(d++))return-1}return d}function fx(a,b,c){return fz.test(b.substring(c,c+=3))?c:-1}function fy(a,b,c){fA.lastIndex=0;var d=fA.exec(b.substring(c,c+10));return d?c+=d[0].length:-1}function fC(a,b,c){var d=fD.get(b.substring(c,c+=3).toLowerCase());return d==null?-1:(a.m=d,c)}function fE(a,b,c){fF.lastIndex=0;var d=fF.exec(b.substring(c,c+12));return d?(a.m=fG.get(d[0].toLowerCase()),c+=d[0].length):-1}function fI(a,b,c){return fq(a,fv.c.toString(),b,c)}function fJ(a,b,c){return fq(a,fv.x.toString(),b,c)}function fK(a,b,c){return fq(a,fv.X.toString(),b,c)}function fL(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+4));return d?(a.y=+d[0],c+=d[0].length):-1}function fM(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+2));return d?(a.y=fN()+ +d[0],c+=d[0].length):-1}function fN(){return~~((new Date).getFullYear()/1e3)*1e3}function fO(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+2));return d?(a.m=d[0]-1,c+=d[0].length):-1}function fP(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+2));return d?(a.d=+d[0],c+=d[0].length):-1}function fQ(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+2));return d?(a.H=+d[0],c+=d[0].length):-1}function fR(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+2));return d?(a.M=+d[0],c+=d[0].length):-1}function fS(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+2));return d?(a.S=+d[0],c+=d[0].length):-1}function fT(a,b,c){fU.lastIndex=0;var d=fU.exec(b.substring(c,c+3));return d?(a.L=+d[0],c+=d[0].length):-1}function fV(a,b,c){var d=fW.get(b.substring(c,c+=2).toLowerCase());return d==null?-1:(a.p=d,c)}function fX(a){var b=a.getTimezoneOffset(),c=b>0?"-":"+",d=~~(Math.abs(b)/60),e=Math.abs(b)%60;return c+fr(d)+fr(e)}function fZ(a){return a.toISOString()}function f$(a,b,c){function d(b){var c=a(b),d=f(c,1);return b-c1)while(gb?1:a>=b?0:NaN},d3.descending=function(a,b){return ba?1:b>=a?0:NaN},d3.mean=function(a,b){var c=a.length,d,e=0,f=-1,g=0;if(arguments.length===1)while(++f1&&(a=a.map(b)),a=a.filter(r),a.length?d3.quantile(a.sort(d3.ascending),.5):undefined},d3.min=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++cf&&(e=f)}else{while(++cf&&(e=f)}return e},d3.max=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++ce&&(e=f)}else{while(++ce&&(e=f)}return e},d3.extent=function(a,b){var c=-1,d=a.length,e,f,g;if(arguments.length===1){while(++cf&&(e=f),gf&&(e=f),g1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}}},d3.sum=function(a,b){var c=0,d=a.length,e,f=-1;if(arguments.length===1)while(++f>1;a.call(b,b[f],f)>1;c0&&(e=f);return e},d3.last=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c=b.length)return e?e.call(a,c):d?c.sort(d):c;var h=-1,i=c.length,k=b[g++],l,m,n=new j,o,p={};while(++h=b.length)return a;var e=[],f=c[d++],h;for(h in a)e.push({key:h,values:g(a[h],d)});return f&&e.sort(function(a,b){return f(a.key,b.key)}),e}var a={},b=[],c=[],d,e;return a.map=function(a){return f(a,0)},a.entries=function(a){return g(f(a,0),0)},a.key=function(c){return b.push(c),a},a.sortKeys=function(d){return c[b.length-1]=d,a},a.sortValues=function(b){return d=b,a},a.rollup=function(b){return e=b,a},a},d3.keys=function(a){var b=[];for(var c in a)b.push(c);return b},d3.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},d3.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},d3.permute=function(a,b){var c=[],d=-1,e=b.length;while(++db)d.push(g/e);else while((g=a+c*++f)=200&&a<300||a===304?d:null)}},d.send(null)},d3.text=function(a,b,c){function d(a){c(a&&a.responseText)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)},d3.json=function(a,b){d3.text(a,"application/json",function(a){b(a?JSON.parse(a):null)})},d3.html=function(a,b){d3.text(a,"text/html",function(a){if(a!=null){var c=document.createRange();c.selectNode(document.body),a=c.createContextualFragment(a)}b(a)})},d3.xml=function(a,b,c){function d(a){c(a&&a.responseXML)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)};var y={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:y,qualify:function(a){var b=a.indexOf(":"),c=a;return b>=0&&(c=a.substring(0,b),a=a.substring(b+1)),y.hasOwnProperty(c)?{space:y[c],local:a}:a}},d3.dispatch=function(){var a=new z,b=-1,c=arguments.length;while(++b0&&(d=a.substring(c+1),a=a.substring(0,c)),arguments.length<2?this[a].on(d):this[a].on(d,b)},d3.format=function(a){var b=B.exec(a),c=b[1]||" ",d=b[3]||"",e=b[5],f=+b[6],g=b[7],h=b[8],i=b[9],j=1,k="",l=!1;h&&(h=+h.substring(1)),e&&(c="0",g&&(f-=Math.floor((f-1)/4)));switch(i){case"n":g=!0,i="g";break;case"%":j=100,k="%",i="f";break;case"p":j=100,k="%",i="r";break;case"d":l=!0,h=0;break;case"s":j=-1,i="r"}return i=="r"&&!h&&(i="g"),i=C.get(i)||E,function(a){if(l&&a%1)return"";var b=a<0&&(a=-a)?"−":d;if(j<0){var m=d3.formatPrefix(a,h);a=m.scale(a),k=m.symbol}else a*=j;a=i(a,h);if(e){var n=a.length+b.length;n=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,C=d3.map({g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return d3.round(a,b=D(a,b)).toFixed(Math.max(0,Math.min(20,b)))}}),G=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(H);d3.formatPrefix=function(a,b){var c=0;return a&&(a<0&&(a*=-1),b&&(a=d3.round(a,D(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,Math.floor((c<=0?c+1:c-1)/3)*3))),G[8+c/3]};var I=R(2),J=R(3),K=function(){return Q},L=d3.map({linear:K,poly:R,quad:function(){return I},cubic:function(){return J},sin:function(){return S},exp:function(){return T},circle:function(){return U},elastic:V,back:W,bounce:function(){return X}}),M=d3.map({"in":Q,out:O,"in-out":P,"out-in":function(a){return P(O(a))}});d3.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return c=L.get(c)||K,d=M.get(d)||Q,N(d(c.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.interpolate=function(a,b){var c=d3.interpolators.length,d;while(--c>=0&&!(d=d3.interpolators[c](a,b)));return d},d3.interpolateNumber=function(a,b){return b-=a,function(c){return a+b*c}},d3.interpolateRound=function(a,b){return b-=a,function(c){return Math.round(a+b*c)}},d3.interpolateString=function(a,b){var c,d,e,f=0,g=0,h=[],i=[],j,k;_.lastIndex=0;for(d=0;c=_.exec(b);++d)c.index&&h.push(b.substring(f,g=c.index)),i.push({i:h.length,x:c[0]}),h.push(null),f=_.lastIndex;f180?k+=360:k-j>180&&(j+=360),d.push({i:c.push(c.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(j,k)})):k&&c.push(c.pop()+"rotate("+k+")"),l!=m?d.push({i:c.push(c.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(l,m)}):m&&c.push(c.pop()+"skewX("+m+")"),n[0]!=o[0]||n[1]!=o[1]?(e=c.push(c.pop()+"scale(",null,",",null,")"),d.push({i:e-4,x:d3.interpolateNumber(n[0],o[0])},{i:e-2,x:d3.interpolateNumber(n[1],o[1])})):(o[0]!=1||o[1]!=1)&&c.push(c.pop()+"scale("+o+")"),e=d.length,function(a){var b=-1,f;while(++b180?f-=360:f<-180&&(f+=360),function(a){return bm(c+f*a,d+g*a,e+h*a).toString()}},d3.interpolateArray=function(a,b){var c=[],d=[],e=a.length,f=b.length,g=Math.min(a.length,b.length),h;for(h=0;h1){while(++e=0;)if(f=c[d])e&&e!==f.nextSibling&&e.parentNode.insertBefore(f,e),e=f;return this},bt.sort=function(a){a=bz.apply(this,arguments);for(var b=-1,c=this.length;++b0&&(a=a.substring(0,e)),arguments.length<2?(e=this.node()[d])&&e._:this.each(function(e,f){function i(a){var c=d3.event;d3.event=a;try{b.call(g,g.__data__,f)}finally{d3.event=c}}var g=this,h=g[d];h&&(g.removeEventListener(a,h,h.$),delete g[d]),b&&(g.addEventListener(a,g[d]=i,i.$=c),i._=b)})},bt.each=function(a){return bA(this,function(b,c,d){a.call(b,b.__data__,c,d)})},bt.call=function(a){return a.apply(this,(arguments[0]=this,arguments)),this},bt.empty=function(){return!this.node()},bt.node=function(a){for(var b=0,c=this.length;b=cF?e?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":e?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+e*m+","+e*n+"A"+e+","+e+" 0 "+j+",0 "+e*k+","+e*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0"+"Z"}var a=cG,b=cH,c=cI,d=cJ;return e.innerRadius=function(b){return arguments.length?(a=p(b),e):a},e.outerRadius=function(a){return arguments.length?(b=p(a),e):b},e.startAngle=function(a){return arguments.length?(c=p(a),e):c},e.endAngle=function(a){return arguments.length?(d=p(a),e):d},e.centroid=function(){var e=(a.apply(this,arguments)+b.apply(this,arguments))/2,f=(c.apply(this,arguments)+d.apply(this,arguments))/2+cE;return[Math.cos(f)*e,Math.sin(f)*e]},e};var cE=-Math.PI/2,cF=2*Math.PI-1e-6;d3.svg.line=function(){return cK(m)};var cN="linear",cO=d3.map({linear:cP,"step-before":cQ,"step-after":cR,basis:cX,"basis-open":cY,"basis-closed":cZ,bundle:c$,cardinal:cU,"cardinal-open":cS,"cardinal-closed":cT,monotone:dh}),da=[0,2/3,1/3,0],db=[0,1/3,2/3,0],dc=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var a=cK(di);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},cQ.reverse=cR,cR.reverse=cQ,d3.svg.area=function(){return dj(Object)},d3.svg.area.radial=function(){var a=dj(di);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},d3.svg.chord=function(){function f(c,d){var e=g(this,a,c,d),f=g(this,b,c,d);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(h(e,f)?j(e.r,e.p1,e.r,e.p0):j(e.r,e.p1,f.r,f.p0)+i(f.r,f.p1,f.a1-f.a0)+j(f.r,f.p1,e.r,e.p0))+"Z"}function g(a,b,f,g){var h=b.call(a,f,g),i=c.call(a,h,g),j=d.call(a,h,g)+cE,k=e.call(a,h,g)+cE;return{r:i,a0:j,a1:k,p0:[i*Math.cos(j),i*Math.sin(j)],p1:[i*Math.cos(k),i*Math.sin(k)]}}function h(a,b){return a.a0==b.a0&&a.a1==b.a1}function i(a,b,c){return"A"+a+","+a+" 0 "+ +(c>Math.PI)+",1 "+b}function j(a,b,c,d){return"Q 0,0 "+d}var a=dk,b=dl,c=dm,d=cI,e=cJ;return f.radius=function(a){return arguments.length?(c=p(a),f):c},f.source=function(b){return arguments.length?(a=p(b),f):a},f.target=function(a){return arguments.length?(b=p(a),f):b},f.startAngle=function(a){return arguments.length?(d=p(a),f):d},f.endAngle=function(a){return arguments.length?(e=p(a),f):e},f},d3.svg.diagonal=function(){function d(d,e){var f=a.call(this,d,e),g=b.call(this,d,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(c),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var a=dk,b=dl,c=dq;return d.source=function(b){return arguments.length?(a=p(b),d):a},d.target=function(a){return arguments.length?(b=p(a),d):b},d.projection=function(a){return arguments.length?(c=a,d):c},d},d3.svg.diagonal -.radial=function(){var a=d3.svg.diagonal(),b=dq,c=a.projection;return a.projection=function(a){return arguments.length?c(dr(b=a)):b},a},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function c(c,d){return(dv.get(a.call(this,c,d))||du)(b.call(this,c,d))}var a=dt,b=ds;return c.type=function(b){return arguments.length?(a=p(b),c):a},c.size=function(a){return arguments.length?(b=p(a),c):b},c};var dv=d3.map({circle:du,cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+ -3*b+","+ -b+"H"+ -b+"V"+ -3*b+"H"+b+"V"+ -b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+ -b+"V"+b+"H"+ -3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*dx)),c=b*dx;return"M0,"+ -b+"L"+c+",0"+" 0,"+b+" "+ -c+",0"+"Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+ -b+","+ -b+"L"+b+","+ -b+" "+b+","+b+" "+ -b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/dw),c=b*dw/2;return"M0,"+c+"L"+b+","+ -c+" "+ -b+","+ -c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/dw),c=b*dw/2;return"M0,"+ -c+"L"+b+","+c+" "+ -b+","+c+"Z"}});d3.svg.symbolTypes=dv.keys();var dw=Math.sqrt(3),dx=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function k(k){k.each(function(){var k=d3.select(this),l=h==null?a.ticks?a.ticks.apply(a,g):a.domain():h,m=i==null?a.tickFormat?a.tickFormat.apply(a,g):String:i,n=dA(a,l,j),o=k.selectAll(".minor").data(n,String),p=o.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),q=d3.transition(o.exit()).style("opacity",1e-6).remove(),r=d3.transition(o).style("opacity",1),s=k.selectAll("g").data(l,String),t=s.enter().insert("g","path").style("opacity",1e-6),u=d3.transition(s.exit()).style("opacity",1e-6).remove(),v=d3.transition(s).style("opacity",1),w,x=cf(a),y=k.selectAll(".domain").data([0]),z=y.enter().append("path").attr("class","domain"),A=d3.transition(y),B=a.copy(),C=this.__chart__||B;this.__chart__=B,t.append("line").attr("class","tick"),t.append("text");var D=t.select("line"),E=v.select("line"),F=s.select("text").text(m),G=t.select("text"),H=v.select("text");switch(b){case"bottom":w=dy,p.attr("y2",d),r.attr("x2",0).attr("y2",d),D.attr("y2",c),G.attr("y",Math.max(c,0)+f),E.attr("x2",0).attr("y2",c),H.attr("x",0).attr("y",Math.max(c,0)+f),F.attr("dy",".71em").attr("text-anchor","middle"),A.attr("d","M"+x[0]+","+e+"V0H"+x[1]+"V"+e);break;case"top":w=dy,p.attr("y2",-d),r.attr("x2",0).attr("y2",-d),D.attr("y2",-c),G.attr("y",-(Math.max(c,0)+f)),E.attr("x2",0).attr("y2",-c),H.attr("x",0).attr("y",-(Math.max(c,0)+f)),F.attr("dy","0em").attr("text-anchor","middle"),A.attr("d","M"+x[0]+","+ -e+"V0H"+x[1]+"V"+ -e);break;case"left":w=dz,p.attr("x2",-d),r.attr("x2",-d).attr("y2",0),D.attr("x2",-c),G.attr("x",-(Math.max(c,0)+f)),E.attr("x2",-c).attr("y2",0),H.attr("x",-(Math.max(c,0)+f)).attr("y",0),F.attr("dy",".32em").attr("text-anchor","end"),A.attr("d","M"+ -e+","+x[0]+"H0V"+x[1]+"H"+ -e);break;case"right":w=dz,p.attr("x2",d),r.attr("x2",d).attr("y2",0),D.attr("x2",c),G.attr("x",Math.max(c,0)+f),E.attr("x2",c).attr("y2",0),H.attr("x",Math.max(c,0)+f).attr("y",0),F.attr("dy",".32em").attr("text-anchor","start"),A.attr("d","M"+e+","+x[0]+"H0V"+x[1]+"H"+e)}if(a.ticks)t.call(w,C),v.call(w,B),u.call(w,B),p.call(w,C),r.call(w,B),q.call(w,B);else{var I=B.rangeBand()/2,J=function(a){return B(a)+I};t.call(w,J),v.call(w,J)}})}var a=d3.scale.linear(),b="bottom",c=6,d=6,e=6,f=3,g=[10],h=null,i,j=0;return k.scale=function(b){return arguments.length?(a=b,k):a},k.orient=function(a){return arguments.length?(b=a,k):b},k.ticks=function(){return arguments.length?(g=arguments,k):g},k.tickValues=function(a){return arguments.length?(h=a,k):h},k.tickFormat=function(a){return arguments.length?(i=a,k):i},k.tickSize=function(a,b,f){if(!arguments.length)return c;var g=arguments.length-1;return c=+a,d=g>1?+b:c,e=g>0?+arguments[g]:c,k},k.tickPadding=function(a){return arguments.length?(f=+a,k):f},k.tickSubdivide=function(a){return arguments.length?(j=+a,k):j},k},d3.svg.brush=function(){function g(a){a.each(function(){var a=d3.select(this),e=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),l=a.selectAll(".resize").data(d,String),m;a.style("pointer-events","all").on("mousedown.brush",k).on("touchstart.brush",k),e.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),l.enter().append("g").attr("class",function(a){return"resize "+a}).style("cursor",function(a){return dB[a]}).append("rect").attr("x",function(a){return/[ew]$/.test(a)?-3:null}).attr("y",function(a){return/^[ns]/.test(a)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),l.style("display",g.empty()?"none":null),l.exit().remove(),b&&(m=cf(b),e.attr("x",m[0]).attr("width",m[1]-m[0]),i(a)),c&&(m=cf(c),e.attr("y",m[0]).attr("height",m[1]-m[0]),j(a)),h(a)})}function h(a){a.selectAll(".resize").attr("transform",function(a){return"translate("+e[+/e$/.test(a)][0]+","+e[+/^s/.test(a)][1]+")"})}function i(a){a.select(".extent").attr("x",e[0][0]),a.selectAll(".extent,.n>rect,.s>rect").attr("width",e[1][0]-e[0][0])}function j(a){a.select(".extent").attr("y",e[0][1]),a.selectAll(".extent,.e>rect,.w>rect").attr("height",e[1][1]-e[0][1])}function k(){function x(){var a=d3.event.changedTouches;return a?d3.touches(d,a)[0]:d3.mouse(d)}function y(){d3.event.keyCode==32&&(q||(r=null,s[0]-=e[1][0],s[1]-=e[1][1],q=2),Y())}function z(){d3.event.keyCode==32&&q==2&&(s[0]+=e[1][0],s[1]+=e[1][1],q=0,Y())}function A(){var a=x(),d=!1;t&&(a[0]+=t[0],a[1]+=t[1]),q||(d3.event.altKey?(r||(r=[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]),s[0]=e[+(a[0]0?e=c:e=0:c>0&&(b.start({type:"start",alpha:e=c}),d3.timer(a.tick)),a):e},a.start=function(){function p(a,c){var d=t(b),e=-1,f=d.length,g;while(++ee&&(e=h),d.push(h)}for(g=0;g0){f=-1;while(++f=i[0]&&o<=i[1]&&(k=g[d3.bisect(j,o,1,m)-1],k.y+=n,k.push(e[f]))}return g}var a=!0,b=Number,c=ed,d=eb;return e.value=function(a){return arguments.length?(b=a,e):b},e.range=function(a){return arguments.length?(c=p(a),e):c},e.bins=function(a){return arguments.length?(d=typeof a=="number"?function(b){return ec(b,a)}:p(a),e):d},e.frequency=function(b){return arguments.length?(a=!!b,e):a},e},d3.layout.hierarchy=function(){function d(e,g,h){var i=b.call(f,e,g),j=ej?e:{data:e};j.depth=g,h.push(j);if(i&&(l=i.length)){var k=-1,l,m=j.children=[],n=0,o=g+1,p;while(++k0&&(eH(eI(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!eA(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!ez(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}var f=a.call(this,d,e),g=f[0];eF(g,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),h(g),i(g,-g._tree.prelim);var k=eB(g,eD),l=eB(g,eC),m=eB(g,eE),n=k.x-b(k,l)/2,o=l.x+b(l,k)/2,p=m.depth||1;return eF(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=a.depth/p*c[1],delete a._tree}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=ey,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},ee(d,a)},d3.layout.treemap=function(){function i(a,b){var c=-1,d=a.length,e,f;while(++c0)d.push(g=f[o-1]),d.area+=g.area,(k=l(d,n))<=h?(f.pop(),h=k):(d.area-=d.pop().area,m(d,n,c,!1),n=Math.min(c.dx,c.dy),d.length=d.area=0,h=Infinity);d.length&&(m(d,n,c,!0),d.length=d.area=0),b.forEach(j)}}function k(a){var b=a.children;if(b&&b.length){var c=e(a),d=b.slice(),f,g=[];i(d,c.dx*c.dy/a.value),g.area=0;while(f=d.pop())g.push(f),g.area+=f.area,f.z!=null&&(m(g,f.z?c.dx:c.dy,c,!d.length),g.length=g.area=0);b.forEach(k)}}function l(a,b){var c=a.area,d,e=0,f=Infinity,g=-1,i=a.length;while(++ge&&(e=d)}return c*=c,b*=b,c?Math.max(b*e*h/c,c/(b*f*h)):Infinity}function m(a,c,d,e){var f=-1,g=a.length,h=d.x,i=d.y,j=c?b(a.area/c):0,k;if(c==d.dx){if(e||j>d.dy)j=d.dy;while(++fd.dx)j=d.dx;while(++f=a.length)return d;if(i)return i=!1,c;var b=f.lastIndex;if(a.charCodeAt(b)===34){var e=b;while(e++50?b:f<-140?c:g<21?d:a)(e)}var a=d3.geo.albers(),b=d3.geo.albers().origin([-160,60]).parallels([55,65]),c=d3.geo.albers().origin([-160,20]).parallels([8,18]),d=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(f){return arguments.length?(a.scale(f),b.scale(f*.6),c.scale(f),d.scale(f*1.5),e.translate(a.translate())):a.scale()},e.translate=function(f){if(!arguments.length)return a.translate();var g=a.scale()/1e3,h=f[0],i=f[1];return a.translate(f),b.translate([h-400*g,i+170*g]),c.translate([h-190*g,i+200*g]),d.translate([h+580*g,i+430*g]),e},e.scale(a.scale())},d3.geo.bonne=function(){function g(g){var h=g[0]*eN-c,i=g[1]*eN-d;if(e){var j=f+e-i,k=h*Math.cos(i)/j;h=j*Math.sin(k),i=j*Math.cos(k)-f}else h*=Math.cos(i),i*=-1;return[a*h+b[0],a*i+b[1]]}var a=200,b=[480,250],c,d,e,f;return g.invert=function(d){var g=(d[0]-b[0])/a,h=(d[1]-b[1])/a;if(e){var i=f+h,j=Math.sqrt(g*g+i*i);h=f+e-j,g=c+j*Math.atan2(g,i)/Math.cos(h)}else h*=-1,g/=Math.cos(h);return[g/eN,h/eN]},g.parallel=function(a){return arguments.length?(f=1/Math.tan(e=a*eN),g):e/eN},g.origin=function(a){return arguments.length?(c=a[0]*eN,d=a[1]*eN,g):[c/eN,d/eN]},g.scale=function(b){return arguments.length?(a=+b,g):a},g.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],g):b},g.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function c(c){var d=c[0]/360,e=-c[1]/360;return[a*d+b[0],a*e+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,-360*e]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.mercator=function(){function c(c){var d=c[0]/360,e=-(Math.log(Math.tan(Math.PI/4+c[1]*eN/2))/eN)/360;return[a*d+b[0],a*Math.max(-0.5,Math.min(.5,e))+b[1]]}var a=500,b=[480,250];return c.invert=function(c){var d=(c[0]-b[0])/a,e=(c[1]-b[1])/a;return[360*d,2*Math.atan(Math.exp(-360*e*eN))/eN-90]},c.scale=function(b){return arguments.length?(a=+b,c):a},c.translate=function(a){return arguments.length?(b=[+a[0],+a[1]],c):b},c},d3.geo.path=function(){function e(c,e){typeof a=="function"&&(b=eP(a.apply(this,arguments))),g(c);var f=d.length?d.join(""):null;return d=[],f}function f(a){return c(a).join(",")}function i(a){var b=l(a[0]),c=0,d=a.length;while(++c0){d.push("M");while(++h0){d.push("M");while(++kd&&(d=a),fe&&(e=f)}),[[b,c],[d,e]]};var eR={Feature:eS,FeatureCollection:eT,GeometryCollection:eU,LineString:eV,MultiLineString:eW,MultiPoint:eV,MultiPolygon:eX,Point:eY,Polygon:eZ};d3.geo.circle=function(){function e(){}function f(a){return d.distance(a)=k*k+l*l?d[f].index=-1:(d[m].index=-1,o=d[f].angle,m=f,n=g)):(o=d[f].angle,m=f,n=g);e.push(h);for(f=0,g=0;f<2;++g)d[g].index!==-1&&(e.push(d[g].index),f++);p=e.length;for(;g=0?(c=a.ep.r,d=a.ep.l):(c=a.ep.l,d=a.ep.r),a.a===1?(g=c?c.y:-1e6,e=a.c-a.b*g,h=d?d.y:1e6,f=a.c-a.b*h):(e=c?c.x:-1e6,g=a.c-a.a*e,f=d?d.x:1e6,h=a.c-a.a*f);var i=[e,g],j=[f,h];b[a.region.l.index].push(i,j),b[a.region.r.index].push(i,j)}),b.map(function(b,c){var d=a[c][0],e=a[c][1];return b.forEach(function(a){a.angle=Math.atan2(a[0]-d,a[1]-e)}),b.sort(function(a,b){return a.angle-b.angle}).filter(function(a,c){return!c||a.angle-b[c-1].angle>1e-10})})};var fi={l:"r",r:"l"};d3.geom.delaunay=function(a){var b=a.map(function(){return[]}),c=[];return fj(a,function(c){b[c.region.l.index].push(a[c.region.r.index])}),b.forEach(function(b,d){var e=a[d],f=e[0],g=e[1];b.forEach(function(a){a.angle=Math.atan2(a[0]-f,a[1]-g)}),b.sort(function(a,b){return a.angle-b.angle});for(var h=0,i=b.length-1;h=g,j=b.y>=h,l=(j<<1)+i;a.leaf=!1,a=a.nodes[l]||(a.nodes[l]=fk()),i?c=g:e=g,j?d=h:f=h,k(a,b,c,d,e,f)}var f,g=-1,h=a.length;h&&isNaN(a[0].x)&&(a=a.map(fm));if(arguments.length<5)if(arguments.length===3)e=d=c,c=b;else{b=c=Infinity,d=e=-Infinity;while(++gd&&(d=f.x),f.y>e&&(e=f.y);var i=d-b,j=e-c;i>j?e=c+i:d=b+j}var m=fk();return m.add=function(a){k(m,a,b,c,d,e)},m.visit=function(a){fl(a,m,b,c,d,e)},a.forEach(m.add),m},d3.time={};var fn=Date;fo.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){fp.setUTCDate.apply(this._,arguments)},setDay:function(){fp.setUTCDay.apply(this._,arguments)},setFullYear:function(){fp.setUTCFullYear.apply(this._,arguments)},setHours:function(){fp.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){fp.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){fp.setUTCMinutes.apply(this._,arguments)},setMonth:function(){fp.setUTCMonth.apply(this._,arguments)},setSeconds:function(){fp.setUTCSeconds.apply(this._,arguments)},setTime:function(){fp.setTime.apply(this._,arguments)}};var fp=Date.prototype;d3.time.format=function(a){function c(c){var d=[],e=-1,f=0,g,h;while(++e=12?"PM":"AM"},S:function(a){return fr(a.getSeconds())},U:function(a){return fr(d3.time.sundayOfYear(a))},w:function(a){return a.getDay()},W:function(a){return fr(d3.time.mondayOfYear(a))},x:d3.time.format("%m/%d/%y"),X:d3.time.format("%H:%M:%S"),y:function(a){return fr(a.getFullYear()%100)},Y:function(a){return ft(a.getFullYear()%1e4)},Z:fX,"%":function(a){return"%"}},fw={a:fx,A:fy,b:fC,B:fE,c:fI,d:fP,e:fP,H:fQ,I:fQ,L:fT,m:fO,M:fR,p:fV,S:fS,x:fJ,X:fK,y:fM,Y:fL},fz=/^(?:sun|mon|tue|wed|thu|fri|sat)/i,fA=/^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/i,fB=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],fD=d3.map({jan:0,feb:1,mar:2,apr:3,may:4,jun:5,jul:6,aug:7,sep:8,oct:9,nov:10,dec:11}),fF=/^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig,fG=d3.map({january:0,february:1,march:2,april:3,may:4,june:5,july:6,august:7,september:8,october:9,november:10,december:11}),fH=["January","February","March","April","May","June","July","August","September","October","November","December"],fU=/\s*\d+/,fW=d3.map({am:0,pm:1});d3.time.format.utc=function(a){function c(a){try{fn=fo;var c=new fn;return c._=a,b(c)}finally{fn=Date}}var b=d3.time.format(a);return c.parse=function(a){try{fn=fo;var c=b.parse(a);return c&&c._}finally{fn=Date}},c.toString=b.toString,c};var fY=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?fZ:fY,fZ.parse=function(a){var b=new Date(a);return isNaN(b)?null:b},fZ.toString=fY.toString,d3.time.second=f$(function(a){return new fn(Math.floor(a/1e3)*1e3)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*1e3)},function(a){return a.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=f$(function(a){return new fn(Math.floor(a/6e4)*6e4)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*6e4)},function(a){return a.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=f$(function(a){var b=a.getTimezoneOffset()/60;return new fn((Math.floor(a/36e5-b)+b)*36e5)},function(a,b){a.setTime(a.getTime()+Math.floor(b)*36e5)},function(a){return a.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=f$(function(a){return new fn(a.getFullYear(),a.getMonth(),a.getDate())},function(a,b){a.setDate(a.getDate()+b)},function(a){return a.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(a){var b=d3.time.year(a);return Math.floor((a-b)/864e5-(a.getTimezoneOffset()-b.getTimezoneOffset())/1440)},fB.forEach(function(a,b){a=a.toLowerCase(),b=7-b;var c=d3.time[a]=f$(function(a){return(a=d3.time.day(a)).setDate(a.getDate()-(a.getDay()+b)%7),a},function(a,b){a.setDate(a.getDate()+Math.floor(b)*7)},function(a){var c=d3.time.year(a).getDay();return Math.floor((d3.time.dayOfYear(a)+(c+b)%7)/7)-(c!==b)});d3.time[a+"s"]=c.range,d3.time[a+"s"].utc=c.utc.range,d3.time[a+"OfYear"]=function(a){var c=d3.time.year(a).getDay();return Math.floor((d3.time.dayOfYear(a)+(c+b)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=f$(function(a){return new fn(a.getFullYear(),a.getMonth(),1)},function(a,b){a.setMonth(a.getMonth()+b)},function(a){return a.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=f$(function(a){return new fn(a.getFullYear(),0,1)},function(a,b){a.setFullYear(a.getFullYear()+b)},function(a){return a.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var gg=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],gh=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],gi=[[d3.time.format("%Y"),function(a){return!0}],[d3.time.format("%B"),function(a){return a.getMonth()}],[d3.time.format("%b %d"),function(a){return a.getDate()!=1}],[d3.time.format("%a %d"),function(a){return a.getDay()&&a.getDate()!=1}],[d3.time.format("%I %p"),function(a){return a.getHours()}],[d3.time.format("%I:%M"),function(a){return a.getMinutes()}],[d3.time.format(":%S"),function(a){return a.getSeconds()}],[d3.time.format(".%L"),function(a){return a.getMilliseconds()}]],gj=d3.scale.linear(),gk=gd(gi);gh.year=function(a,b){return gj.domain(a.map(gf)).ticks(b).map(ge)},d3.time.scale=function(){return ga(d3.scale.linear(),gh,gk)};var gl=gh.map(function(a){return[a[0].utc,a[1]]}),gm=[[d3.time.format.utc("%Y"),function(a){return!0}],[d3.time.format.utc("%B"),function(a){return a.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(a){return a.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(a){return a.getUTCDay()&&a.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(a){return a.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(a){return a.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(a){return a.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(a){return a.getUTCMilliseconds()}]],gn=gd(gm);gl.year=function(a,b){return gj.domain(a.map(gp)).ticks(b).map(go)},d3.time.scale.utc=function(){return ga(d3.scale.linear(),gl,gn)}})(); \ No newline at end of file diff --git a/js/dat.gui.min.js b/js/dat.gui.min.js deleted file mode 100755 index 17e4a3c..0000000 --- a/js/dat.gui.min.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * dat-gui JavaScript Controller Library - * http://code.google.com/p/dat-gui - * - * Copyright 2011 Data Arts Team, Google Creative Lab - * - * 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 - */ -var dat=dat||{};dat.gui=dat.gui||{};dat.utils=dat.utils||{};dat.controllers=dat.controllers||{};dat.dom=dat.dom||{};dat.color=dat.color||{};dat.utils.css=function(){return{load:function(e,a){var a=a||document,c=a.createElement("link");c.type="text/css";c.rel="stylesheet";c.href=e;a.getElementsByTagName("head")[0].appendChild(c)},inject:function(e,a){var a=a||document,c=document.createElement("style");c.type="text/css";c.innerHTML=e;a.getElementsByTagName("head")[0].appendChild(c)}}}(); -dat.utils.common=function(){var e=Array.prototype.forEach,a=Array.prototype.slice;return{BREAK:{},extend:function(c){this.each(a.call(arguments,1),function(a){for(var f in a)this.isUndefined(a[f])||(c[f]=a[f])},this);return c},defaults:function(c){this.each(a.call(arguments,1),function(a){for(var f in a)this.isUndefined(c[f])&&(c[f]=a[f])},this);return c},compose:function(){var c=a.call(arguments);return function(){for(var d=a.call(arguments),f=c.length-1;f>=0;f--)d=[c[f].apply(this,d)];return d[0]}}, -each:function(a,d,f){if(e&&a.forEach===e)a.forEach(d,f);else if(a.length===a.length+0)for(var b=0,n=a.length;b-1?d.length-d.indexOf(".")-1:0};c.superclass=e;a.extend(c.prototype,e.prototype,{setValue:function(a){if(this.__min!==void 0&&athis.__max)a=this.__max;this.__step!==void 0&&a%this.__step!=0&&(a=Math.round(a/this.__step)*this.__step);return c.superclass.prototype.setValue.call(this,a)},min:function(a){this.__min=a;return this},max:function(a){this.__max=a;return this},step:function(a){this.__step=a;return this}});return c}(dat.controllers.Controller,dat.utils.common); -dat.controllers.NumberControllerBox=function(e,a,c){var d=function(f,b,e){function h(){var a=parseFloat(l.__input.value);c.isNaN(a)||l.setValue(a)}function j(a){var b=o-a.clientY;l.setValue(l.getValue()+b*l.__impliedStep);o=a.clientY}function m(){a.unbind(window,"mousemove",j);a.unbind(window,"mouseup",m)}this.__truncationSuspended=false;d.superclass.call(this,f,b,e);var l=this,o;this.__input=document.createElement("input");this.__input.setAttribute("type","text");a.bind(this.__input,"change",h); -a.bind(this.__input,"blur",function(){h();l.__onFinishChange&&l.__onFinishChange.call(l,l.getValue())});a.bind(this.__input,"mousedown",function(b){a.bind(window,"mousemove",j);a.bind(window,"mouseup",m);o=b.clientY});a.bind(this.__input,"keydown",function(a){if(a.keyCode===13)l.__truncationSuspended=true,this.blur(),l.__truncationSuspended=false});this.updateDisplay();this.domElement.appendChild(this.__input)};d.superclass=e;c.extend(d.prototype,e.prototype,{updateDisplay:function(){var a=this.__input, -b;if(this.__truncationSuspended)b=this.getValue();else{b=this.getValue();var c=Math.pow(10,this.__precision);b=Math.round(b*c)/c}a.value=b;return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.NumberController,dat.dom.dom,dat.utils.common); -dat.controllers.NumberControllerSlider=function(e,a,c,d,f){var b=function(d,c,f,e,l){function o(b){b.preventDefault();var d=a.getOffset(g.__background),c=a.getWidth(g.__background);g.setValue(g.__min+(g.__max-g.__min)*((b.clientX-d.left)/(d.left+c-d.left)));return false}function y(){a.unbind(window,"mousemove",o);a.unbind(window,"mouseup",y);g.__onFinishChange&&g.__onFinishChange.call(g,g.getValue())}b.superclass.call(this,d,c,{min:f,max:e,step:l});var g=this;this.__background=document.createElement("div"); -this.__foreground=document.createElement("div");a.bind(this.__background,"mousedown",function(b){a.bind(window,"mousemove",o);a.bind(window,"mouseup",y);o(b)});a.addClass(this.__background,"slider");a.addClass(this.__foreground,"slider-fg");this.updateDisplay();this.__background.appendChild(this.__foreground);this.domElement.appendChild(this.__background)};b.superclass=e;b.useDefaultStyles=function(){c.inject(f)};d.extend(b.prototype,e.prototype,{updateDisplay:function(){this.__foreground.style.width= -(this.getValue()-this.__min)/(this.__max-this.__min)*100+"%";return b.superclass.prototype.updateDisplay.call(this)}});return b}(dat.controllers.NumberController,dat.dom.dom,dat.utils.css,dat.utils.common,".slider {\n box-shadow: inset 0 2px 4px rgba(0,0,0,0.15);\n height: 1em;\n border-radius: 1em;\n background-color: #eee;\n padding: 0 0.5em;\n overflow: hidden;\n}\n\n.slider-fg {\n padding: 1px 0 2px 0;\n background-color: #aaa;\n height: 1em;\n margin-left: -0.5em;\n padding-right: 0.5em;\n border-radius: 1em 0 0 1em;\n}\n\n.slider-fg:after {\n display: inline-block;\n border-radius: 1em;\n background-color: #fff;\n border: 1px solid #aaa;\n content: '';\n float: right;\n margin-right: -1em;\n margin-top: -1px;\n height: 0.9em;\n width: 0.9em;\n}"); -dat.controllers.FunctionController=function(e,a,c){var d=function(c,b,e){d.superclass.call(this,c,b);var h=this;this.__button=document.createElement("div");this.__button.innerHTML=e===void 0?"Fire":e;a.bind(this.__button,"click",function(a){a.preventDefault();h.fire();return false});a.addClass(this.__button,"button");this.domElement.appendChild(this.__button)};d.superclass=e;c.extend(d.prototype,e.prototype,{fire:function(){this.__onChange&&this.__onChange.call(this);this.__onFinishChange&&this.__onFinishChange.call(this, -this.getValue());this.getValue().call(this.object)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common); -dat.controllers.BooleanController=function(e,a,c){var d=function(c,b){d.superclass.call(this,c,b);var e=this;this.__prev=this.getValue();this.__checkbox=document.createElement("input");this.__checkbox.setAttribute("type","checkbox");a.bind(this.__checkbox,"change",function(){e.setValue(!e.__prev)},false);this.domElement.appendChild(this.__checkbox);this.updateDisplay()};d.superclass=e;c.extend(d.prototype,e.prototype,{setValue:function(a){a=d.superclass.prototype.setValue.call(this,a);this.__onFinishChange&& -this.__onFinishChange.call(this,this.getValue());this.__prev=this.getValue();return a},updateDisplay:function(){this.getValue()===true?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=true):this.__checkbox.checked=false;return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common); -dat.color.toString=function(e){return function(a){if(a.a==1||e.isUndefined(a.a)){for(a=a.hex.toString(16);a.length<6;)a="0"+a;return"#"+a}else return"rgba("+Math.round(a.r)+","+Math.round(a.g)+","+Math.round(a.b)+","+a.a+")"}}(dat.utils.common); -dat.color.interpret=function(e,a){var c,d,f=[{litmus:a.isString,conversions:{THREE_CHAR_HEX:{read:function(a){a=a.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return a===null?false:{space:"HEX",hex:parseInt("0x"+a[1].toString()+a[1].toString()+a[2].toString()+a[2].toString()+a[3].toString()+a[3].toString())}},write:e},SIX_CHAR_HEX:{read:function(a){a=a.match(/^#([A-F0-9]{6})$/i);return a===null?false:{space:"HEX",hex:parseInt("0x"+a[1].toString())}},write:e},CSS_RGB:{read:function(a){a=a.match(/^rgb\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\)/); -return a===null?false:{space:"RGB",r:parseFloat(a[1]),g:parseFloat(a[2]),b:parseFloat(a[3])}},write:e},CSS_RGBA:{read:function(a){a=a.match(/^rgba\(\s*(.+)\s*,\s*(.+)\s*,\s*(.+)\s*\,\s*(.+)\s*\)/);return a===null?false:{space:"RGB",r:parseFloat(a[1]),g:parseFloat(a[2]),b:parseFloat(a[3]),a:parseFloat(a[4])}},write:e}}},{litmus:a.isNumber,conversions:{HEX:{read:function(a){return{space:"HEX",hex:a,conversionName:"HEX"}},write:function(a){return a.hex}}}},{litmus:a.isArray,conversions:{RGB_ARRAY:{read:function(a){return a.length!= -3?false:{space:"RGB",r:a[0],g:a[1],b:a[2]}},write:function(a){return[a.r,a.g,a.b]}},RGBA_ARRAY:{read:function(a){return a.length!=4?false:{space:"RGB",r:a[0],g:a[1],b:a[2],a:a[3]}},write:function(a){return[a.r,a.g,a.b,a.a]}}}},{litmus:a.isObject,conversions:{RGBA_OBJ:{read:function(b){return a.isNumber(b.r)&&a.isNumber(b.g)&&a.isNumber(b.b)&&a.isNumber(b.a)?{space:"RGB",r:b.r,g:b.g,b:b.b,a:b.a}:false},write:function(a){return{r:a.r,g:a.g,b:a.b,a:a.a}}},RGB_OBJ:{read:function(b){return a.isNumber(b.r)&& -a.isNumber(b.g)&&a.isNumber(b.b)?{space:"RGB",r:b.r,g:b.g,b:b.b}:false},write:function(a){return{r:a.r,g:a.g,b:a.b}}},HSVA_OBJ:{read:function(b){return a.isNumber(b.h)&&a.isNumber(b.s)&&a.isNumber(b.v)&&a.isNumber(b.a)?{space:"HSV",h:b.h,s:b.s,v:b.v,a:b.a}:false},write:function(a){return{h:a.h,s:a.s,v:a.v,a:a.a}}},HSV_OBJ:{read:function(b){return a.isNumber(b.h)&&a.isNumber(b.s)&&a.isNumber(b.v)?{space:"HSV",h:b.h,s:b.s,v:b.v}:false},write:function(a){return{h:a.h,s:a.s,v:a.v}}}}}];return function(){d= -false;var b=arguments.length>1?a.toArray(arguments):arguments[0];a.each(f,function(e){if(e.litmus(b))return a.each(e.conversions,function(e,f){c=e.read(b);if(d===false&&c!==false)return d=c,c.conversionName=f,c.conversion=e,a.BREAK}),a.BREAK});return d}}(dat.color.toString,dat.utils.common); -dat.GUI=dat.gui.GUI=function(e,a,c,d,f,b,n,h,j,m,l,o,y,g,i){function q(a,b,r,c){if(b[r]===void 0)throw Error("Object "+b+' has no property "'+r+'"');c.color?b=new l(b,r):(b=[b,r].concat(c.factoryArgs),b=d.apply(a,b));if(c.before instanceof f)c.before=c.before.__li;t(a,b);g.addClass(b.domElement,"c");r=document.createElement("span");g.addClass(r,"property-name");r.innerHTML=b.property;var e=document.createElement("div");e.appendChild(r);e.appendChild(b.domElement);c=s(a,e,c.before);g.addClass(c,k.CLASS_CONTROLLER_ROW); -g.addClass(c,typeof b.getValue());p(a,c,b);a.__controllers.push(b);return b}function s(a,b,d){var c=document.createElement("li");b&&c.appendChild(b);d?a.__ul.insertBefore(c,params.before):a.__ul.appendChild(c);a.onResize();return c}function p(a,d,c){c.__li=d;c.__gui=a;i.extend(c,{options:function(b){if(arguments.length>1)return c.remove(),q(a,c.object,c.property,{before:c.__li.nextElementSibling,factoryArgs:[i.toArray(arguments)]});if(i.isArray(b)||i.isObject(b))return c.remove(),q(a,c.object,c.property, -{before:c.__li.nextElementSibling,factoryArgs:[b]})},name:function(a){c.__li.firstElementChild.firstElementChild.innerHTML=a;return c},listen:function(){c.__gui.listen(c);return c},remove:function(){c.__gui.remove(c);return c}});if(c instanceof j){var e=new h(c.object,c.property,{min:c.__min,max:c.__max,step:c.__step});i.each(["updateDisplay","onChange","onFinishChange"],function(a){var b=c[a],H=e[a];c[a]=e[a]=function(){var a=Array.prototype.slice.call(arguments);b.apply(c,a);return H.apply(e,a)}}); -g.addClass(d,"has-slider");c.domElement.insertBefore(e.domElement,c.domElement.firstElementChild)}else if(c instanceof h){var f=function(b){return i.isNumber(c.__min)&&i.isNumber(c.__max)?(c.remove(),q(a,c.object,c.property,{before:c.__li.nextElementSibling,factoryArgs:[c.__min,c.__max,c.__step]})):b};c.min=i.compose(f,c.min);c.max=i.compose(f,c.max)}else if(c instanceof b)g.bind(d,"click",function(){g.fakeEvent(c.__checkbox,"click")}),g.bind(c.__checkbox,"click",function(a){a.stopPropagation()}); -else if(c instanceof n)g.bind(d,"click",function(){g.fakeEvent(c.__button,"click")}),g.bind(d,"mouseover",function(){g.addClass(c.__button,"hover")}),g.bind(d,"mouseout",function(){g.removeClass(c.__button,"hover")});else if(c instanceof l)g.addClass(d,"color"),c.updateDisplay=i.compose(function(a){d.style.borderLeftColor=c.__color.toString();return a},c.updateDisplay),c.updateDisplay();c.setValue=i.compose(function(b){a.getRoot().__preset_select&&c.isModified()&&B(a.getRoot(),true);return b},c.setValue)} -function t(a,b){var c=a.getRoot(),d=c.__rememberedObjects.indexOf(b.object);if(d!=-1){var e=c.__rememberedObjectIndecesToControllers[d];e===void 0&&(e={},c.__rememberedObjectIndecesToControllers[d]=e);e[b.property]=b;if(c.load&&c.load.remembered){c=c.load.remembered;if(c[a.preset])c=c[a.preset];else if(c[w])c=c[w];else return;if(c[d]&&c[d][b.property]!==void 0)d=c[d][b.property],b.initialValue=d,b.setValue(d)}}}function I(a){var b=a.__save_row=document.createElement("li");g.addClass(a.domElement, -"has-save");a.__ul.insertBefore(b,a.__ul.firstChild);g.addClass(b,"save-row");var c=document.createElement("span");c.innerHTML=" ";g.addClass(c,"button gears");var d=document.createElement("span");d.innerHTML="Save";g.addClass(d,"button");g.addClass(d,"save");var e=document.createElement("span");e.innerHTML="New";g.addClass(e,"button");g.addClass(e,"save-as");var f=document.createElement("span");f.innerHTML="Revert";g.addClass(f,"button");g.addClass(f,"revert");var m=a.__preset_select=document.createElement("select"); -a.load&&a.load.remembered?i.each(a.load.remembered,function(b,c){C(a,c,c==a.preset)}):C(a,w,false);g.bind(m,"change",function(){for(var b=0;b0){a.preset=this.preset;if(!a.remembered)a.remembered={};a.remembered[this.preset]=z(this)}a.folders={};i.each(this.__folders,function(b, -c){a.folders[c]=b.getSaveObject()});return a},save:function(){if(!this.load.remembered)this.load.remembered={};this.load.remembered[this.preset]=z(this);B(this,false)},saveAs:function(a){if(!this.load.remembered)this.load.remembered={},this.load.remembered[w]=z(this,true);this.load.remembered[a]=z(this);this.preset=a;C(this,a,true)},revert:function(a){i.each(this.__controllers,function(b){this.getRoot().load.remembered?t(a||this.getRoot(),b):b.setValue(b.initialValue)},this);i.each(this.__folders, -function(a){a.revert(a)});a||B(this.getRoot(),false)},listen:function(a){var b=this.__listening.length==0;this.__listening.push(a);b&&E(this.__listening)}});return k}(dat.utils.css,'
\n\n Here\'s the new load parameter for your GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n \n
\n \n
\n\n
', -".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity 0.1s linear;-o-transition:opacity 0.1s linear;-moz-transition:opacity 0.1s linear;transition:opacity 0.1s linear;border:0;position:absolute;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-x:hidden}.dg.a.has-save ul{margin-top:27px}.dg.a.has-save ul.closed{margin-top:0}.dg.a .save-row{position:fixed;top:0;z-index:1002}.dg li{-webkit-transition:height 0.1s ease-out;-o-transition:height 0.1s ease-out;-moz-transition:height 0.1s ease-out;transition:height 0.1s ease-out}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;overflow:hidden;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li > *{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .c{float:left;width:60%}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:9px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2fa1d6}.dg .cr.number input[type=text]{color:#2fa1d6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2fa1d6}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n", -dat.controllers.factory=function(e,a,c,d,f,b,n){return function(h,j,m,l){var o=h[j];if(n.isArray(m)||n.isObject(m))return new e(h,j,m);if(n.isNumber(o))return n.isNumber(m)&&n.isNumber(l)?new c(h,j,m,l):new a(h,j,{min:m,max:l});if(n.isString(o))return new d(h,j);if(n.isFunction(o))return new f(h,j,"");if(n.isBoolean(o))return new b(h,j)}}(dat.controllers.OptionController,dat.controllers.NumberControllerBox,dat.controllers.NumberControllerSlider,dat.controllers.StringController=function(e,a,c){var d= -function(c,b){function e(){h.setValue(h.__input.value)}d.superclass.call(this,c,b);var h=this;this.__input=document.createElement("input");this.__input.setAttribute("type","text");a.bind(this.__input,"keyup",e);a.bind(this.__input,"change",e);a.bind(this.__input,"blur",function(){h.__onFinishChange&&h.__onFinishChange.call(h,h.getValue())});a.bind(this.__input,"keydown",function(a){a.keyCode===13&&this.blur()});this.updateDisplay();this.domElement.appendChild(this.__input)};d.superclass=e;c.extend(d.prototype, -e.prototype,{updateDisplay:function(){if(!a.isActive(this.__input))this.__input.value=this.getValue();return d.superclass.prototype.updateDisplay.call(this)}});return d}(dat.controllers.Controller,dat.dom.dom,dat.utils.common),dat.controllers.FunctionController,dat.controllers.BooleanController,dat.utils.common),dat.controllers.Controller,dat.controllers.BooleanController,dat.controllers.FunctionController,dat.controllers.NumberControllerBox,dat.controllers.NumberControllerSlider,dat.controllers.OptionController, -dat.controllers.ColorController=function(e,a,c,d,f){function b(a,b,c,d){a.style.background="";f.each(j,function(e){a.style.cssText+="background: "+e+"linear-gradient("+b+", "+c+" 0%, "+d+" 100%); "})}function n(a){a.style.background="";a.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);";a.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"; -a.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);";a.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);";a.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}var h=function(e,l){function o(b){q(b);a.bind(window,"mousemove",q);a.bind(window, -"mouseup",j)}function j(){a.unbind(window,"mousemove",q);a.unbind(window,"mouseup",j)}function g(){var a=d(this.value);a!==false?(p.__color.__state=a,p.setValue(p.__color.toOriginal())):this.value=p.__color.toString()}function i(){a.unbind(window,"mousemove",s);a.unbind(window,"mouseup",i)}function q(b){b.preventDefault();var c=a.getWidth(p.__saturation_field),d=a.getOffset(p.__saturation_field),e=(b.clientX-d.left+document.body.scrollLeft)/c,b=1-(b.clientY-d.top+document.body.scrollTop)/c;b>1?b= -1:b<0&&(b=0);e>1?e=1:e<0&&(e=0);p.__color.v=b;p.__color.s=e;p.setValue(p.__color.toOriginal());return false}function s(b){b.preventDefault();var c=a.getHeight(p.__hue_field),d=a.getOffset(p.__hue_field),b=1-(b.clientY-d.top+document.body.scrollTop)/c;b>1?b=1:b<0&&(b=0);p.__color.h=b*360;p.setValue(p.__color.toOriginal());return false}h.superclass.call(this,e,l);this.__color=new c(this.getValue());this.__temp=new c(0);var p=this;this.domElement=document.createElement("div");a.makeSelectable(this.domElement, -false);this.__selector=document.createElement("div");this.__selector.className="selector";this.__saturation_field=document.createElement("div");this.__saturation_field.className="saturation-field";this.__field_knob=document.createElement("div");this.__field_knob.className="field-knob";this.__field_knob_border="2px solid ";this.__hue_knob=document.createElement("div");this.__hue_knob.className="hue-knob";this.__hue_field=document.createElement("div");this.__hue_field.className="hue-field";this.__input= -document.createElement("input");this.__input.type="text";this.__input_textShadow="0 1px 1px ";a.bind(this.__input,"keydown",function(a){a.keyCode===13&&g.call(this)});a.bind(this.__input,"blur",g);a.bind(this.__selector,"mousedown",function(){a.addClass(this,"drag").bind(window,"mouseup",function(){a.removeClass(p.__selector,"drag")})});var t=document.createElement("div");f.extend(this.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}); -f.extend(this.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:this.__field_knob_border+(this.__color.v<0.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1});f.extend(this.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1});f.extend(this.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"});f.extend(t.style, -{width:"100%",height:"100%",background:"none"});b(t,"top","rgba(0,0,0,0)","#000");f.extend(this.__hue_field.style,{width:"15px",height:"100px",display:"inline-block",border:"1px solid #555",cursor:"ns-resize"});n(this.__hue_field);f.extend(this.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:this.__input_textShadow+"rgba(0,0,0,0.7)"});a.bind(this.__saturation_field,"mousedown",o);a.bind(this.__field_knob,"mousedown",o);a.bind(this.__hue_field,"mousedown", -function(b){s(b);a.bind(window,"mousemove",s);a.bind(window,"mouseup",i)});this.__saturation_field.appendChild(t);this.__selector.appendChild(this.__field_knob);this.__selector.appendChild(this.__saturation_field);this.__selector.appendChild(this.__hue_field);this.__hue_field.appendChild(this.__hue_knob);this.domElement.appendChild(this.__input);this.domElement.appendChild(this.__selector);this.updateDisplay()};h.superclass=e;f.extend(h.prototype,e.prototype,{updateDisplay:function(){var a=d(this.getValue()); -if(a!==false){var e=false;f.each(c.COMPONENTS,function(b){if(!f.isUndefined(a[b])&&!f.isUndefined(this.__color.__state[b])&&a[b]!==this.__color.__state[b])return e=true,{}},this);e&&f.extend(this.__color.__state,a)}f.extend(this.__temp.__state,this.__color.__state);this.__temp.a=1;var h=this.__color.v<0.5||this.__color.s>0.5?255:0,j=255-h;f.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toString(),border:this.__field_knob_border+ -"rgb("+h+","+h+","+h+")"});this.__hue_knob.style.marginTop=(1-this.__color.h/360)*100+"px";this.__temp.s=1;this.__temp.v=1;b(this.__saturation_field,"left","#fff",this.__temp.toString());f.extend(this.__input.style,{backgroundColor:this.__input.value=this.__color.toString(),color:"rgb("+h+","+h+","+h+")",textShadow:this.__input_textShadow+"rgba("+j+","+j+","+j+",.7)"})}});var j=["-moz-","-o-","-webkit-","-ms-",""];return h}(dat.controllers.Controller,dat.dom.dom,dat.color.Color=function(e,a,c,d){function f(a, -b,c){Object.defineProperty(a,b,{get:function(){if(this.__state.space==="RGB")return this.__state[b];n(this,b,c);return this.__state[b]},set:function(a){if(this.__state.space!=="RGB")n(this,b,c),this.__state.space="RGB";this.__state[b]=a}})}function b(a,b){Object.defineProperty(a,b,{get:function(){if(this.__state.space==="HSV")return this.__state[b];h(this);return this.__state[b]},set:function(a){if(this.__state.space!=="HSV")h(this),this.__state.space="HSV";this.__state[b]=a}})}function n(b,c,e){if(b.__state.space=== -"HEX")b.__state[c]=a.component_from_hex(b.__state.hex,e);else if(b.__state.space==="HSV")d.extend(b.__state,a.hsv_to_rgb(b.__state.h,b.__state.s,b.__state.v));else throw"Corrupted color state";}function h(b){var c=a.rgb_to_hsv(b.r,b.g,b.b);d.extend(b.__state,{s:c.s,v:c.v});if(d.isNaN(c.h)){if(d.isUndefined(b.__state.h))b.__state.h=0}else b.__state.h=c.h}var j=function(){this.__state=e.apply(this,arguments);if(this.__state===false)throw"Failed to interpret color arguments";this.__state.a=this.__state.a|| -1};j.COMPONENTS="r,g,b,h,s,v,hex,a".split(",");d.extend(j.prototype,{toString:function(){return c(this)},toOriginal:function(){return this.__state.conversion.write(this)}});f(j.prototype,"r",2);f(j.prototype,"g",1);f(j.prototype,"b",0);b(j.prototype,"h");b(j.prototype,"s");b(j.prototype,"v");Object.defineProperty(j.prototype,"a",{get:function(){return this.__state.a},set:function(a){this.__state.a=a}});Object.defineProperty(j.prototype,"hex",{get:function(){if(!this.__state.space!=="HEX")this.__state.hex= -a.rgb_to_hex(this.r,this.g,this.b);return this.__state.hex},set:function(a){this.__state.space="HEX";this.__state.hex=a}});return j}(dat.color.interpret,dat.color.math=function(){var e;return{hsv_to_rgb:function(a,c,d){var e=a/60-Math.floor(a/60),b=d*(1-c),n=d*(1-e*c),c=d*(1-(1-e)*c),a=[[d,c,b],[n,d,b],[b,d,c],[b,n,d],[c,b,d],[d,b,n]][Math.floor(a/60)%6];return{r:a[0]*255,g:a[1]*255,b:a[2]*255}},rgb_to_hsv:function(a,c,d){var e=Math.min(a,c,d),b=Math.max(a,c,d),e=b-e;if(b==0)return{h:NaN,s:0,v:0}; -a=a==b?(c-d)/e:c==b?2+(d-a)/e:4+(a-c)/e;a/=6;a<0&&(a+=1);return{h:a*360,s:e/b,v:b/255}},rgb_to_hex:function(a,c,d){a=this.hex_with_component(0,2,a);a=this.hex_with_component(a,1,c);return a=this.hex_with_component(a,0,d)},component_from_hex:function(a,c){return a>>c*8&255},hex_with_component:function(a,c,d){return d<<(e=c*8)|a&~(255<, lat: , lon: }, + * i: {countryCode: , lat: , lon: }, + * v: , log_v: }, + * {e: {...}, i: {...}, v: ..., log_v: ...}, + * {e: {...}, i: {...}, v: ..., log_v: ...}, + * ... + * ], + * t: 0}, + * {data: [...], t: 1}, + * {data: [...], t: 2}, + * ... + * ]; + * spikes: [{data: [{loc: {countryCode: , lat: , lon: }, + * v: , log_v: }, + * {loc: {...}, v: ..., log_v: ...}, + * {loc: {...}, v: ..., log_v: ...}, + * ... + * ], + * t: 0}, + * {data: [...], t: 1}, + * {data: [...], t: 2}, + * ... + * ]; + */ +function loadContentData( data ) { + timeBins = data; + // Iterates through all of the time bins, each of which has a data array and a + // time value. One of these time values should be t = 0. + for ( var i = 0; i < timeBins.length; i++ ) { + var bin = timeBins[i].data; + for ( var j = 0; j < bin.length; j++ ) { + var set = bin[j]; + if ( set.i !== undefined && set.e !== undefined ) { // arc + set.i.c = countryLookup[set.i.countryCode]; + if (set.i.c === undefined) { + set.i.c = 'Invalid Country'; + } + set.e.c = countryLookup[set.e.countryCode]; + if (set.e.c === undefined) { + set.e.c = 'Invalid Country'; + } + } else if ( set.loc !== undefined ) { // spike + set.loc.c = countryLookup[set.loc.countryCode]; + if (set.loc.c === undefined) { + set.loc.c = 'Invalid Country'; + } + } + set.v = set.lin_v; + } + } - if(callback) - callback(); - console.log("finished read data file"); - } - }; - xhr.send( null ); -} + selectableCountries = []; + for ( var i in timeBins ){ + var bin = timeBins[i].data; + for ( var s in bin ){ + var set = bin[s]; + + if ( set.e !== undefined && set.i !== undefined ) { //arcs + var exporterName = set.e.c.toUpperCase(); + var importerName = set.i.c.toUpperCase(); + // let's track a list of actual countries listed in this data set + // this is actually really slow... consider re-doing this with a map + if ( $.inArray(exporterName, selectableCountries) < 0 ) + selectableCountries.push( exporterName ); + + if ( $.inArray(importerName, selectableCountries) < 0 ) + selectableCountries.push( importerName ); + } + else if ( set.loc !== undefined ) { //spikes + var countryName = set.loc.c.toUpperCase(); + if ( $.inArray(countryName, selectableCountries) < 0 ) + selectableCountries.push( countryName ); + } + } + } + console.log('finished loading content data'); + + selectableTimes = {}; + + console.time('buildDataVizGeometries'); + var vizilines = buildDataVizGeometries( timeBins ); + console.timeEnd('buildDataVizGeometries'); + + controllers.spin = DEFAULT_SPIN; + + selectVisualization( selectionData.selectedTime, allCountries ); +}; function loadCountryCodes( callback ){ cxhr = new XMLHttpRequest(); @@ -57,4 +113,4 @@ function loadCountryCodes( callback ){ } }; cxhr.send( null ); -} \ No newline at end of file +}; diff --git a/js/datguicontrol.js b/js/datguicontrol.js index 4cde082..ce43fa8 100644 --- a/js/datguicontrol.js +++ b/js/datguicontrol.js @@ -1,54 +1,15 @@ +var DEFAULT_SPIN = 1.0; + var controllers = { speed: 3, multiplier: 0.5, backgroundColor:"#000000", zoom: 1, - spin: 0, - transitionTime: 2000, + spin: DEFAULT_SPIN, + transitionTime: 2000 }; function buildGUI(){ var selection = new Selection(); selectionData = selection; - /* - var updateVisualization = function(){ - selectVisualization( timeBins, selection.selectedYear, [selection.selectedCountry], selection.getExportCategories(), selection.getImportCategories() ); - } - - var changeFunction = function(v){ - updateVisualization(); - } - - var categoryFunction = function(v){ - updateVisualization(); - } - - var gui = new dat.GUI(); - var c = gui.add( selection, 'selectedYear', selectableYears ); - c.onFinishChange( changeFunction ); - - c = gui.add( selection, 'selectedCountry', selectableCountries ); - c.onFinishChange( changeFunction ); - - // c = gui.add( selection, 'showExports' ); - // c.onFinishChange( filterFunction ); - - // c = gui.add( selection, 'showImports' ); - // c.onFinishChange( filterFunction ); - - var catFilterExports = gui.addFolder('Exports'); - for( var i in selection.exportCategories ){ - var catSwitch = selection.exportCategories[i]; - c = catFilterExports.add( selection.exportCategories, i ); - c.onFinishChange( categoryFunction ); - } - - var catFilterImports = gui.addFolder('Imports'); - for( var i in selection.importCategories ){ - var catSwitch = selection.importCategories[i]; - c = catFilterImports.add( selection.importCategories, i ); - c.onFinishChange( categoryFunction ); - } - gui.close(); - */ -} \ No newline at end of file +}; \ No newline at end of file diff --git a/js/geopins.js b/js/geopins.js index edc8654..b8354ec 100644 --- a/js/geopins.js +++ b/js/geopins.js @@ -1,45 +1,34 @@ +var RADIUS = 100; + function loadGeoData( latlonData ){ // ----------------------------------------------------------------------------- // Load the world geo data json, per country - - var sphereRad = 1; - var rad = 100; - + // iterate through each set of country pins for ( var i in latlonData.countries ) { - var country = latlonData.countries[i]; - - // can we even find the country in the list? - // if( countryLookup[country.n.toUpperCase()] === undefined ){ - // console.log('could not find country that has country code: ' + country.n) - // continue; - // } + var country = latlonData.countries[i]; // save out country name and code info country.countryCode = i; - country.countryName = countryLookup[i]; - - // take the lat lon from the data and convert this to 3d globe space - var lon = country.lon - 90; - var lat = country.lat; - - var phi = Math.PI/2 - lat * Math.PI / 180 - Math.PI * 0.01; - var theta = 2 * Math.PI - lon * Math.PI / 180 + Math.PI * 0.06; - - var center = new THREE.Vector3(); - center.x = Math.sin(phi) * Math.cos(theta) * rad; - center.y = Math.cos(phi) * rad; - center.z = Math.sin(phi) * Math.sin(theta) * rad; + country.countryName = countryLookup[i]; // save and catalogue - country.center = center; + country.center = latLonTo3dSpace( country.lat, country.lon ); countryData[country.countryName] = country; } +}; - // console.log(countryData); -} +// take the lat lon from the data and convert this to 3d globe space +function latLonTo3dSpace( lat, lon ) { + lon = lon - 90; + + var phi = Math.PI/2 - lat * Math.PI / 180; + var theta = 2 * Math.PI - lon * Math.PI / 180; -// convenience function to get the country object by name -function getCountry(name){ - return countryData[name.toUpperCase()] -} \ No newline at end of file + var pos = new THREE.Vector3(); + pos.x = Math.sin(phi) * Math.cos(theta) * RADIUS; + pos.y = Math.cos(phi) * RADIUS; + pos.z = Math.sin(phi) * Math.sin(theta) * RADIUS; + + return pos; +}; \ No newline at end of file diff --git a/js/innersvg.js b/js/innersvg.js deleted file mode 100644 index 2b3775f..0000000 --- a/js/innersvg.js +++ /dev/null @@ -1,97 +0,0 @@ -/** - * innerHTML property for SVGElement - * Copyright(c) 2010, Jeff Schiller - * - * Licensed under the Apache License, Version 2 - * - * Works in a SVG document in Chrome 6+, Safari 5+, Firefox 4+ and IE9+. - * Works in a HTML5 document in Chrome 7+, Firefox 4+ and IE9+. - * Does not work in Opera since it doesn't support the SVGElement interface yet. - * - * I haven't decided on the best name for this property - thus the duplication. - */ - -(function() { -var serializeXML = function(node, output) { - var nodeType = node.nodeType; - if (nodeType == 3) { // TEXT nodes. - // Replace special XML characters with their entities. - output.push(node.textContent.replace(/&/, '&').replace(/', '>')); - } else if (nodeType == 1) { // ELEMENT nodes. - // Serialize Element nodes. - output.push('<', node.tagName); - if (node.hasAttributes()) { - var attrMap = node.attributes; - for (var i = 0, len = attrMap.length; i < len; ++i) { - var attrNode = attrMap.item(i); - output.push(' ', attrNode.name, '=\'', attrNode.value, '\''); - } - } - if (node.hasChildNodes()) { - output.push('>'); - var childNodes = node.childNodes; - for (var i = 0, len = childNodes.length; i < len; ++i) { - serializeXML(childNodes.item(i), output); - } - output.push(''); - } else { - output.push('/>'); - } - } else if (nodeType == 8) { - // TODO(codedread): Replace special characters with XML entities? - output.push(''); - } else { - // TODO: Handle CDATA nodes. - // TODO: Handle ENTITY nodes. - // TODO: Handle DOCUMENT nodes. - throw 'Error serializing XML. Unhandled node of type: ' + nodeType; - } -} -// The innerHTML DOM property for SVGElement. -Object.defineProperty(SVGElement.prototype, 'innerHTML', { - get: function() { - var output = []; - var childNode = this.firstChild; - while (childNode) { - serializeXML(childNode, output); - childNode = childNode.nextSibling; - } - return output.join(''); - }, - set: function(markupText) { - // Wipe out the current contents of the element. - while (this.firstChild) { - this.removeChild(this.firstChild); - } - - try { - // Parse the markup into valid nodes. - var dXML = new DOMParser(); - dXML.async = false; - // Wrap the markup into a SVG node to ensure parsing works. - sXML = '' + markupText + ''; - var svgDocElement = dXML.parseFromString(sXML, 'text/xml').documentElement; - - // Now take each node, import it and append to this element. - var childNode = svgDocElement.firstChild; - while(childNode) { - this.appendChild(this.ownerDocument.importNode(childNode, true)); - childNode = childNode.nextSibling; - } - } catch(e) { - throw new Error('Error parsing XML string'); - }; - } -}); - -// The innerSVG DOM property for SVGElement. -Object.defineProperty(SVGElement.prototype, 'innerSVG', { - get: function() { - return this.innerHTML; - }, - set: function(markupText) { - this.innerHTML = markupText; - } -}); - -})(); diff --git a/js/jquery-1.7.1.min.js b/js/jquery-1.7.1.min.js deleted file mode 100755 index 198b3ff..0000000 --- a/js/jquery-1.7.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.1 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; -f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() -{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/js/jquery-ui-1.8.21.custom.min.js b/js/jquery-ui-1.8.21.custom.min.js deleted file mode 100755 index ffc330a..0000000 --- a/js/jquery-ui-1.8.21.custom.min.js +++ /dev/null @@ -1,25 +0,0 @@ -/*! jQuery UI - v1.8.21 - 2012-06-05 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.core.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.21",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.position.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.21 - 2012-06-05 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.draggable.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height() 0; - }); - - // If none of the parents can be scrolled up when we try to scroll up - prevent_up = y > 0 && !_($(e.target).parents()).detect(function (el) { - return $(el).scrollTop() > 0; - }); - - // Prevent futile scroll, which would trigger the Back/Next page event - if (prevent_left || prevent_up) { - e.preventDefault(); - } - }); - - } - -}(jQuery)); diff --git a/js/main.js b/js/main.js index 577f04b..66102c2 100644 --- a/js/main.js +++ b/js/main.js @@ -1,33 +1,70 @@ -var masterContainer = document.getElementById('visualization'); - -var overlay = document.getElementById('visualization'); +/** + * Usage: + * Include Three.js r59 and Tween.js r9. + * (Optional: have an HTML DOM element with id 'selectedCountryName' if want to + * display selected country's name to user) + * + * var container = HTML DOM element to contain the globe; + * var globe = new com.google.Globe(container); + * + * var data = arcs or spikes, see function {@link loadContentData} for expected format. + * + * // Load new data and redraw globe. + * globe.loadContentData(data); + * + * // Select arcs/spikes from all countries on globe. + * globe.selectAllCountries(); + * + * // Change display scale. + * var scale = desired scale to display; + * var power = desired exponent to apply to each normalized volume/height; + * globe.changeDisplayScale(scale, power); + * + * // Fade into selected time's mesh. + * var time = specified when we loaded the data (t value in each set); + * var switchVisualizedMeshes = whether we want to actually display a new mesh after switching time; + * var animationDuration = how long fading into selected time's mesh should take; + * globe.selectTime(time, switchVisualizedMeshes, animationDuration); + * + * // Change the globe map texture. + * var fileName = , where the containing directory is IMAGE_DIR; + * globe.setGlobeImage(fileName); + * + * // Start crazy mode: random colors, pulsating arcs, and rapid spinning. + * globe.startCrazyMode(); + * + * // Stop crazy mode. + * globe.stopCrazyMode(); + */ + +var com = com || {}; +com.google = com.google || {}; + +var IMAGE_DIR = 'images/'; var mapIndexedImage; var mapOutlineImage; +var outlinedMapTexture; + // where in html to hold all our things -var glContainer = document.getElementById( 'glContainer' ); +var glContainer; // contains a list of country codes with their matching country names var isoFile = 'country_iso3166.json'; -var latlonFile = 'country_lat_lon.json' +var latlonFile = 'country_lat_lon.json'; -var camera, scene, renderer, controls; +var camera, scene, renderer; -var pinsBase, pinsBaseMat; -var lookupCanvas +var lookupCanvas; var lookupTexture; -var backTexture; -var worldCanvas; var sphere; var rotating; var visualizationMesh; var mapUniforms; -// contains the data loaded from the arms data file -// contains a list of years, followed by trades within that year -// properties for each "trade" is: e - exporter, i - importer, v - value (USD), wc - weapons code (see table) +// contains the loaded data var timeBins; // contains latlon data for each country @@ -40,86 +77,60 @@ var countryData = new Object(); // contains a list of country code to country name for running lookups var countryLookup; -var selectableYears = []; +// map from time to arc/spike data +var selectableTimes = {}; var selectableCountries = []; -/* - 930100 – military weapons, and includes some light weapons and artillery as well as machine guns and assault rifles etc. - 930190 – military firearms – eg assault rifles, machineguns (sub, light, heavy etc), combat shotguns, machine pistols etc - 930200 – pistols and revolvers - 930320 – Sporting shotguns (anything that isn’t rated as a military item). - 930330 – Sporting rifles (basically anything that isn’t fully automatic). - 930621 – shotgun shells - 930630 – small caliber ammo (anything below 14.5mm which isn’t fired from a shotgun. -*/ - -// a list of weapon 'codes' -// now they are just strings of categories -// Category Name : Category Code -var weaponLookup = { - 'Military Weapons' : 'mil', - 'Civilian Weapons' : 'civ', - 'Ammunition' : 'ammo', -}; - -// a list of the reverse for easy lookup -var reverseWeaponLookup = new Object(); -for( var i in weaponLookup ){ - var name = i; - var code = weaponLookup[i]; - reverseWeaponLookup[code] = name; -} - -// A list of category colors -var categoryColors = { - 'mil' : 0xdd380c, - 'civ' : 0x3dba00, - 'ammo' : 0x154492, -} +var allCountries = []; -var exportColor = 0xdd380c; -var importColor = 0x154492; +var Selection = function(){ + this.selectedTime = 0; + this.selectedCountry = 'UNITED STATES'; +}; // the currently selected country var selectedCountry = null; var previouslySelectedCountry = null; // contains info about what year, what countries, categories, etc that's being visualized -var selectionData; +var selectionData = new Selection(); -// when the app is idle this will be true -var idle = false; +// contains meshes currently being shown +var currMeshes; -// for svg loading -// deprecated, not using svg loading anymore -var assetList = []; +var time = 0; +var increment = 0; // TODO // use underscore and ".after" to load these in order // don't look at me I'm ugly -function start( e ){ +com.google.Globe = function( container ) { // detect for webgl and reject everything else if ( ! Detector.webgl ) { Detector.addGetWebGLMessage(); } else{ + glContainer = container; + this.loadContentData = loadContentData; + this.selectAllCountries = selectAllCountries; + this.changeDisplayScale = changeDisplayScale; + this.selectTime = selectTime; + this.setGlobeImage = setGlobeImage; + this.startCrazyMode = startCrazyMode; + this.stopCrazyMode = stopCrazyMode; // ensure the map images are loaded first!! mapIndexedImage = new Image(); - mapIndexedImage.src = 'images/map_indexed.png'; + mapIndexedImage.src = IMAGE_DIR + 'map_indexed_corrected_offset.png'; mapIndexedImage.onload = function() { mapOutlineImage = new Image(); - mapOutlineImage.src = 'images/map_outline.png'; - mapOutlineImage.onload = function(){ + mapOutlineImage.src = IMAGE_DIR + 'map_outline_corrected_offset.png'; + mapOutlineImage.onload = function() { loadCountryCodes( - function(){ + function() { loadWorldPins( - function(){ - loadContentData( - function(){ - initScene(); - animate(); - } - ); + function() { + initScene(); + animate(); } ); } @@ -127,43 +138,9 @@ function start( e ){ }; }; }; -} - - - -var Selection = function(){ - this.selectedYear = '2010'; - this.selectedCountry = 'UNITED STATES'; - // this.showExports = true; - // this.showImports = true; - // this.importExportFilter = 'both'; - - this.exportCategories = new Object(); - this.importCategories = new Object(); - for( var i in weaponLookup ){ - this.exportCategories[i] = true; - this.importCategories[i] = true; - } - - this.getExportCategories = function(){ - var list = []; - for( var i in this.exportCategories ){ - if( this.exportCategories[i] ) - list.push(i); - } - return list; - } - - this.getImportCategories = function(){ - var list = []; - for( var i in this.importCategories ){ - if( this.importCategories[i] ) - list.push(i); - } - return list; - } }; + // ----------------------------------------------------------------------------- // All the initialization stuff for THREE function initScene() { @@ -171,26 +148,10 @@ function initScene() { // ----------------------------------------------------------------------------- // Let's make a scene scene = new THREE.Scene(); - scene.matrixAutoUpdate = false; - // scene.fog = new THREE.FogExp2( 0xBBBBBB, 0.00003 ); - - scene.add( new THREE.AmbientLight( 0x505050 ) ); - - light1 = new THREE.SpotLight( 0xeeeeee, 3 ); - light1.position.x = 730; - light1.position.y = 520; - light1.position.z = 626; - light1.castShadow = true; - scene.add( light1 ); - - light2 = new THREE.PointLight( 0x222222, 14.8 ); - light2.position.x = -640; - light2.position.y = -500; - light2.position.z = -1000; - scene.add( light2 ); + scene.matrixAutoUpdate = false; rotating = new THREE.Object3D(); - scene.add(rotating); + scene.add( rotating ); lookupCanvas = document.createElement('canvas'); lookupCanvas.width = 256; @@ -202,173 +163,98 @@ function initScene() { lookupTexture.needsUpdate = true; var indexedMapTexture = new THREE.Texture( mapIndexedImage ); - //THREE.ImageUtils.loadTexture( 'images/map_indexed.png' ); indexedMapTexture.needsUpdate = true; indexedMapTexture.magFilter = THREE.NearestFilter; indexedMapTexture.minFilter = THREE.NearestFilter; - var outlinedMapTexture = new THREE.Texture( mapOutlineImage ); + outlinedMapTexture = new THREE.Texture( mapOutlineImage ); outlinedMapTexture.needsUpdate = true; - // outlinedMapTexture.magFilter = THREE.NearestFilter; - // outlinedMapTexture.minFilter = THREE.NearestFilter; var uniforms = { - 'mapIndex': { type: 't', value: 0, texture: indexedMapTexture }, - 'lookup': { type: 't', value: 1, texture: lookupTexture }, - 'outline': { type: 't', value: 2, texture: outlinedMapTexture }, - 'outlineLevel': {type: 'f', value: 1 }, + 'mapIndex': { type: 't', value: indexedMapTexture }, + 'lookup': { type: 't', value: lookupTexture }, + 'outline': { type: 't', value: outlinedMapTexture }, + 'outlineLevel': {type: 'f', value: 1 } }; mapUniforms = uniforms; var shaderMaterial = new THREE.ShaderMaterial( { uniforms: uniforms, - // attributes: attributes, - vertexShader: document.getElementById( 'globeVertexShader' ).textContent, - fragmentShader: document.getElementById( 'globeFragmentShader' ).textContent, - // sizeAttenuation: true, + vertexShader: Shaders.globeVertexShader, + fragmentShader: Shaders.globeFragmentShader }); - - - // ----------------------------------------------------------------------------- - // Create the backing (sphere) - // var mapGraphic = new THREE.Texture(worldCanvas);//THREE.ImageUtils.loadTexture("images/map.png"); - // backTexture = mapGraphic; - // mapGraphic.needsUpdate = true; - backMat = new THREE.MeshBasicMaterial( - { - // color: 0xffffff, - // shininess: 10, -// specular: 0x333333, - // map: mapGraphic, - // lightMap: mapGraphic - } - ); - // backMat.ambient = new THREE.Color(255,255,255); - sphere = new THREE.Mesh( new THREE.SphereGeometry( 100, 40, 40 ), shaderMaterial ); - // sphere.receiveShadow = true; - // sphere.castShadow = true; - sphere.doubleSided = false; + shaderMaterial.side = THREE.FrontSide; + + sphere = new THREE.Mesh( new THREE.SphereGeometry( globeRadius, 40, 40 ), shaderMaterial ); sphere.rotation.x = Math.PI; sphere.rotation.y = -Math.PI/2; sphere.rotation.z = Math.PI; - sphere.id = "base"; + sphere.id = "base"; rotating.add( sphere ); - - - for( var i in timeBins ){ - var bin = timeBins[i].data; - for( var s in bin ){ - var set = bin[s]; - // if( set.v < 1000000 ) - // continue; - - var exporterName = set.e.toUpperCase(); - var importerName = set.i.toUpperCase(); - - // let's track a list of actual countries listed in this data set - // this is actually really slow... consider re-doing this with a map - if( $.inArray(exporterName, selectableCountries) < 0 ) - selectableCountries.push( exporterName ); - - if( $.inArray(importerName, selectableCountries) < 0 ) - selectableCountries.push( importerName ); - } - } - - console.log( selectableCountries ); // load geo data (country lat lons in this case) console.time('loadGeoData'); loadGeoData( latlonData ); - console.timeEnd('loadGeoData'); - - console.time('buildDataVizGeometries'); - var vizilines = buildDataVizGeometries(timeBins); - console.timeEnd('buildDataVizGeometries'); + console.timeEnd('loadGeoData'); visualizationMesh = new THREE.Object3D(); - rotating.add(visualizationMesh); + rotating.add( visualizationMesh ); buildGUI(); - - selectVisualization( timeBins, '2010', ['UNITED STATES'], ['Military Weapons','Civilian Weapons', 'Ammunition'], ['Military Weapons','Civilian Weapons', 'Ammunition'] ); - - // test for highlighting specific countries - // highlightCountry( ["United States", "Switzerland", "China"] ); - + + for ( var countryCode in countryLookup ) { + if ( countryLookup.hasOwnProperty( countryCode ) ) { + allCountries.push(countryLookup[countryCode]); + } + } // ----------------------------------------------------------------------------- // Setup our renderer - renderer = new THREE.WebGLRenderer({antialias:false}); + renderer = new THREE.WebGLRenderer( {antialias:true} ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.autoClear = false; - - renderer.sortObjects = false; - renderer.generateMipmaps = false; glContainer.appendChild( renderer.domElement ); - // ----------------------------------------------------------------------------- // Event listeners - document.addEventListener( 'mousemove', onDocumentMouseMove, true ); document.addEventListener( 'windowResize', onDocumentResize, false ); - - //masterContainer.addEventListener( 'mousedown', onDocumentMouseDown, true ); - //masterContainer.addEventListener( 'mouseup', onDocumentMouseUp, false ); - document.addEventListener( 'mousedown', onDocumentMouseDown, true ); - document.addEventListener( 'mouseup', onDocumentMouseUp, false ); - masterContainer.addEventListener( 'click', onClick, true ); - masterContainer.addEventListener( 'mousewheel', onMouseWheel, false ); + glContainer.addEventListener( 'mousedown', onDocumentMouseDown, true ); + glContainer.addEventListener( 'mouseup', onDocumentMouseUp, false ); + glContainer.addEventListener( 'mousemove', onDocumentMouseMove, true ); + + glContainer.addEventListener( 'click', onClick, true ); + glContainer.addEventListener( 'mousewheel', onMouseWheel, false ); // firefox - masterContainer.addEventListener( 'DOMMouseScroll', function(e){ + document.addEventListener( 'DOMMouseScroll', function(e){ var evt=window.event || e; //equalize event object onMouseWheel(evt); }, false ); - document.addEventListener( 'keydown', onKeyDown, false); + document.addEventListener( 'keydown', onKeyDown, false ); // ----------------------------------------------------------------------------- // Setup our camera - camera = new THREE.PerspectiveCamera( 12, window.innerWidth / window.innerHeight, 1, 20000 ); + camera = new THREE.PerspectiveCamera( 12, window.innerWidth / window.innerHeight, 1, 20000 ); camera.position.z = 1400; camera.position.y = 0; - camera.lookAt(scene.width/2, scene.height/2); + camera.lookAt( vec3_origin ); scene.add( camera ); - var windowResize = THREEx.WindowResize(renderer, camera) -} + var windowResize = THREEx.WindowResize( renderer, camera ); +}; -function animate() { - - // Disallow roll for now, this is interfering with keyboard input during search -/* - if(keyboard.pressed('o') && keyboard.pressed('shift') == false) - camera.rotation.z -= 0.08; - if(keyboard.pressed('p') && keyboard.pressed('shift') == false) - camera.rotation.z += 0.08; -*/ - - if( rotateTargetX !== undefined && rotateTargetY !== undefined ){ +function animate() { + if ( rotateTargetX !== undefined && rotateTargetY !== undefined ) { rotateVX += (rotateTargetX - rotateX) * 0.012; rotateVY += (rotateTargetY - rotateY) * 0.012; - // var move = new THREE.Vector3( rotateVX, rotateVY, 0 ); - // var distance = move.length(); - // if( distance > .01 ) - // distance = .01; - // move.normalize(); - // move.multiplyScalar( distance ); - - // rotateVX = move.x; - // rotateVy = move.y; - - if( Math.abs(rotateTargetX - rotateX) < 0.1 && Math.abs(rotateTargetY - rotateY) < 0.1 ){ + if ( Math.abs(rotateTargetX - rotateX) < 0.1 && Math.abs(rotateTargetY - rotateY) < 0.1 ) { rotateTargetX = undefined; rotateTargetY = undefined; } @@ -377,12 +263,10 @@ function animate() { rotateX += rotateVX; rotateY += rotateVY; - //rotateY = wrap( rotateY, -Math.PI, Math.PI ); - rotateVX *= 0.98; rotateVY *= 0.98; - if(dragging || rotateTargetX !== undefined ){ + if (dragging || rotateTargetX !== undefined ) { rotateVX *= 0.6; rotateVY *= 0.6; } @@ -391,53 +275,42 @@ function animate() { // constrain the pivot up/down to the poles // force a bit of bounce back action when hitting the poles - if(rotateX < -rotateXMax){ + if (rotateX < -rotateXMax) { rotateX = -rotateXMax; rotateVX *= -0.95; } - if(rotateX > rotateXMax){ + if (rotateX > rotateXMax) { rotateX = rotateXMax; rotateVX *= -0.95; - } + } + + time += increment; + uniforms.scale.value = 1 + (Math.sin(time) * 0.25); + uniforms.randomColor.value = colorFn( Math.random() ); TWEEN.update(); rotating.rotation.x = rotateX; rotating.rotation.y = rotateY; - render(); - - requestAnimationFrame( animate ); - - - THREE.SceneUtils.traverseHierarchy( rotating, - function(mesh) { - if (mesh.update !== undefined) { - mesh.update(); - } - } - ); - - for( var i in markers ){ - var marker = markers[i]; - marker.update(); - } - -} + render(); + + requestAnimationFrame( animate ); +}; function render() { renderer.clear(); - renderer.render( scene, camera ); -} + renderer.render( scene, camera ); +}; -function findCode(countryName){ +function findCode( countryName ){ countryName = countryName.toUpperCase(); for( var i in countryLookup ){ if( countryLookup[i] === countryName ) return i; } return 'not found'; -} +}; // ordered lookup list for country color index // used for GLSL to find which country needs to be highlighted @@ -461,8 +334,8 @@ var countryColorMap = {'PE':1, function highlightCountry( countries ){ var countryCodes = []; for( var i in countries ){ - var code = findCode(countries[i]); - countryCodes.push(code); + var code = findCode( countries[i] ); + countryCodes.push( code ); } var ctx = lookupCanvas.getContext('2d'); @@ -479,77 +352,31 @@ function highlightCountry( countries ){ ctx.fillStyle = 'rgb(' + oceanFill + ',' + oceanFill + ',' + oceanFill +')'; ctx.fillRect( 0, 0, 1, 1 ); - // for( var i = 0; i<255; i++ ){ - // var fillCSS = 'rgb(' + i + ',' + 0 + ',' + i + ')'; - // ctx.fillStyle = fillCSS; - // ctx.fillRect( i, 0, 1, 1 ); - // } - var selectedCountryCode = selectedCountry.countryCode; for( var i in countryCodes ){ var countryCode = countryCodes[i]; var colorIndex = countryColorMap[ countryCode ]; - - var mapColor = countryData[countries[i]].mapColor; - // var fillCSS = '#ff0000'; + + if ( countryData[countries[i]] !== undefined ) { + var mapColor = countryData[countries[i]].mapColor; + } var fillCSS = '#333333'; - if( countryCode === selectedCountryCode ) - fillCSS = '#eeeeee' - // if( mapColor !== undefined ){ - // var k = map( mapColor, 0, 200000000, 0, 255 ); - // k = Math.floor( constrain( k, 0, 255 ) ); - // fillCSS = 'rgb(' + k + ',' + k + ',' + k + ')'; - // } + if( countryCode === selectedCountryCode ) { + fillCSS = '#eeeeee'; + } ctx.fillStyle = fillCSS; ctx.fillRect( colorIndex, 0, 1, 1 ); } lookupTexture.needsUpdate = true; -} - -function getHistoricalData( country ){ - var history = []; - - var countryName = country.countryName; - - var exportCategories = selectionData.getExportCategories(); - var importCategories = selectionData.getImportCategories(); - - for( var i in timeBins ){ - var yearBin = timeBins[i].data; - var value = {imports: 0, exports:0}; - for( var s in yearBin ){ - var set = yearBin[s]; - var categoryName = reverseWeaponLookup[set.wc]; - - var exporterCountryName = set.e.toUpperCase(); - var importerCountryName = set.i.toUpperCase(); - var relevantCategory = ( countryName == exporterCountryName && $.inArray(categoryName, exportCategories ) >= 0 ) || - ( countryName == importerCountryName && $.inArray(categoryName, importCategories ) >= 0 ); - - if( relevantCategory == false ) - continue; - - // ignore all unidentified country data - if( countryData[exporterCountryName] === undefined || countryData[importerCountryName] === undefined ) - continue; - - if( exporterCountryName == countryName ) - value.exports += set.v; - if( importerCountryName == countryName ) - value.imports += set.v; - } - history.push(value); - } - // console.log(history); - return history; -} +}; function getPickColor(){ var affectedCountries = undefined; - if( visualizationMesh.children[0] !== undefined ) + if ( visualizationMesh.children[0] !== undefined ) { affectedCountries = visualizationMesh.children[0].affectedCountries; + } highlightCountry([]); rotating.remove(visualizationMesh); @@ -560,37 +387,55 @@ function getPickColor(){ renderer.autoClearColor = false; renderer.autoClearDepth = false; renderer.autoClearStencil = false; - renderer.preserve - renderer.clear(); - renderer.render(scene,camera); + renderer.clear(); + renderer.render(scene,camera); - var gl = renderer.context; - gl.preserveDrawingBuffer = true; + var gl = renderer.context; + gl.preserveDrawingBuffer = true; - var mx = ( mouseX + renderer.context.canvas.width/2 );//(mouseX + renderer.context.canvas.width/2) * 0.25; - var my = ( -mouseY + renderer.context.canvas.height/2 );//(-mouseY + renderer.context.canvas.height/2) * 0.25; + var mx = ( mouseX + renderer.context.canvas.width/2 ); + var my = ( -mouseY + renderer.context.canvas.height/2 ); mx = Math.floor( mx ); my = Math.floor( my ); - var buf = new Uint8Array( 4 ); - // console.log(buf); + var buf = new Uint8Array( 4 ); gl.readPixels( mx, my, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf ); - // console.log(buf); renderer.autoClear = true; renderer.autoClearColor = true; renderer.autoClearDepth = true; renderer.autoClearStencil = true; - gl.preserveDrawingBuffer = false; + gl.preserveDrawingBuffer = false; mapUniforms['outlineLevel'].value = 1; rotating.add(visualizationMesh); - if( affectedCountries !== undefined ){ highlightCountry(affectedCountries); } - return buf[0]; -} \ No newline at end of file + return buf[0]; +}; + +function setGlobeImage( fileName ) { + var newTextureImage = new Image(); + newTextureImage.src = IMAGE_DIR + fileName; + newTextureImage.onload = function() { + outlinedMapTexture.image = newTextureImage; + outlinedMapTexture.needsUpdate = true; + }; +}; + +function startCrazyMode() { + increment = 0.539; + uniforms.isCrazy.value = 1; + controllers.spin = -50; +}; + +function stopCrazyMode() { + increment = 0; + time = 0; + uniforms.isCrazy.value = 0; + controllers.spin = 0; +}; diff --git a/js/markers.js b/js/markers.js deleted file mode 100644 index 95b0824..0000000 --- a/js/markers.js +++ /dev/null @@ -1,168 +0,0 @@ -var markers = []; - -function onMarkerHover( event ){ - var hx = event.clientX - window.innerWidth * 0.5; - var hy = event.clientY - window.innerHeight * 0.5; - var dx = mouseX - hx; - var dy = mouseY - hy; - var d = Math.sqrt( dx * dx + dy * dy ); - // if( event.target.style.visibility == 'visible' ) - // console.log('clicked on something!!'); -} - -function attachMarkerToCountry( countryName, importance ){ - // look up the name to mesh - countryName = countryName.toUpperCase(); - var country = countryData[countryName]; - if( country === undefined ) - return; - - var container = document.getElementById( 'visualization' ); - var template = document.getElementById( 'marker_template' ); - var marker = template.cloneNode(true); - - country.marker = marker; - container.appendChild( marker ); - - marker.countryName = countryName; - - marker.importance = importance; - marker.selected = false; - marker.hover = false; - if( countryName === selectedCountry.countryName.toUpperCase() ) - marker.selected = true; - - marker.setPosition = function(x,y,z){ - this.style.left = x + 'px'; - this.style.top = y + 'px'; - this.style.zIndex = z; - } - - marker.setVisible = function( vis ){ - if( ! vis ) - this.style.display = 'none'; - else{ - this.style.display = 'inline'; - } - } - var countryLayer = marker.querySelector( '#countryText'); - marker.countryLayer = countryLayer; - var detailLayer = marker.querySelector( '#detailText' ); - marker.detailLayer = detailLayer; - marker.jquery = $(marker); - marker.setSize = function( s ){ - var detailSize = Math.floor(2 + s * 0.5); - this.detailLayer.style.fontSize = detailSize + 'pt'; - var totalHeight = detailSize * 2; - this.style.fontSize = totalHeight * 1.125 + 'pt'; - if(detailSize <= 8) { - this.countryLayer.style.marginTop = "0px"; - } else { - this.countryLayer.style.marginTop = "-1px"; - } - } - - marker.update = function(){ - var matrix = rotating.matrixWorld; - var abspos = matrix.multiplyVector3( country.center.clone() ); - var screenPos = screenXY(abspos); - - var s = 0.3 + camera.scale.z * 1; - var importanceScale = this.importance / 5000000; - importanceScale = constrain( importanceScale, 0, 18 ); - s += importanceScale; - - if( this.tiny ) - s *= 0.75; - - if( this.selected ) - s = 30; - - if( this.hover ) - s = 15; - - this.setSize( s ); - - // if( this.selected ) - // this.setVisible( true ) - // else - this.setVisible( ( abspos.z > 60 ) && s > 3 ); - - var zIndex = Math.floor( 1000 - abspos.z + s ); - if( this.selected || this.hover ) - zIndex = 10000; - - this.setPosition( screenPos.x, screenPos.y, zIndex ); - } - - var nameLayer = marker.querySelector( '#countryText' ); - - // right now, something arbitrary like 10 mil dollars or more to be highlighted - var tiny = (importance < 20000000) && (!marker.selected); - marker.tiny = tiny; - - // if( tiny ) - // nameLayer.innerHTML = country.countryCode; - // else - nameLayer.innerHTML = countryName.replace(' ',' '); - - // marker.nameLayer = nameLayer; - // marker.nameLayerText = countryName; - // marker.nameLayerShorten = country.countryCode;; - - var importExportText = ""; - if(country.exportedAmount > 0 && country.importedAmount > 0) { - importExportText += "imported: $" + numberWithCommas(country.importedAmount) + "
" + - "exported: $"+numberWithCommas(country.exportedAmount); - } else if(country.exportedAmount > 0 && country.importedAmount == 0) { - importExportText += "exported: $"+numberWithCommas(country.exportedAmount)+"
 "; - } else if(country.exportedAmount == 0 && country.importedAmount > 0) { - importExportText += "imported: $"+numberWithCommas(country.importedAmount)+"
 "; - } - - marker.importExportText = importExportText; - - - var markerOver = function(e){ - this.detailLayer.innerHTML = importExportText; - this.hover = true; - } - - var markerOut = function(e){ - this.detailLayer.innerHTML = ""; - this.hover = false; - } - - if( !tiny ) { - detailLayer.innerHTML = importExportText; - } - else{ - marker.addEventListener( 'mouseover', markerOver, false ); - marker.addEventListener( 'mouseout', markerOut, false ); - } - - - var markerSelect = function(e){ - var selection = selectionData; - selectVisualization( timeBins, selection.selectedYear, [this.countryName], selection.getExportCategories(), selection.getImportCategories() ); - }; - marker.addEventListener('click', markerSelect, true); - - markers.push( marker ); -} - -function removeMarkerFromCountry( countryName ){ - countryName = countryName.toUpperCase(); - var country = countryData[countryName]; - if( country === undefined ) - return; - if( country.marker === undefined ) - return; - - var index = markers.indexOf(country.marker); - if( index >= 0 ) - markers.splice( index, 1 ); - var container = document.getElementById( 'visualization' ); - container.removeChild( country.marker ); - country.marker = undefined; -} \ No newline at end of file diff --git a/js/mousekeyboard.js b/js/mousekeyboard.js index 81d9041..09649a7 100644 --- a/js/mousekeyboard.js +++ b/js/mousekeyboard.js @@ -10,7 +10,7 @@ var rotateXMax = 90 * Math.PI/180; var rotateTargetX = undefined; var rotateTargetY = undefined; -var keyboard = new THREEx.KeyboardState(); +var keyboard = new THREEx.KeyboardState(); function onDocumentMouseMove( event ) { @@ -20,87 +20,95 @@ function onDocumentMouseMove( event ) { mouseX = event.clientX - window.innerWidth * 0.5; mouseY = event.clientY - window.innerHeight * 0.5; - if(dragging){ - if(keyboard.pressed("shift") == false){ - rotateVY += (mouseX - pmouseX) / 2 * Math.PI / 180 * 0.3; - rotateVX += (mouseY - pmouseY) / 2 * Math.PI / 180 * 0.3; - } - else{ - camera.position.x -= (mouseX - pmouseX) * .5; - camera.position.y += (mouseY - pmouseY) * .5; - } + if ( dragging ) { + rotateVY += (mouseX - pmouseX) / 2 * Math.PI / 180 * 0.3; + rotateVX += (mouseY - pmouseY) / 2 * Math.PI / 180 * 0.3; } -} +}; function onDocumentMouseDown( event ) { - if(event.target.className.indexOf('noMapDrag') !== -1) { - return; - } dragging = true; pressX = mouseX; pressY = mouseY; rotateTargetX = undefined; rotateTargetX = undefined; -} + controllers.spin = 0; + event.preventDefault(); +}; function onDocumentMouseUp( event ){ - d3Graphs.zoomBtnMouseup(); dragging = false; - histogramPressed = false; -} +}; function onClick( event ){ // make the rest not work if the event was actually a drag style click - if( Math.abs(pressX - mouseX) > 3 || Math.abs(pressY - mouseY) > 3 ) - return; + if( Math.abs(pressX - mouseX) > 3 || Math.abs(pressY - mouseY) > 3 ) { + return; + } var pickColorIndex = getPickColor(); // find it - for( var i in countryColorMap ){ + for ( var i in countryColorMap ) { var countryCode = i; var countryColorIndex = countryColorMap[i]; - if( pickColorIndex == countryColorIndex ){ - // console.log("selecting code " + countryCode); + if ( pickColorIndex == countryColorIndex ) { var countryName = countryLookup[countryCode]; - // console.log("converts to " + countryName); - if( countryName === undefined ) + if ( countryName === undefined ) { return; - if( $.inArray(countryName, selectableCountries) <= -1 ) + } + if ( $.inArray(countryName, selectableCountries) <= -1 ) { return; - // console.log(countryName); + } var selection = selectionData; selection.selectedCountry = countryName; - selectVisualization( timeBins, selection.selectedYear, [selection.selectedCountry], selection.getExportCategories(), selection.getImportCategories() ); - // console.log('selecting ' + countryName + ' from click'); + selectVisualization( selection.selectedTime, [selection.selectedCountry] ); return; } } -} +}; function onKeyDown( event ){ -} + switch ( event.keyCode ) { + case 37: + controllers.spin += 0.1; + event.preventDefault(); + break; + case 38: + handleMWheel( 2.5 ); + event.preventDefault(); + break; + case 39: + controllers.spin -= 0.1; + event.preventDefault(); + break; + case 40: + handleMWheel( -2.5 ); + event.preventDefault(); + break; + } +}; function handleMWheel( delta ) { camera.scale.z += delta * 0.1; camera.scale.z = constrain( camera.scale.z, 0.7, 5.0 ); -} +}; function onMouseWheel( event ){ var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; + if ( event.wheelDelta ) { /* IE/Opera. */ + delta = event.wheelDelta/120; } // firefox - else if( event.detail ){ + else if ( event.detail ) { delta = -event.detail/3; } - - if (delta) - handleMWheel(delta); + if ( delta ) { + handleMWheel( delta ); + } event.returnValue = false; -} +}; -function onDocumentResize(e){ -} \ No newline at end of file +function onDocumentResize( e ) { +}; diff --git a/js/perlin.js b/js/perlin.js deleted file mode 100644 index 64e55c2..0000000 --- a/js/perlin.js +++ /dev/null @@ -1,56 +0,0 @@ -// This is a port of Ken Perlin's Java code. The -// original Java code is at http://cs.nyu.edu/%7Eperlin/noise/. -// Note that in this version, a number from 0 to 1 is returned. -PerlinNoise = new function() { - -this.noise = function(x, y, z) { - - var p = new Array(512) - var permutation = [ 151,160,137,91,90,15, - 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, - 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, - 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, - 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, - 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, - 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, - 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, - 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, - 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, - 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, - 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, - 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 - ]; - for (var i=0; i < 256 ; i++) - p[256+i] = p[i] = permutation[i]; - - var X = Math.floor(x) & 255, // FIND UNIT CUBE THAT - Y = Math.floor(y) & 255, // CONTAINS POINT. - Z = Math.floor(z) & 255; - x -= Math.floor(x); // FIND RELATIVE X,Y,Z - y -= Math.floor(y); // OF POINT IN CUBE. - z -= Math.floor(z); - var u = fade(x), // COMPUTE FADE CURVES - v = fade(y), // FOR EACH OF X,Y,Z. - w = fade(z); - var A = p[X ]+Y, AA = p[A]+Z, AB = p[A+1]+Z, // HASH COORDINATES OF - B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z; // THE 8 CUBE CORNERS, - - return scale(lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ), // AND ADD - grad(p[BA ], x-1, y , z )), // BLENDED - lerp(u, grad(p[AB ], x , y-1, z ), // RESULTS - grad(p[BB ], x-1, y-1, z ))),// FROM 8 - lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ), // CORNERS - grad(p[BA+1], x-1, y , z-1 )), // OF CUBE - lerp(u, grad(p[AB+1], x , y-1, z-1 ), - grad(p[BB+1], x-1, y-1, z-1 ))))); - } - function fade(t) { return t * t * t * (t * (t * 6 - 15) + 10); } - function lerp( t, a, b) { return a + t * (b - a); } - function grad(hash, x, y, z) { - var h = hash & 15; // CONVERT LO 4 BITS OF HASH CODE - var u = h<8 ? x : y, // INTO 12 GRADIENT DIRECTIONS. - v = h<4 ? y : h==12||h==14 ? x : z; - return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v); - } - function scale(n) { return (1 + n)/2; } -} \ No newline at end of file diff --git a/js/rgbcolor.js b/js/rgbcolor.js deleted file mode 100755 index 04423f2..0000000 --- a/js/rgbcolor.js +++ /dev/null @@ -1,288 +0,0 @@ -/** - * A class to parse color values - * @author Stoyan Stefanov - * @link http://www.phpied.com/rgb-color-parser-in-javascript/ - * @license Use it if you like it - */ -function RGBColor(color_string) -{ - this.ok = false; - - // strip any leading # - if (color_string.charAt(0) == '#') { // remove # if any - color_string = color_string.substr(1,6); - } - - color_string = color_string.replace(/ /g,''); - color_string = color_string.toLowerCase(); - - // before getting into regexps, try simple matches - // and overwrite the input - var simple_colors = { - aliceblue: 'f0f8ff', - antiquewhite: 'faebd7', - aqua: '00ffff', - aquamarine: '7fffd4', - azure: 'f0ffff', - beige: 'f5f5dc', - bisque: 'ffe4c4', - black: '000000', - blanchedalmond: 'ffebcd', - blue: '0000ff', - blueviolet: '8a2be2', - brown: 'a52a2a', - burlywood: 'deb887', - cadetblue: '5f9ea0', - chartreuse: '7fff00', - chocolate: 'd2691e', - coral: 'ff7f50', - cornflowerblue: '6495ed', - cornsilk: 'fff8dc', - crimson: 'dc143c', - cyan: '00ffff', - darkblue: '00008b', - darkcyan: '008b8b', - darkgoldenrod: 'b8860b', - darkgray: 'a9a9a9', - darkgreen: '006400', - darkkhaki: 'bdb76b', - darkmagenta: '8b008b', - darkolivegreen: '556b2f', - darkorange: 'ff8c00', - darkorchid: '9932cc', - darkred: '8b0000', - darksalmon: 'e9967a', - darkseagreen: '8fbc8f', - darkslateblue: '483d8b', - darkslategray: '2f4f4f', - darkturquoise: '00ced1', - darkviolet: '9400d3', - deeppink: 'ff1493', - deepskyblue: '00bfff', - dimgray: '696969', - dodgerblue: '1e90ff', - feldspar: 'd19275', - firebrick: 'b22222', - floralwhite: 'fffaf0', - forestgreen: '228b22', - fuchsia: 'ff00ff', - gainsboro: 'dcdcdc', - ghostwhite: 'f8f8ff', - gold: 'ffd700', - goldenrod: 'daa520', - gray: '808080', - green: '008000', - greenyellow: 'adff2f', - honeydew: 'f0fff0', - hotpink: 'ff69b4', - indianred : 'cd5c5c', - indigo : '4b0082', - ivory: 'fffff0', - khaki: 'f0e68c', - lavender: 'e6e6fa', - lavenderblush: 'fff0f5', - lawngreen: '7cfc00', - lemonchiffon: 'fffacd', - lightblue: 'add8e6', - lightcoral: 'f08080', - lightcyan: 'e0ffff', - lightgoldenrodyellow: 'fafad2', - lightgrey: 'd3d3d3', - lightgreen: '90ee90', - lightpink: 'ffb6c1', - lightsalmon: 'ffa07a', - lightseagreen: '20b2aa', - lightskyblue: '87cefa', - lightslateblue: '8470ff', - lightslategray: '778899', - lightsteelblue: 'b0c4de', - lightyellow: 'ffffe0', - lime: '00ff00', - limegreen: '32cd32', - linen: 'faf0e6', - magenta: 'ff00ff', - maroon: '800000', - mediumaquamarine: '66cdaa', - mediumblue: '0000cd', - mediumorchid: 'ba55d3', - mediumpurple: '9370d8', - mediumseagreen: '3cb371', - mediumslateblue: '7b68ee', - mediumspringgreen: '00fa9a', - mediumturquoise: '48d1cc', - mediumvioletred: 'c71585', - midnightblue: '191970', - mintcream: 'f5fffa', - mistyrose: 'ffe4e1', - moccasin: 'ffe4b5', - navajowhite: 'ffdead', - navy: '000080', - oldlace: 'fdf5e6', - olive: '808000', - olivedrab: '6b8e23', - orange: 'ffa500', - orangered: 'ff4500', - orchid: 'da70d6', - palegoldenrod: 'eee8aa', - palegreen: '98fb98', - paleturquoise: 'afeeee', - palevioletred: 'd87093', - papayawhip: 'ffefd5', - peachpuff: 'ffdab9', - peru: 'cd853f', - pink: 'ffc0cb', - plum: 'dda0dd', - powderblue: 'b0e0e6', - purple: '800080', - red: 'ff0000', - rosybrown: 'bc8f8f', - royalblue: '4169e1', - saddlebrown: '8b4513', - salmon: 'fa8072', - sandybrown: 'f4a460', - seagreen: '2e8b57', - seashell: 'fff5ee', - sienna: 'a0522d', - silver: 'c0c0c0', - skyblue: '87ceeb', - slateblue: '6a5acd', - slategray: '708090', - snow: 'fffafa', - springgreen: '00ff7f', - steelblue: '4682b4', - tan: 'd2b48c', - teal: '008080', - thistle: 'd8bfd8', - tomato: 'ff6347', - turquoise: '40e0d0', - violet: 'ee82ee', - violetred: 'd02090', - wheat: 'f5deb3', - white: 'ffffff', - whitesmoke: 'f5f5f5', - yellow: 'ffff00', - yellowgreen: '9acd32' - }; - for (var key in simple_colors) { - if (color_string == key) { - color_string = simple_colors[key]; - } - } - // emd of simple type-in colors - - // array of color definition objects - var color_defs = [ - { - re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, - example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], - process: function (bits){ - return [ - parseInt(bits[1]), - parseInt(bits[2]), - parseInt(bits[3]) - ]; - } - }, - { - re: /^(\w{2})(\w{2})(\w{2})$/, - example: ['#00ff00', '336699'], - process: function (bits){ - return [ - parseInt(bits[1], 16), - parseInt(bits[2], 16), - parseInt(bits[3], 16) - ]; - } - }, - { - re: /^(\w{1})(\w{1})(\w{1})$/, - example: ['#fb0', 'f0f'], - process: function (bits){ - return [ - parseInt(bits[1] + bits[1], 16), - parseInt(bits[2] + bits[2], 16), - parseInt(bits[3] + bits[3], 16) - ]; - } - } - ]; - - // search through the definitions to find a match - for (var i = 0; i < color_defs.length; i++) { - var re = color_defs[i].re; - var processor = color_defs[i].process; - var bits = re.exec(color_string); - if (bits) { - channels = processor(bits); - this.r = channels[0]; - this.g = channels[1]; - this.b = channels[2]; - this.ok = true; - } - - } - - // validate/cleanup values - this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r); - this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g); - this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b); - - // some getters - this.toRGB = function () { - return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; - } - this.toHex = function () { - var r = this.r.toString(16); - var g = this.g.toString(16); - var b = this.b.toString(16); - if (r.length == 1) r = '0' + r; - if (g.length == 1) g = '0' + g; - if (b.length == 1) b = '0' + b; - return '#' + r + g + b; - } - - // help - this.getHelpXML = function () { - - var examples = new Array(); - // add regexps - for (var i = 0; i < color_defs.length; i++) { - var example = color_defs[i].example; - for (var j = 0; j < example.length; j++) { - examples[examples.length] = example[j]; - } - } - // add type-in colors - for (var sc in simple_colors) { - examples[examples.length] = sc; - } - - var xml = document.createElement('ul'); - xml.setAttribute('id', 'rgbcolor-examples'); - for (var i = 0; i < examples.length; i++) { - try { - var list_item = document.createElement('li'); - var list_color = new RGBColor(examples[i]); - var example_div = document.createElement('div'); - example_div.style.cssText = - 'margin: 3px; ' - + 'border: 1px solid black; ' - + 'background:' + list_color.toHex() + '; ' - + 'color:' + list_color.toHex() - ; - example_div.appendChild(document.createTextNode('test')); - var list_item_value = document.createTextNode( - ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex() - ); - list_item.appendChild(example_div); - list_item.appendChild(list_item_value); - xml.appendChild(list_item); - - } catch(e){} - } - return xml; - - } - -} - diff --git a/js/shaders.js b/js/shaders.js new file mode 100644 index 0000000..66a325a --- /dev/null +++ b/js/shaders.js @@ -0,0 +1,52 @@ +var Shaders = { + arcsVertexShader: [ + 'uniform float scale;', + 'uniform vec3 randomColor;', + 'uniform float isCrazy;', + 'attribute vec3 color;', + 'attribute float opacity;', + 'varying vec3 vColor;', + 'varying float vOpacity;', + 'void main() {', + 'gl_Position = projectionMatrix * modelViewMatrix * vec4( position * scale, 1.0);', + 'vOpacity = opacity;', + 'vColor = color * (1.-isCrazy) + randomColor * isCrazy;', + '}' + ].join('\n'), + arcsFragmentShader: [ + 'varying float vOpacity;', + 'varying vec3 vColor;', + 'void main() {', + 'gl_FragColor = vec4(vColor, vOpacity);', + '}' + ].join('\n'), + globeVertexShader: [ + 'varying vec3 vNormal;', + 'varying vec2 vUv;', + 'void main() {', + 'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0);', + 'vNormal = normalize( normalMatrix * normal );', + 'vUv = uv;', + '}' + ].join('\n'), + globeFragmentShader: [ + 'uniform sampler2D mapIndex;', + 'uniform sampler2D lookup;', + 'uniform sampler2D outline;', + 'uniform float outlineLevel;', + 'varying vec3 vNormal;', + 'varying vec2 vUv;', + 'void main() {', + 'vec4 mapColor = texture2D( mapIndex, vUv );', + 'float indexedColor = mapColor.x;', + 'vec2 lookupUV = vec2( indexedColor, 0. );', + 'vec4 lookupColor = texture2D( lookup, lookupUV );', + 'float mask = lookupColor.x + (1.-outlineLevel) * indexedColor;', + 'mask = clamp(mask,0.,1.);', + 'float outlineColor = texture2D( outline, vUv ).x * outlineLevel;', + 'float diffuse = mask + outlineColor;', + // If not testing for which country was picked, display true color, else display indexed color + 'gl_FragColor = vec4( vec3(diffuse), 1. ) * (1.-outlineLevel) + texture2D( outline, vUv ) * outlineLevel;', + '}' + ].join('\n') + }; \ No newline at end of file diff --git a/js/shadow_transparent.png b/js/shadow_transparent.png deleted file mode 100755 index 0e48a8c1f5e9cff1847f4953a5ce6d917216294c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6633 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 0 ){ - beginState = keyframes[i - 1].vars; - } - - // copy over from begin state to keep the state from last animation - var endState = keyframe.vars; - for( var prop in beginState ) { - if (!(prop in endState)) { - endState[prop] = beginState[prop]; - } - - // additive - // else { - // endState[prop] += beginState[prop]; - // } - } - - var tween = _this.setTweenStates( elementName, beginState, endState, duration, easing ); - - if( i == 0 ){ - firstTween = tween; - } - else{ - lastTween.chain( tween ); - } - - if( loop ){ - tween.chain( tween ); - } - - if( loopedVars !== undefined ){ - tween.onComplete( function(){ - for( var prop in loopedVars ){ - beginState[prop] = loopedVars[prop]; - } - }); - } - - lastTween = tween; - } - firstTween.start(); - } - - this.setTweenStates = function( elementName, beginState, endState, duration, easing ){ - _this.prepVars( beginState ); - _this.prepVars( endState ); - - var state = beginState; - var tween = _this.makeTween( state, endState, duration, easing, function(){ - var value = _this.beginTransform() - .translate( state._tx, state._ty) - .rotateOrigin( state._ro, state._ox, state._oy ) - .scaleOrigin( state._so, state._ox, state._oy ) - .endTransform(); - _this.setProperty( elementName, 'transform', value ); - for( prop in state ){ - if( _this.isEscapeProperty(prop) ) - continue; - // console.log(state[prop]); - _this.setProperty( elementName, prop, state[prop] ); - } - }); - return tween; - } - - this.makeTween = function( start, end, duration, easing, updatefunction ){ - var tween = new TWEEN.Tween( start ); - tween.to( end, duration ); - tween.easing( easing ); - tween.onUpdate(updatefunction); - return tween; - } - - this.isEscapeProperty = function( propName ){ - if( propName === '_ox' || propName === '_oy' || - propName === '_tx' || propName === '_ty' || - propName === '_ro' || propName === '_so' || - propName === 'duration' || propName === 'easing' || - propName === 'vars' || propName === 'loop' || - propName === 'loopedVars' ) - return true; - return false; - } - - -} - -SVGToy.prototype.getOriginFromFile = function(){ - if( this.svg === undefined ) - return {x:0,y:0}; - var originObject = this.svg.getElementById('Origin'); - var p = { - x : 0, - y : 0 - }; - if( originObject === undefined || originObject === null ) - return {x:0,y:0}; - - p.x = parseFloat(originObject.getAttribute('cx')); - p.y = parseFloat(originObject.getAttribute('cy')); - - return p; -} - -SVGToy.prototype.setOrigin = function( x, y ){ - this.svg.style.marginLeft = (-x) + 'px'; - this.svg.style.marginTop = (-y) + 'px'; - this.origin.x = x; - this.origin.y = y; -}; - -SVGToy.prototype.setPosition = function( x, y, z ){ - this.container.style.left = x + 'px'; - this.container.style.top = y + 'px'; - - // umm can't get this to work - // vvvvvvvvvvvvvvvvvvvvvvvvvv - - // this.container.style.webkitTransform = 'translate3d(' + x + ',' + y + ',' + 0 + ')'; - // var str = 'translate3d(' + x + 'px,' + y + 'px,' + z + 'px)'; - // console.log(str); - // this.container.style['webkit-transform'] = str; - // console.log(this.container.style.webkitTransform); - // var fin = 'translate3d(' + x + ',' + y + ',' + '0' + ')' - // console.log(fin); - // console.log = function(){}; -}; - -SVGToy.prototype.setAlpha = function( alpha ){ - this.container.style.opacity = alpha; -} - -SVGToy.prototype.setZIndex = function( index ){ - this.container.style['z-index'] = index + ''; -} - -SVGToy.prototype.setScale = function( scale ){ - this.svg.style.width = (scale * 100) + "%"; - this.svg.style.height = (scale * 100) + "%"; - var transform = this.beginTransform().scaleOrigin(scale).endTransform(); - this.setProperty('transform', transform); -} - -SVGToy.prototype.setProperty = function( elementName, elementProperty, value ){ - var element = this.svg.getElementById( elementName ); - if( element === undefined || element === null ) - return; - element.setAttribute( elementProperty, value ); -}; - -SVGToy.prototype.getProperty = function( elementName, elementProperty ){ - var element = this.svg.getElementById( elementName ); - if( element === undefined || element === null ) - return undefined; - return element.getAttribute( elementProperty ); -}; - -SVGToy.prototype.hide = function(){ - if( this.container.style.visibility === 'visibile' || this.container.style.visibility === undefined ) - if( this.hideEvent !== undefined ) - this.hideEvent(); - this.container.style.visibility = 'hidden'; - this.svg.style.visibility = 'hidden'; -}; - -SVGToy.prototype.show = function(){ - if( this.container.style.visibility === 'hidden' || this.container.style.visibility === undefined ) - if( this.showEvent !== undefined ) - this.showEvent(); - this.container.style.visibility = 'visible'; - this.svg.style.visibility = 'visible'; -}; - -SVGToy.prototype.visibile = function(){ - return this.container.style.visibility == 'visible' ? true : false; -}; - -SVGToy.prototype.setText = function( elementName, value ){ - if( this.svg === undefined ) - return; - var element = this.svg.getElementById( elementName ); - if( element === undefined || element === null ) - return undefined; - element.textContent = value; -}; - -SVGToy.prototype.beginTransform = function(){ - return new this.TransformHelper(); -}; - -SVGToy.prototype.removeFromDom = function(){ - this.parentContainer.removeChild( this.container ); -}; \ No newline at end of file diff --git a/js/ui.controls.js b/js/ui.controls.js deleted file mode 100644 index dd9781c..0000000 --- a/js/ui.controls.js +++ /dev/null @@ -1,805 +0,0 @@ -/** -ui.control.js -Created by Pitch Interactive -Created on 6/26/2012 -This code will control the primary functions of the UI in the ArmsGlobe app -**/ -d3.selection.prototype.moveToFront = function() { - return this.each(function() { - this.parentNode.appendChild(this); - }); -}; - -var d3Graphs = { - barGraphWidth: 300, - barGraphHeight: 800, - barWidth: 14, - barGraphTopPadding: 20, - barGraphBottomPadding: 50, - histogramWidth: 686, - histogramHeight: 160, - histogramLeftPadding:31, - histogramRightPadding: 31, - histogramVertPadding:20, - barGraphSVG: d3.select("#wrapper").append("svg").attr('id','barGraph'), - histogramSVG: null, - histogramYScale: null, - histogramXScale: null, - cumImportY: 0,cumExportY: 0, - cumImportLblY: 0,cumExportLblY: 0, - inited: false, - histogramOpen: false, - handleLeftOffset: 12, - handleInterval: 35, - windowResizeTimeout: -1, - histogramImports: null, - histogramExports: null, - histogramAbsMax: 0, - previousImportLabelTranslateY: -1, - previousExportLabelTranslateY: -1, - zoomBtnInterval: -1, - - - setCountry: function(country) { - $("#hudButtons .countryTextInput").val(country); - d3Graphs.updateViz(); - }, - initGraphs: function() { - this.showHud(); - this.drawBarGraph(); - this.drawHistogram(); - }, - showHud: function() { - if(this.inited) return; - this.inited = true; - d3Graphs.windowResize(); - $("#hudHeader, #hudButtons").show(); - $("#history").show(); - $("#graphIcon").show(); - $("#importExportBtns").show(); - $("#graphIcon").click(d3Graphs.graphIconClick); - $("#history .close").click(d3Graphs.closeHistogram); - $("#history ul li").click(d3Graphs.clickTimeline); - $("#handle").draggable({axis: 'x',containment: "parent",grid:[this.handleInterval, this.handleInterval], stop: d3Graphs.dropHandle, drag: d3Graphs.dropHandle }); - $("#hudButtons .searchBtn").click(d3Graphs.updateViz); - $("#importExportBtns .imex>div").not(".label").click(d3Graphs.importExportBtnClick); - $("#importExportBtns .imex .label").click(d3Graphs.importExportLabelClick); - $("#hudButtons .countryTextInput").autocomplete({ source:selectableCountries, autoFocus: true }); - $("#hudButtons .countryTextInput").keyup(d3Graphs.countryKeyUp); - $("#hudButtons .countryTextInput").focus(d3Graphs.countryFocus); - $("#hudButtons .aboutBtn").click(d3Graphs.toggleAboutBox); - $(document).on("click",".ui-autocomplete li",d3Graphs.menuItemClick); - $(window).resize(d3Graphs.windowResizeCB); - $(".zoomBtn").mousedown(d3Graphs.zoomBtnClick); - $(".zoomBtn").mouseup(d3Graphs.zoomBtnMouseup); - - }, - zoomBtnMouseup: function() { - clearInterval(d3Graphs.zoomBtnInterval); - }, - zoomBtnClick:function() { - var delta; - if($(this).hasClass('zoomOutBtn')) { - delta = -0.5; - } else { - delta = 0.5; - } - d3Graphs.doZoom(delta); - d3Graphs.zoomBtnInterval = setInterval(d3Graphs.doZoom,50,delta); - }, - doZoom:function(delta) { - camera.scale.z += delta * 0.1; - camera.scale.z = constrain( camera.scale.z, 0.8, 5.0 ); - }, - toggleAboutBox:function() { - $("#aboutContainer").toggle(); - }, - clickTimeline:function() { - var year = $(this).html(); - if(year < 10) { - year = (year * 1) + 2000; - } - if(year < 100) { - year = (year * 1) + 1900 - } - var index = year - 1992; - var leftPos = d3Graphs.handleLeftOffset + d3Graphs.handleInterval * index; - $("#handle").css('left',leftPos+"px"); - d3Graphs.updateViz(); - }, - windowResizeCB:function() { - clearTimeout(d3Graphs.windowResizeTimeout); - d3Graphs.windowResizeTimeout = setTimeout(d3Graphs.windowResize, 50); - }, - windowResize: function() { - var windowWidth = $(window).width(); - var windowHeight = $(window).height(); - d3Graphs.positionHistory(windowWidth); - var minWidth = 1280; - var minHeight = 860; - var w = windowWidth < minWidth ? minWidth : windowWidth; - var hudButtonWidth = 489; - $('#hudButtons').css('left',w - hudButtonWidth-20); - var importExportButtonWidth = $("#importExportBtns").width(); - $("#importExportBtns").css('left',w-importExportButtonWidth - 20); - var barGraphHeight = 800; - var barGraphBottomPadding = 10; - console.log(windowHeight+ " " + barGraphHeight + " " + barGraphBottomPadding); - var barGraphTopPos = (windowHeight < minHeight ? minHeight : windowHeight) - barGraphHeight - barGraphBottomPadding; - console.log(barGraphTopPos); - - $("#barGraph").css('top',barGraphTopPos+'px'); - /* - var hudHeaderLeft = $("#hudHeader").css('left'); - hudHeaderLeft = hudHeaderLeft.substr(0,hudHeaderLeft.length-2) - console.log(hudHeaderLeft); - var hudPaddingRight = 30; - $("#hudHeader").width(w-hudHeaderLeft - hudPaddingRight); - */ - }, - positionHistory: function(windowWidth) { - var graphIconPadding = 20; - var historyWidth = $("#history").width(); - var totalWidth = historyWidth + $("#graphIcon").width() + graphIconPadding; -// var windowWidth = $(window).width(); - var historyLeftPos = (windowWidth - totalWidth) / 2.0; - var minLeftPos = 280; - if(historyLeftPos < minLeftPos) { - historyLeftPos = minLeftPos; - } - $("#history").css('left',historyLeftPos+"px"); - $("#graphIcon").css('left',historyLeftPos + historyWidth + graphIconPadding+'px'); - }, - countryFocus:function(event) { - //console.log("focus"); - setTimeout(function() { $('#hudButtons .countryTextInput').select() },50); - }, - menuItemClick:function(event) { - d3Graphs.updateViz(); - }, - countryKeyUp: function(event) { - if(event.keyCode == 13 /*ENTER */) { - d3Graphs.updateViz(); - } - }, - - updateViz:function() { - var yearOffset = $("#handle").css('left'); - yearOffset = yearOffset.substr(0,yearOffset.length-2); - yearOffset -= d3Graphs.handleLeftOffset; - yearOffset /= d3Graphs.handleInterval; - var year = yearOffset + 1992; - - var country = $("#hudButtons .countryTextInput").val().toUpperCase(); - if(typeof countryData[country] == 'undefined') { - return; - } - - //exports first - var exportArray = [] - var exportBtns = $("#importExportBtns .exports>div").not(".label"); - for(var i = 0; i < exportBtns.length; i++) { - var btn = $(exportBtns[i]); - var weaponTypeKey = btn.attr('class'); - var weaponName = reverseWeaponLookup[weaponTypeKey]; - - if(btn.find('.inactive').length == 0) { - exportArray.push(weaponName); - selectionData.exportCategories[weaponName] = true; - } else { - selectionData.exportCategories[weaponName] = false; - } - } - //imports esecond - var importArray = [] - var importBtns = $("#importExportBtns .imports>div").not(".label"); - for(var i = 0; i < importBtns.length; i++) { - var btn = $(importBtns[i]); - var weaponTypeKey = btn.attr('class'); - var weaponName = reverseWeaponLookup[weaponTypeKey]; - if(btn.find('.inactive').length == 0) { - importArray.push(weaponName); - selectionData.importCategories[weaponName] = true; - } else { - selectionData.importCategories[weaponName] = false; - } - } - selectionData.selectedYear = year; - selectionData.selectedCountry = country; - selectVisualization(timeBins, year,[country],exportArray, importArray); - }, - dropHandle:function() { - d3Graphs.updateViz(); - }, - importExportLabelClick: function() { - var btns = $(this).prevAll(); - var numInactive = 0; - for(var i = 0; i < btns.length; i++) { - if($(btns[i]).find('.inactive').length > 0) { - numInactive++; - } - } - if(numInactive <= 1) { - //add inactive - $(btns).find('.check').addClass('inactive'); - } else { - //remove inactive - $(btns).find('.check').removeClass('inactive'); - } - d3Graphs.updateViz(); - }, - importExportBtnClick:function() { - var check = $(this).find('.check'); - if(check.hasClass('inactive')) { - check.removeClass('inactive'); - } else { - check.addClass('inactive'); - } - d3Graphs.updateViz(); - }, - graphIconClick: function() { - if(!d3Graphs.histogramOpen) { - d3Graphs.histogramOpen = true; - $("#history .graph").slideDown(); - } else { - d3Graphs.closeHistogram(); - } - }, - closeHistogram: function() { - d3Graphs.histogramOpen = false; - $("#history .graph").slideUp(); - }, - line: d3.svg.line() - // assign the X function to plot our line as we wish - .x(function(d,i) { - if(d == null) { - return null; - } - return d3Graphs.histogramXScale(d.x) + d3Graphs.histogramLeftPadding; - }) - .y(function(d) { - if(d == null) { - return null; - } - return d3Graphs.histogramYScale(d.y) + d3Graphs.histogramVertPadding; - }), - setHistogramData:function() { - var importArray = []; - var exportArray = []; - var historical = selectedCountry.summary.historical; - var numHistory = historical.length; - var absMax = 0; - var startingImportIndex = 0; - var startingExportIndex = 0; - - while(startingImportIndex < historical.length && historical[startingImportIndex].imports == 0) { - startingImportIndex++; - } - while(startingExportIndex < historical.length && historical[startingExportIndex].exports == 0) { - startingExportIndex++; - } - for(var i = 0; i < startingImportIndex; i++) { -// importArray.push({x:i, y:null}); - } - if(startingImportIndex != numHistory) { - importArray.push({x: startingImportIndex, y:0}); - } - for(var i = startingImportIndex + 1; i < numHistory; i++) { - var importPrev = historical[startingImportIndex].imports; - var importCur = historical[i].imports; - var importDiff = (importCur - importPrev) / importPrev * 100; - importArray.push({x:i, y:importDiff}); - if(Math.abs(importDiff) > absMax) { - absMax = Math.abs(importDiff); - } - - } - for(var i = 0; i < startingExportIndex; i++) { - // exportArray.push(null); - } - if(startingExportIndex != numHistory) { - exportArray.push({x: startingExportIndex, y: 0}); - } - for(var i = startingExportIndex + 1; i < numHistory; i++) { - var exportPrev = historical[startingExportIndex].exports; - var exportCur = historical[i].exports; - var exportDiff = (exportCur - exportPrev) / exportPrev * 100; - exportArray.push({x: i, y: exportDiff}); - if(Math.abs(exportDiff) > absMax) { - absMax = Math.abs(exportDiff); - } - - } - this.histogramImportArray = importArray; - this.histogramExportArray = exportArray; - this.histogramAbsMax = absMax; - }, - drawHistogram:function() { - if(this.histogramSVG == null) { - this.histogramSVG = d3.select('#history .container').append('svg'); - this.histogramSVG.attr('id','histogram').attr('width',this.histogramWidth).attr('height',this.histogramHeight); - } - this.setHistogramData(); - - this.histogramYScale = d3.scale.linear().domain([this.histogramAbsMax,-this.histogramAbsMax]).range([0, this.histogramHeight - this.histogramVertPadding*2]); - var maxX = selectedCountry.summary.historical.length - 1; - this.histogramXScale = d3.scale.linear().domain([0,maxX]).range([0, this.histogramWidth - this.histogramLeftPadding - this.histogramRightPadding]); - - var tickData = this.histogramYScale.ticks(4); - var containsZero = false; - var numTicks = tickData.length; - for(var i = 0; i < numTicks; i++) { - if(tickData[i] == 0) { - containsZero = true; - break; - } - } - if(!containsZero && numTicks != 0) { - tickData.push(0); - } - //tick lines - var ticks = this.histogramSVG.selectAll('line.tick').data(tickData); - ticks.enter().append('svg:line').attr('class','tick'); - ticks.attr('y1',function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding; - }).attr('y2', function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding; - }).attr('x1',this.histogramLeftPadding).attr('x2',this.histogramWidth - this.histogramRightPadding) - .attr('stroke-dasharray',function(d) { - if(d == 0) { - return null; - } - return '3,1'; - }).attr('stroke-width',function(d) { - if(d == 0) { - return 2; - } - return 1; - }); - //tick labels - var tickLabels = this.histogramSVG.selectAll("text.tickLblLeft").data(tickData); - tickLabels.enter().append('svg:text').attr('class','tickLbl tickLblLeft').attr('text-anchor','end'); - tickLabels.attr('x', d3Graphs.histogramLeftPadding-3).attr('y',function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding + 4; - }).text(function(d) { return Math.abs(d); }).attr('display', function(d) { - if(d == 0) { return 'none'; } - return null; - }); - var tickLabelsRight = this.histogramSVG.selectAll("text.tickLblRight").data(tickData); - tickLabelsRight.enter().append('svg:text').attr('class','tickLbl tickLblRight'); - tickLabelsRight.attr('x', d3Graphs.histogramWidth - d3Graphs.histogramRightPadding+3).attr('y',function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding + 4; - }).text(function(d) { return Math.abs(d); }).attr('display', function(d) { - if(d == 0) { return 'none'; } - return null; - }); - ticks.exit().remove(); - tickLabels.exit().remove(); - tickLabelsRight.exit().remove(); - //+ and - - var plusMinus = this.histogramSVG.selectAll("text.plusMinus").data(["+","—","+","—"]); //those are —s - plusMinus.enter().append('svg:text').attr('class','plusMinus').attr('text-anchor',function(d,i) { - if(i < 2) return 'end'; - return null; - }).attr('x',function(d,i) { - var plusOffset = 3; - if(i < 2) return d3Graphs.histogramLeftPadding + (d == '+' ? -plusOffset : 0) -2; - return d3Graphs.histogramWidth - d3Graphs.histogramRightPadding + (d == '+' ? plusOffset : 0)+2; - }).attr('y',function(d,i) { - var yOffset = 10; - return d3Graphs.histogramYScale(0) + d3Graphs.histogramVertPadding + 6 + (d == '+' ? -yOffset : yOffset); - }).text(String); - //lines - var importsVisible = $("#importExportBtns .imports .check").not(".inactive").length != 0; - var exportsVisible = $("#importExportBtns .exports .check").not(".inactive").length != 0; - $("#history .labels .exports").css('display', exportsVisible ? 'block' : 'none'); - $("#history .labels .imports").css('display', importsVisible ? 'block' : 'none'); - - - var importLine = this.histogramSVG.selectAll("path.import").data([1]); - importLine.enter().append('svg:path').attr('class','import'); - importLine.attr('d', - function(){ - if(d3Graphs.histogramImportArray.length == 0) { - return 'M 0 0'; - } else { - return d3Graphs.line(d3Graphs.histogramImportArray); - } - }).attr('visibility',importsVisible ? 'visible' : 'hidden'); - var exportLine = this.histogramSVG.selectAll("path.export").data([1]); - exportLine.enter().append('svg:path').attr('class','export'); - exportLine.attr('d',function() { - if(d3Graphs.histogramExportArray.length == 0) { - return 'M 0 0'; - } else { - return d3Graphs.line(d3Graphs.histogramExportArray); - } - }).attr('visibility', exportsVisible ? 'visible' : 'hidden'); - importLine.moveToFront(); - exportLine.moveToFront(); - //active year labels - var yearOffset = $("#handle").css('left'); - yearOffset = yearOffset.substr(0,yearOffset.length-2); - yearOffset -= d3Graphs.handleLeftOffset; - yearOffset /= d3Graphs.handleInterval; - var activeYearImports = null; - for(var i = 0; i < this.histogramImportArray.length; i++) { - var curYearData = this.histogramImportArray[i]; - if(curYearData.x == yearOffset) { - activeYearImports = curYearData; - break; - } - } - var activeYearExports = null; - for(var i = 0; i < this.histogramExportArray.length; i++) { - var curYearData = this.histogramExportArray[i]; - if(curYearData.x == yearOffset) { - activeYearExports = curYearData; - break; - } - } - var maxVal; - if(activeYearImports != null && activeYearExports!= null) { - maxVal = activeYearImports.y > activeYearExports.y ? activeYearImports.y : activeYearExports.y; - } else if(activeYearImports != null) { - maxVal = activeYearImports.y; - } else if(activeYearExports != null) { - maxVal = activeYearExports.y; - } else { - maxVal = -1; - } - - var activeYearData = [{x:yearOffset, y: activeYearImports != null ? activeYearImports.y : -1, max: maxVal, show: activeYearImports!=null, type:"imports"}, - {x: yearOffset, y: activeYearExports != null ? activeYearExports.y : -1, max: maxVal, show:activeYearExports!=null, type:'exports'}]; - var yearDots = this.histogramSVG.selectAll("ellipse.year").data(activeYearData); - var yearDotLabels = this.histogramSVG.selectAll("text.yearLabel").data(activeYearData); - yearDots.enter().append('ellipse').attr('class','year').attr('rx',4).attr('ry',4) - .attr('cx',function(d) { return d3Graphs.histogramLeftPadding + d3Graphs.histogramXScale(d.x); }) - .attr('cy',function(d) { return d3Graphs.histogramVertPadding + d3Graphs.histogramYScale(d.y); }); - yearDotLabels.enter().append('text').attr('class','yearLabel').attr('text-anchor','middle'); - var importsVisible = $("#importExportBtns .imports .check").not(".inactive").length != 0; - var exportsVisible = $("#importExportBtns .exports .check").not(".inactive").length != 0; - - yearDots.attr('cx', function(d) { return d3Graphs.histogramLeftPadding + d3Graphs.histogramXScale(d.x); }) - .attr('cy',function(d) { return d3Graphs.histogramVertPadding + d3Graphs.histogramYScale(d.y); } ) - .attr('visibility', function(d) { - if(d.show == false) { - return 'hidden'; - } - if(d.type == "imports") { - return importsVisible ? 'visible' : 'hidden'; - } else if(d.type == "exports") { - return exportsVisible ? 'visible' : 'hidden'; - } - }); - yearDotLabels.attr('x',function(d) { return d3Graphs.histogramLeftPadding + d3Graphs.histogramXScale(d.x); }) - .attr('y',function(d) { - var yVal = d3Graphs.histogramYScale(d.y) + d3Graphs.histogramVertPadding; - if(d.y == maxVal) { - yVal -= 7; - } else { - yVal += 19; - } - if(yVal > d3Graphs.histogramHeight + d3Graphs.histogramVertPadding) { - yVal -= 26; - } - return yVal; - - }).text(function(d) { - var numlbl = Math.round(d.y*10)/10; - var lbl = ""; - if(d.y > 0) { - lbl = "+"; - } - lbl += ""+numlbl+"%"; - return lbl; - - }).attr('visibility', function(d) { - if(d.show == false) { - return 'hidden'; - } - if(d.type == "imports") { - return importsVisible ? 'visible' : 'hidden'; - } else if(d.type == "exports") { - return exportsVisible ? 'visible' : 'hidden'; - } - }); - yearDots.moveToFront(); - yearDotLabels.moveToFront(); - - }, - drawBarGraph: function() { - this.barGraphSVG.attr('id','barGraph').attr('width',d3Graphs.barGraphWidth).attr('height',d3Graphs.barGraphHeight).attr('class','overlayCountries noPointer'); - var importArray = []; - var exportArray = []; - var importTotal = selectedCountry.summary.imported.total; - var exportTotal = selectedCountry.summary.exported.total; - var minImExAmount = Number.MAX_VALUE; - var maxImExAmount = Number.MIN_VALUE; - for(var type in reverseWeaponLookup) { - var imAmnt = selectedCountry.summary.imported[type]; - var exAmnt = selectedCountry.summary.exported[type]; - if(imAmnt < minImExAmount) { - minImExAmount = imAmnt; - } - if(imAmnt > maxImExAmount) { - maxImExAmount = imAmnt; - } - if(exAmnt < minImExAmount) { - minImExAmount = exAmnt; - } - if(exAmnt > maxImExAmount) { - maxImExAmount = exAmnt; - } - importArray.push({"type":type, "amount": imAmnt}); - exportArray.push({"type":type, "amount": exAmnt}); - } - var max = importTotal > exportTotal ? importTotal : exportTotal; - var yScale = d3.scale.linear().domain([0,max]).range([0,this.barGraphHeight - this.barGraphBottomPadding - this.barGraphTopPadding]); - var importRects = this.barGraphSVG.selectAll("rect.import").data(importArray); - var midX = this.barGraphWidth / 2; - this.cumImportY = this.cumExportY = 0; - importRects.enter().append('rect').attr('class', function(d) { - return 'import '+d.type; - }).attr('x',midX - this.barWidth).attr('width',this.barWidth); - - importRects.attr('y',function(d) { - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumImportY - yScale(d.amount) ; - d3Graphs.cumImportY += yScale(d.amount); - return value; - }).attr('height',function(d) { return yScale(d.amount); }); - var exportRects = this.barGraphSVG.selectAll('rect.export').data(exportArray); - exportRects.enter().append('rect').attr('class',function(d) { - return 'export '+ d.type; - }).attr('x',midX + 10).attr('width',this.barWidth); - - exportRects.attr('y',function(d) { - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumExportY - yScale(d.amount); - d3Graphs.cumExportY += yScale(d.amount); - return value; - }).attr('height',function(d) { return yScale(d.amount); }); - //bar graph labels - this.cumImportLblY = 0; - this.cumExportLblY = 0; - this.previousImportLabelTranslateY = 0; - this.previousExportLabelTranslateY = 0; - var paddingFromBottomOfGraph = 00; - var heightPerLabel = 25; - var fontSizeInterpolater = d3.interpolateRound(10,28); - var smallLabelSize = 22; - var mediumLabelSize = 40; - //import labels - var importLabelBGs = this.barGraphSVG.selectAll("rect.barGraphLabelBG").data(importArray); - importLabelBGs.enter().append('rect').attr('class',function(d) { - return 'barGraphLabelBG ' + d.type; }); - var importLabels = this.barGraphSVG.selectAll("g.importLabel").data(importArray); - importLabels.enter().append("g").attr('class',function(d) { - return 'importLabel '+d.type; - }); - importLabels.attr('transform',function(d) { - var translate = 'translate('+(d3Graphs.barGraphWidth / 2 - 25)+","; - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumImportLblY - yScale(d.amount)/2; - d3Graphs.cumImportLblY += yScale(d.amount); - translate += value+")"; - this.previousImportLabelTranslateY = value; - return translate; - }).attr('display',function(d) { - if(d.amount == 0) { return 'none';} - return null; - }); - importLabels.selectAll("*").remove(); - var importLabelArray = importLabels[0]; - var importLabelBGArray = importLabelBGs[0]; - for(var i = 0; i < importLabelArray.length; i++) { - var importLabelE = importLabelArray[i]; - var importLabel = d3.select(importLabelE); - var data = importArray[i]; - importLabel.data(data); - var pieceHeight = yScale(data.amount); - var labelHeight = -1; - var labelBGYPos = -1; - var labelWidth = -1; - var importLabelBG = d3.select(importLabelBGArray[i]); - if(pieceHeight < smallLabelSize) { - //just add number - //console.log("small label"); - var numericLabel = importLabel.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','end').attr('alignment-baseline','central') - .attr('font-size',function(d) { - return fontSizeInterpolater((d.amount-minImExAmount)/(maxImExAmount - minImExAmount)); - }); - labelHeight = fontSizeInterpolater((data.amount-minImExAmount)/(maxImExAmount-minImExAmount)); - labelBGYPos = - labelHeight / 2; - var numericLabelEle = numericLabel[0][0]; - labelWidth = numericLabelEle.getComputedTextLength(); - } else if(pieceHeight < mediumLabelSize || data.type == 'ammo') { - //number and type - //console.log('medium label'); - var numericLabel = importLabel.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','end').attr('font-size',function(d) { - return fontSizeInterpolater((d.amount-minImExAmount)/(maxImExAmount - minImExAmount)); - }); - var textLabel = importLabel.append('text').text(function(d) { - return reverseWeaponLookup[d.type].split(' ')[0].toUpperCase(); - }).attr('text-anchor','end').attr('y',15).attr('class',function(d) { return 'import '+d.type}); - labelHeight = fontSizeInterpolater((data.amount-minImExAmount)/(maxImExAmount-minImExAmount)); - labelBGYPos = -labelHeight; - labelHeight += 16; - var numericLabelEle = numericLabel[0][0]; - var textLabelEle = textLabel[0][0]; - labelWidth = numericLabelEle.getComputedTextLength() > textLabelEle.getComputedTextLength() ? numericLabelEle.getComputedTextLength() : textLabelEle.getComputedTextLength(); - } else { - //number type and 'weapons' - //console.log('large label'); - var numericLabel = importLabel.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','end').attr('font-size',function(d) { - return fontSizeInterpolater((d.amount-minImExAmount)/(maxImExAmount - minImExAmount)); - }).attr('y',-7); - var textLabel = importLabel.append('text').text(function(d) { - return reverseWeaponLookup[d.type].split(' ')[0].toUpperCase(); - }).attr('text-anchor','end').attr('y',8).attr('class',function(d) { return 'import '+d.type}); - var weaponLabel =importLabel.append('text').text('WEAPONS').attr('text-anchor','end').attr('y',21) - .attr('class',function(d) { return'import '+d.type} ); - labelHeight = fontSizeInterpolater((data.amount-minImExAmount)/(maxImExAmount-minImExAmount)); - labelBGYPos = -labelHeight - 7; - labelHeight += 16 +14; - var numericLabelEle = numericLabel[0][0]; - var textLabelEle = textLabel[0][0]; - var weaponLabelEle = weaponLabel[0][0]; - labelWidth = numericLabelEle.getComputedTextLength() > textLabelEle.getComputedTextLength() ? numericLabelEle.getComputedTextLength() : textLabelEle.getComputedTextLength(); - if(weaponLabelEle.getComputedTextLength() > labelWidth) { - labelWidth = weaponLabelEle.getComputedTextLength(); - } - } - if(labelHeight != -1 && labelBGYPos != -1 && labelWidth != -1) { - importLabelBG.attr('x',-labelWidth).attr('y',labelBGYPos).attr('width',labelWidth).attr('height',labelHeight) - .attr('transform',importLabel.attr('transform')); - } - } - //export labels - var exportLabelBGs = this.barGraphSVG.selectAll("rect.barGraphLabelBG.exportBG").data(exportArray); - exportLabelBGs.enter().append('rect').attr('class',function(d) { - return 'barGraphLabelBG exportBG ' + d.type; }); - var exportLabels = this.barGraphSVG.selectAll("g.exportLabel").data(exportArray); - exportLabels.enter().append("g").attr('class',function(d) { - return 'exportLabel '+d.type; - }); - exportLabels.attr('transform',function(d) { - var translate = 'translate('+(d3Graphs.barGraphWidth / 2 + 35)+","; - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumExportLblY - yScale(d.amount)/2; - d3Graphs.cumExportLblY += yScale(d.amount); - translate += value+")"; - this.previousExportLabelTranslateY = value; - return translate; - }).attr('display',function(d) { - if(d.amount == 0) { return 'none';} - return null; - }); - exportLabels.selectAll("*").remove(); - var exportLabelArray = exportLabels[0]; - var exportLabelBGArray = exportLabelBGs[0]; - for(var i = 0; i < exportLabelArray.length; i++) { - var exportLabelE = exportLabelArray[i]; - var exportLabel = d3.select(exportLabelE); - var data = exportArray[i]; - exportLabel.data(data); - var pieceHeight = yScale(data.amount); - var labelHeight = -1; - var labelBGYPos = -1; - var labelWidth = -1; - var exportLabelBG = d3.select(exportLabelBGArray[i]); - if(pieceHeight < smallLabelSize) { - //just add number - //console.log("small label"); - var numericLabel = exportLabel.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','start').attr('alignment-baseline','central') - .attr('font-size',function(d) { - return fontSizeInterpolater((d.amount-minImExAmount)/(maxImExAmount - minImExAmount)); - }); - labelHeight = fontSizeInterpolater((data.amount-minImExAmount)/(maxImExAmount-minImExAmount)); - labelBGYPos = - labelHeight / 2; - var numericLabelEle = numericLabel[0][0]; - labelWidth = numericLabelEle.getComputedTextLength(); - } else if(pieceHeight < mediumLabelSize || data.type == 'ammo') { - //number and type - var numericLabel = exportLabel.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','start').attr('font-size',function(d) { - return fontSizeInterpolater((d.amount-minImExAmount)/(maxImExAmount - minImExAmount)); - }); - var textLabel = exportLabel.append('text').text(function(d) { - return reverseWeaponLookup[d.type].split(' ')[0].toUpperCase(); - }).attr('text-anchor','start').attr('y',15).attr('class',function(d) { return 'export '+d.type}); - labelHeight = fontSizeInterpolater((data.amount-minImExAmount)/(maxImExAmount-minImExAmount)); - labelBGYPos = -labelHeight; - labelHeight += 16; - var numericLabelEle = numericLabel[0][0]; - var textLabelEle = textLabel[0][0]; - labelWidth = numericLabelEle.getComputedTextLength() > textLabelEle.getComputedTextLength() ? numericLabelEle.getComputedTextLength() : textLabelEle.getComputedTextLength(); - } else { - //number type and 'weapons' - var numericLabel = exportLabel.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','start').attr('font-size',function(d) { - return fontSizeInterpolater((d.amount-minImExAmount)/(maxImExAmount - minImExAmount)); - }).attr('y',-7); - var textLabel = exportLabel.append('text').text(function(d) { - return reverseWeaponLookup[d.type].split(' ')[0].toUpperCase(); - }).attr('text-anchor','start').attr('y',8).attr('class',function(d) { return 'export '+d.type}); - var weaponLabel =exportLabel.append('text').text('WEAPONS').attr('text-anchor','start').attr('y',21) - .attr('class',function(d) { return'export '+d.type} ); - labelHeight = fontSizeInterpolater((data.amount-minImExAmount)/(maxImExAmount-minImExAmount)); - labelBGYPos = -labelHeight - 7; - labelHeight += 16 +14; - var numericLabelEle = numericLabel[0][0]; - var textLabelEle = textLabel[0][0]; - var weaponLabelEle = weaponLabel[0][0]; - labelWidth = numericLabelEle.getComputedTextLength() > textLabelEle.getComputedTextLength() ? numericLabelEle.getComputedTextLength() : textLabelEle.getComputedTextLength(); - if(weaponLabelEle.getComputedTextLength() > labelWidth) { - labelWidth = weaponLabelEle.getComputedTextLength(); - } - } - if(labelHeight != -1 && labelBGYPos != -1 && labelWidth != -1) { - exportLabelBG.attr('x',0).attr('y',labelBGYPos).attr('width',labelWidth).attr('height',labelHeight) - .attr('transform',exportLabel.attr('transform')); - } - } - //over all numeric Total Import/Export labels - var importsVisible = $("#importExportBtns .imports .check").not(".inactive").length != 0; - var exportsVisible = $("#importExportBtns .exports .check").not(".inactive").length != 0; - var importTotalLabel = this.barGraphSVG.selectAll('text.totalLabel').data([1]); - importTotalLabel.enter().append('text').attr('x',midX).attr('text-anchor','end') - .attr('class','totalLabel').attr('y',this.barGraphHeight- this.barGraphBottomPadding + 25); - importTotalLabel.text(abbreviateNumber(importTotal)).attr('visibility',importsVisible ? "visible":"hidden"); - var exportTotalLabel = this.barGraphSVG.selectAll('text.totalLabel.totalLabel2').data([1]); - exportTotalLabel.enter().append('text').attr('x',midX+10).attr('class','totalLabel totalLabel2').attr('y', this.barGraphHeight - this.barGraphBottomPadding+25); - exportTotalLabel.text(abbreviateNumber(exportTotal)).attr('visibility',exportsVisible ? "visible":"hidden"); - //Import label at bottom - var importLabel = this.barGraphSVG.selectAll('text.importLabel').data([1]); - importLabel.enter().append('text').attr('x',midX).attr('text-anchor','end').text('IMPORTS') - .attr('class','importLabel').attr('y', this.barGraphHeight - this.barGraphBottomPadding + 45); - importLabel.attr('visibility',importsVisible ? "visible":"hidden"); - //Export label at bottom - var exportLabel = this.barGraphSVG.selectAll('text.exportLabel').data([1]); - exportLabel.enter().append('text').attr('x',midX+10).text('EXPORTS') - .attr('class','exportLabel').attr('y', this.barGraphHeight - this.barGraphBottomPadding + 45); - exportLabel.attr('visibility',exportsVisible ? "visible":"hidden") - }, - dragHandleStart: function(event) { - console.log('start'); - event.dataTransfer.setData('text/uri-list','yearHandle.png'); - event.dataTransfer.setDragImage(document.getElementById('handle'),0,0); - event.dataTransfer.effectAllowed='move'; - } -} - -/* -This is going to be a number formatter. Example of use: - -var bigNumber = 57028715; -var formated = abbreviateNumber(57028715); -return formated; //should show 57B for 57 Billion - -*/ -function abbreviateNumber(value) { - - var newValue = value; - if (value >= 1000) { - var suffixes = ["", "K", "M", "B","T"]; - var suffixNum = Math.floor( (""+value).length/3 ); - var shortValue = ''; - for (var precision = 3; precision >= 1; precision--) { - shortValue = parseFloat( (suffixNum != 0 ? (value / Math.pow(1000,suffixNum) ) : value).toPrecision(precision)); - var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,''); - if (dotLessShortValue.length <= 3) { break; } - } - if (shortValue % 1 != 0) shortNum = shortValue.toFixed(1); - newValue = shortValue+suffixes[suffixNum]; - } - return '$' + newValue; -} - diff --git a/js/ui.controls_test.js b/js/ui.controls_test.js deleted file mode 100644 index 424b705..0000000 --- a/js/ui.controls_test.js +++ /dev/null @@ -1,531 +0,0 @@ -/** -ui.control.js -Created by Pitch Interactive -Created on 6/26/2012 -This code will control the primary functions of the UI in the ArmsGlobe app -**/ -var d3Graphs = { - barGraphWidth: 300, - barGraphHeight: 800, - barWidth: 14, - barGraphTopPadding: 20, - barGraphBottomPadding: 50, - histogramWidth: 780, - histogramHeight: 140, - histogramLeftPadding:31, - histogramRightPadding: 31, - histogramVertPadding:10, - barGraphSVG: d3.select("body").append("svg"), - histogramSVG: null, - histogramYScale: null, - histogramXScale: null, - cumImportY: 0,cumExportY: 0, - cumImportLblY: 0,cumExportLblY: 0, - inited: false, - histogramOpen: false, - handleLeftOffset: 14, - handleInterval: 40, - windowResizeTimeout: -1, - histogramImports: null, - histogramExports: null, - histogramAbsMax: 0, - previousImportLabelTranslateY: -1, - previousExportLabelTranslateY: -1, - setCountry: function(country) { - $("#hudHeader .countryTextInput").val(country); - d3Graphs.updateViz(); - }, - initGraphs: function() { - this.showHud(); - this.drawBarGraph(); - this.drawHistogram(); - }, - showHud: function() { - if(this.inited) return; - this.inited = true; - $("#hudHeader").show(); - d3Graphs.positionHistory(); - $("#history").show(); - $("#graphIcon").show(); - $("#importExportBtns").show(); - $("#graphIcon").click(d3Graphs.graphIconClick); - $("#history .close").click(d3Graphs.closeHistogram); - $("#history ul li").click(d3Graphs.clickTimeline); - $("#handle").draggable({axis: 'x',containment: "parent",grid:[this.handleInterval, this.handleInterval], stop: d3Graphs.dropHandle, drag: d3Graphs.dragHandle }); - $("#hudHeader .searchBtn").click(d3Graphs.updateViz); - $("#importExportBtns .imex>div").not(".label").click(d3Graphs.importExportBtnClick); - $("#importExportBtns .imex .label").click(d3Graphs.importExportLabelClick); - $("#hudHeader .countryTextInput").autocomplete({ source:selectableCountries }); - $("#hudHeader .countryTextInput").keyup(d3Graphs.countryKeyUp); - $("#hudHeader .countryTextInput").focus(d3Graphs.countryFocus); - $(document).on("click",".ui-autocomplete li",d3Graphs.menuItemClick); - $(window).resize(d3Graphs.windowResizeCB); - - }, - dragHandle:function() { - if(!d3Graphs.histogramOpen) { - return; - } - d3Graphs.setHistogramData(); - d3Graphs.updateActiveYearDots(); - }, - clickTimeline:function() { - var year = $(this).html(); - if(year < 10) { - year = (year * 1) + 2000; - } - if(year < 100) { - year = (year * 1) + 1900 - } - var index = year - 1992; - var leftPos = d3Graphs.handleLeftOffset + d3Graphs.handleInterval * index; - $("#handle").css('left',leftPos+"px"); - d3Graphs.updateViz(); - }, - windowResizeCB:function() { - clearTimeout(d3Graphs.windowResizeTimeout); - d3Graphs.windowResizeTimeout = setTimeout(d3Graphs.positionHistory, 250); - }, - positionHistory: function() { - var graphIconPadding = 20; - var historyWidth = $("#history").width(); - var totalWidth = historyWidth + $("#graphIcon").width() + graphIconPadding; - var windowWidth = $(window).width(); - var historyLeftPos = (windowWidth - totalWidth) / 2.0; - $("#history").css('left',historyLeftPos+"px"); - $("#graphIcon").css('left',historyLeftPos + historyWidth + graphIconPadding+'px'); - }, - countryFocus:function(event) { - console.log("focus"); - setTimeout(function() { $('#hudHeader .countryTextInput').select() },50); - }, - menuItemClick:function(event) { - d3Graphs.updateViz(); - }, - countryKeyUp: function(event) { - if(event.keyCode == 13 /*ENTER */) { - d3Graphs.updateViz(); - } - }, - - updateViz:function() { - var yearOffset = $("#handle").css('left'); - yearOffset = yearOffset.substr(0,yearOffset.length-2); - yearOffset -= d3Graphs.handleLeftOffset; - yearOffset /= d3Graphs.handleInterval; - var year = yearOffset + 1992; - - var country = $("#hudHeader .countryTextInput").val().toUpperCase(); - if(typeof countryData[country] == 'undefined') { - return; - } - //exports first - var exportArray = [] - var exportBtns = $("#importExportBtns .exports>div").not(".label"); - for(var i = 0; i < exportBtns.length; i++) { - var btn = $(exportBtns[i]); - var weaponTypeKey = btn.attr('class'); - if(btn.find('.inactive').length == 0) { - exportArray.push(reverseWeaponLookup[weaponTypeKey]); - } - } - //imports esecond - var importArray = [] - var importBtns = $("#importExportBtns .imports>div").not(".label"); - for(var i = 0; i < importBtns.length; i++) { - var btn = $(importBtns[i]); - var weaponTypeKey = btn.attr('class'); - if(btn.find('.inactive').length == 0) { - importArray.push(reverseWeaponLookup[weaponTypeKey]); - } - } - selectVisualization(timeBins, year,[country],exportArray, importArray); - }, - dropHandle:function() { - d3Graphs.updateViz(); - }, - importExportLabelClick: function() { - var btns = $(this).prevAll(); - var numInactive = 0; - for(var i = 0; i < btns.length; i++) { - if($(btns[i]).find('.inactive').length > 0) { - numInactive++; - } - } - if(numInactive <= 1) { - //add inactive - $(btns).find('.check').addClass('inactive'); - } else { - //remove inactive - $(btns).find('.check').removeClass('inactive'); - } - d3Graphs.updateViz(); - }, - importExportBtnClick:function() { - var check = $(this).find('.check'); - if(check.hasClass('inactive')) { - check.removeClass('inactive'); - } else { - check.addClass('inactive'); - } - d3Graphs.updateViz(); - }, - graphIconClick: function() { - if(!d3Graphs.histogramOpen) { - d3Graphs.histogramOpen = true; - $("#history .graph").slideDown(); - } else { - d3Graphs.closeHistogram(); - } - }, - closeHistogram: function() { - d3Graphs.histogramOpen = false; - $("#history .graph").slideUp(); - }, - line: d3.svg.line() - // assign the X function to plot our line as we wish - .x(function(d,i) { - return d3Graphs.histogramXScale(i) + d3Graphs.histogramLeftPadding; - }) - .y(function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding; - }), - setHistogramData:function() { - var importArray = [0]; - var exportArray = [0]; - var historical = selectedCountry.summary.historical; - var numHistory = historical.length; - var absMax = 0; - for(var i = 1; i < numHistory; i++) { - var importPrev = historical[0].imports; - var importCur = historical[i].imports; - var importDiff = (importCur - importPrev) / importPrev * 100; - var exportPrev = historical[0].exports; - var exportCur = historical[i].exports; - var exportDiff = (exportCur - exportPrev) / exportPrev * 100; - importArray.push(importDiff); - exportArray.push(exportDiff); - if(Math.abs(importDiff) > absMax) { - absMax = Math.abs(importDiff); - } - if(Math.abs(exportDiff) > absMax) { - absMax = Math.abs(exportDiff); - } - - } - this.histogramImportArray = importArray; - this.histogramExportArray = exportArray; - this.histogramAbsMax = absMax; - }, - drawHistogram:function() { - if(this.histogramSVG == null) { - this.histogramSVG = d3.select('#history .container').append('svg'); - this.histogramSVG.attr('id','histogram').attr('width',this.histogramWidth).attr('height',this.histogramHeight); - } - this.setHistogramData(); - - this.histogramYScale = d3.scale.linear().domain([this.histogramAbsMax,-this.histogramAbsMax]).range([0, this.histogramHeight - this.histogramVertPadding*2]); - this.histogramXScale = d3.scale.linear().domain([0,this.histogramExportArray.length-1]).range([0, this.histogramWidth - this.histogramLeftPadding - this.histogramRightPadding]); - - var tickData = this.histogramYScale.ticks(4); - var containsZero = false; - var numTicks = tickData.length; - for(var i = 0; i < numTicks; i++) { - if(tickData[i] == 0) { - containsZero = true; - break; - } - } - if(!containsZero) { - tickData.push(0); - } - //tick lines - var ticks = this.histogramSVG.selectAll('line.tick').data(tickData); - ticks.enter().append('svg:line').attr('class','tick'); - ticks.attr('y1',function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding; - }).attr('y2', function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding; - }).attr('x1',this.histogramLeftPadding).attr('x2',this.histogramWidth - this.histogramRightPadding) - .attr('stroke-dasharray',function(d) { - if(d == 0) { - return null; - } - return '3,1'; - }).attr('stroke-width',function(d) { - if(d == 0) { - return 2; - } - return 1; - }); - //tick labels - var tickLabels = this.histogramSVG.selectAll("text.tickLblLeft").data(tickData); - tickLabels.enter().append('svg:text').attr('class','tickLbl tickLblLeft').attr('text-anchor','end'); - tickLabels.attr('x', d3Graphs.histogramLeftPadding-3).attr('y',function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding + 4; - }).text(function(d) { return Math.abs(d); }).attr('display', function(d) { - if(d == 0) { return 'none'; } - return null; - }); - var tickLabelsRight = this.histogramSVG.selectAll("text.tickLblRight").data(tickData); - tickLabelsRight.enter().append('svg:text').attr('class','tickLbl tickLblRight'); - tickLabelsRight.attr('x', d3Graphs.histogramWidth - d3Graphs.histogramRightPadding+3).attr('y',function(d) { - return d3Graphs.histogramYScale(d) + d3Graphs.histogramVertPadding + 4; - }).text(function(d) { return Math.abs(d); }).attr('display', function(d) { - if(d == 0) { return 'none'; } - return null; - }); - ticks.exit().remove(); - tickLabels.exit().remove(); - tickLabelsRight.exit().remove(); - //+ and - - var plusMinus = this.histogramSVG.selectAll("text.plusMinus").data(["+","—","+","—"]); //those are —s - plusMinus.enter().append('svg:text').attr('class','plusMinus').attr('text-anchor',function(d,i) { - if(i < 2) return 'end'; - return null; - }).attr('x',function(d,i) { - var plusOffset = 3; - if(i < 2) return d3Graphs.histogramLeftPadding + (d == '+' ? -plusOffset : 0) -2; - return d3Graphs.histogramWidth - d3Graphs.histogramRightPadding + (d == '+' ? plusOffset : 0)+2; - }).attr('y',function(d,i) { - var yOffset = 10; - return d3Graphs.histogramYScale(0) + d3Graphs.histogramVertPadding + 6 + (d == '+' ? -yOffset : yOffset); - }).text(String); - //lines - var importsVisible = $("#importExportBtns .imports .check").not(".inactive").length != 0; - var exportsVisible = $("#importExportBtns .exports .check").not(".inactive").length != 0; - $("#history .labels .exports").css('display', exportsVisible ? 'block' : 'none'); - $("#history .labels .imports").css('display', importsVisible ? 'block' : 'none'); - - - var importLine = this.histogramSVG.selectAll("path.import").data([1]); - importLine.enter().append('svg:path').attr('class','import'); - importLine.attr('d',this.line(this.histogramImportArray)).attr('visibility',importsVisible ? 'visible' : 'hidden'); - var exportLine = this.histogramSVG.selectAll("path.export").data([1]); - exportLine.enter().append('svg:path').attr('class','export'); - exportLine.attr('d',this.line(this.histogramExportArray)).attr('visibility', exportsVisible ? 'visible' : 'hidden'); - - //active year labels - var yearOffset = $("#handle").css('left'); - yearOffset = yearOffset.substr(0,yearOffset.length-2); - yearOffset -= d3Graphs.handleLeftOffset; - yearOffset /= d3Graphs.handleInterval; - var maxVal = this.histogramImportArray[yearOffset] > this.histogramExportArray[yearOffset] ? this.histogramImportArray[yearOffset] : this.histogramExportArray[yearOffset]; - - var activeYearData = [{x:yearOffset, y: this.histogramImportArray[yearOffset], max: maxVal}, {x: yearOffset, y: this.histogramExportArray[yearOffset], max: maxVal}]; - var yearDots = this.histogramSVG.selectAll("ellipse.year").data(activeYearData); - var yearDotLabels = this.histogramSVG.selectAll("text.yearLabel").data(activeYearData); - yearDots.enter().append('ellipse').attr('class','year').attr('rx',4).attr('ry',4) - .attr('cx',function(d) { return d3Graphs.histogramLeftPadding + d3Graphs.histogramXScale(d.x); }) - .attr('cy',function(d) { return d3Graphs.histogramVertPadding + d3Graphs.histogramYScale(d.y); }); - yearDotLabels.enter().append('text').attr('class','yearLabel').attr('text-anchor','middle'); - this.updateActiveYearDots(); - }, - updateActiveYearDots: function() { - var yearOffset = $("#handle").css('left'); - yearOffset = yearOffset.substr(0,yearOffset.length-2); - yearOffset -= d3Graphs.handleLeftOffset; - yearOffset /= d3Graphs.handleInterval; - var maxVal = this.histogramImportArray[yearOffset] > this.histogramExportArray[yearOffset] ? this.histogramImportArray[yearOffset] : this.histogramExportArray[yearOffset]; - var activeYearData = [{x:yearOffset, y: this.histogramImportArray[yearOffset], max: maxVal, type:"imports"}, {x: yearOffset, y: this.histogramExportArray[yearOffset], max: maxVal, type:"exports"}]; - var yearDots = this.histogramSVG.selectAll("ellipse.year").data(activeYearData); - var yearDotLabels = this.histogramSVG.selectAll("text.yearLabel").data(activeYearData); - var importsVisible = $("#importExportBtns .imports .check").not(".inactive").length != 0; - var exportsVisible = $("#importExportBtns .exports .check").not(".inactive").length != 0; - - yearDots.attr('cx', function(d) { return d3Graphs.histogramLeftPadding + d3Graphs.histogramXScale(d.x); }) - .attr('cy',function(d) { return d3Graphs.histogramVertPadding + d3Graphs.histogramYScale(d.y); } ) - .attr('visibility', function(d) { - if(d.type == "imports") { - return importsVisible ? 'visible' : 'hidden'; - } else if(d.type == "exports") { - return exportsVisible ? 'visible' : 'hidden'; - } - }); - yearDotLabels.attr('x',function(d) { return d3Graphs.histogramLeftPadding + d3Graphs.histogramXScale(d.x); }) - .attr('y',function(d) { - var yVal = d3Graphs.histogramYScale(d.y) + d3Graphs.histogramVertPadding; - if(d.y == maxVal) { - yVal -= 7; - } else { - yVal += 19; - } - if(yVal < d3Graphs.histogramVertPadding) { - yVal += 26; - } - if(yVal > d3Graphs.histogramHeight + d3Graphs.histogramVertPadding) { - yVal -= 26; - } - return yVal; - - }).text(function(d) { - var numlbl = Math.round(d.y*10)/10; - var lbl = ""; - if(d.y > 0) { - lbl = "+"; - } - lbl += ""+numlbl; - return lbl; - - }).attr('visibility', function(d) { - if(d.type == "imports") { - return importsVisible ? 'visible' : 'hidden'; - } else if(d.type == "exports") { - return exportsVisible ? 'visible' : 'hidden'; - } - }); - }, - drawBarGraph: function() { - - this.barGraphSVG.attr('id','barGraph').attr('width',d3Graphs.barGraphWidth).attr('height',d3Graphs.barGraphHeight); - var importArray = []; - var exportArray = []; - var importTotal = selectedCountry.summary.imported.total; - var exportTotal = selectedCountry.summary.exported.total; - for(var type in reverseWeaponLookup) { - importArray.push({"type":type, "amount":selectedCountry.summary.imported[type]}); - exportArray.push({"type":type, "amount":selectedCountry.summary.exported[type]}); - } - var max = importTotal > exportTotal ? importTotal : exportTotal; - var yScale = d3.scale.linear().domain([0,max]).range([0,this.barGraphHeight - this.barGraphBottomPadding - this.barGraphTopPadding]); - var importRects = this.barGraphSVG.selectAll("rect.import").data(importArray); - var midX = this.barGraphWidth / 2; - this.cumImportY = this.cumExportY = 0; - importRects.enter().append('rect').attr('class', function(d) { - return 'import '+d.type; - }).attr('x',midX - this.barWidth).attr('width',this.barWidth); - - importRects.attr('y',function(d) { - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumImportY - yScale(d.amount) ; - d3Graphs.cumImportY += yScale(d.amount); - return value; - }).attr('height',function(d) { return yScale(d.amount); }); - var exportRects = this.barGraphSVG.selectAll('rect.export').data(exportArray); - exportRects.enter().append('rect').attr('class',function(d) { - return 'export '+ d.type; - }).attr('x',midX + 10).attr('width',this.barWidth); - - exportRects.attr('y',function(d) { - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumExportY - yScale(d.amount); - d3Graphs.cumExportY += yScale(d.amount); - return value; - }).attr('height',function(d) { return yScale(d.amount); }); - //bar graph labels - this.cumImportLblY = 0; - this.cumExportLblY = 0; - var importLabels = this.barGraphSVG.selectAll("g.importLabel").data(importArray); - importLabels.enter().append("g").attr('class',function(d) { - return 'importLabel '+d.type; - }); - this.previousImportLabelTranslateY = 0; - this.previousExportLabelTranslateY = 0; - var paddingFromBottomOfGraph = 10; - var heightPerLabel = 25; - importLabels.attr('transform',function(d) { - var translate = 'translate('+(d3Graphs.barGraphWidth / 2 - 25)+","; - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumImportLblY - yScale(d.amount)/2; - d3Graphs.cumImportLblY += yScale(d.amount); - if(value > d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - paddingFromBottomOfGraph) { - value -= paddingFromBottomOfGraph; - d3Graphs.cumImportLblY += paddingFromBottomOfGraph; - }/* else if(value > d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - this.previousImportLabelTranslateY - heightPerLabel) { - value -= heightPerLabel; - d3Graphs.cumImportLblY += heightPerLabel; - }*/ - translate += value+")"; - - this.previousImportLabelTranslateY = value; - return translate; - }).attr('display',function(d) { - if(d.amount == 0) { return 'none';} - return null; - }); - importLabels.selectAll("*").remove(); - importLabels.append('text').text(function(d) { - return reverseWeaponLookup[d.type].split(' ')[0].toUpperCase(); - }).attr('text-anchor','end').attr('y',15).attr('class',function(d){ return 'import '+d.type}); - importLabels.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }).attr('text-anchor','end'); - var exportLabels = this.barGraphSVG.selectAll("g.exportLabel").data(exportArray); - exportLabels.enter().append("g").attr('class',function(d) { - return 'exportLabel '+d.type; - }) - exportLabels.attr('transform',function(d) { - var translate = 'translate('+(d3Graphs.barGraphWidth / 2 + 35)+","; - var value = d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - d3Graphs.cumExportLblY - yScale(d.amount)/2; - d3Graphs.cumExportLblY += yScale(d.amount); - if(value > d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - paddingFromBottomOfGraph) { - value -= paddingFromBottomOfGraph; - d3Graphs.cumExportLblY += paddingFromBottomOfGraph; - }/* else if(value > d3Graphs.barGraphHeight - d3Graphs.barGraphBottomPadding - this.previousExportLabelTranslateY - heightPerLabel) { - value -= heightPerLabel; - d3Graphs.cumExportLblY += heightPerLabel; - }*/ - translate += value+")"; - this.previousExportLabelTranslateY = value; - return translate; - }).attr('display',function(d) { - if(d.amount == 0) { return 'none';} - return null; - }); - exportLabels.selectAll("*").remove(); - exportLabels.append('text').text(function(d) { - return reverseWeaponLookup[d.type].split(' ')[0].toUpperCase(); - }).attr('y',15).attr('class',function(d) { return 'export '+ d.type}); - exportLabels.append('text').text(function(d) { - return abbreviateNumber(d.amount); - }); - - var importTotalLabel = this.barGraphSVG.selectAll('text.totalLabel').data([1]); - importTotalLabel.enter().append('text').attr('x',midX).attr('text-anchor','end') - .attr('class','totalLabel').attr('y',this.barGraphHeight- this.barGraphBottomPadding + 25); - - importTotalLabel.text(abbreviateNumber(importTotal)); - - var exportTotalLabel = this.barGraphSVG.selectAll('text.totalLabel.totalLabel2').data([1]); - exportTotalLabel.enter().append('text').attr('x',midX+10).attr('class','totalLabel totalLabel2').attr('y', this.barGraphHeight - this.barGraphBottomPadding+25); - exportTotalLabel.text(abbreviateNumber(exportTotal)); - - //Import label at bottom - var importLabel = this.barGraphSVG.selectAll('text.importLabel').data([1]).enter().append('text').attr('x',midX).attr('text-anchor','end').text('IMPORTS') - .attr('class','importLabel').attr('y', this.barGraphHeight - this.barGraphBottomPadding + 45); - //Export label at bottom - var exportLabel = this.barGraphSVG.selectAll('text.exportLabel').data([1]).enter().append('text').attr('x',midX+10).text('EXPORTS') - .attr('class','exportLabel').attr('y', this.barGraphHeight - this.barGraphBottomPadding + 45); - - }, - dragHandleStart: function(event) { - console.log('start'); - event.dataTransfer.setData('text/uri-list','yearHandle.png'); - event.dataTransfer.setDragImage(document.getElementById('handle'),0,0); - event.dataTransfer.effectAllowed='move'; - } -} - -/* -This is going to be a number formatter. Example of use: - -var bigNumber = 57028715; -var formated = abbreviateNumber(57028715); -return formated; //should show 57B for 57 Billion - -*/ -function abbreviateNumber(value) { - - var newValue = value; - if (value >= 1000) { - var suffixes = ["", "K", "M", "B","T"]; - var suffixNum = Math.floor( (""+value).length/3 ); - var shortValue = ''; - for (var precision = 3; precision >= 1; precision--) { - shortValue = parseFloat( (suffixNum != 0 ? (value / Math.pow(1000,suffixNum) ) : value).toPrecision(precision)); - var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,''); - if (dotLessShortValue.length <= 3) { break; } - } - if (shortValue % 1 != 0) shortNum = shortValue.toFixed(1); - newValue = shortValue+suffixes[suffixNum]; - } - return '$' + newValue; -} - diff --git a/js/util.js b/js/util.js index 7a15fb2..32b67fc 100644 --- a/js/util.js +++ b/js/util.js @@ -1,227 +1,21 @@ -function toTHREEColor( colorString ){ - return new THREE.Color( parseInt( colorString.substr(1) , 16) ); -} - -var monthNames = new Array(12); -monthNames[0] = "January"; -monthNames[1] = "February"; -monthNames[2] = "March"; -monthNames[3] = "April"; -monthNames[4] = "May"; -monthNames[5] = "June"; -monthNames[6] = "July"; -monthNames[7] = "August"; -monthNames[8] = "September"; -monthNames[9] = "October"; -monthNames[10] = "November"; -monthNames[11] = "December"; - -function toMonthName( monthNumber ){ - return monthNames[monthNumber]; -} - -function componentToHex(c) { - var hex = c.toString(16); - return hex.length == 1 ? "0" + hex : hex; -} - -function rgbToHex(r, g, b) { - return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); -} - -function gup( name ) -{ - name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); - var regexS = "[\\?&]"+name+"=([^&#]*)"; - var regex = new RegExp( regexS ); - var results = regex.exec( window.location.href ); - if( results == null ) - return ""; - else - return results[1]; -} - -function wrap(value, min, rangeSize) { +function wrap( value, min, rangeSize ) { rangeSize-=min; - while (value < min) { - value += rangeSize; + while ( value < min ) { + value += rangeSize; } return value % rangeSize; -} - -THREE.Curve.Utils.createLineGeometry = function( points ) { - var geometry = new THREE.Geometry(); - for( var i = 0; i < points.length; i ++ ) { - geometry.vertices.push( points[i] ); - } - return geometry; }; -function getAbsOrigin( object3D ){ - var mat = object3D.matrixWorld; - var worldpos = new THREE.Vector3(); - worldpos.x = mat.n14; - worldpos.y = mat.n24; - worldpos.z = mat.n34; - return worldpos; -} - -function screenXY(vec3){ +function screenXY( vec3 ) { var projector = new THREE.Projector(); var vector = projector.projectVector( vec3.clone(), camera ); var result = new Object(); - var windowWidth = window.innerWidth; - var minWidth = 1280; - if(windowWidth < minWidth) { - windowWidth = minWidth; - } + var windowWidth = window.innerWidth; + var minWidth = 1280; + if( windowWidth < minWidth ) { + windowWidth = minWidth; + } result.x = Math.round( vector.x * (windowWidth/2) ) + windowWidth/2; result.y = Math.round( (0-vector.y) * (window.innerHeight/2) ) + window.innerHeight/2; return result; -} - -function buildHexColumnGeo(rad, height){ - var points = []; - var ang = 0; - var sixth = 2*Math.PI / 6; - for(var i=0; i<7; i++){ - var x = Math.cos(ang) * rad; - var y = -Math.sin(ang) * rad; - points.push( new THREE.Vector2(x,y) ); - ang += sixth; - } - var shape = new THREE.Shape(points); - - var options = { - size: 0, - amount: height, - steps: 1, - bevelEnabled: false, - }; - var extrudedGeo = new THREE.ExtrudeGeometry(shape, options); - return extrudedGeo; -} - -function map(v, i1, i2, o1, o2) { - return o1 + (o2 - o1) * (v - i1) / (i2 - i1); - } - - function numberWithCommas(x) { - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); -} - -function roundNumber(num, dec) { - var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec); - return result; -} - -function save(data, filename, mime) { - - window.webkitRequestFileSystem(window.TEMPORARY, 1024 * 1024, initRecord, errorHandler("Error getting file system")); - - function initRecord(fs) { - var create = function() { - fs.root.getFile("data.tar", {create: true}, function(fileEntry) { - - // Create a FileWriter object for our FileEntry (log.txt). - fileEntry.createWriter(function(fileWriter) { - - - var bb = new window.WebKitBlobBuilder(); - - data = dataURItoBlob(data); - var header = createHeader(filename, data.byteLength, mime); - bb.append(header); - bb.append(data); - -// - fileWriter.write(bb.getBlob('tar/archive')); - window.open(fileEntry.toURL(), "_blank", "width=400,height=10"); - - - }, errorHandler("Error creating writer")); - - }, errorHandler("Error getting file")); - }; - // delete any previous - fs.root.getFile("data.tar", {create: false}, function(fileEntry) { - fileEntry.remove(create, errorHandler("Error deleting file")); - }, create); - } - - function dumpString(value, ia, off, size) { - var i,x; - var sum = 0; - var len = Math.min(value.length, size); - for (i = 0; i < len; i++) { - x = value.charCodeAt(i); - ia[off] = x; - sum += x; - off += 1; - } - return sum; - } - - function padLeft(value, size) { - if (size < value.length) { - throw new Error("Incompatible size"); - } - var l = size-value.length; - for (var i = 0; i < l; i++) { - value = "0" + value; - } - return value; - } - - function createHeader( name, size, type ){ - var ab = new ArrayBuffer(512); - var ia = new Uint8Array(ab); - var sum = 0; - sum += dumpString(name, ia, 0, 99); - sum += dumpString(size.toString(8), ia, 124, 12); - sum += dumpString(padLeft("644 \0", 8), ia, 100, 8) - // timestamp - var ts = new Date().getTime(); - ts = Math.floor(ts/1000); - sum += dumpString(ts.toString(8), ia, 136, 12); - - // extra header info - sum += dumpString("0", ia, 156, 1); - sum += dumpString("ustar ", ia, 257, 6); - sum += dumpString("00", ia, 263, 2); - - // assume checksum to be 8 spaces - sum += 8*32; - //checksum 6 digit octal followed by null and space - dumpString(padLeft(sum.toString(8)+"\0 ", 8), ia, 148, 8) - return ab; - } - - function dataURItoBlob(byteString) { - - // write the bytes of the string to an ArrayBuffer - var padding = 512 - (byteString.length % 512); - var ab = new ArrayBuffer(byteString.length + padding); - var ia = new Uint8Array(ab); - for (var i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - - return ab; - } - - - function errorHandler(msg) { - return function(e) { - console.log(msg, e); - } - } -} - -function wrap(value, min, rangeSize) { - rangeSize-=min; - while (value < min) { - value += rangeSize; - } - return value % rangeSize; -} \ No newline at end of file +}; diff --git a/js/visualize.js b/js/visualize.js index 787da2a..c4a8a0c 100644 --- a/js/visualize.js +++ b/js/visualize.js @@ -1,366 +1,204 @@ -function buildDataVizGeometries( linearData ){ - - var loadLayer = document.getElementById('loading'); - - for( var i in linearData ){ - var yearBin = linearData[i].data; - - var year = linearData[i].t; - selectableYears.push(year); +var com = com || {}; +com.google = com.google || {}; - var count = 0; - console.log('Building data for ...' + year); - for( var s in yearBin ){ - var set = yearBin[s]; +var COUNTRY_TRANSITION_MILLISECONDS = 300; +var CHANGE_SCALE_MILLISECONDS = 300; - var exporterName = set.e.toUpperCase(); - var importerName = set.i.toUpperCase(); +com.google.scaleEnum = { + LINEAR: 'linear', + LOG: 'log' +}; - exporter = countryData[exporterName]; - importer = countryData[importerName]; - - // we couldn't find the country, it wasn't in our list... - if( exporter === undefined || importer === undefined ) - continue; +function colorFn( val ) { + var lineColor = new THREE.Color(); + lineColor.setHSL( 0.6 - (val * 0.6), 1.0, 0.5 ); + return lineColor; +}; - // visualize this event - set.lineGeometry = makeConnectionLineGeometry( exporter, importer, set.v, set.wc ); +function buildDataVizGeometries( linearData ){ - // if( s % 1000 == 0 ) - // console.log( 'calculating ' + s + ' of ' + yearBin.length + ' in year ' + year); - } + for( var i in linearData ){ + var timeBin = linearData[i].data; - // use this break to only visualize one year (1992) - // break; + var time = linearData[i].t; + selectableTimes[time] = timeBin; - // how to make this work? - // loadLayer.innerHTML = 'loading data for ' + year + '...'; - // console.log(loadLayer.innerHTML); + console.log('Building data for ...' + time); + for( var s in timeBin ){ + var set = timeBin[s]; + + if ( set.e !== undefined && set.i !== undefined ) { // arcs + var exporterLoc = latLonTo3dSpace( set.e.lat, set.e.lon ); + var importerLoc = latLonTo3dSpace( set.i.lat, set.i.lon ); + + // visualize this event + if ( !exporterLoc.equals( importerLoc ) ) { + var exporter = { center: exporterLoc, countryName: set.e.c.toUpperCase() }; + var importer = { center: importerLoc, countryName: set.i.c.toUpperCase() }; + set.arcInfo = makeArcInfo( exporter, importer, set.v, set.lin_v, set.log_v, colorFn( set.log_v ), 20); + } else { + set.spikeMesh = makeSpikeMesh( set.e.lat, set.e.lon, (set.v * 200) + 0.1, colorFn( set.log_v ) ); + } + } else if ( set.loc !== undefined ) { // spikes + set.spikeMesh = makeSpikeMesh( set.loc.lat, set.loc.lon, (set.v * 200) + 0.1, colorFn( set.log_v ) ); + } + } } +}; - loadLayer.style.display = 'none'; -} - -function getVisualizedMesh( linearData, year, countries, exportCategories, importCategories ){ +function getVisualizedMeshes( time, countries ){ // for comparison purposes, all caps the country names for( var i in countries ){ countries[i] = countries[i].toUpperCase(); } - // pick out the year first from the data - var indexFromYear = parseInt(year) - 1992; - if( indexFromYear >= timeBins.length ) - indexFromYear = timeBins.length-1; - var affectedCountries = []; - var bin = linearData[indexFromYear].data; - - var linesGeo = new THREE.Geometry(); - var lineColors = []; + var bin = selectableTimes[time]; - var particlesGeo = new THREE.Geometry(); - var particleColors = []; + var meshes = []; + var linewidthToArcsInfo = {}; + var spikeGeometries = new THREE.Geometry(); - // var careAboutExports = ( action === 'exports' ); - // var careAboutImports = ( action === 'imports' ); - // var careAboutBoth = ( action === 'both' ); - - // go through the data from year, and find all relevant geometries + // go through the data from time, and find all relevant geometries for( i in bin ){ var set = bin[i]; - + + var exporterName; + var importerName; // filter out countries we don't care about - var exporterName = set.e.toUpperCase(); - var importerName = set.i.toUpperCase(); - var relevantExport = $.inArray(exporterName, countries) >= 0; - var relevantImport = $.inArray(importerName, countries) >= 0; + if ( set.e !== undefined && set.i !== undefined ) { // arcs + exporterName = set.e.c.toUpperCase(); + importerName = set.i.c.toUpperCase(); + } else if ( set.loc !== undefined ) { // spikes + exporterName = set.loc.c.toUpperCase(); + importerName = set.loc.c.toUpperCase(); + } + var relevantExport = $.inArray( exporterName, countries ) >= 0; + var relevantImport = $.inArray( importerName, countries ) >= 0; var useExporter = relevantExport; var useImporter = relevantImport; - var categoryName = reverseWeaponLookup[set.wc]; - var relevantExportCategory = relevantExport && $.inArray(categoryName,exportCategories) >= 0; - var relevantImportCategory = relevantImport && $.inArray(categoryName,importCategories) >= 0; - - if( (useImporter || useExporter) && (relevantExportCategory || relevantImportCategory) ){ + if( (useImporter || useExporter) ){ // we may not have line geometry... (?) - if( set.lineGeometry === undefined ) + if( set.arcInfo === undefined && set.spikeMesh === undefined ) { continue; - - var thisLineIsExport = false; - - if(exporterName == selectedCountry.countryName ){ - thisLineIsExport = true; } - - var lineColor = thisLineIsExport ? new THREE.Color(exportColor) : new THREE.Color(importColor); - - var lastColor; - // grab the colors from the vertices - for( s in set.lineGeometry.vertices ){ - var v = set.lineGeometry.vertices[s]; - lineColors.push(lineColor); - lastColor = lineColor; + + if ( set.arcInfo !== undefined ) { + var arcWidth = set.arcInfo.width; + if ( linewidthToArcsInfo[arcWidth] === undefined ) { + linewidthToArcsInfo[arcWidth] = []; + } + linewidthToArcsInfo[arcWidth].push( set.arcInfo ); + } else if ( set.spikeMesh !== undefined ) { + THREE.GeometryUtils.merge( spikeGeometries, set.spikeMesh ); } - // merge it all together - THREE.GeometryUtils.merge( linesGeo, set.lineGeometry ); - - var particleColor = lastColor.clone(); - var points = set.lineGeometry.vertices; - var particleCount = Math.floor(set.v / 8000 / set.lineGeometry.vertices.length) + 1; - particleCount = constrain(particleCount,1,100); - var particleSize = set.lineGeometry.size; - for( var s=0; s= points.length ) - particle.nextIndex = 0; - particle.lerpN = 0; - particle.path = points; - particlesGeo.vertices.push( particle ); - particle.size = particleSize; - particleColors.push( particleColor ); - } - - if( $.inArray( exporterName, affectedCountries ) < 0 ){ - affectedCountries.push(exporterName); + if ( $.inArray( exporterName, affectedCountries ) < 0 ) { + affectedCountries.push( exporterName ); } - if( $.inArray( importerName, affectedCountries ) < 0 ){ - affectedCountries.push(importerName); + if ( $.inArray( importerName, affectedCountries ) < 0 ) { + affectedCountries.push( importerName ); } var vb = set.v; var exporterCountry = countryData[exporterName]; - if( exporterCountry.mapColor === undefined ){ - exporterCountry.mapColor = vb; + if ( exporterCountry !== undefined ) { + if ( exporterCountry.mapColor === undefined ){ + exporterCountry.mapColor = vb; + } + else { + exporterCountry.mapColor += vb; + } } - else{ - exporterCountry.mapColor += vb; - } var importerCountry = countryData[importerName]; - if( importerCountry.mapColor === undefined ){ - importerCountry.mapColor = vb; - } - else{ - importerCountry.mapColor += vb; - } - - exporterCountry.exportedAmount += vb; - importerCountry.importedAmount += vb; - - if( exporterCountry == selectedCountry ){ - selectedCountry.summary.exported[set.wc] += set.v; - selectedCountry.summary.exported.total += set.v; - } - if( importerCountry == selectedCountry ){ - selectedCountry.summary.imported[set.wc] += set.v; - selectedCountry.summary.imported.total += set.v; + if ( importerCountry !== undefined ) { + if ( importerCountry.mapColor === undefined ){ + importerCountry.mapColor = vb; + } + else { + importerCountry.mapColor += vb; + } } - - if( importerCountry == selectedCountry || exporterCountry == selectedCountry ){ - selectedCountry.summary.total += set.v; - } - - } } + + for ( var width in linewidthToArcsInfo ) { + var relevantArcsInfo = linewidthToArcsInfo[width]; + var arcsGeometry = createLineGeometry( relevantArcsInfo ); + var arcsMesh = makeArcMesh( arcsGeometry, width ); + meshes.push( arcsMesh ); + } + var spikesMesh = new THREE.Mesh( spikeGeometries, + new THREE.MeshBasicMaterial( {vertexColors: THREE.FaceColors, + blending: THREE.AdditiveBlending, transparent: true})); + spikesMesh.material.fullOpacity = 1; + spikesMesh.material.side = THREE.FrontSide; + meshes.push( spikesMesh ); + + currMeshes = meshes; + var meshesAndAffectedCountries = {}; + meshesAndAffectedCountries.meshes = meshes; + meshesAndAffectedCountries.affectedCountries = affectedCountries; - // console.log(selectedCountry); - - linesGeo.colors = lineColors; - - // make a final mesh out of this composite - var splineOutline = new THREE.Line( linesGeo, new THREE.LineBasicMaterial( - { color: 0xffffff, opacity: 1.0, blending: - THREE.AdditiveBlending, transparent:true, - depthWrite: false, vertexColors: true, - linewidth: 1 } ) - ); - - splineOutline.renderDepth = false; - - - attributes = { - size: { type: 'f', value: [] }, - customColor: { type: 'c', value: [] } - }; - - uniforms = { - amplitude: { type: "f", value: 1.0 }, - color: { type: "c", value: new THREE.Color( 0xffffff ) }, - texture: { type: "t", value: 0, texture: THREE.ImageUtils.loadTexture( "images/particleA.png" ) }, - }; - - var shaderMaterial = new THREE.ShaderMaterial( { - - uniforms: uniforms, - attributes: attributes, - vertexShader: document.getElementById( 'vertexshader' ).textContent, - fragmentShader: document.getElementById( 'fragmentshader' ).textContent, - - blending: THREE.AdditiveBlending, - depthTest: true, - depthWrite: false, - transparent: true, - // sizeAttenuation: true, - }); - - - - var particleGraphic = THREE.ImageUtils.loadTexture("images/map_mask.png"); - var particleMat = new THREE.ParticleBasicMaterial( { map: particleGraphic, color: 0xffffff, size: 60, - blending: THREE.NormalBlending, transparent:true, - depthWrite: false, vertexColors: true, - sizeAttenuation: true } ); - particlesGeo.colors = particleColors; - var pSystem = new THREE.ParticleSystem( particlesGeo, shaderMaterial ); - pSystem.dynamic = true; - splineOutline.add( pSystem ); - - var vertices = pSystem.geometry.vertices; - var values_size = attributes.size.value; - var values_color = attributes.customColor.value; - - for( var v = 0; v < vertices.length; v++ ) { - values_size[ v ] = pSystem.geometry.vertices[v].size; - values_color[ v ] = particleColors[v]; - } - - pSystem.update = function(){ - // var time = Date.now() - for( var i in this.geometry.vertices ){ - var particle = this.geometry.vertices[i]; - var path = particle.path; - var moveLength = path.length; - - particle.lerpN += 0.05; - if(particle.lerpN > 1){ - particle.lerpN = 0; - particle.moveIndex = particle.nextIndex; - particle.nextIndex++; - if( particle.nextIndex >= path.length ){ - particle.moveIndex = 0; - particle.nextIndex = 1; - } - } - - var currentPoint = path[particle.moveIndex]; - var nextPoint = path[particle.nextIndex]; - - - particle.copy( currentPoint ); - particle.lerpSelf( nextPoint, particle.lerpN ); - } - this.geometry.verticesNeedUpdate = true; - }; - - // return this info as part of the mesh package, we'll use this in selectvisualization - splineOutline.affectedCountries = affectedCountries; - - - return splineOutline; -} + return meshesAndAffectedCountries; +}; -function selectVisualization( linearData, year, countries, exportCategories, importCategories ){ +function selectVisualization( time, countries ){ + // we're only doing one country for now so... var cName = countries[0].toUpperCase(); - $("#hudButtons .countryTextInput").val(cName); previouslySelectedCountry = selectedCountry; - selectedCountry = countryData[countries[0].toUpperCase()]; - - selectedCountry.summary = { - imported: { - mil: 0, - civ: 0, - ammo: 0, - total: 0, - }, - exported: { - mil: 0, - civ: 0, - ammo: 0, - total: 0, - }, - total: 0, - historical: getHistoricalData(selectedCountry), - }; - - // console.log(selectedCountry); + if ( countries == allCountries ) { + selectedCountry = countryData['UNITED STATES']; + selectionData.selectedCountry = 'ALL'; + } else { + selectedCountry = countryData[cName]; + if ( selectedCountry === undefined ) { + return; + } + selectionData.selectedCountry = selectedCountry.countryName; + } + $('#selectedCountryName').text( selectionData.selectedCountry ); // clear off the country's internally held color data we used from last highlight for( var i in countryData ){ var country = countryData[i]; - country.exportedAmount = 0; - country.importedAmount = 0; country.mapColor = 0; } - // clear markers - for( var i in selectableCountries ){ - removeMarkerFromCountry( selectableCountries[i] ); - } - - // clear children - while( visualizationMesh.children.length > 0 ){ - var c = visualizationMesh.children[0]; - visualizationMesh.remove(c); - } - + var prevMeshes = currMeshes; + // build the mesh console.time('getVisualizedMesh'); - var mesh = getVisualizedMesh( timeBins, year, countries, exportCategories, importCategories ); + var meshes = getVisualizedMeshes( time, countries ); console.timeEnd('getVisualizedMesh'); - - // add it to scene graph - visualizationMesh.add( mesh ); - - - // alright we got no data but at least highlight the country we've selected - if( mesh.affectedCountries.length == 0 ){ - mesh.affectedCountries.push( cName ); - } - - for( var i in mesh.affectedCountries ){ - var countryName = mesh.affectedCountries[i]; - var country = countryData[countryName]; - attachMarkerToCountry( countryName, country.mapColor ); - } - - // console.log( mesh.affectedCountries ); - highlightCountry( mesh.affectedCountries ); + + animateBetweenMeshes( prevMeshes, meshes.meshes, COUNTRY_TRANSITION_MILLISECONDS ); if( previouslySelectedCountry !== selectedCountry ){ if( selectedCountry ){ rotateTargetX = selectedCountry.lat * Math.PI/180; var targetY0 = -(selectedCountry.lon - 9) * Math.PI / 180; - var piCounter = 0; - while(true) { - var targetY0Neg = targetY0 - Math.PI * 2 * piCounter; - var targetY0Pos = targetY0 + Math.PI * 2 * piCounter; - if(Math.abs(targetY0Neg - rotating.rotation.y) < Math.PI) { - rotateTargetY = targetY0Neg; - break; - } else if(Math.abs(targetY0Pos - rotating.rotation.y) < Math.PI) { - rotateTargetY = targetY0Pos; - break; - } - piCounter++; - rotateTargetY = wrap(targetY0, -Math.PI, Math.PI); + var piCounter = 0; + while ( true ) { + var targetY0Neg = targetY0 - Math.PI * 2 * piCounter; + var targetY0Pos = targetY0 + Math.PI * 2 * piCounter; + if( Math.abs(targetY0Neg - rotating.rotation.y) < Math.PI ) { + rotateTargetY = targetY0Neg; + break; + } else if ( Math.abs(targetY0Pos - rotating.rotation.y) < Math.PI ) { + rotateTargetY = targetY0Pos; + break; + } + piCounter++; + rotateTargetY = wrap( targetY0, -Math.PI, Math.PI ); } - // console.log(rotateTargetY); //lines commented below source of rotation error //is there a more reliable way to ensure we don't rotate around the globe too much? /* @@ -371,6 +209,116 @@ function selectVisualization( linearData, year, countries, exportCategories, imp rotateVY *= 0.6; } } - - d3Graphs.initGraphs(); -} +}; + +function selectAllCountries() { + selectVisualization( selectionData.selectedTime, allCountries ); +}; + +function changeDisplayScale( scale, power ) { + if ( timeBins === undefined ) { + return; + } + for ( var i = 0; i < timeBins.length; i++ ) { + var bin = timeBins[i].data; + for ( var j = 0; j < bin.length; j++ ) { + var set = bin[j]; + if ( scale == com.google.scaleEnum.LINEAR ) { + set.v = Math.pow( set.lin_v, power ); + } else if ( scale == com.google.scaleEnum.LOG ) { + set.v = Math.pow( set.log_v, power ); + } + if ( set.arcInfo !== undefined ) { + set.arcInfo.width = roundLinewidth( set.v ); + } else if ( set.spikeMesh !== undefined ) { + set.spikeMesh.scale.z = (set.v * 200) + 0.1; + } + } + } + selectVisualization( selectionData.selectedTime, getSelectedCountries() ); +}; + +function selectTime( time, switchVisualizedMeshes, animationDuration ) { + selectionData.selectedTime = time; + + if ( !switchVisualizedMeshes ) { + return; + } + + var prevMeshes = currMeshes; + + console.time('getVisualizedMesh'); + var destinationMeshes = + getVisualizedMeshes( selectionData.selectedTime, getSelectedCountries() ).meshes; + console.timeEnd('getVisualizedMesh'); + + animateBetweenMeshes( prevMeshes, destinationMeshes, animationDuration ); +}; + +function animateBetweenMeshes( fromMeshes, toMeshes, animationDuration ) { + // add it to scene graph + for ( var i = 0; i < toMeshes.length; i++ ) { + if ( toMeshes[i].geometry.fullOpacityPerVertex !== undefined ) { // arcs + var opacities = toMeshes[i].geometry.attributes.opacity.array; + for ( var j = 0; j < opacities.length; j++ ) { + opacities[j] = 0; + } + toMeshes[i].geometry.attributes.opacity.needsUpdate = true; + } else { + toMeshes[i].material.opacity = 0; + } + visualizationMesh.add( toMeshes[i] ); + } + for ( var i = 0; i < toMeshes.length; i++ ) { + if ( toMeshes[i].geometry.fullOpacityPerVertex !== undefined ) { // arcs + tweenArcOpacities(toMeshes[i], 0, 1, animationDuration); + } else { // spikes + tweenSpikeOpacity(toMeshes[i], 1, animationDuration); + } + } + if ( fromMeshes !== undefined ) { + for ( var i = 0; i < fromMeshes.length; i++ ) { + if ( fromMeshes[i].geometry.fullOpacityPerVertex !== undefined ) { // arcs + tweenArcOpacities( fromMeshes[i], 1, 0, animationDuration ); + } else { // spikes + tweenSpikeOpacity( fromMeshes[i], 0, animationDuration ); + } + } + setTimeout( function() { + for ( var i = 0; i < fromMeshes.length; i++ ) { + visualizationMesh.remove( fromMeshes[i] ); + } + }, animationDuration); + } +}; + +function tweenArcOpacities( mesh, startT, endT, duration ) { + var geometry = mesh.geometry; + var opacities = geometry.attributes.opacity.array; + var fullOpacities = geometry.fullOpacityPerVertex; + new TWEEN.Tween( {t: startT} ) + .to( {t: endT}, duration ) + .easing( TWEEN.Easing.Linear.None ) + .onUpdate( function() { + for ( var j = 0; j < opacities.length; j++ ) { + opacities[j] = this.t * fullOpacities[j]; + } + geometry.attributes.opacity.needsUpdate = true; + }) + .start(); +}; + +function tweenSpikeOpacity( mesh, endOpacity, duration ) { + new TWEEN.Tween( mesh.material ) + .to( {opacity: endOpacity}, duration ) + .easing( TWEEN.Easing.Linear.None ) + .start(); +}; + +function getSelectedCountries() { + var countries = [selectionData.selectedCountry]; + if ( selectionData.selectedCountry == 'ALL' ) { + countries = allCountries; + } + return countries; +}; diff --git a/js/visualize_lines.js b/js/visualize_lines.js index 1baa8f3..772eb98 100644 --- a/js/visualize_lines.js +++ b/js/visualize_lines.js @@ -1,16 +1,40 @@ -var globeRadius = 1000; -var vec3_origin = new THREE.Vector3(0,0,0); - -function makeConnectionLineGeometry( exporter, importer, value, type ){ +var EPSILON = 0.5; +var MAX_LINE_WIDTH = 40.0; +var NUM_LINEWIDTH_BINS = 20; +var LINEWIDTH_BIN_SIZE = 1 / NUM_LINEWIDTH_BINS; + +var globeRadius = 100; +var vec3_origin = new THREE.Vector3( 0, 0, 0 ); + +var spikeWidth = latLonTo3dSpace( 0, 0 ).distanceTo( latLonTo3dSpace( 0.1, 0 ) ); +var spike = new THREE.CubeGeometry( spikeWidth, spikeWidth, 1, 1, 1, 1 ); +var curveGeometry = new THREE.Geometry(); + +var uniforms = { + scale: { + type: 'f', + value: 1 + }, + randomColor: { + type: 'c', + value: new THREE.Color( 0xffffff ) + }, + isCrazy: { + type: 'f', + value: 0 + } +}; + +var attributes = { + opacity: {type: 'f', value: null} +}; + + +function getConnectionLinePoints( exporter, importer ){ if( exporter.countryName == undefined || importer.countryName == undefined ) return undefined; - // console.log("making connection between " + exporter.countryName + " and " + importer.countryName + " with code " + type ); - - var distanceBetweenCountryCenter = exporter.center.clone().subSelf(importer.center).length(); - - // how high we want to shoot the curve upwards - var anchorHeight = globeRadius + distanceBetweenCountryCenter * 0.7; + var distanceBetweenCountryCenter = exporter.center.clone().sub( importer.center ).length(); // start of the line var start = exporter.center; @@ -19,13 +43,13 @@ function makeConnectionLineGeometry( exporter, importer, value, type ){ var end = importer.center; // midpoint for the curve - var mid = start.clone().lerpSelf(end,0.5); - var midLength = mid.length() + var mid = start.clone().lerp( end, 0.5 ); + var midLength = mid.length(); mid.normalize(); mid.multiplyScalar( midLength + distanceBetweenCountryCenter * 0.7 ); // the normal from start to end - var normal = (new THREE.Vector3()).sub(start,end); + var normal = ( new THREE.Vector3() ).subVectors( start, end ); normal.normalize(); /* @@ -43,50 +67,138 @@ function makeConnectionLineGeometry( exporter, importer, value, type ){ var distanceHalf = distanceBetweenCountryCenter * 0.5; var startAnchor = start; - var midStartAnchor = mid.clone().addSelf( normal.clone().multiplyScalar( distanceHalf ) ); - var midEndAnchor = mid.clone().addSelf( normal.clone().multiplyScalar( -distanceHalf ) ); + var midStartAnchor = mid.clone().add( normal.clone().multiplyScalar( distanceHalf ) ); + var midEndAnchor = mid.clone().add( normal.clone().multiplyScalar( -distanceHalf ) ); var endAnchor = end; // now make a bezier curve out of the above like so in the diagram - var splineCurveA = new THREE.CubicBezierCurve3( start, startAnchor, midStartAnchor, mid); - // splineCurveA.updateArcLengths(); + var splineCurveA = new THREE.CubicBezierCurve3( start, startAnchor, midStartAnchor, mid ); - var splineCurveB = new THREE.CubicBezierCurve3( mid, midEndAnchor, endAnchor, end); - // splineCurveB.updateArcLengths(); + var splineCurveB = new THREE.CubicBezierCurve3( mid, midEndAnchor, endAnchor, end ); // how many vertices do we want on this guy? this is for *each* side - var vertexCountDesired = Math.floor( /*splineCurveA.getLength()*/ distanceBetweenCountryCenter * 0.02 + 6 ) * 2; + var vertexCountDesired = Math.floor( distanceBetweenCountryCenter * 0.02 + 6 ) * 2; // collect the vertices var points = splineCurveA.getPoints( vertexCountDesired ); // remove the very last point since it will be duplicated on the next half of the curve - points = points.splice(0,points.length-1); + points = points.splice( 0, points.length-1 ); points = points.concat( splineCurveB.getPoints( vertexCountDesired ) ); // add one final point to the center of the earth // we need this for drawing multiple arcs, but piled into one geometry buffer points.push( vec3_origin ); - - var val = value * 0.0003; - var size = (10 + Math.sqrt(val)); - size = constrain(size,0.1, 60); - - // create a line geometry out of these - var curveGeometry = THREE.Curve.Utils.createLineGeometry( points ); - - curveGeometry.size = size; - - return curveGeometry; -} - -function constrain(v, min, max){ - if( v < min ) + return points; +}; + +function createLineGeometry( arcsInfo ) { + var vertexList = []; + var opacityPerVertex = []; + var fullOpacityPerVertex = []; + var colorPerVertex = []; + for ( var i = 0; i < arcsInfo.length; i++ ) { + var arcInfo = arcsInfo[i]; + for ( var j = 0; j < arcInfo.points.length; j++ ) { + vertexList.push( arcInfo.points[j] ); + opacityPerVertex.push( arcInfo.opacity ); + fullOpacityPerVertex.push( arcInfo.fullOpacity ); + colorPerVertex.push( arcInfo.color ); + } + } + var geometry = new THREE.BufferGeometry(); + geometry.dynamic = true; + geometry.attributes = { + position: { + itemSize: 3, + array: new Float32Array( vertexList.length * 3 ) + }, + color: { + itemSize: 3, + array: new Float32Array( vertexList.length * 3 ) + }, + opacity: { + itemSize: 1, + array: new Float32Array( vertexList.length ) + } + } + var positions = geometry.attributes.position.array; + var colors = geometry.attributes.color.array; + var opacities = geometry.attributes.opacity.array; + for ( var i = 0; i < vertexList.length; i++ ) { + var vertex = vertexList[i]; + positions[i * 3] = vertex.x; + positions[i * 3 + 1] = vertex.y; + positions[i * 3 + 2] = vertex.z; + + var color = colorPerVertex[i]; + colors[i * 3] = color.r; + colors[i * 3 + 1] = color.g; + colors[i * 3 + 2] = color.b; + + var opacity = opacityPerVertex[i]; + opacities[i] = opacity; + } + geometry.fullOpacityPerVertex = fullOpacityPerVertex; + return geometry; +}; + +/** + * For linewidth, follow documentation for roundLineWidth function. + */ +function makeArcInfo( exporter, importer, linewidth, linVolume, logVolume, lineColor ) { + var arcPoints = getConnectionLinePoints( exporter, importer ); + return { + points: arcPoints, + width: roundLinewidth( linewidth ), + opacity: logVolume, + fullOpacity: logVolume, + color: lineColor + }; +}; + +/** + * Input width between 0.0 and 1.0. + * Output linewidth between EPSILON and MAX_LINE_WIDTH + EPSILON, separated into + * numLinewidthBins number of distinct bins. + */ +function roundLinewidth( width ) { + return EPSILON + (Math.round( width / LINEWIDTH_BIN_SIZE ) * LINEWIDTH_BIN_SIZE) * MAX_LINE_WIDTH; +}; + +function makeArcMesh( geometry, linewidth ) { + var arcMaterial = new THREE.ShaderMaterial( { + uniforms: uniforms, + attributes: attributes, + vertexShader: Shaders.arcsVertexShader, + fragmentShader: Shaders.arcsFragmentShader, + blending: THREE.AdditiveBlending, + side: THREE.DoubleSide, + transparent: true, + linewidth: linewidth + }); + return new THREE.Line( geometry, arcMaterial ); +}; + +function makeSpikeMesh( lat, lon, size, color ) { + var spikeMesh = new THREE.Mesh( spike.clone(), new THREE.MeshBasicMaterial() ); + for ( var i = 0; i < spikeMesh.geometry.faces.length; i++ ) { + spikeMesh.geometry.faces[i].color = color; + } + spikeMesh.position = latLonTo3dSpace( lat, lon ); + spikeMesh.lookAt( rotating.position ); + spikeMesh.scale.z = size; + spikeMesh.updateMatrix(); + return spikeMesh; +}; + +function constrain( v, min, max ){ + if ( v < min ) { v = min; - else - if( v > max ) + } else if ( v > max ) { v = max; + } return v; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/roboto/roboto-bold-webfont.eot b/roboto/roboto-bold-webfont.eot deleted file mode 100755 index 66041cbee7938388e7e4c311db13be135276d7f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32652 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 - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Font data copyright Google 2011 -Designer : Google -Foundry URL : Googlecom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roboto/roboto-bold-webfont.ttf b/roboto/roboto-bold-webfont.ttf deleted file mode 100755 index 26d030f1f28d735c2cbae47c6df8e399aa7befda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32468 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 diff --git a/roboto/roboto-bold-webfont.woff b/roboto/roboto-bold-webfont.woff deleted file mode 100755 index d4ae9e66398cd9d0ff9fec6ec33c28c2c2c8f389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20792 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 R4v^8jrUWiNy&+nq007b;6NLZ( diff --git a/roboto/roboto-bolditalic-webfont.eot b/roboto/roboto-bolditalic-webfont.eot deleted file mode 100755 index 88cc3ea03db871b4eabbf02bf7d88a0b627ad2a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38600 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%0DX%1BsH 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 diff --git a/roboto/roboto-bolditalic-webfont.svg b/roboto/roboto-bolditalic-webfont.svg deleted file mode 100755 index a1068bf..0000000 --- a/roboto/roboto-bolditalic-webfont.svg +++ /dev/null @@ -1,255 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Font data copyright Google 2011 -Designer : Google -Foundry URL : Googlecom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roboto/roboto-bolditalic-webfont.ttf b/roboto/roboto-bolditalic-webfont.ttf deleted file mode 100755 index d2b1647621fb2539b8026f2ee88033c6e9686982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38388 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 diff --git a/roboto/roboto-italic-webfont.woff b/roboto/roboto-italic-webfont.woff deleted file mode 100755 index ce6cb8589ff9a37100cb15ed62897f27596e80a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24848 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 - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Font data copyright Google 2011 -Designer : Google -Foundry URL : Googlecom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roboto/roboto-regular-webfont.ttf b/roboto/roboto-regular-webfont.ttf deleted file mode 100755 index 2a1ec52e6760980f5131c551926d389d10970e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32944 zcmd3P33wF6_HR{pPtQyy%S@8VPBO`4Um+ocunP!b4|~`NI|vAfVG#iV1tL2lo9rTs zC_PD3L{v}`0Y$xvs0fOHT%%sstEiBk_dC^-fL^`d|9kIy-+Mq$cUO1Ua?Yu9PMxJ- zoG})RABDL(b?Vn+M`;nuklump8A5)Iw{w;j--pE#oK88TUvZTT9$eU~F`&31dsg)J69_ z%-GB)@x0jt6a+q^-i7;%xKErgW#;V9Qig0{?0($JrzYP!y7WWaiAjvjK85zLPbr-} zO$y_;7@Mo%1=rNlDPvtq>jk)f7tf!VcJF;Nub$m~fw6h$zigd0W9+o;FQo5eY{6_i z&&M|eEp~eOy-n!+<~_;=-+7aG5{SD*Dq#|nQL+!me*Bf#0rmr~74gKV#gE0ZOvWdd z&Ya3D;tBJ5MJ@cEu`{U5c#po4#I=QSzscgw_G}f~$zEgU*e^VWx8NiBBEFL!6ZPk~!79%6!s%#(d8F zmHFRh-QsWlwgzvId8DAnm3 z?|1m-JLbf7g!e}liR&nDEsOSki*F=m#nW%_T^$Q!X4D$QB2Z5x?xVcdSTtIR0p!eR zTgF?Tg5*B{+rx4#QBcqE{cFSJzobz_1A4 z_Q6qtBN}yF24y%v8Fo-cFuU9PGx~f1ef|J_{+M;~eu92~ih6%xJpj3$-e1w1Usy44 z-Wx|Bywex7&=2qQ$G8T1&!O#4F{U>$ruWzo>aF)3j7??!Xl)(~($6vnjzsTL^yekC zat^ishFWi+wsWZEP1NunzIq#2?1-60J?;(M^ue_O0gkb8)Z7uHEJAPk;3&cOLoq%( zN`J)|e#IERMgRYe{{M>p{)#$&#hd>|e{Z3cU)ca01MyV}&Vx|XV3ZHVSwaoemm4eq zJ$?r;J_Q(`1dLAr#wYRg7qof?y{5NLi@Hj@@8Ww8zCR3TGSFHgOTm{P;LCsD%d`0M zAE1&kppv(NkIulydf>PhpsJ$>SMl{he7&As&}-Qx{W^^uP$>dFdZ2&3aoq>kB{&a7 zKV>{I`bc9ALq9(RM9-sz)2RJ@)LzS40*bA?HLMdx)EVCt;oJpq>xy#^)YS*)zJO~# zKym=i0|iw`YzSa96zvc5{s4+#-g4kf1I{$Gu#TkyLK!$RadgBCDgs?~!x*}wm%UKd z8%H0M^+$^XP}4xx2(`r#y<+|(;wS*EHwVoWdfz}lKVmIG_pQ7yqBbwacME)j0m8}X zVLFanyxA1z0*ui3>SKI$1z&8(7Z??K*#`$GiU}-=>Z58H}t3uW7R>Y)P~Lm zgC2)s+%aft2n+HKWeyyTyyI9baFhtXk?eg7?Vm#XZ=n4%teN*SR=`}CEiTNKIP}_y z8555_l%fyA1q~N_=b|seG4{C_`&hIz7kJ%)emwzbKFlrvszg)g(8Bw`$@ieoTYsR> zz8Hl;n}8hpIs_vd=KUAiV(6DYczBSvJNnuieLaD`o~q z)@vAjBh(y;nqNlECs6YV)cgTz{unjiK+TO%vlTU4@t1+#lX2Wh|3zYMpTpb7!RdYz zytFskPec26qy4+l{ywz7AMKam>oYzKoJ9Ml(0&4-p9ttD0Q%8@eiHhVg#Ii*e+cq( zf#1b|+k5DfhB^Ha`jkQt$J>cGjQ*U(h|ZwKv-ncSmmm0MGI6d8z}G4C?=e8 zetr&){5fc45a!fi;A|+)7rfOdtrpLJ!PPI~>ISZEU~Uct{a?VGzJ$XfsLT&kL*u0W zb_GwNeqBJ>B^=a74c@I0SHI!vH?&>^dZ#BpJwHJG`< zxq~r762ZCs{?OB3QRlBH3j+Ukcpn7}ub|#9K+PoOzCeASqrNZjO#()jfO!@K?Ze@H z3U84t{04844EzRjp%cc~8BnIN_QBB)*B8+4B^*|KSBCEv;;ql{)@OL@GraW~-uf7C z#o#T{RE(!r8lKV|yM%-A_aQh-BBW^nU|$Hy&;s?gLd_k~$4;oFGcYKm9B@QZt{B+s zjf12bNwfig?Lcr8;ur>8TzA05!am0AG^3V7`0^*rg&X+dBYXkOfZ7Om)P5P-x1xPN zwC|7hiL-y^8~dwb>|N2*V!YiOM<2|-zMuetMSt8604)j53{F9{4u)1T1oaHX^)O&s z0)^S|mqB}q!Kf2i8^Hs+W1jb9eOV4<=5UtJ2xe{BMf|-BZ(&)0w`2c9uf+rWk(ETg z1~6f!Ev7uEw{gZ<{s$W;8E^Q0FEi=8BIX(rx)XGaKhx&SxDPb$x~Zs4$Gv&F6z*bt zM=!Lfv@i*69z8}2zJq#9f4)HpUBy5KLC0r}QJ(^g&1YWTg!kpMr5fpibkXJK3Ux)f zVqFQYWLJ)>g{z}$gzHdzLPGFmc2fbrWcY3;zUb5N1#{V55v~~D7lnWLf_uH*tKQeV zYrWIGJ#<$0uext8pT2zZ@`=mGFTZ^G=;eyb2QKft{K(}NpH+W)-c@U=_4O9b{LlYz z)mR|V7o5iaM-YmKvSL!r7OS7lKOiv3?g$PEb%upUL`Fr&G>VOL#V5EElaf^{cE&k|#tJdf=^`q1d9bTj3_%cB-Oyz%vuAAWT4(#IEGWGAYxUB7bm ztFPIdPd;T!RxDmwzIx5tRT~~>k3F$%>uWWqrZe`&Tv3faQc%EQwv|21)?rn&mmOo( z?6mY2emAmhOk>ZnS8@F&JI_90kFh=M9jwa^YAjP@A>Fj};u5WE*&vO%+eT<=MoH^I zqU^yzu5%g>$&SdV%xWDO^lD4)!L1v8+;QeT55ehB0fIab-o;6z(-xsxBkAq zp?`QSDAVma?`z!cD(TiYI$q<0O3E>yF79%-tGr9OyOerD!=Yd5kDbsE3^X`s0CW-j zrvad&?oRH~Nh9wZ34I!pi9wVvC9riJ<1ROAuHuqb(Z}&5G_#VmE-_DxvRWSiF*`!?`|KB6L+@<enBYIJ65Cb zlSLHD8Mpy-Pl-K^o9Wc#~e_rN#f+O@(kuN zaYwMG6gF;>m!Id99eIwYYig>`p5>p)@7>C#SwCOiFU>){Ch*?otU^L{nmMluyxdR8 z(9~S6*>W^~-lL#m#qLpghQ}IE>+#1~p}I|ltZ|c&0@Q5Iqo4V_dhEHHvGV@!d4&Gs z?~(;S)J`YNwB2YYn#J*ftRf8kuW&|2<>lp7n9*j1#paLeD#pXi0U4E&Bc@Sec%Fx; zwUwda5z&d^xm6}bJd*9ParDT9N2=8?0FSr^dWbsji43gOBJG|q^vxMqTj31z%cyMU z46$ZZTAX2)438Pl%{d+mo|!H5%&b^5G^gET!x#R6wVrsMp*4#-+UDJ#jxuM4-_bU2 z{5td!;@2U5L+O{^2^a6+ zs|fKG>Wr?hC#JrhM)Xc)Z2g;YR4%u(OEL}B?jTqY_s#y(AFW*!p&>s$BpyeeOh=y6 zEe>~xTXu&O#D};$aZ5*7iDLR}?8ChHdE-jQPi_=%D)ts{EUskUj$XcH1s}SK@6<=q zu}Xh(g+7jNp#$XxJudb(R+80ius&^J73sjDmI7RuYb(-C1kv;~Yet2Gh$uAA6OCd= zG!;97t)SAZ94+v?Cl-{%T<0AgDY#aPwR;=@erQmwmPTc%xCpg-EI>p=t|t+%hUa>+ z@kUxKh|Ryylj?8;SK3U`@rmJu9!n?+6AGCp+T;iZ?F5D=qL}D0FElJKw^@GE zzg6>g)wV+y`F_)u#ScswydbyrTL<^P>%8=7*!2?&wm)!B>Fj3hs}CG{GvxTI!5jd-Z)PDm~g@M+BrfQ0aHp7dXyPk3_q@+bE! zE8n}WclR#Ey}NcR9xc5wrLK^Vcyjr&y-zOnJ?PV=Yj34nj|I;@v#`g4Lx&c09Y3yH zkFFCZcD)s;%;<1))q$Q1o_S_L&xMB$E$lXae7BxmCrs!{T30*o*UGzqTRf<$kUh#O zqKP}i5#W-P+6pTHu0R2ZS_lv&1YqVTFihwy&_{v+7Jo;r=5N5wX|MIP1cb5@Kpk?S z*3?mDjY~?i12&p}u$Ee=g*rf&F@=SNnlo670K}4_0jEfmXa$bvnCc&q*4Q8|Mf_&3$3$=&gMYyzu*Md*Ub5u!pwCR>TD86Y!t`}bvUz2rj`O5v^6%?7B6(1=*2AI6kc^lwzrZ^R9-d)v zaAMyU1v5^q=iS7=J!SyqHq(yANSre9YkY3~{xkhL)wM)#B5hO0z+M!>xE3q`?uTzf zAWevf?5rS;tCGWM4+ad9*%IF7u$sL5%`@f6>S6sgsgsqLOWDKt%zN}yeQ$uiS5KWe zd6)!g#+iz`e93CKa{LK%iHQFo>ld26Zz+S zSO6cuuTGsjtnNL%%&OmC_x>;egA)FT9IX_xK*-k$St6krl%q-KJtoW-I|go&Kn*rS zT7{?N$pzs+Vv0GXprpw+e!Ki?8~?a@$%>^9Z(i^HVHJFzKBz*^=WiM~zF*gQOROPHSg)fG zRnq?y!{+;eVSFrK{Ni_vWuFu!{VY{s)+JCq9qH#RlRUdmar(Iq-aC2fuw|D zgE{C?18OVO5NbvZKr=BYii`sD3JL`C3UO4(Hb3w+=CMIMXhDTqn4{z ~WMbg-JPoF-ikK)_a5MF$*{KKslTXc;V zZ;_tnx#$>Y+kl@C^eYY&T+yfjKaCpjV<-HCSZXT+8`&)xRpGWqcAzHQ0@Og84mw|H z4`P7;zoVA4F;5iGVW`JiauoLj24$aSAiC_+q%gPL|JxYSlTBKXU9%s@@TRfYzJgk)6UmzG6t6_i=Xw9sr`VGjv~A`9h}do0AB8x?9%4i6rKfCGWz3TBBi zNcXlv2W*;CLO{QA8(z>X*h!N-d7D(Re9D96kItJpA#zVY>EpVyIXN@BocZGG&tLq7 z&rxSB);2$Ss8bh*oOW0r=FZ}h?!Ekp{tLJg@tx&>RjQbeDQpU>h#+Xif^r4l!PKk@ zPK+RpEm#F`QUwc&CKi;dMcWA|9w&g4hI2gB2t;uLaf8iK$hX=Z0HhdBg{xaq!<$O@hvey&C9v_g8};s(hKMJTmE$GeIt*3 z^7FfA^zTpZy8nTPS1%g&uv<#yFlX_e2~is(k$NMu2f@lFOM zz@2Xo4k?vu^lx6P{^`2Oxpk|4MEBEA?byM)N)8TJ9_e@E0N*IUHyjq+9JY{EI0?eh zfUr>QvH;|qh?ui9_gK-&b*ZiqC9oOkO9)Ezo2_B^< zI)b0G205eSWx*i`6`o)Q4w2&U1j#sO1$+Ee!6W{t)R~DPC=IHd!4jd%H878Hn-@)6 z^mFym?-ov)_qcxZ%z6EX>Rk(FY~DI!-tM#&_mn=gxb&WKzUF~rnd#5Wc=gPiugrKR zBjeZur!QVS`@mxx=FZx(MasUny!_sY%N85-Hq86A{Hu@N#Pf!MGt(Bh5dJ<(e<*n}s5IDe?4($66i-7$~D4_FE))FOy^Xt6|lpfr++ z3^I{nx}+4ug3y|^=A^>hwI<|u6Mer|I-!sxGVZ()x6GKxP1Nb7l(H_w8!%*yewWrS5TVSlgaaF zH`A{?8Rfg7icCd$3QD*<*$zuQ8FN`@c8@$u{+WCo!7-D{^|DWV`AeOM;dbi~^sqn4k+N$acD`z$fujY-%jqW#n;*f>Mc>LSS zs9mp}u6pSFv}OZ_terOW{`rF@%@{rM=9BNjlr6CtdQ0`BX(P0n4zO?vxupf=d1A3p zB^l-^P;0d&IaTQ<77shnT{#}7sa8wO@yN7P?I>nw3Kpd)f&o^kfvgR*#=8ysN!! z27Am2#6#1uq}8$uHLF9*D)ih{fIEL;v05b2b})-~FbO;Pi# zt@9pu%wpG%>ze+SzC0+H7xNY+&$UVJ@Xly`iC!vAv)$FT-K0#;rJSh3xCfW;Px(G6 zSohcap4Z>(+r7Bg4=1_I3!64m>Ry=I_v&FjpFgeV>MQkSdbbSsJ?T08Cq84Ljn3K-gavF zh86l(Cat=9_=c3wcUPWzf6K#j=R9WGGG}tx{bF91LEgNCx$1_GsUn`JS*X?VB+N*y zHUvA3FG!)XARDRLiDFnG7)XfS6A4O&rq&3$sU_EwgaJi{U>xxnP*51i)zU~v5)$9d z!l6?;&BC@Mfx&{$Hp|Zo4|Rr`VQFDyyx_)-b*rS8tDf9@^5otpt6rAYJoeKK{j@Xy z^bo*D@FffXp{nZU3jLRA{pK6`FPJ-d8NYhWgb+GH zMZd8|*Zk}xrfG@baf;;!!0Zxh>3Bdm7}g%i9e;qI;f?qZEX=R!H@WFdZS5KTrb*Lx z>0iB}*Xnz=aKCp?zs>!?ABip!(Y6iT*`Nt)eai}H!eo#i^nS78#nP{Sxhs~!R%j5K zU#_w4^(}Udg)S|2ZTcF7O&1HW+YRoK*VZ+a#?@`1#{9O{%`@7X16nyDXl42xv?4UWKN3h) zbWA)cflyoinpViJY00gKj3ttajE2rsPc|MUo_JU^2uF)8^aO#qiz#Yoe|M0N3i1*B z%7KaCP@$BtIlRrypH?oHUOu#a-&-H;e`sTp{=5{_RQH~}g^Tt)lUsSuhvuI!sp`X? z-;e9>y>_!hHZR&z_f79*yr(fnqM=^|9-;REzGUGSAk|EHRetbsVpyQ5dMwghmU1j_wYhm7S}y!wD$^-xCHIV;3lFy(b(VE z2TrX=S#?IpcDf990(>KoOkXHDmis>_yaU#$4u{N>H>?-}=oMYU)`Qd>RqTS2p$+?4x4T8xe#Lq_PK^dDe5C;4o*%BJuCr)N!|j! z?U77GxEunyLiP&~+6V{$l7&bhg}b@gu?Jl29hLv%=W12&yj*Vq;c~N7+3|a^(t+PR zrcB^BHxoQ>)1a>(chKOSga@iqe7yk484F=atd~fbP)|HEbR?SDd7Ru%)CZ8_%PMHG z12uj?Qu?Fy66xka@K4y3OcLfd+2k8+O7Ke5rNakyI3U0DS?F$ zlMjYXi4086>AWoh0xZ0n{+#}+S3gmG_RtF-e)RmIvx39>@lpB?{b#)n$4&&>+Rh*# z!22dQo#M>PPLVD~{Elee4^-d&jv3*03i~%#O*yHHjv#N z!c}p{NAd=7DrMDjS+A?rH}MINty{ld-(=FhKUwo_-4W@^jyZF7Q$MDAr<(=?Rw0 zaX<^W1CYXqF0{43180XeA20p1)02pw`#X@{ceeNY4}Fl8{a0Ycc=iIWAD9kfec)ze zeVos3(7wk_N=>u?tx#$V=?^Q17M%-spIB+d<GW{fn!4q3@Pb7TEX5p}4_QV2r7Q+n^;b4Ga=dwBz$;=L z#4lrDbK_dJ@VddAre%_XM&`CSgSAIuU_f1XaIGhY&=?0Nn$6$jHf(G$V4#&O(3u29 z{0=VabEzffh5bQr`Fv^+St-c{P3KF;-d$Y2cg>3zf8xry>&qUNk3F+=dHL4L&ujJC zOYiUA#`!jN`G(a~N0c>gc7D&Ht9;RdeI}DSZ}-EKM=r=|`PR;gf0oU71wksrJCcCM zCowcdAeFZ^~=BX_js-R#;wAAFTcEx&fn`la)gs|igZ+dL%UXzlfrTc zkqM_e+VsmIr!*`sRx}|jE_pmWuYh#=u=9L&yc*AEe^7Vz0QlY8bLJ?y5T620>Z_>F z$&UJLEJ2~*^;BskSIz!#n{zEpFnsQ;)wo@_@dKP70b}8IV)>6D!r#s8n)7%d-q57u zM_Zr#u8m>cQ?mm#({WEo6nY(c{OD^Pzl#&E2cg`4++&GGx%s%vsw9)e9zsjKY~IdK zqA;Q$*!rBJMEqdkhsH5B64fwE1Xn0lhq2nt3yI@2Pz*N&!{sS%Gj}I_a4u3!;L-`M zB&gBvp4WG3`lT?{sei1Qv|C+X<;Ue0ZgqM6b@_$gi{&2|FTNEBc(ez6&jTJdM4cIW zk0sBDa3IN7zhWW-vqyo|95Thqjel+{Z_hu{bH72%R=;ocT>jD5`W}6^^r`e--6^Sg zU3Oi9)V}T&w2_K7uAmJIYsM z#m-lm!w0C=-7#p>^5__mB`1x?-!+w^Mw(6M9sDf5x7zs=tYxTL_>Lwbh{dk(Oe za#R|5)TEK8hclagimw!Hwh?WLiJaqselOZIpU1SWQjKO+yN6@uam;ahedFk+(Ret- zKNRJ7+siNWMf&`0>Y}Z`78yLFwe+zZAz;QrXx7LeBN=}4M|k>kPuW%b9_eH0!@4xS zr&A|=82Y4m$H_bJDY8C%FeaS~55Pgmsw4)R2Nt5pTW^ge;2}y?xyHXTeT$gDRHn)B z$=R5lysjnzH+a$zLPHTVz&Bxp8EiDf-ABHDc)RIKRsV(hDzQn>d4E!RLP}*fc)!K6 zH3fF15co1ZSnpI=gxAO74?l{W86N_jUD#rB#C#?rX`)@T5r+=|hYtY%z$wwNn=0wK zxt?&a`ocJ)V9E!R$ zYc+4Y_3%9-?j6}dQqAhrVWVEs>Ta}{+_Xuz;(W#Yuu z%kGK*nqE#QBr3rqhAxC}Nrk^jcrBpGl8G3k>VR!3*zSqIc*%QBM*3hdGzZ+-3Y(1y92);2>kw?J%Yyb$K~c0H$2Q-Z;yaW!4OM6dxSYbD*f&1b2F!Lsq&#wYad>`e#o*4 zdG@>~ul*`n(!byZ(2_{nl#(`@Q?a;?@9d2nRCW3l`NUHyovtf z6O_nt~`7zQ|-R+d`a+BTkt~&!}1Ov%nK6BJ2>_o1r;G9Gw=DOI$%E4L%}A z3ls4Pa9nBj+&d!WD#DzkLWPmugwbIDB&7YsB(aJCb|s zzq6pr2J};@tC<4iWLtsdoYa)W1`4tuRt$#zEC4^2WH><_9Ia9b4M4ykmLNns%o9q> zaZGb4>OcexkP(Gis?YuABdY?#GVs@a5g&<7{_NEFC-Nh<{dleCb9cuU?&`T_asFea zHJ?>KvSQHel;pVsR@M_+-<~UP9)I_UHOl9_Xg2%wi@!B zVIGCB9zMOqFVEm{wmhe9!1-PE_AFqhwJkSk>B|1K<6qZm_ifk%f1+x%Gj-38;sUL4U}X;?poH z1m%$6v(+mC2xOtS4!E*Kc!wc@sYw}5h#l3{)k=$-HKtytPg9-VSM+Xt2I>sLD4|sg z^ePw~9wK^z#2JyMJqO+@G=OnJ>e~&}2IubR>%^`Xsi zd2dzg!?v2tC8L$~H>d1-&Z>H=t7#sr0eo#}+aFm44SJsm?N!M(W+K6f_7NxnFv~)8 z!1;-JO=~@f4&mvPi31Vmp#j3&VTB^FezH|h>f#Owo)PprEg-;018b=eQ!GIDj{LRMiZJN1# z5~S}j8j^y>d}A9m|^!^y;e6zTE6q)757-` zdP~bUt?b(2)@Q)7F*dmlV+%n9m4OG)IT2O^vDce4K;dFceXqx(uUffQa)f=)3-mKTg#D<$#q)nSbouh3 zu!C2w93(hF*U?8RY3LW}IwLSwgqnkX;USi~4e)}(Q?KPXfOJd~2{P32M=i(U0~xfO z0C>A0OMUDw#?W#?9C-qC4O&hl|D%?(F)n}m#M7T$t{$^7KWX;B6>HY6>_0n6A8ER< zqGuodg#J5eIUPFGeJ53R=yrCu^T@w?bif!!=_BQ@d}Dx5Tdbm;7=w+*aGR&YI8i?a z!Dp>$84-_x@rit zf~6~Z-gPv+{z98FQ1` zoC00sG}_E!v;W4v16ue$v+q1-^LLm;5EbeEZa`I-d0^$qtT*!rav*PU3=^uSk}9!6H5o(eOI5jw8!QxIW}hG ze0a7x%@}@HyH1VLx6E7f{KPR!d^Vma@7K~OQ(NdRBUwcV%>aK$3n7I}hW=vCt&g!p z)czehOuYk0MEi>v%Py0$ z(cuHqXRU?~gPDADUERIi+gQ}4!QpGSN^1#Ej{;A(losG?{fyaam`b5q867605hNN! z${&qJ6rdac&J8t;1h_CCK_x*58(BfPie8FnFOqkL8>n90O@6d`+~kSN-PN9eyj>GK zHT;+~zi#0(iw5+P{chIm8aUz#^$Q6d@-_6!iuI_^o&fT+td9y~$1qAP!E}~v1Yhu`yv_M#uh!#~OZ8VsaP&pJdpE*aq zZO##foDiQmN36r$S!WMMs!<OHiO@40&+AV(cQAw*S-nv!NZq`Wa z4;`wTBKkmMJBL2}(UwEQ`!BYfXd$?5JeyC{cU`@D{kp!3PrUN|_mW!**QfKBu#lfM*WgqPKiloSV)Q5vLZ09G>->^NcdL&RFLLJq`|h3F{{gM*EMI1p6G zWI|nA9(D1WTjhSA=!I#U7e#ap4ORQv+7?IWV2lHo$xUv$rtG$vwsLh^$LWN-;TYdh zfxAE0cnHYpmM#Tm3Ow^X@x+x@3xc1Klys<)S>zrosv@0=KG zS^ZdJbE@D(qX3rh98Va=8kkcRbbGAwdHAP26v_u#N@I;CGYyFv?D2sWDUCIZWRDgY z?D0cXV&f)Y=VGYF&?t_IhMMQ3;604oIc50Z;rKTt?X|sQCr=)`_qAUVE0>(TXJ9kwEhDGXsY6w?tUc!)2n zi88JN5X(+FpMNB2adr~#RwQOtu#iZy=7c#g!*P~_D^!2OTL%*kt(y&=9xk+K@O6ra zUHJ5plE?eE7}>Oa>B?sp4PM{B<*3{aBlv}7C+_Z)mp!9L@bWY5yEbk-iEJ2%+ghWS z^8rc=duLe6zEE1UW5>CGcd6GVe`rdE?P@kd;AmBtO;`(qa;i+?s$OgL#Z>^xL|^2M zP;n?EA3G0c0@Vg|iM_5G+$tD;E5d2c1lD{PoMgk;NsR;HBHiCUab1Q8z zss$wL&e0MY7TUpBXeZF3!x;((MS@spCt#sn*)AdGb{?7^yfKLYgEIkRb^xz1ig;AS z_#q^g7A3w_xGWG`KVT;X!~(tMcyoMy9^%7NI&Js6eC*UkMS5lasL?b1_-=i)8rMkr zjNfYP*SN7Njo-=x->Ut`A+>DAhKKbZw{94`r{$I{0Vl_Az>vZACV0Ov4OV^tUUS$S zW+dZ8yYuoqut_43%M(BZibzdFz9#~AFf^v4(_x4frfAGW1;!9=wz_E@o(`PZV-n~x zEV$AUBGAV?DR4JcMls_-mIJScMAAC}!Ic(2d$3SP+Jbdc`c_JTPme;@hLO63+zo@@ zntje#;ftM6o||9TY~7=)yH<=Wt?0IH#p6v2^Bb>P@oJ4+jtZ zFl|Nm=SGh^)^o$7>k3-8X})2_=AJK(9aY(V^`lGMw7;wM5^3%+{RX!lJBnDyUx@}{ zK?8@ukHXkYBQBxd#$RQ31Tx^>n&+`2M9!9573vfPP+LM#V8+5NoLq3kWRUGbF(LsX zoFM@DARzjRzyKnOKoAA3fXQSTfDmcnCm_!VE=b0ZmjFnnztDDJ)~CO*SNM27;j%uQ zH`gEH3-pJou{cFw7cYPhVWPCLF86_bbM>RV)7*Uz7Ny;>}i)=Py6|1?(ew~ft>>Q5^Czo9dprSz7vI9YMm>Zn|9~JCb zOQFmzTIPlZYq^D5wxb=QC&S$tO$uAI>p+AQNTwc-t2N$jgxTZBa0EZE`n!@-ThL>` z)E5Vg!~msXBKiE7^^s`_iESmrf+`eZEcU=lL5qfd3=$kZd|=0p-2ZYdR}}f!_7!U% zf8_mte>QU9-JSGbKEI^DXOfPcSh{@Mnzz2YQoZcG=3V29ir1gX>6_T4ikDG>8v3`#mvWKhT$g8xqCOL?r2k!JEfk(7k8;$b$CbVRpw?epV!U7 zk}BTx6yUY&R3Hwa-Ev|~9uS9sdSJ3j4US{JBs~$DVFYM|P&_@uHCa^+OJzN3?-UA9 z)Jphvp2}1BcD+=;pns%~n!^YF@-r{d_y7Ehe&Fh{o!dN$v~I|d;p4^)A2N8Iq-fiA z9+N)iExD!_>(%;6y(h2Wt@IoEV|+4#u*`gt{O!1fV2F$}{kUlhTsr&_WGQPKC|im;7^wFDHi^nLvN%$eDd$ z*Q2dkbm+31s|Qv*@`Qijvlc%&etM5ti=JuGDsM_~dAGjurm3@=w(Z!gNq{m8`#5lo=5AL@>?ocB=xL5CQY-91ipVNjN$L^r>Tx9GX_$x|> zW0)wNvUr;aN^gS53b3)NsFvbER73vmpC~*RG@X~L<=QEgNh?4`GYT5z3d)Dbyo1mw zr8hH|TnI$y;9iLi%>|@3A)|-8P|I^vs=>@fPg)W`1N-_Lvge4c{i_(13?9izHE5cg z!T*x@{|(|lK*Wz(5wYo+_HEm@H2ZC~Djj<4*mT#BUZWQO1@-@;ZxGaP!3t|*-4MCY z;`wcc$3;!*);#Slr`_2*y;)I5{aJpFw{6~~CCSn8rdZj~>thX$MLGVycn(UhY4EjD zyvBIxJ5%hsb;Roy%CAZfV*U_6Dnf=QF*h)wiXd7cSqc7dY8V^_k?6!>?f@?NX@dPR zJFG|q@fniHKW=Eph(iWHxHI2o;iie>H#|0B(#FMI@|$)p%FFMf9G|px>!isWHcT!k zDk>=G2CY~^q_iU6P<}$6g0KsY2q=JF=t~gA)!!$G!g%CM5XChA+XPYAbdA6j2w+3( za{y&Df6&9n>03Pdez}A6$`-y=AG<{#&9~Kc+PW3Io3mNcR_ToC4S2HAD~L@S7!0i` z0IvVYEkqWRClZd7`t(Bd2Ma$+D-415{TJzkz?V?E>yrtC{v(-imb!oC(oKVAZkG7O zI*n)FommKGvP=1B^ooTui>FOosxDf@)mGiobKA5-vKnX8q}9?jQ;m^JXygr|tGDw8 zkptr~q2zXUp@20Z9a)6j$RflT8nOsA2bK~TNgR^wl8CR6*WAb^BzG3F2@#$aLm3B2 z#{L16PpBo`&L-62h&t*6M`_0VF_%#I!Np3~Af9P_Pq(&3{kn8nvZTXZUG8pv_ijl& zFn{g-&TTq%uUfa@IeCVfUD&d5o5J~pO*2|FPF07`nl-gxNL2X9j`z;PcBq^!R<22j zB9yrKxLJ|B_{g%N0X4qnX6t)cbo5`B&vrpBV zl>Nx60d>+B3q(#pxRol1p4*%OF$CLjdD6iZ7Hi0M+_ONMxt|Loi`I{uDo9L5M0d)KsLYm>tHd%}8=6$TOBO?pZ}8 zMFU+c{O=mDeZ79PNt4FO=A}(-eTqlUK%YlQoB0axI}rnHsB&nRa*rDlj_ni!MAWU^ zDIY1}cm&US)|C24_^or&YVfJqQl*@My2$T=Jzk8^SLhyazdMNM`n(>PF!fp0P&OK} zs_P?Q|I7XmvyW}te(a@f+h2aBWI*3RgZuR>QTY9jz4X#!_iuRd#SJABCk?#6-#z#A zBc0$W)>&RG?|@ElHH`AYuJUQZzHkIK#&1j~kr(zY8zgPQ`5MRmr+DKB=_KG!-_koj zi+8T^Bs{Bs*UY|?GkotXWK7**dP98wj(Fz>8GA;dp6{7m0)Iq3_v>ZyVWlM!TodH4 zm6pe8j~#rkTs3zKradz0?GEe*KCGdA?7UfS?} zKtuT?_Q)OYPj4uHgXi)?z*!*nDWe#A@}JIUA_P}sd7eKcU>W{YH6> z_ij`}vvHlk*38cg%e_bf&`>^!y~v60m9Wp{&y_jQ zsa)891RH5^5rG(qNIJ>~FhhQeU`+yul^0k!i{N)|fzk)?6VPe9m>+ zhXBa(F7FnFJ!>ESUDH$bnXktb*YOI`@8jNss=NSn7$2+FXBy;XFTd39%0ou7L0amTuls&e-hW+FE^kQ9M6yBM z{Rs&o_n_M&xn#Zt9z^W3m>v6%xq{D&{~pLoD}{Lz0x&f6#7y!^`7`WyWH zC#KIp@CNA$v=_ioH3U1M`r}2r8OeR~F2vIdMvQsd5k^M?y629w7mtP~=VT{b! zMp6WAY?FqEjSyRjkfab{3UxU=;lgZB4hAixP;)yf%mL7)h|M~LN!N)a-%xC8Kx-0T zo_2myiHxAeULB6*muimQ$ZLG1=D?sMsXbF?H6K0XN{jqW112t1dR+MCbk)F3-TLTH z-M9Z>Uh>MA#uH1r^WjrRKRKjm`V(tzg1Z6dBHmQB0w)~}oMUIh=!SArLwOkz$if@S zRbRQvYI;WBQBQC~`Kc~(x64g$Hk40FyYu~=hWg)NAFxS=tx4Sizjrove`-(J$e94S zmYnCw1=OL#+eu#ygM7kmyWA?dAQM|v5J#1v#IyuQ?I0#=4lt7QpE0mGc2BE*ofwnGCa&6(OWSS^39caLs;^;_3wnRe6^P@7O~_^u8>#xCyvRoq z*;fuaDMmzMeYxqahVn@nqTG7~6K=Ta-zb00s2@9Bt9Ty?V^Rmx_r7wKmBmR^k9QTy zrZFmT=Nrl=={K?4t%O}{zg8N9&$|#&F@sga(nL-K4P{_0j1vW) z!I?pkRmhRSLLeRlYvQ!p%7q{XDfV`mB3KQuhnObi`CRZdVr2KJjkM7JixIRh`0 zW)H6LvxO7wI2@i(U--1x+XFm4#gvkSUw8|{;lKz3CHx_DNI2w*c<2X%cQjS3{X6QP z_CNrA-^^CM*0jCQcy{l~TF8C?~vAIq*BtnAb)*)o+xa8gobef)5zwlRDyk%=gZ$O36~l zfntW7&t}5t1EV!Lq_M9SZQekuGYEfdYKd@XaCveLLjD`(5bWrHoy%}^mao@gL(3Ye zKXMO7y!ob__vV|ZwbVNYab7R_7_b`(0&s!9yBfMU~d;G+j zjzqjC6o`h9_cUsZvw}SeMD~ag-0PF^28wUXcti*oe%ISUn^sT~%6R^Hv;>dWFs)<<`4J%7z=RTfxmSK$DmIr+8v z31oaC^uxPo&#(lN@iBRxRB&Qvu9%s~w)5oUwry@zi=YG=dkY$SdogxoDr!k~v9Tjm ztBRJwY1%RyKl{ICWgE$n)tUhWJ3pb(0rdU;Lrc;0L6+PyRx!TUWW$-Z@^ zFM5C3KiaoD@qiHvI(ucPEJe(yTVzUxoOuv}dV+IczOL6@{G0qkHL}dS{!GlMM zNYTB^!qUSsL(-f}_gy(S-3ayvjT(BjKWMa-n17S76XQ_O=v3vJ+{5%W^3lQ=jAm8b z#6l^w$C~3o1{(2C82+$%rP)1|``7RQ>EOwe2b8Zk*S)Hy8ML}rDU&E?nr!We+$E!2 zl~dG1!9ob25j8g0+kGCr|88%GF-%wt4ITGCEbe>9cPSb>wy4YaF`2H|jEq=UrYX8; z)Tp8^Lx&Z)GScJYvk-(vb8xBhx!l_H6RaY=n8;_qHo$f@0J=AnL0{NiRfyqcL^Lrh znpJ*=D^Y~pArcVwJ|YS`seP;vpW#d!rWnou+PuSvlOYT*EgRB&f77&9lV=U?yd^KA zg>rM)^5J*oxP~tpb{8Vj(4YT(-_!r2Z$Uei(lX@-*=_H{zQli&lh=-PgqNgcrhgk{ zhuOGs?PzRkp%KK51mz#h1O#dgwjWJ3GO&aWxAB%bPG4Ctn9{MVs5aky{`2{`%_?DRFbw~#} z{r^uk{GSHo>{0V*Gfvtq+X78eSS;#y%OgNN{3r)h>_Zw(R&#Tn_|?#< z_j&c0@4m<8T0j1FgWK^-<6JIx;U)NOip^={p|Rcc7c7vn87<-)nM1(y#*TX53QjPwWxf4vXisugC}B zY3Y0tt4Q&!FI^Be@wpY)0wqJU<05?_tM9?7J9% z)$j46KNlarj#3+TaH;gisuZe$y)wui7?N?+Uq8`bJc_qhCd9k(DA`__l$?m|8F71i zd&UZsVH?H@e11nE>Odi@^bbl%61m+k*!+X+@d-)E^@-iIpBExU-N2r3QRnC7yKxxu zwSJRBXdCqR4;gUzz1FQ;$D{w*^8WTA&89bB_cZ@T55*BJDNnC2oYpj?`2(&0sb7`Y zyr&)v`ZssmgLc?M-ah1b@TqyG17{tMZ9#S(|8LCC@$yDtSEB#x4N>&Mb7Bpko#hPy zhJ81Ep$4??rX?sOHy5)OvP?Z+WfFqouXhp9Ok&T3s>JgxhJam#QE`w2*(<9uCn$ zd!&fDM@i9c2Y2KlIGC~%Qe?Mmc8uo>*AC~cXYNvWPaUQ{o`;Q|hWF{C7xFjsLMc+8 z%O9!xCm$&3`}lZC-zw;KzqCyL8u6hr#v>L;ckI_|@=f%3CwYRG!TU=_J*G5Qn$tYM z9zF3&^P8vW5OW=?Zuy*=g}L5E%<=A$;d}XWd9T~$YR886Q&<-&hkc;Ca=E^~zkJ?{ zo}(||Abf?K3CQOgd*_M)z>VeGD_NqzAYZV@e|Kg{t9{NaQ7`;C(izknh5vKLw}0;c z7ane@^Kgn-(B38 zn*%|Asd7B{eh_4**nyNb@j}QNMJQlq+QdHDHj$Hu5DAOeE!PacBxQ7i*gZB{y-*%K zHi)1Naj^kuJhFdM%mevT&&;2HP#^K^PilZJx$Aygv}w~K-i(KdIe~ex_mf>ej0kG= zGmEo;h{XTDxvBo_U8OtBOU%=8Z$UqeKlsKxy{;C&?|4^vA2%;CW|!|NoqptX#+`&j zF1nVY+0)V`Heb2LIw=R(V$%gS0oU#L%WS^1k1df7GgY3+N|bWelfS|4m$yQHOk}&{ zJ_w6@h)u`wI*xK2vvCyR*oI>{j#3=sa14`7@Mj0G-HM%c#{DLxFQI5tUH!B(SBr8tkG zGk8V}t|wEuq_7=Qu=f=uimjn*RmZ#Z{tEFvokvM$ai7DcNGn+s?jOZ}+LVo8z$`lB zh{7>kIs$k9O|}+ir|DkA&;$1PpIO%^qfpO5)(JZ11mzPJ%YR~Pm9N=w#mRQ69a)LI zfz6g{SPx}7TR^ZEWzVzm(oMEd>B2_KW7sTtGU8EIAs%A|+bn;}+Db8O7wVsdE$m0g zd&T!pnGUlf>LDCIBQEI|c0b@kaQ~0P{0_r5#;mL!5A|p1F7GA61JP%ji@@VS&;;BhcqJp*9##QmcvzkLuccC*cd6ROL+pH09FDkU0`-)B>So4q(Mm5v2mJkvKZtoW5$^ye^@nL0t5oM-&>NVpKxEx~OT7Hc9Qp2B2Hj;Pb?@3eT zK)IbULv*rZzaPxIbiDissnq`^gpyjwV)q2Y> z+wXC|TecRqGTR~lSpNb3GyRYF{}K=rFf!nYfNukH1GfZ8LGy#24f@I+Y~Nyk%dR^z z9VL!&j!no;KjZi|cy{ooA?-sBg$9R?3BB&jc9u9FcfRNRCTwun?yzsei^GqE{}?eX zq9!spvQ6Z|NG&&Qqr^sCWBp>A$6k&b95*g*Roo%h z7}rAAnfS2ysqx<@ge6Q$*q(4K;a7L8dyIRUdy)Gw_fu}oeawBzea?N^{f+zA#F2@U z6K5wbNnDfoMB@I$s>I`oZzW|WHBai8RGc(4X+qM>q^FWIlba`ZOfF6ynmi%7DkV83 zH>FKV*OUP%qf(}(W~a7D?UdRlb$IHe)Uwn?sjE`Aq{XJCr!`A!pVl*NaN4-E$I~Oy z6Vn@~w@NQc@0b33`fKTzGe%}wGD9<)WiH8l>u>&km1W6F&T5?1B5PFEvaCZ{N3u?4 z-OA3)ZiT<&ve#tq%-)&vSkA4+p^Xz7XaBFd&NZ~DB#Pr_Y+{nu+O$oJ)YoN2WU1Dh zSYK6qR1?`&M5;(DBBnNNvuaagqWFHlQ4qn8;x2wse8gSR#TR~XSrrvT!EfR>U-+Qt zeyzW`cM?T3;r7h`+_^Jz@0sS#oO5Q5-C#G_OYMF3i*S4RBr?|Hqdu%0UUbkpGP2@e z7bbSj)^;d;)-Rnpt&@yn*W0?>2}V}gO>uWmIOH>Vq>iiqhn7=J4c42g)?0Q ztX@qSY1sg3rwwlD-{!Nv%ejP{Y5b6rPF{;r>nJ_{o%WO3#(h`HV%nLc6su6DMH}J{ zr;8eToLcl9Cb(0Jwr%8ZhO6}be0>Uw*v~9WNol?b?!`hn-(H=9UzdL`_y0~=Kl=2+ z)bcDsvR*W{K4ckStWkpON|95U1exPjpg9U*bFOAQJp>Cu4SpNL*o|TYYp*Tlqrb=~ zbd;mL2es{|Kuc>KV^Y!e?y?_R0okp3~VKdWOuDS!gyJWe!%= zD0epx>)3DflxCTaC-egJRSU7dv=IGpG0_i~@T=2`f96ugu*>iqSv@+hwy!S(q7d;33EJ~=68<+FT}|K(3PFZbj> zxxlkt$vnG*$aM*N+q5*= zJU#sAg^N{*!a0fMk!32V%2kD`R3TM`&Hrz?B3I>(Tqerizp@_>s%p7~{r3hF_#xRnnnrBf$qx-1?BoYK`JwfO z?_39-WbkA|rx=$=@jk(f&-#yrt%I;BC>v?JE&wgc+4 z1M0K`TJKBsBdwrP=DNO^J?sUT8_&ZbCv}V!G|55#WbLxmR=lly>FDZ4j?NUs~ z5X=P$Kp1Kvv7>D`0sofqp7dDJTv6@Z+(0Y(muK66S_gOm1E(9{(`Q~9;0O464F~}I zV+|+<1S|te0L3E>7z8Nsxj?aC$E~meZt0Z)C}v~pslOapv7i8h!19IyECU8>3UII$ qy(VSsl2_nVYEJ3){;!-6msH*^WT*m$<`iHxuxe@^w&gmwWf55!g&%GM004Uc03cUZ23JKy6qNV@fZsDe8od8t8Rr-yqd-Id!`=MY%0JL; zwWXahu+p;y03bwv{F8og*F0<0YvAno;{&<#qhb9I(D$%t#tc*E9fNz!@wL#bIisX9xg@7yfAIe!%>RsZeA3 zL;i3pKQ`_U2w{W4_)M)FU4OWjpYcrr0FaSw5{-0A8-pL6lGt3NnehUzo7(sTWp zSBCS)5AQz!qXKscB7aGF2%@{cYP?-!Skt&M{t03gfwGv2SC@gVjm^Ve+cjedOP zS$}k$KRTxD7V=!zH3MB;T|Le^_A-kT%yxFRVR2!N{|GzsuupP{bq4v0Pq7`(2& zuCcD6D(nD-Z)}(zQNIXY1}J4e0KoSGviLKg>zY!snWUl$^6>OT??i?ln4IRyz#Kx= zA~RhxCE|LzoG>J0KPZ~gLJ^kLwk$at+&hf`0}qWf6$zoRDX zM(nyz^YccbJx)8Cp)Qv73-Gpz4a{)Hef5fRX360*dFxH1wc)Lkv^eVXrZFro_q8)~ony(~{`TwWD8V%5wjZ&z9j=V=RVT zV-7fmrMegLH7KcsPEv=ta^Q=_S&Ip8oPoT21g3D$9P?#?RKX=m;63O%rIEY0%B0(| zHQm<5829p9qQ-Iwo(4t1l?`smcuKIsAP9t_UG@54eEoe1?){y|2D1&?8CZx>)>od~ z1Y77n^;xM5&zQpI_G?IG#Eyi`nq=7Opf#(c!S&L=X{p^*f3cjW_8aH@dZc*9!dflF zh$mU4?qcYUT&q5Zx=oTRymZ*kyfdUyxb_R`d|nkdh4&!&7XgdYh2fwCm$=l`{YyHZ z15Ooa`!MGI3CndxDG@=bw37Wd?PAKP zyjfsONR5=6H5<4r@e(!1vkb3iz?|Sl6ka-|-T*0tZD0q15nEVj7QBqvjeqG9fpQgp zD~D=dprP{pi{NIJ9{LIXt}z%EC0-c+m61jZ~4{S~wdiW4M$uV@@Un4~9D2UIhlH zPb}@6*vV%iUS%hl$KAY?^o;_ZKR9R8kc4X)hOpHzf=i{=`w}}zBhWJPM7C5R7MPmr zyzXR6CZD#Keil8P!-kKg2{&(u+$4OQ;3=@Kl4IKL3;=ofS+9FK3)E7o+-Bc3aC4f{ zVLohdC#(fI+2Js5qyxoRAD}jv1LoLwJ{({-*aOMfEIf`^h|lZ*&XsTNd+X;suVgV6 zo2fbb51#06?3Zo7@0wd5$nPdqmqGHGXeW}dhSBbf3zLLT$NC;rZj0S}<`MS$$%SXF zyQP2>hK*A`)~b1Qk@YCSSI2-AP<@tU1j=^<7B!h_z~foqwvf9iQo}Ulv>fprX_x$P zR(XlB_mVIB^r_qZD`kh81Iw^=bjNAQH^{~*o_?ygU~&sEvjIn5qLZH zk#+WF=V~9w(Kq_nbZUp5bN>-_xMj#JTBP+n(ee%3Py$~z^grHv=$Se`L$Xyaap#yJ z;&<8=AY#7ci=h~}Px05^hX&cocslmO_cF6-D(#p8;{dBe@ z`ZjG4H^O}xy~LOqma4?Jk8zdV;ayNA6E1p06#)rA($yJtZ?WP}Kp$WTB+emq9KlP! z)d@_aa+&;>;MLJhPic})=Ih>N9~QCV!}HSKezGx7i%{IOiN8xZ0MD2&_o z3!*)TW2M?{t55<*m{sW;OSEzi1EEJolOS$%hN0`HfJ02m?|teCJ-SfPq`Y;<%f|2i z7ni;5pl`vC^HFZZh)))VC;dX`OM9-QHZK%M-zg!K?}}3*2YLoFMsqG5BAA_*RTg)S` z1tTbRWdXNPBKMHRLU%1#(hiAP((^@#{Bkse+##kgN#2CU}6quYaIFv|&s4WKo^`d*UE$LVE`!H8jk8FkNb7{KZ&Ij+2#0O zXsc*DYiMb{zmVF2b!BU7>+2kB?d|Sw?rx!eLqbG^hKEUrii?epjEz!|l9N@GmX}$W znwy=UoSkB#VW4NErl)DBs;jN9tgUjeva@xxwzqk>y1TuR3=R?z6c!pD z7#buYq;G6;ahA!Zv$@SD8c(LyX>(spZ#rMLT4{AVPqyM{zFzHe!4;4bH$VCe4+34C z9N{ope;-Z&`MG0uhmyEu*V6_(s;)!D|33=C0MrEX!E#Vk`4|K$>H>Pcv-Xv z9$SA#Q+H4I=y)TMyvSgW(i_WcYk?Sw2v0B|2C{3MZpFI@oO7dvPTAOjEt zhzH~XihlB}LBJ^R#7~_9$O6;?ngBgN?Qy^oU>%SMC;&_YN&w}qYg%$0(i(j5n=o)7 zegi9bY-`93X|cf9LCm6f)ztq+oDJCc*P=8J^fi0IW%1+!o-DvjNfipE0%D;Ex&359 z6VsT&@){ZSMR%MgoW4o2&kAD+z;Em zdSd#F84sl~c-^Ko#sq}trE^g)+kEJG0(QB-$2q|Rl8w`|)lL3#1@?L}SexB26{xv< z^6AvEYr=p9BhM>tJPs?4eJ3AjTA?>HGo-uN{>A4>1v53TisGHmVJ~#&j@E~;f3>WH zAug`u85OkEqt{wgq+;lHw#~VqWM3&1ch~`ftyRkQ57{q(2zsCjqn8i}3|Jwj;~yXl z;g@D}splb+<&F=evx%RZYSpXqvpZm-EuEal>YgxGSl0-l^+pi6*`yhYhvlx%V-^lv ziB^Tw1&)iAQ|itea-fL-YFqeXfG5&*d%M&j0j}a;MxZgW$})&V@z367-hMS2+$`5T z7Ru{zQDRa&O*|5yG1=ZnkckP}&8^#+JofS_;Jt*2z=TN$>5JWp+WMYVcN$RIg2G+3 zVQQ#D{dv|udmrd$pToJXO?E=KDl9J1c0Q-kGf7F$F=m-&6eA(4i>izB83zK(+wu~p znf&@iO&>NvPXLTBU<8IP$VO5H5*jZ4lYV!>YMRK!S}b~GRl7GGJZMESQZfJE&Rs`wudrtkjcw zkO6La5GuS9RHYj8bw#;*Nt?MV0+L2mM5VA#C;VK*OtW$eXi(V)|Gr(#!8!Iu{UiPJAYl`=Dz z2-h(c!xS}=cBI57pTNq6{JaJ^<{54%5W3?jl{q|xk|ywp4*k=ybSelr76o0IWjw7$ z5=^N|&kpP~Aj>DR1s(j%{ja5j%F(+S(r!5tbjf5nr5C|^LL+LFyc&7Uvh4HwGkCJ` zvVqUTU~4{Gp=c73O;A$w?fWk-wEnrImXF0-21f{*Br(k%4ds=z0RoB2O07KvO>@Um`?j^4H^mPEFSTEu6|xo+|lDL}^O4IDr9 zQH<dr@_r z^R;VW`qh9peOffxIdXIZq<3(MB+fM;+vZ^BGA&8+jCqBK;7s+(VVIB*3MSLlA^GX) z<@jZ#Kx;F@bytmmsIBA*2XtiT{SrivK-CU4o5b4{l7LW;9Spo=nz>p9F{FaCY z+uVX03tOGYY<<`tUm_en)#6G1&O-SRiW0~46vk2?YP&kF?ZH5?WO?id4Ljp-db{^= zH5gB>zq(IiE^cYkVEI@vVYO^~5HYq&X?4eA<- zIo~W<9ti8ICWc~YU*d9Y)!#*up{!JOd^pM9+8=(dK4H@1rvXN+Quti{m*LBTYpaB= zCcs}ticJr1$Hs3p;vY(Z0uZu753j$dy>Iw!d4k%DtH!Rrcc4xrJ)AMDR?!?VjjGm* z?U^P|siHw|pUw`%BAzKRN~3^ixHH~ZUr#@{FCPyuU@P-2G4v%Zx>FDgmoQ(GHzCx; z9^&;y*F^&_!ZsCyXC1bxPHD1d~SNX37{BTcAjZIfHP~Ubvj=(k`htgV2`cNe4fxMps?Zin3#_c zuDafo!Q6H`?lt-Y?nNHmQMR9CQfyk@qxN{ax7fZ-moq8(kJ#%_!C z4DpDdw0t@rk@OR*mT!P&eWWuh@nN<5<;I!jY3dXG@+QBELy*AfL`Re7rLPu8?%{MM zXQG9lfds9y@P6GZRC$-)#S(Sf!02HT7!m}ujHI{O;A_jDV{w_e=rsu$@wMo%2L|>9 z>FdIjVrd)p4KIUDgDR`n{$?W!70%j(igj+)`D$4A#`QD=+)k%uOj>8qRZ?Uq z86?cMDAK~;4+Y{>P2p$&rpUP{RlXBB|CB@#zCS93sx-Mc&ACg^ft1Q0Q~Lhvm8hMK zh!TG0EV5@HU8naihCP~mEWxMlR_>{o82R8$e1EF~yNl;vw519zM}~R#i(jA@H+)k5 z6?^#oyD|7Gpz#i{gS98ykkMqiXs5&yDdMNic5QrFlq^}VHy%jE)2v5m+Mj(JS0VE_4$qykl21v zN^j>9)l-iaFL!-P7hYwx5bQcZp;l>knC_ZK7l`=etF4jnn7Mr9YZa#XY~EflaF`hm z&&yoClQdIWdH13c z@$L4U6akfDipgp{zR31)(FxQ*OsReAAB*~S*fsopH*2tFwfBUQdA(~8Fhsq@2DL;B zZhGj;#7JNvMvA+P_pc!0^~De$4=*uzTnwPfkMR#No)UENsr7?V*2Q^19Vi|#i8CE& z%l98$Rm~B=%Bb-dy>I;_P%nb2sCXLw_@ch1x-$2?tzGW5Qap%6^SCa66aue{VXS)b z1GM+^!oP}^hGkuqQ{fY@?bw#2WiqS5eRr(OBSk9B>pF6h#4XO=M5n|4Ike0tER!S8 zi|<%0f!Q*+3S8Y8Ji8eY99@(@nKVQZ zDI=)i4=F!;Hp>cjMB~U%(1Xfe7V(hGC%Wl3|+P_h8&iPH` zNQ)R;SF&M}2k4&)C&J~~syM6~F0C-6H zz{xzJFfPg5uvK+cxXm8pA4Lxl8s7nVF|4nuqyF-%>@DwG1 zIR9T5woQokTX7|Z@MB^l@$kxj%e;H8cy^(w3S-p-6teS)$6#NF95ZuE)Ns~!8`zqr zi;3?lHEBE!{CC|Pt;HIoRK6Q%S}&O3hVlYh5K1EL_Dfk1e^G%09OO zm&Xq5Fe*URcdOnL1PY?05Oqm7NgTCI6;IOJB!%{$RbF)ci-dj}yrU2f9vR}a}9*B-i`@p*7BZJui>i0W}k^+as@ z73HUw9Xeb-a_?baK5Spl$2e{`vfI_YNCbW=_r4^1q9Ta&1SRsCf06W`@CQACK8H#z zeuYySGSk5dHAjjx6B--Kore4QBJ9xEwQmr-Vq9jV^z&#Va3v+JHKZ$XG+6w(92{jt zxgAfi^W8@7tx0(iLr@ds#~H9SUud)dLYumGqx9Y7^h`{K?icgbg8&6$2NIKJ!oE58 zmq<|v6R>4ywN@@10y@*^Q<}Az2(|fbc7n)%ry!m|e;4`eL~&zh79tjp-zb z_nS^ZdbqV?_OaDUqL}KH%yVyDDB*}Fe=(~g*9&*6!FH&54E_F@S zjqTu+N%S6ShyD7F<$D`1!LGF)@A>v+v+t1!S3-tI$HxyGE;66Pxcz>2oXwJMQBkih zYl`1hS#7$P2qh5PucLr%sNxYt-(#S_yM!!6yI*qJk9aQk4X-(&LGZE8II{=0;n_Hz z<0IQ|&&S~>Nt2FStLiBS-JZ(ByUOiB-@f0mg97r75<{91!jYkf6Pg46aM=swU9Ao~ zG`;+;`CBfwf0n#mv#v-n3i!hRMxRnsk5^ESPXS@5Ik>vm=CKdNW!-t`F(liqP-#5O z(CdD>`Dj3!oEuf#6p)*@l&iApR<E$+fCOU%qQ;)Z_|10#R`#>UBl=t zWT#9k({$5TJ!T0oOLm-Zfd&vyqH*P0e`na>e;J!z7S8XX)|$7+|8eRnV)Zv?XDxTF zN)~StugE_$#=nIC6+gybBv>L}6(WzRHfI@1aN9{dq61Q;8ccxIW!kD7mSOMySa(ze zzZLf=ncGFac+g2oR461TYVrb)RGwKuLHcwX8Dzwz-AUk3qwLJwtgKZM(@4yVmtZpb z%b)HiQGuLHhN@;JSL{q})CYjC6Q{=?5%Nq6Op!&Rt)XmT45F{YI3OBYe}log?Q8mT zHA1NPjo;!_mNB}8ZvDodC3anqVKh#H`ziF&qd4lIc$NM6jIoTZNK;N+ZRm6SgyaG5cy6z8oyN3g z(_5madpoC?lZwKcN-#Uk{k_P*5y(pu%JjT3N&Oo5dvh}UB*t+l0IuZ>E#>S$es2%v zJs)8BL=?M9e8Zi7uH5nuJZ+~sc_Pq1H8ysCKRlHOr~@EtFzAb`y5hYx+~L*Pc_SxhWN5m0JFXYgcx=Tjw@PtK*+2_ zFJ4F~>;?W~07yNDrkP(VAi|9h(AMF6iDA)Eu;mi4Ca&e;xlTK8;x4GYTjm9Ri>b`QFACaukvwHOJmj<0L`PS^t&L%CIY6OX}aGKd@b|;-o zwzj@{JKNwQ){mvLooLpV8+f-l!95mbg5zRigeT2)90Sh6v6qkG;g4!}izki8?fdyR zq?yoJ(J7mVYl9|%n82$nSt|R%q3j8PJJK@}g%({bXfC8;!UmIB;cKZCvG{EKN&0>n z6Q>DD_`DkJ2W;FgzQbj5d+GW--fsxNeZNFFCwCyd^ht-z8%2B(i_JC1J~^mXcqqNA zc_|_mr5{$D(&m2aJx(^*$WlxMdd9&xtn;#; zGic;9K=mT!PkHC}uE62qpIycgCP*X&-LMOS~V4Nr$Z99~6Y?MjD>7cDi? z-;FzKQSWyST25v?xM3bKMp#NSOqq4vW)1~5pA&Bk+k_%J?BlQ7(OVc9c5^Rl?j)t4 z)kxY5P_XF6o-HuqV)&J@K1R8M?x!E|lCoj@#AQOpz#CyI-Q+<_fDXycjVp?z*9keD z*C4!$_Hs*7j@BX=LPR3cr#P3s+ij9xy%uo5b$@N;4QkjomavJ`Df@hpYdYplmIWzO zYTv|@iouokWX)~4w^dvGrP{`MJz7d?@RKd3ujIi zkhOG2Q=XZOBK-v9-Q4xR@6tYtvtpUikjIs63~j&JNf11r-**9Q##3{yEd+abLg9K% zX%=#M=X}=xSQ6}j?>ylI+e~~Uzoc&K>j?nOcTm$V&)#5KvCp4-3v%kN1AhhVnO|`9 zN}jwN9ws9{A7<;&I*gs&(Cjuel*}{DjTv#IKrXfC=)7ND+0mpIaHLZ&ZgJs@2 z2Q%Q<9fbxFwgSM?e^W+>aR;3-b63L$)-Cf(d7q^`2mP@-l4%_=v*!G^ItY>S?S9>$ zr<c~FcjN~e$YG?Hqx4y8>ipIVDak+FzHVjEAqKOcnw1Kq!RXZ zSyEg0s9MwndMM8#zw)TTlSfg-K_;2&v|fGKch$4sHxvo3NrEP$CsLnJFhS=tYRMTk zrtxt6TV9f5mjOV*O#?*ZJU9yH!0(glg{R^o7(*7e@kmFcz*ubfMq?n(+!sp5HXA5f zd=n?ML3*G?WKRc{$~kW)A}=%9*z%P4l;eI`bn{v;{qfmV5|eF$xFs%P*3p>L_`B12 z9$~?`8VCAdxzsf{-rXL|iSuqv3{}83fjWu^XXM#DBI-8%P+iUjD!0)^S93o0seGMS zr$7_5hbC=kfowTH`A)r1d0m`@v(s*#*s7w`)201LC(fj8+GR4ULnWq1>JKm6|Q-i;sHzd0$o&m3Kov~*+;z0!LHL|>UbBcLd?2IvF9quVh{0rFFNRiG&N zQU8+(^>+eC=gXU~aGCb&p7R*Fx0L&q?yi?j)F2jqippca&ZE{X+RBAD{n8G5$&^z$ zZdCdLSb=cL3E7D;Xd?3F{MheYkFwBqpxD@an{!sRI6bXV!4?boG_8Fb-mYB*<~)cn z?Us0x1SYqvh*2v6s-@B$pS0IeHl_OM^CG}x;0-R={_#^WMCOHWccXGyen|N)$LM;dCC0~s+>)c;Dc6A&h{59oI7?$i z4r0xmfU1BRR7!IGIs_vEp=Mr1_O=_pYS6o!nEqba%5VCpP#K5i{{Gg}0W4GNB zR9&u_n7T!e6YzHs=WDb|1u8(4VBAA2+|ngmdkFh;f|YYn;II{?$qs#Y71ibt1SpjW zCOH*Cn--8pqeB$|9&yKN3>PnMwWNv698nhFYJzmCXYAetq0Hs5rm1@Co4nf`D07t_ z?8k<5ITL)J-*%oU@Q~N*#Lt%BB)eIFD3R{mxLk*J?f}`DQYdFb*(p}wEISfxn4hGd zZ%jx+B1%}@btG}E7E|p%2rehaiN*96TI$-&z!SfYTBvCU2!rcz=rlHMBu(kHB>)|o z_>P<^x#yWbF{6c;YaLg4Hw!fI^tbCEi)P3BJyXIT~2?E~)F0g!bFmyz`*LJwoFJ~NNNMYEVVBO_uRhtQ)oh<^>RHr_ z*kr}85=|Wyk1H?ku-(YkG!kgbftC``akGXJ90&0!uZ{POZ33y&?yJqFJlh^wp6Knt z{3Nm{OX^PDGP-_MPz3y&B$Z)n6Ne3A&0?LfZ+u`|Aj;hI1_Y9$1HoVxZUhO_T79sS zDCEEGXio1o`!!hWWZqxc|)65sx`8zsr#fSweNM7*?8{&izhc}Pp;CIsR#nU z?rZwDFF8*C_v;~o1B-nGenuQUEByu6)|ouU!3TQvzfpS##gx_uH7VKYY*F?~5h7Nu zx~Ii|DFi+;U*BoILl{`z{gb6LK1f~T3zj{bJ65|R9Kgl>TlN1Lifb^WNBTQ`7|s}m zTT7guA)4U}n&H!?|30!X%SRHR1I>?v#FQOT9w1FP;D@*XcsGuUV^NM8%tv_rdPr2u zE*v=h=ZmxU?iLlWL=Uy)ChX&QjvAg>QpqFHG_!am+?dEhS(a>TyKPJv#z*%mkQwM#T#Npgj|LyMJi#Te)f zRvP`?dSNS{VRvthUtitKi_E=!p~0SO5l9JPBh*Vi>ZhdcY@%{J;W%NCW&3XaF4 z5>U4FIfrEGo*E4o-F7dgmZyB44NnSM>=VtI<6lp484q+9h!(ObX0VB7(O_xG@CiVg zfI;8MSQE6<+P1W0a3Ef2Ogi#DUcvWAckqNx?hWJZ6B2F6Z=<1JqF20fW<_Y%`>qk) ztC>3?7MIpH>H-K`IBbyVfVRYcrQczh0pZiAOuuLm1BGh`xS?Sp74C@mrmJmPDI2RQ z5ZR?V_i?Fk-c;Qc| zOsRC3g)a(1jvbaaB{ z${!TTF5)qFPAvh7F(Wi)-(WpxqM#)Dd@GuQn&XmW*)UkaoxHCsWNbpull##8dA8)#VK=Xepyxf=gGo@qZF5T0Te@ywoW zHo+zCIods%Kye=qC(U6?&gnF^@@~a6PXd#j_P5ciR_2?|Ab88`)ZUP~#rzq>;+k2+ z`cTJ%c(vS7;5TKq5vbOSo+)`zVy3xk!J zhVE5K4MYWo#{&&H+R!np^6?BNy=x)NmFGMpBA9=@Yn%6&FNrQ$8tvPiqddozoG!h* zYmQfao=(G?{h0l~$5i`W`y+;!R%~Hl=((!+qA-;Gq-Y+a#vWXW=k17^Qc0yOdJDPy`^+^_B?2{%)u{oc~HJkr6jDm@K)?J z-A!pKzh7;0|Jm2N`dvBfmx-7V%Kq0fc}>_)!BDgL6N~*U>MYCRWx-;M!L@Pl>~GlX z(?T7J3k$*;4hHKGAtym!bXh-Ji7%Bs>X9Yi(FdPr$ouw?OLqO>C_Y6#|N1sA%>7R$ zoG#MO**+1aEUlB06Phf2uJ=H;A!fH<8rC3E<9+*KqBK3_+jEV{toM=2RMRczaaZ&6 zewaNs5Eo#5<*6Y&A975?!Dc)FESA_ljkeUL@Ju|}JneIG8fK7;PM4kdR?{Y@FH)-| z92<+dj03*rZ}wNNMMu)lG^)sVJbIOO_Lr=FeH9GS@lp$*4;ah1f5e?li9Y}) zSp&a>6NlTU+n{b^A?>WIVfErsx4&1qdL6CpI2qR1ENHwVFMi#3x*hDqQOOj_{u0)! z^MDfx$g7Gy(>qg)Q33Kpgj7 zHgUtz&vP}aA>%wN!Ola}>gwv?*<#SYdm^;eA&qnU;^LmMFjeAqeZjHvz!3!KyI9?S zGy92cG3RM{Hn#UZ;ta_SyRxoJ#L_ypXUv_oOvw+so1l&^TZ~~!1mBdD?ZvfVT24=9 zN01S<);VsVmxt_Id14L==?AR}f*kXkkLQXgR2sP)_l~!{hF{rgn6s*57KFKr*Bfs~ zeAI2eB$|hk2@Qn^guo0E1xb8~!v83e(X|Vrr=VS%s^Y`Y7a&NEXcB6Pq~FaN^$1qs znj1;AP>G!-#o}#RpRdp~{a#|#CE6~hb{NynP!%gO+brIH3+{W9rd`uQ+TZ;Gr_0vU zoF0Mlq|LXVSGk9Xq3&@X483(+z&UajyA)%;p}5E}uhCxcV`8YSp%hA0dW3M_6en-E zr)`D1B33RXEUcddv3LTu-YhestOM;B-IEvUxN@R@>|;i3h7%0fCgytDw3~bRtT~YB zs^IzPurU9kcpr8^&$!C?8rt7Z-a7X&U&TanX(8QU`1+_XzfddM#%ANW^nRMaY{Wgu zqV)dNyntH*XIEqS+k!`w=3_1Ba|*;F3q{MqU5;sX`HV^)Nw4ZwXfZmt>Fy7*g>RB_ z+e1_FUHuhFthQhiw(!)T;brQC?3krzPBdW1nL>z2yz9bY4&)O@&cGACl>U_+=YgZnzp<_^o z75!>ZV+FU$Q&BxA=Js^eQs(aDRZqK7(?K@5E{#l8vIA*qgK0<(EN(Xy(eU{OC+khM zd82j}7kkIU){|Q!5Zu#kXF*RHQ2#wXnbmv9(SQr4h%xE9QfCBt}} z!Suv>cqFy#}C@tRJyQ6fbbs1vFZS{)4ydl+}G)pW13;m;jQCQj44{K6-q zI5O?%ot@H;b_OObqdYP-L7-F}5w|!IXz*{I8cLs|RBgzd@W(Glo)*`iC8O)K%|>8u z*M&nJ0Ctn&PN*SV@k>5%+BWNQy_*mLe*Wh#S74%ks%_PnI2-t$sBL9twJN_iq%!xi zZ1L@^n9gKy53&ZAlmUKi(c;zd`S3E?F2$br1!Y%z!&R}8De+*Ospvx+N+(tX8miHt zT}GxU+hBxhY6%9HMS8xNx(bYjvS4^ike3cLnQ5lxns!nizZvN%I0@oVNFH>e(-^z! z>_V@-rln+DF+VsF7p-WsJx0NFQ7T`f-Ge=et)D18jZ=TH8@T8fU%!O8TzQRxK}Wyf zvA-q~J}$1#-TLImJv4Hj4r|3+v#D(7 zc~M%fu~efrneISRQR<=weXz;Np&6d4V$I0sy zo|;-EeM1XKrGmgur$R1-OEo1myl{^S%}Qcek*ee+Mz$I5+4Cct0g={!-xxv4B@c=) zO$LNs%r>av-QD&)OrN^4@8&Z{HqWBY2d(YVvX(ULDv^`Ng>58@?sNy-HzGB@cLqG4 zI$Fh65bqoZKh5&oT+4OeNe%_`jopc<^c+mv@`zMgR_diwPK0L0=)AUKsjpw^miIDn&Y_(JijsJ-hE7TE?ZUxn2 z60DoUO%&uJPV`SvJ31k1iswp_C32`4MJ(&glvi4nRF8<>qMgYxtT+6#&mRM=KQ|+z zW?<>DTDC~1OX$LFc;DS0Hz(`>LD8?Ni?@_0ANrs?#M;=1KjbM|tT%fsGHV2KH) z68&{$Rc2bO!FdXY-raFMBZr;Y(#qTRu(Y5i^ILRpsV0@naAYMKTShSoeOp>OQUcBE zKDL8nh=^mu0RFoph~~8pj7lTHlqpEuasqG3p|I{IYK(+lBT-3(aOece9*Hp6y_9(Og6sNx_827ZYvR#svOiM zX$uraL7O@6S)Ag8vY_-6!b^n9*HszKl{PgDZr#mDw&&_Dhr~vs5FCSyex-Zs6^gV% z-;bb^%|FJqqH_@oma&LZ5#?_Ew6g@++&4&`(oAp-EM-8oBfX;oq9t%t39YWm%Q*FH zbVdP~c%vr_vR$T)j7dqqxDt@+2iwN0rw@^5H+ZBDCfGVnCZ()8o;D893dM#FH`jV?!}?TGe|GMyH%L7wr{?c)r~g z-4D_`-{*^Ht51<2k0ILtG(*_S%JYsPEb@1S)0ga*p<}G}YJEI}pj8kboKG5JVg=!! z(E*#aJkEE6<`N&-0D0a7vskfeV0VF|Zx-5bJwxvoe6w>TEp}%!lX~lh-&*e%Yin+z z+j0^%y`MZ58R*X$ef?{Q=>N8x9r;4^(8&_qTg=v0_a8RaDxKU|F2&wpFIS39I0_eC z>9Up|W!UKi6BRK#OcO1H*rSfSQRZ2!2R<7@ed0QBpWx=oG6zJF>~lj55grSJqrYL< zzcBy)xo50qUBO1}ro<49*I%kDksEI47C^PiV)ef7M+OAEU`70H##gF z&0vwCrlO&ty4=LfF=Iq{(Fw%eO~W#T*OMky^$`vzy)l8wpHdAdy_dldJltjq)u-q; zb?*@$Hd|M^gx^l`(Br6D7_wd#p2v>6N=lm0&YD!RKORsKgXBgjmC7i6N8W>Rhe~?! zO}{WTrE#PmhFgc+96j0ps?LHRagVMQFWr8?6J zRJ_J_WIV%HG_)nkES2Uz$~0Zlye2MmXUS7jp0C}<6XD?jyh9{q23zwJ?N56^Xy~j< zq;f=Eop08CL}zoQP@S)}9ZyrTqrp^ou+O(s#ZBQNe6RA_b@CpBWEi zN}1AJHT|2-yzmWAt?E#%#h$`!Y&}W=1|w?g?a3+8bkv@rcBFz^b(n&fv#ak*AU%Qn zpys%6Tsf!Py4h7WUBQuYu#&`mP)mx;=na6gm6 zdmi^E@RU`z=~<$pk2{!7z%?#$SttvH8cTvRo~Ah7wCCPt3~Ud3)g6_$3Gx>HuI!qT zT9Q~84&MvVLSltHA{j$jV;C0?=`pK5uQ^iGGn&>;UflT|g3vDyIdwZ66JH8eC{sB| zQG{EyJYv#;9AQsc6kFk``$P-P?Er+CzK_g9%Ti=gP} zF7!746+W#Pn7giDh<&tWHss1=DfRtKxc_^Uxlwn2;K1R`{XNjjVS~%~63qby`LGp| z<8ig?!Gg=v?Y1)@26EN4f7Nl#o3TST7oanC4V&>*~--TvZrw!f3tj$v^QkVOV41R?qDj8A1Y#0_{j^WypN9a`VZ83vsF$__ZjS^Q#*F&JzE5ZgDVrWZlF};!Qs|^b;j0DGs-J zUT;lX`pBGh;FYop^XZ_M-C>pec$VeN2Z;5YPS16k<;FXES19B;w9jM~1^Sx3lM}4w zF9pV?O-vt2oZN44kAxW`%a5bCmq&}0Pa0p~oZg}3-3Cz>te$Sj9n94i_RiujW9BI` zU!MOu63!S-WpfphXLABPEJ~$GB7dKPh5rc^6vIjl6%V&YBm`Y?jxZSG$;P%p3O6AP z8|KetMMVn@_>9z;U5xcz099zrDj`eStP93rgsE3%JUcVPj&6ROaa*&umLO`uTiWcm znsqJc6S0toaMg8sjnvUV|9FGhS5aoM!2r7Pjb=%gG8x!$8Qf_&A#pT^=4Sj^O%7wb zk3O__aHovP;Eo#I3!!~x{syKf_dXBOk-t=un5quI2qknB*y1lRnaQsggukfj=6NeB zdO!iqAuU*5bT-CGvT1>D3=YqP-c0c52#fbUhAWe9zmfmGVzl3 zx{C&p;?Kpi)xMMy4Pg3@J7g2CBKl=~k&5tL869mOiDJ_5^!8D*Ak8Fpk6{ z8H=ARs0!W=-uLeI#P&AIs1)(nT|eot+o*ZY>X)g(3|qt{9QGCgSdI{n{<};_%J2@; zL4ok|y1|Xu0Xmq;V_oqTpl1~Am=@dgfiqIK>jY=6LvC82N$R?)ui0a3e#STfjcQhw z%>&ODHQW+er!EkB++O6I$$I7szW9lz?t53_Qp9}w*LNeXkkI>0#<9+ex<^v?=g9+l z$AczBHmGgN0kPYxdt_|F83($78oz*ub9RTx%*wJiV#-)=jQBE{)YMFia!gzhyfL!5_mGT%1=?_H9 zSGUPszUd>CgK299_mN{OiRLXfySSO-0GlagxRtec=F7SsEOx{Rt&}DEy~uh^8kM zSk6M@?Wa)Ptq##Oa89jiLZenGUQl7AW1scGQR$_9fH|)&b0^Z};sBmq!Iz!SFQ4=+BP_sdkhzrzq(goXWOlQ;=7`L~5qg7`>RR+V)R;#T-hMTMHLuHrGm?FV_~w8wRzQ{wF&U z#Obo$xXe64k){D54DIH^R^!bx{TDiVSOslrMsbJwV3iiFrBj4!ao>7>TayN{3iNuAC;kJ9t;IVCmmY z`=k#gdAB#esqaG_Kj`zy@Cn+*zki_BhWD?1;IMzstfhPCTbF5CubadvN|yuUHYR4p z?{{}8yno!Z3EDsRee{!dmL~mm+1blaKHTosHxd7=4vX#6TlIZ9A|px{p&63{w;A+3 z#^itw7h~{QbRv@jI$Sc~K;Ma}jmB}s;Ah4(8lTAl9X_dBDvK@mAk{((A;jX=HrVw> zogs70EUf;=V$-`(g$r2jjE7oU0}bb8dDzKi@an-|i9B9YQ^WN?c~Tqx+G~99wbx+O zk@a(hX2NkpzfXwj_h>#nOZYGKdm`%hr_F*#_C^)FYGpnhs(3X42n|YJZPKy~HN0xF zmc@#D4IQtOxIxEzgF2Z#4MpX7eykR2Goi58;)w%?X;&`>?rK)Pc+AN0;ryl&?UUX$ zXWfQl$!#*%ZOrmXdI?!#!sd5+{bL=Lk;%?Yua$qddC1n5++NxB`4R2jINQaeiT&0V zG2F8n6}Gnq8nk_a?JXVtT?{^pjwf6U{=ESQ+K!hRjq`L2KBt?gGtzT|FB+!BDT)H!9gwDJ@#Oa(%`Ab+v5U!X=N4xDkDUZsmVa%NASP)5h9h%|z1UDk!gnwvGFmxj!rN+{Q{`qxsaYO;&aWP7YZ{Layiu z3$dec@DxS48g|(BZdh>Y}9uAYy=;)z_hJ2sVjM=z^ZUQa&_2%_``R>tH{j10BTGI7b?QHnv z!|ms_Z9ng(!>71T;P_eSEpZm3i{EOaw@}N4%NC2U&}_T(E@6A}Yw1JK@!4P>cE&hg z7V7x4pqekB2xdD|u?E!=__Jf6x~(G%*WMP_-i56l4+hI|vV$GLvi! zYL_FsI#~s)!;_ZfDhQOZM6#?VB_reH<3W(gh>B2BMghv`wk%~>60HK)_ia>3v$)=M zYTA(1dff+pAaZgV%Jzj%=fB*k({q#Ge?L;ean8zhM)m&6zjf*K(tUa@=$v&4Jjd|~ zaIt}xqBZ?&Uym6)Xe`$CJJLLB53IAS#j|5Bh&R_|Cn7J z7qhD;k!AEQ;K`}NWxkL2H8GP!qDV#6R3r%)q_PxY2O7#x8l)ya$fcTY#=st}p-u)VykgdnHiwFv-ZXjk z;2zt91#N}8p{s^T>PL1DwWqE;bx3IVpBi|i~rcJQRA_v*8%fzlu^Zx}lg98a2A zS5LGraJ=2{*SPD?DYgDrr&#KTOYg>WN;m(9`n8L!R`yUmrBlhT|D*FTy%^i&55Y+F z)b#zQ+CO03utx5Ps5o=U`)nV*Pj6@X4W5;IiNQZ$@DJz^wl|b|nL9$0U|t(`FOnif z3gYB=TDCc0L@c7GWt$8|W^Z^5)oO~KL+aH}&1UZkJk;AXJm%Z)s8{>p*I%d;-kCqj zdAU6PGh#2vydUHowUTvbv|Kj3#0E9fobEO3m>+t_kr$AE`8iRFpd zQH5TQgJw{VX&}8{{GxsPFGPCy5jv88_RXy9*PrECe?||^&F_LSeZ+|ND`KG9!iHsI zTJ#EP7_YRXBQ2sOrPMbjtg3jtkENiv3#x=ImgrI@GzkPk$s9Wb#tUjWB@p70@h=V!8z%wGwAuAO zrsfUjDf+YVJjHCkex72y^3qd!$F<+7_)cMGXYMKe+(kRyXE)AW{Nb~g?$YmzXXh^3 z!TUXR;-`M6uHd?@3_QBAD$bFW!+N`)vBf!@zO0Ob1u+r`~_dYg@p({Ho{c%^c}cC63I0?0(0; zso&|?<#fMsRKEYQ`QqX8vb@9Lq`rT{{v6M5VR0oB=&m_N=EP#hljU^<#>aB9cOqWR)szs(KZhVS>BC^b4wO3ayUMHUQQtfEacTOyi#WPY2d5c|fR1Uh~KRhdi z_wy!sJYBS57;QgukFvF{rG32lTnxDRA7>V!6RXYj@LdK%VHOD$lp_hftg7H--N z;e8w6Qnwg9kMu-1{!X~~r{DL*?=go3Z)^GHfcX;r>|C}0u{N3t=Pdu-WEQvHNM`9d zIS|C>VB8ckBzk`C{}UN*uKkTO+$_gk{}Xo^p1IL^xi`vag8{=zry7#q|NrK=JJSEp za@_Czd5RnM<^bTceBQ^-%I%<^K#GkCVvx}fcBYM$LD;BKB4K8y<(iy&M>jhc*J||9 zm+A-Ndi*86(x9AY8bBX=V!?tV+VCfTl((W-HBJ0K$8`920C?JCU}Rum z0OF;$7k-TAxB1E-&%po!r?XjR!07*d{{-1v*b9MN4hANWC;(zM3@88q0C?JCU}Rum zFZ}xwNS^=S_kS9D3jfs#-Ykpw}}qFS`8TxF}kP1Hus zzWa14tp`88bI-f?y!*~~oJDw#Bmjr8Y{q?=L6crUkse2@`G9K11@P6j^2wl^%j2L zPMkOC*hNN6CN7v7jOz-FSj=f$G=mtILQHdg)b63i-7kE{ys1OPJJ(Om#HgO-KfK0v z*63$`llz%*Iu4Lr=7W-p9#w)J)O9KVzZ!v-7L@8L)aWks@J>N$xmBq}4&$)Ri^iaA zT$W24Ms6UR>rU-rx0{AMt0bG0NfP0v<{X-B@0|to z>T=depvX+J?;o+n`G!9I6=gaLG4~(>>NXnHOB~S=T(!OTa*q&_c{J<8s8E$?P+`eL%jWS^Yr$O5gv%_YP^+il?fZXl7ddOzi#3Q^N{T|1+D!)ZL(bYCA69dd zbJp#}ovW~33?pjQ*7C(s?Ta92@1@@3EWH_}UROzgd8AY>(W_6yzYON6SE#4Bhn}P` zZJ2T|o|kN zon6NB^7yjX>K2au0nD?2Xct`onF-UBOXd`0F1s z8R!{U8F(2)8MGNZFibL>2LP4uj*b8T00031008m;MgRo>M*su>0ssL30ss~O00962 zY5)TO0eISVkV^`}U<`yutD+#Dz{S57Eb3Npso=7TxUH{RkXCC&y7fFB#AEsO;R8W_ z(oB-cB&npjcCu8eG$f6%9GBE2%5hmOO$%&+mj$k<{qC)*qg#P%b+ej(8GCB#C5FNF|MQGRP#0Y;wpYk9-O!q=;hL(3WU9Fzz)@rKpxlt_tUt3%0>^dpOK5 ze)60B9OVwTIL2(|us!&xd$_pGT^@0t2R!5hZl3a(Cmg4i@9f|O&v=f9Pkdn`b$FS} zeCAQlUVJQ|0Y8ldXksDFd}I+zSjoVhF=7y- z#7dmROM)ayk|axtq)M8kbBfcP<2*Mw!&z>!o+FaMRjzSaG9`;Ge3NX+kzC1>d?}DZ zDUxD+px&!#c1>9s)?rp!ls08WNVBGCN|Vy8v?#4go3d0{rYu+f+h-4JQhQA%quW~> z@VjcN8$IEX*%{X6jI0XyeW9jG-QjeE?+9vET9j73uijPC7--NpHTyyunmm42>mMp(UDi&t8{Lx#v`sTd%` ssiKbz`ik8&dk~-cM3uNH-l6^%h9~h;F+sAqVh@>2eiXp?8)>jt;oGWX&Hw-a diff --git a/ropasans/RopaSans-Italic.ttf b/ropasans/RopaSans-Italic.ttf deleted file mode 100755 index e1ed564a27d885e51e4030dde75f0a7dc8b9d17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42396 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�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 B3jY8A diff --git a/ropasans/RopaSans-Regular.ttf b/ropasans/RopaSans-Regular.ttf deleted file mode 100755 index be70f9a0f58b6be170c4012902f7f19baf6e954e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41796 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 diff --git a/style.css b/style.css deleted file mode 100755 index ba30507..0000000 --- a/style.css +++ /dev/null @@ -1,616 +0,0 @@ -/* Import Roboto Font */ -@font-face { - font-family: 'Roboto'; - src: url('roboto/roboto-regular-webfont.eot'); - src: url('roboto/roboto-regular-webfont.eot?#iefix') format('embedded-opentype'), - url('roboto/roboto-regular-webfont.woff') format('woff'), - url('roboto/roboto-regular-webfont.ttf') format('truetype'), - url('roboto/roboto-regular-webfont.svg#RobotoRegular') format('svg'); - font-weight: normal; - font-style: normal; - -} - -@font-face { - font-family: 'Roboto'; - src: url('roboto/roboto-bold-webfont.eot'); - src: url('roboto/roboto-bold-webfont.eot?#iefix') format('embedded-opentype'), - url('roboto/roboto-bold-webfont.woff') format('woff'), - url('roboto/roboto-bold-webfont.ttf') format('truetype'), - url('roboto/roboto-bold-webfont.svg#RobotoBold') format('svg'); - font-weight: bold; - font-style: normal; - -} - -@font-face { - font-family: 'Roboto'; - src: url('roboto/roboto-bolditalic-webfont.eot'); - src: url('roboto/roboto-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), - url('roboto/roboto-bolditalic-webfont.woff') format('woff'), - url('roboto/roboto-bolditalic-webfont.ttf') format('truetype'), - url('roboto/roboto-bolditalic-webfont.svg#RobotoBoldItalic') format('svg'); - font-weight: normal; - font-style: italic; - -} - -@font-face { - font-family: 'Roboto'; - src: url('roboto/roboto-italic-webfont.eot'); - src: url('roboto/roboto-italic-webfont.eot?#iefix') format('embedded-opentype'), - url('roboto/roboto-italic-webfont.woff') format('woff'), - url('roboto/roboto-italic-webfont.ttf') format('truetype'), - url('roboto/roboto-italic-webfont.svg#RobotoItalic') format('svg'); - font-weight: bold; - font-style: italic; - -} - -/*Import Ropa Sans Font, do we need other font file types??*/ -@font-face { - font-family: 'RopaSans'; - src: url('ropasans/RopaSans-Regular.ttf') format('truetype'); -} -@font-face { - font-family: 'RopaSans'; - src: url('ropasans/RopaSans-Italic.ttf') format('truetype'); - font-style: italic; -} - -/* Main Styles */ -body { color:#000000; font-family:'Roboto'; font-size:14px; height:768px; min-width: 1280px; min-height: 860px; overflow: hidden;} -a { color:#ffffff; text-decoration:none; text-transform:uppercase; } -a:hover { color:#8eb423; } -h1 { font-family:'RopaSans'; font-weight:normal; } -h2 { font-family:'RopaSans'; font-weight:normal; } -li { list-style-type:none; } - -#wrapper { - display:block; - float:left; - /* min-width:1280px;*/ -} - -#visualization{ - position: fixed; -} - -#dataviz { - background-color: #000000; - margin: 0px; - overflow-y: hidden; - overflow-x: auto; -} -#overlay_2d{ - -webkit-perspective: 800; - position: absolute; - margin: 0px; - width: 100%; - height: 100%; - pointer-events: none; -} - -.marker { - position: absolute; - display: inline-block; - background-color: rgba(0,0,0,.87); - color: #ffffff; - font-size: 4pt; - font-family: 'RopaSans'; - -moz-user-select: -moz-none; - -khtml-user-select: none; - -webkit-user-select: none; - margin: 0px; - border: 0px; - padding: 10px; - overflow: hidden; - cursor: pointer; -} - -.country { - margin-right: 10px; -} - - -.detail { - color: #aaaaaa; -} - -#loading{ - background-color: #111; - position: fixed; - top: 50%; - left: 50%; - margin-top: -38px; - margin-left: -380px; - color: white; - padding: 16px 30px; - width: 700px; - height: 45px; - line-height: 11px; -} - - -/*Styles by Pitch*/ -.clear { - clear:both; -} - -/*Remove all text selection (except for Text Input)*/ -* { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -input[type='text'] { - -webkit-touch-callout: default; - -webkit-user-select: auto; - -khtml-user-select: auto; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - -} -/* -Elements to control the title and country selector -*/ -.overlayCountries { - z-index: 10001; /* selected country has z-index:10000*/ -} -.pointer { - pointer-events: auto; -} -.noPointer { - pointer-events: none; -} - -#glContainer { - z-index:1; - pointer-events:none; -} -#glContainer canvas { - z-index:1; - pointer-events:none; -} - -#hudHeader { - position: absolute; -/* width: 95%; */ - left: 30px; - top: 20px; - color: #fff; - font-family: 'RopaSans'; - display: none; - background: rgba(0,0,0,0.4); -} -#hudHeader h1 { - font-size: 32px; - font-family: 'RopaSans'; - margin: 0 0 0px 0; - display: block; - float: left; -} -#hudHeader h1 .subtitle { - font-size: 14px; - color: #ddd; - -} -#hudButtons { - display: none; - position: absolute; - top: 20px; - - width: 489px; -} -#hudButtons .countryTextInput { - float: right; - font-size: 17px; - width: 300px; - margin-right: 5px; - font-family: 'RopaSans'; - text-transform: uppercase; -} -#hudButtons .armsBtn { - float: right; - background: #333333; - padding: 3px 10px 2px; - color: white; - border: 0; - font-size: 18px; - font-family: 'RopaSans'; - cursor: pointer; - margin-right: 0px; - opacity: 0.9; -} -#hudButtons .armsBtn:hover { - opacity: 1; -} -#hudButtons .aboutBtn { - display: block; - clear: both; - margin-right: 0px; - width: 76px; - -} -#hudButtons .zoomBtn { - margin-right: 5px; - width: 30px; - font-weight: bold; - height: 24px; - margin-top: 2px; -} - -#hudButtons .zoomOutBtn { - font-size: 17px; -} -.ui-autocomplete { - position: absolute; -} -.ui-autocomplete .ui-menu-item { - border-top: 1px solid #656565; - margin-left: -39px; - padding-left: 4px; - font-family: 'RopaSans'; - font-size: 18px; - color: white; - background: #333; - width: 301px; -} -.ui-autocomplete #ui-active-menuitem { - background: white; - color: black; - width: 301px; - display: block; - margin-left: -4px; - padding-left: 4px; -} - -/* -Bar graph on left -*/ -#barGraph { - position: absolute; - /*bottom:10px;*/ - left:-7px; - opacity: 0.9; -} -#barGraph .import.ammo { - fill: #44B2D4; -} -#barGraph .import.civ { - fill: #4679C1; -} -#barGraph .import.mil { - fill: #1658B2; -} -#barGraph .export.ammo { - fill: #FFA90B; -} -#barGraph .export.civ { - fill: #FF7018; -} -#barGraph .export.mil { - fill: #E83E0A; -} -#barGraph .importLabel text,#barGraph .exportLabel text { - fill: white; - font-family: Roboto; -} -#barGraph .totalLabel { - fill: white; - font-family: Roboto; - font-size: 23px; -} -#barGraph .exportLabel { - font-family: Roboto; - font-size: 14px; - fill: #FFA90B; -} -#barGraph .importLabel { - font-family: Roboto; - font-size: 14px; - fill: #44B2D4; -} -#barGraph .barGraphLabelBG { - fill: rgba(0,0,0,0.8); -} -/* histogram and timeline at bottom */ -#history { - position: absolute; - bottom: 0; - left: 386px; - background-color: rgba(43,43,43,0.9); - display: none; -} -#history ul { - list-style-type: none; - margin: 10px; - padding: 0; - padding-bottom: 15px; - padding-top: 22px; - color: white; - font-size: 12px; - font-family: 'Roboto'; - width: 668px; - background: url('timelineBG.png') 8px 0 no-repeat; /*to be resized!*/ -} -#history ul li { - width: 35px; - float: left; - text-align: center; - margin-top: -30px; - padding-top: 30px; - cursor: pointer; -} -#history .timeline #handle { - cursor: pointer; - width: 36px; - height: 36px; - background: url('yearHandle.png') 0px 0 no-repeat; - position: absolute; - bottom: 20px; - left: 642px; -} -#history .graph { - display: none; -} -#history .close { - width: 8px; - height: 8px; - background: url('close.png') 0 0 no-repeat; - margin-right: 8px; - margin-top: 5px; - float: right; - cursor: pointer; - pointer-events:auto; -} - -#history .labels { - margin-right: 35px; -} -#history .labels .change { - font-family: RopaSans; - font-size: 23px; - color: white; - margin-left: 31px; - float: left; - margin-top: 10px; -} -#history .labels .imports { - float: right; - font-family: Roboto; - font-size: 14px; - color:#70B4CB; - margin-top: 10px; -} -#history .labels .exports { - float: right; - font-family: Roboto; - font-size: 14px; - color: #FFA90B; - margin-top: 10px; - margin-left: 10px; -} -#histogram path { - fill: none; - stroke-width: 2px; -} -#histogram .export { - stroke: #FFA90B; -} -#histogram .import { - stroke: #44B2D4; -} -#histogram .tick { - fill: none; - stroke: #959595; -} -#histogram .tickLbl { - fill: #fff; - font-size: 10px; - font-family: Roboto; -} -#histogram .plusMinus { - font-size: 16px; - fill: #fff; -} -#histogram ellipse.year { - fill: #fff; -} -#histogram text.yearLabel { - fill: #fff; -} - -/* import export buttons (bottom right)*/ -#importExportBtns { - width: 298px; - position: absolute; - bottom: 0px; - color: white; - display: none; -} -#importExportBtns>div>div { - float: left; - width: 60px; - text-align: center; - height: 28px; -} -#importExportBtns .imex>div { - background: #262626; -} -#importExportBtns .typeLabels div { - font-family: 'Roboto'; - font-size: 13px; - text-transform: uppercase; - margin-bottom:-12px; -} - -#importExportBtns .imex>div { - cursor: pointer; - opacity: 0.9; -} -#importExportBtns .imex>div:hover { - opacity: 1; -} -#importExportBtns>div>.label { - width: 98px; - height: 25px; - text-transform: uppercase; - font-family: 'Roboto'; - font-size: 18px; - margin-left: 10px; - background: #262626; - vertical-align: middle; - padding-top: 3px; -} -#importExportBtns .imports .label { - color: #44B2D4; -} -#importExportBtns .exports .label { - color: #FFA90B; -} -#importExportBtns .imports { - margin-bottom: 5px; -} -#importExportBtns .mil, #importExportBtns .civ { - margin-right: 5px; -} -#importExportBtns .imex .check { - width: 16px; - height: 16px; - background: #262626 url('importExportIcons.png') 0 0 no-repeat; - margin: 6px auto; -} -#importExportBtns .imports .mil .check { - background-position: 0px 0px; -} -#importExportBtns .imports .mil .check.inactive { - background-position: 0px -16px; -} -#importExportBtns .imports .civ .check { - background-position: -16px 0px; -} -#importExportBtns .imports .civ .check.inactive { - background-position: -16px -16px; -} -#importExportBtns .imports .ammo .check { - background-position: -32px 0px; -} -#importExportBtns .imports .ammo .check.inactive { - background-position: -32px -16px; -} -#importExportBtns .exports .mil .check { - background-position: -48px 0px; -} -#importExportBtns .exports .mil .check.inactive { - background-position: -48px -16px; -} -#importExportBtns .exports .civ .check { - background-position: -64px 0px; -} -#importExportBtns .exports .civ .check.inactive { - background-position: -64px -16px; -} -#importExportBtns .exports .ammo .check { - background-position: -80px 0px; -} -#importExportBtns .exports .ammo .check.inactive { - background-position: -80px -16px; -} - - -#graphIcon { - width: 42px; - height: 42px; - position: absolute; - bottom: 10px; - left: 1255px; - cursor: pointer; - background: url('graphIcon.png') 0 0 no-repeat; - display: none; - opacity: 0.9; -} -#graphIcon:hover { - opacity: 1; -} - -#aboutContainer { - display: none; - position: absolute; - top: 95px; - width: 350px; - right: 28px; - color: white; -} -#aboutBox { - width: 288px; - padding: 20px 30px; - background: #323232; -} -#aboutBox .title { - margin-bottom: 20px; - font-weight: bold; - font-family: RopaSans; - font-size: 20px; -} -#aboutContainer .arrowUp { - width: 0; - height: 0; - border-left: 15px solid transparent; - border-right: 15px solid transparent; - border-bottom: 15px solid #323232; - margin-left: 293px; -} -#aboutBox .text { - font-family: Roboto; - font-size: 15px; -} -#aboutBox a { - text-transform: none; - font-size: 15px; - font-family: Roboto; - font-weight: bold; - color: #FFA90B; -} -#aboutBox a:hover { - text-decoration: underline; -} - - -/* Small size */ -@media all and (max-width: 1395px) { - #importExportBtns { - width: 187px; - } - #importExportBtns>div>div { - width: 23px; - } - #importExportBtns .imex>div { - background: transparent; - } - #importExportBtns .imex .label { - background: #262626; - } - #importExportBtns .typeLabels div { - font-size: 12px; - -webkit-transform:rotate(323deg); - -moz-transform:rotate(323deg); - -o-transform:rotate(323deg); - -ms-transform:rotate(323deg); - margin-top: -2px; - } - - #importExportBtns .typeLabels .mil { - margin-left: 8px; - } - #importExportBtns .typeLabels .civ { - margin-left: 2px; - } - #importExportBtns .typeLabels .ammo { - margin-left: -1px; - } -} diff --git a/timelineBG.png b/timelineBG.png deleted file mode 100644 index b813453380f2299ee4a6ed176ca51932607719b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4383 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 diff --git a/yearHandle.png b/yearHandle.png deleted file mode 100644 index 9e161d0c9f5a07d5d6d07ade3429c26795353952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 zcmaJ?dsGuw9**IaW<^0oB4{0h53rCY0TT%(Bn(6egd|pkW1El}UCWN1Qk*MhqU zS|3;t2vP+FPQhAypr@_1MapXhWPN}N)y2968x*#2k+r6~6BWCE*qw9c-ut`f`@Y}z zyZ3j_Es-V0d6NUk1OmZZ5-*nH^GerG^2EncLS-dBEx}?_Fa?@{nbk&^AcW9#7?9}H znXnvIL;1Nqa1?>yMn#kxDa(iG!SLs;Q~4sQv()Vj^4zx@To6!dHCA3 zO{W4cAefd1ZCtr{YdumY_4dmereH9TR?Fbc@Hml7 zbg$7SOb-9%_l?3PWxfHX%V86mXVl;qml5PjW#Ea7uo^>+N)*kRJw;g-ilL?~)BuPS z96+kpAbMB)0xy;FBzhC3)@xvim`}wOXb1xF!nqs~M;OD10Yw}pGnOgD2QX$GOB@jq zzK+G>&T_@5CQk?Ju~{zk8<+XJTvsdT40vWSY(zeQA<&5GfEOk6kT-Z?fU#iYx(Hk^ z#%1FTUS4vcH+Xr)W&JLfj+>#oF7|&edUgx%9@p}9+v36N#)tKIw;S=c9yrl|n?P_E zNW?;=<<7~|9^CMF&|e*D-gvC(mKuBLz6<|hVE?j%&2Sf^SDe~(Am}Xz0>JTS~joixct|o)gQmV*x&#CgoK10 zjXq0MTgj{Zc3r!&z_0U6ON(JWW$qFrvJ!Lm<-W(Hu7767Sg^GkGtBmNDI8gS` zZvTTX<=$p($&lUq*^W!s%gf8%%5ur=*e;vfR;Z?`Dqosj-+YZY_D{?6w6wH)>8Dd{ zcel8yI(&B*9Bb|^jek&k1Q|9){dU` z)g5bXZ4L7wohz;1TWKrL`!2iqc2>#XlS{q`P7gRzbul?DGjojnv2geI`YnemDl|&J z6ynMvxjz}9Elf>KjauzC|7T-U%)F-kHESUc^0sVt)Z=8SR4NQAfVTb^5+7!$@M~R? zn6x7L=v4cp#oa*m+{{ypmXW(1s&YpEt zFwaa`9m<03APD{mI(z%i$%5+Y>Yb;I{CD0fvqb$mNUCgaZ@)1zG7{a?&x+3*;VmMa z*gWuje0+S9swA*qzb8uzjW zK|UXt*Vju7`S(vVK2LvfnspIrQZB>ca17&?jy`-IBwr5-8lU{fa42+qIx73j7;WzE z_Be$?F=@BkukYKpFVfy!u%eq%J$&od3@1GNi5fvdipnHZpmda0#pyMv4t`!+|K6j4 zA>_iP+EaMl=)b0?t&)K>Nm|RHghPWvLkB*6u)zCnI6-b7@a1b|wkyV4@KSB+iOqg7 zh-&CtO7h-L5(xvB+uX^cGd+bl>^4ez-_XfYh3ERW!uGMB{1_78PbI0w8&>}HWT*@@ zH_(C)9*gc#eNsyJDB|MLx*J6e9=YUT1;gv%oLmy=YMZPkTt4O=yps4-P`NaqmwaAW z*bgQPWfn(8?Am%kMh&r;Eklj<(@_2SYkT?==j^Xra%_=y{$VgsTu({hE)O(>h6EpO zNi|g1L`dHVtbE4xyi02Km@_&>tF`YfRQ}wyr`1umsq%7ns;D4g)%lK%t9+(r=-(1D X56;~k9Wm_gdS4~6iQ-c+s>1&QxbGh6

XRWf^Can7CAL*&b|B?M*_ES%% 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 G0000#9q1$g diff --git a/roboto/roboto-italic-webfont.eot b/roboto/roboto-italic-webfont.eot deleted file mode 100755 index fc041d37f0f5cdc12d4829ba42b21e7d279d73ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38672 zcmbS!2YeJo|M$%9?Uh_|xsu$a=aLIaAdTc8A+%6JZ=r`Oy-SmBSEPwp@DT-6uu&A< zy~Ku~K?z`i=TVSHQ4|q#9Wm7MBxim+F=X)*j|S=b`hSsZ7+b)m;IjlD#v)li zoK0r)*lacx*KOD+Hk~bIH{p5#n~$yvSw3sq{9h-u6yd56|1p+uU2pzB^o1K}jBXrE z%-_5Bh(VKXSg{(7xoA!5Q{Jn$bQ>Rq>%O?o?Nc#i_$RfW_QCZM#v(rHGkj!^c@HkR zA7dPd-~B^|7Zkm=uq|EB!}X-8H%?yo%7-`B;Q9kR^Xt@QOZ@ibjx~%q(8fB?SUB^> z=<0%9xW3AmG=1jen--$o$(U;zzO6Iot(>84IQutTqrVkD%$h!VT7xqDW5zaA;`icN zXmHF|s&M@Pt}|xcxMal_TPl)pUCo$$Y~F&YlT-hy#4)z%7QFx48z-+=D0%ro#vY*l z{qrZ^I6ZZH=W)2EIX|*+!A(oPKK|4h#vVc+vTfnw=?iDv)*VRrOE!MTM?j0cyM6(I zmc2jMgt3e7=fy7$Tx3uSh(SinE_`<5KZ)&Ozu?>?eldE9U@0t@@p+S%%x6~d3u|l? zz3{oy7gL*YA3a5+#nHke=7~FduuW_Sdz+nN^*o7pt+0M8Lc`!)A$pf`H98i zJg)Iq7LW6U#yXbR_#>W?m<_-Ffae;Rms!wjG>bz&@wiTCyucFimLx#Vf_KZf>nq%m zjyqg zKEYjfyd?%0_BBq#NWa4KpMt?MG1Bkw{3Z0_!AN4nTkLo`2G3h@SEJ}z#xG~k^F{nZ zkhvNj;fI(d#=;n8nTb2vpx2_t)2to7OB!df4vi;SY2!TBvGH-%xp4w3$KAbgZy$`f zFUHxw@n<#+-y`rn3UeOaSi>p-zcHBm*v12F0!DGBaRobzk2Tyw1RIF=55Z>`Mm-WU ztVFNl0oMqO<1)r^8RNK&aa_bWF5~Xs*hqX=;xis_n1FUOM)fg9^(`w04Ey5QVfa+y zlZZaffihg63@0eV&3ZNd2V*{iF@KCPf6Dqbeui;>fqv`RAV6+#=Bx}5dMeE0z3!jX}wHVJEc*`mD zehIx^L~p0i%lqizBRq8iSS$xW(TIlvH^XplK!9Uz96gs~mVGgrVfa+y`SF;a6Rp2v z4!>g#KVtm9Vf?>iyuYK5-*M+}81GfQ<##p;pV4@#65nIc(^#~R$G3zYXe<|56h{14 z!1x$od>Al31Q;L2ul0EAdl)s{^{(ivvhiV*0h$c7mcg>{_Z#`hu&Ap{LO-8NHsfVt|RQ+kKa z#)2NlW8TmojpJB!<9O!6C%JJ3O975DAU84_KfwEs;r&PP{`XjMBm4Enr! z9eobREDYKNjw0C3ca30uba{91wh~e zdi@H$Ucl^=(Q`a{K8T(Vq31*B`D66_DSEz$o|DnD4L#fN9|OH-;?t7;`wHGZg}ZAY z=`IObIu!43jraG$`+MR2yYT+qcz-3HelLuH!+8HOygwb#&j9q(0sTZkzZJ&Q3gfvQ z;~~he0)FoX+&;pXRPgjC7*iHO9Cv5nV~poGX7nC)>`pTNah*ZiS$yanM{w^Eadru3m+c^-Fvf_px}2xy#VK(S}>aRa)y0lK$^CHv>-`wS#ODjSUV48#2+UwA?r7?<@584W3EI?9#z! z(Xc*TjnCmO(uF_ZF4BQNfERjWj(q@Sn(HupM&SGm-g_1w8=hN+=kCB=U*fJWao3l) z>r34ADeg+bU1X^kzn*XYm3ZtdK7_x&L$YK*o0b6frO*r=(Qjw;T#hmJMlXGUL80Y< zBhqpez}`@NNUM=X8wJ>ohD0HWVZg=T0xnkeDY(;uUS7bH{{}By#1o(3319})M!2K* zFT?w7cz*=mABp#qWdAZe_qW8{`(vaPxO*r*!@zyRK>-Adk+>cOS`v~Ol7f023#()t z`WcV&3Ba@j3bW%s2J0yav(8{$g$x`BJ|E16vjXVMiL5;%n3b{5@n3h`1-Afqr~JvT z#Si!=n=<$VfC*E!D)4-Gs_`v<$Yw~!9pU3SCjHcx`NzfV03GAs!j+3}Lht@7CNtA< zZCNDw{ER<21aCBTR8%w(z2gnx4~>}q{eTuaOM(u99|5<>k25E`jWzN@KAf+Rj!0*u z&;1ep7=MC4#h>oa^cVO$`pf+{_+Lm%Pj{bVS4@zX)c+1VF|7Fs=6Cwz{7K;_O0Ro@ zH#RnY-S~FngN=(C2kETgUkyK;d-vSobBE5=oI7}K|GCh)J?D0uTXU}Cm$hG<_SY$O z;nCtX|M!2~Y&Zz?1gE)Q4?^*yY*Ne?t1ZGF8Rdv}y4;?aSg$WGJ|QtFIVIJfmLAAx zm6?^@x=l`QUVcH_!lGci_QfR~N;`Jy+@)(-x9&Z9!UOEnw_pDO0|yNrQZaPc@DU?N zjjkLscHH<06K|L_nXOs7{@%@xKJoNZ&ph|+u07B1ePQ2AFREJA%hj*E_UeH*4!+42 zPn$mb%N08p&i%)-Ic(ilIIV2vaxuqwx3Jy&@0>cHE^fT_+?2cS+49cezkl-i*-y{B z&JNXH`1btQ-+j+ke)a`hz47k*Hr)TfgPZ>H2zz+@S}M^}k%^htsOUSiwW zJ?tTPMbEMWtd_lt&laY#*Vvol>NqmrP z>+p8}y7A)^p;_`&ORkn7nz}VNS##Yke`!IUYRmQCN-sH#{{5=ls$ambnlk&VtfF$m z^bM2!bkZR)Ep1HV25~jaxS|(E7^8D0I@9nHd#?W@F`dXrQ7^xy+tb0Webj&$=#jNHFrSY==eMjz;rh%X-K0mye7RvCgk=sC4Vi2FIdRR2^p zetMD^DSC{}RnZE#;E+dD${8dA>`&OhxcE2Zl?-XUl7;X~jw%N=Zm(0NqL3ov(j4Tf zwLs;kH7T-AW&YDHO~#4jR4sIF!nvtHvqaWaDH6BlXy(W|&Bk-o;)MNW!|M;Q*qjKH z%A8durg+e~v&tfyJvowQvgGHh-4Zx!TNo?}T4Ya99+z??<<3pDn~opnU&tR_&8M+S z>=k*pbQxn*guD+~X;4zI+HPl7Q;y1txEfiYN~guBWT$53IhqY)h{Crlx!kH!s#;yD zxm2~eReLF3=PALvEJ1O6C6HB{x$aaT^GN18dH2sePXG1t@7#%_csJrIraHVk5mrQR z7V;8&;)5XzjlmwQX54Fu%F$d&!Jx*>b(+UlR8*~)L}PRc8Wl9!qKYs^e}R_9bHv-z zJZU9q7y^BQmVo#KJOMf2L35xmmRpxKvRIz9Y0DDD>dYV@UKeU@ipZ(z z);i0Uqh=R{oHP$lP)o4XsR_<%7ZfZ&>c(($3siPm<3KKVYS{o~R#csu<r0S z)OJ3WKX@ANyt{SomI|k7jT{Btny^JJvmjGbfosy)Gk*!J(;cZ@ek@a=P{X{D;yt;MC6mNG5D< z&E8;9aY=DzRz5H3%FB4rlEN*4;>wg-igm zmZa2GcgV;wfnGY`G}bOoW0g9tb}rDmgn>A&{@(;d2RKIMHJaOeNlmTUU$)@lT>`do zPBp$pv!d04)`=Gt(du`qX*F6tT05aN+=bfCskX1tveBAV!@4;cw^-eA@ldl_+4=3- zcOnF|{KxI_?&GpRNf|eAKv=o< zd&zaby&CC0uwl)8u1L=t>(<_XmppIk)rY&=dk*X~$sQTeqkq525&Q+Z<(~W9#x2i; zf3)MrDG{atgYJ6%#oGtnwP)Ye3#P?AuWXXf4xB!-|Db_0XZOE)``|mDfAO}#ckSJG z`=IGF2MiuCb9O(HD>6L$?@ez5XMS)=2ZXajkVQG66hc~tsV-zAq!pWhp3(x-pusD!B21MUP|G({dhPR34>z=8b;hhdyK8n|12jFP$sb_1RpmpURm&@JnlE-j=da7pWS_X<(e>sb(^gv+&4<(o1BJC?)Tz*4VWpURD zuxdzGye7ZOYlZyHVj&4osfHl7nR2*lZj!s21<(i!TZp(sOvWO=mYH6gdLJIP{rsi= ztO_rt_PRRn;;o_tZ}_wD24lzi>XT~t0d@kqf2JVTK))k7D|Pimb5qT z{G~)H)mOY})*qkEzv2_3_znD%h4Usfe55b4>2n&soXEvom-97p2U96?z<&+N62l~; z3sm{EW{RrQoS39ZhTKuC5q98F2y|@{UncHsTOWV*mIrTqcEthd z%GR;Ees#?D@?(?Ed^G-q0fSNOA=4<+D*)oXum}q@s~w7h+v+q)DJp^rCIQVNAfRnU zAZo?IBGF@m>0uklvoZ4|-s_&h79$ z6~GANua^E7YH)c@~-YsthZNpEq@E{*1_u6&!z^&%IODAcJ5}OAZ(ND?9mq5Dr43$I)Pu z3bf>~>>gGhYAL%N-b-pCr3kHuNRp)ih;DJ+r{d;=XO#O?GPki!q+~V7B-R%TMsP#wDk}ra*(~qbi^} zu(?T?S0Pzg53*#-A&wXHHoE?#n4QU~DmAjIgvp7Qv;raV9Is?QedKl1#Yc-TcQO&; zIU4|*swdu?fC#ODG5}JTBAOK^Rwt3XHPQy&ODs^MPHT2&ot6aNvqwSQ_~JSIRr{6r{b8XwM zkCLQEylbVjhhG{q^Y$l~nqT?%nLW$?zFQw|CK|f|xbKB=<{%y+Y$#2^@RCU_#Ns42 znZ_9#Z_BB6M7B}{F@gOy5fxYsDgZS=(Ay+T%oIuXE!fi%L8h#;K((FLtT6px4Tg!}BZKm7PBp4V zQLRo@uBkFvA!n*AbR;PhVT;0LBpqd@M&kqT*koUH~9 zZ@~Ogk)RGG6ZaAh$?VlU*1Bq+J=ux*`K&-3oIhB+Qgj{J=`^b@mwvVg(st%M)aV*T z^Tb_ps4+E6i;l_9=T*^8555g2Mw4j7G7TMQ*0{s4iJFm1D9!SabR{ZvTZor4S4&l% zW%F0<^2RK_Wzn+0j(4R`;~S38YqzrBdvE#u`Y&I=u-AFSB+TnVZ5{VOOs!HBRNg~ z_QNCp{Abdg%U3+@ja_#4_y_Z)Y(9jWdEfMeE%B*8X!ARlH+=AoewnwcKX~%MUmkpR zXt}^S)U0VQa2`n>t(7R+5)5%dIY^kRQ3aYK428=2vjV|ZAUFaDws?VHrKZYkAy?Jv ztg=}n016zhfg*$-0THH|ZA1hV&T1k8rZKCa0;1S7iId}y96S#`mraU>|6NGkq-_o z-Pbzrjg`kgIs3tF4?ePT)s}5i!J>8d&YySB-G*#gj`HK}T^%1AdE!L6 zpSL>j@i!UWTIu`08TiC*-|UssA8!*MxBQ;jFSdEapLis+qIYkuT=yj`A$_8_dIDzs;z1d zpq7M~QgTs9ChU8ybs?`z`qP_0dOo#4O**Y5d+Jog=v-Qgr%v-5JlgfQ-&PvbkVvXU zO>wG`kieuhxHuAWwUi{_mb@)5PBdl{%+SmRumb|%jBEA*3{uMjvD{Q$^L9eau611l zj#^*0n-I48{+`#{uz+fz=Yn5OJ}`@O2wf4ix8)VPNhj9+}`m>U;NyWz?+e?!<_ zVl(wl=7Y)>aA{ArHmohy;>8Ka~IPT7#5et3uo(7O6@#k0s z^~Z#oV)<%rJ_18RBq9{SAsJ(xRsPsq5{q<{p_XI)X}N|J1kEtbj~ETqx0)uRYq@R& zLSZd?(u#cE*cdXAz2XEGW-B6#;`W(YnHIz+#d*7|%s|@kll-$Umrhh1>u20o-d;)3 zVSQ}nx2%5NZQ{k{YxPY&-gVyNF1cOz`}FS=b!x@^>6w%Mk{L6rVrEL}@e^C`S(Ok! zzGHvBb>+Oc*wOi=Bv+OoUS@)fXw9Btp$y`fB)}ypgG547sx8MbVB7?kHU(<-X@q&T zI5@lBA~nuQ`kTy8HI;-#8cgk+Fr>nvFT|Un(RqzY^O8o71xEocUcpfsj}4n_sZa^8!Zi1j_MbIVuXk_H^fMl)t;6uqBVvkLtsJ#vABIPfRZl3AB&Cgd3}IW&_`BH zR%ZKlx3R5_5^`F&sZpyNHns`ApQJ|K1K{WfzM%D{XFsW|9$ptvUDwUsLF3Z2_hydtq3ZkxV<2uF(>(Z+`DCk zHMxzxO#kX9t{mYpDan?8lRnT9+E+Jz(602T{;Mix!W*zlff|8heL>AOp0N`HAO8-alT-*w=1UhcwaT}Xtj1LmXU~d|pRT1nBua+ZB zL+%A7ChXx+j;;UB7$rq|;UKA|nwF6oxr#G3io~7U`Gx#bOS;tUT6JH5$0L)aKmYxM~Kn(;*PW_ zBBjXA2&PMi?zY-VcmILoh=$-m85~E}DI|H}Gdn*O)g*h)|p-`QH-;ku3ab6vPd_Ev*3ThF6sLjwjK(rm) zXa~hXQc>DWGV)T$lEILrP?V7JP4qgtUbxTu%SP0{BS^yTtdi}L;e(j0a7N&XkV}I0 z2x^zBWYaYTMYLgLlLDSJdCbY$Nzyx$YERZqXy^j!XqYcObh$#hyWv*QE7IGN1#^;7 zBO&;SVm_pfphLrfx28N=c<40PmOj4Bo5(RJ&p&zOB&j_EUTuZ{qN3VrAq%;P_9&ba zNu5Wbb6Qf}LeDp&f#qF$IjZ3Cmja z^`OE}RdN*2RTW7`8IU!Y87CMxTxD*!%7nfk5Bh980Q;if$=dOENGZQc4NLe(U+FWJ zB7o7bR$8evimO9#L;DU&2@w)HfMpmBVsTAQBNfBm5cS5~)yAM^ud_TQMUE0n;!$I4F!{gPjIH&|D+4 zD%lnVQUFQ3$|c!sLk$UC(La!fW{rmUFhP8%7MG?(5PgW;q6w!$dLkzkL`*VE02xM& z%mZfW*8iNWeZt(ZXT5&b{IsH8naoW)E?1a(NLLP+W?gxdWc)QbaC;cm7Ki~u%99Wf zrsg%4|8JPPY4UcmJ@=Q5s{fk+i9%vuQO(GvV~UyyRwswxx3sW6DM2a=mj-kKOC6Ko z7GiTLS=k9TZ}?i-iIMN&rcoGqCBL$V=vhJz_AdW<$*D$RzEFj|S z0@W>qKhn5rOp)q!3b!kzNLW`9Ma|)&KiO3=Br|TvoemvJav+|~H82hVX5bqpS9PRA zh=Itk^##m_#Q>!S&G0vxOt5CVT_||SwD=lGf_TUS2OXi{BOSt$YLcjAl>1^R+M6cB zLMLlHY=KL8U*9yIn-QG(UVn7tTt4f8eQs0RE)VOED(Z^K4+gT{uWNWsI=^E@V*Hq{ zLLL+T7YY2wBOm=T3&jxr{lI@TP7ESwLqw2YpvDOzNCFWg6sbv0EfaDqqnQW_!cy%| zM36wJ&TB~o86bkdABi9#kdbGwsX+t*aV3Z#lk9AhGsZ#LG|eAlkVG4hg!PYfK*>>y zaBE5DmxRTA6E%=QejPQqZ|L{>);9+}KjHGaxhJe$hQIhf(8IFh6(8PtGB@u}G_mo9 zTZtq<6C>fvomXChztWz)5|#q-t(&Akdr(Do8$lJ>L>0wCIkW~mTRXM3hO)1UF}Fp= zF3DYolo7>4VsM6(P&D~40o)oWAn~b{grVIOn-nq={UDcLmEF2Mh^Gx5K|I-Q+BeC* zwgK=?0%V_NCMg&fPYjh!A!%?}8#1qi1ca++Y4Z7eaAph-2C3JqcJ14du@2WJt0n0{ zQ=XKR?-q^YihJXV1#ObKImT?VrpWK7OSTvj&+oWQ-!^VB&wF~0$5hbeF}+54iO(7N zP)7EWXWC{}b{QJTT%Q$4@D``XrT4H|J9fDzF@9umZ{Dz8cHePlQo_h~J>V)s#!i9l zunn@R3{`WXj!m{h0>z31M7tHJU5&(Ntf?!&m}=qLWn5|e_1$!VYAeLVzV1<&dMxlH(Nen8a-$G(ifuSj(y*%n>Ui1<9O`*Ki)Od zBE2bhuXyyP$0JR_?(h9PXQVknzi{ebPu$M=F4&|?JM>yq8RHpV+PkdJ?BVxjWbZ!6 zmreLfcCI)1*%ub7Q9uJi>kQd1@g!sRt)4hFq-&g ztLYS}L=!5GR8~U;W-??;zxox_3JZZEf2so#!}`{~3?d4E>qk|G8!kual2nEzQnY+Iu{I^Eo>I zkA898ycbYuz>yncSgEF>zB${7_Jv?V8?|wUW5;8JV}}#~z1@VjdxD-+j>HuYJa+nX zrxKK6K5lUCfucUKg0D0ck=0DA@tCCt`i({1w21esj-coo{s95dDe28f=KMU~F&*!)Vnt5K zLbPf&<_uqit2PvXo)+Fw#PyQUL3W_EhD;>|z5%($TpS7e0Eq>#kpws}9uBg7{wwa{ z|M;q5MgPMCVL>NJ7p_+5Ov17o4mr+DG*4S|{eT6uEBs^_(&Vj^o6a;u=Y<5JvJWH1 zQNrPST6mhJHJ5W5W_ab>Vy=EDUGP3+x_jGwSC)ru<~aSB^rHC=@Z)HvT7X290>VE; zp`@sA04rXraA@MjDHj96Bs4-6N^{6U4j~W#TE{$%G^1Hmo?r-6Ita1C@AMw1JK)ui zSzg9%b&zrBrjOJ8DsvhWXxQ~?vCutMX}qNq;>K~c6d?B5-F=a*Q6{h)E=8e&4J zM$#nNU@sB}AmzRL`OW(k73C4U@nOs{N6c{&Wf+iUqsgIel-`3PQkt;YkUN;H*(m4u z<7B0LAe8(Na*>gLlTm?y!cZ|;GXWpPIBg5%lAtG0lE&wG57r&@^1Jl!^<&%2cWwK< zFXlR0`cy6wxP&j%?8|~JDg28GhT|=Ve*1Z_fUlHq!UP?f;<#jj@hzdMfxye*yv@5+)UJGHx*!c!enj2BpW!B|pK($(l_H2jj-?t*%?#=jeyu0)nf#CS zPbhVYUQh3oSog;7<%_1li1Bn}Ke136-fDz;g2<|PP_slCwUFIIj-Ndm?aC6i!(YQ!70pQN-B#=4-vqY;U6F%8^~-|g3Jb# zFd2!4%YY;w!biQm-1F(jPC2t^?u50r1KiHdZ&XjKPzKl}%lop@75V6mw}=&AL!j z)j${KgR)^!OJr-u)=<1(j-`-7D>{a7yas5hKd6Rl9NWr(HMFF0D)eIt^kbFT8J8~L zn@-tK55y(K9w;?WrXegs%712AJmK7E6QC_+=W8pwJ~jQFaou@@DWG3EI_IG_#bXl| zOkB4s&SXmq-Z%DMOu1oazkxd!KhtwS>`(f)qepJx?T3yz`c!O>(m4Z{j2%dFX#{BZ z-=N*rSgZ42$NdRD*W&&n=-(9a2QMSguTk(YWJ;yDJwk^eyFU$Qe~j6CL`JtcW^b5k zO%|^avkwP}#+%c5s|(un3bRx#=M+!fw8v+*rWZX_x!n5vGeHw}AAvFw71aP>q8%iGbYi+o5C+v}QvC+S8_4g1 z0Zc6A6J9t%utvggtSOU6zBgfg&gk0nTkPF-%{(-*7aZ`6cAG}s9qgBUB_^{_Jh2QY!GIaO zfNFnaJk_%JNkQinsL7`_n2)dsu|fs0Mx=pq@tuK84zfC_P1F(VHK-#Vlk(qWWXYbQV`is6c}RzWI|L6vU6h&g z47*vZD2RovPJ|)3sLl#Y24b*|fC^R2Bq)Rtt;M#mltHwUGQq}BIZDc`}1dY<<=Gq-v zr4aCph}|0#f8y!1UfKDsqQsHYqhb!n9$r_AbrTP**Iu_rJYq7>n!Ns@tCcd$TC6S6 z2bczd*ZtV|<0XR^v@GyI3d2-Q&{gr6vzibL#nRmKX{tp9YP9ed;1FxUuqQ*zR_!n`Xt>rYQw$+ecNLxtybT&s=U{OvmfiwRdC3NiU+RL zocb(RzO`Nc)Si=v_vgR#s`%Gykeg+&R}&yt;<0W_*yW)pM?B>sgg%KS*dY;!P*glP zg0g(zgmB)0YV@LuM5%COQB_og3m%x@8|2FX<)&a&xQ>&S>QFi=p3FZA#ePDRX1HC3 z3r3Bkob0%#N{%O86i3GpjxA6CUGy?^QDk(SL1 zG-$0^^T<#=V|%_dZSSzo)+x19mGriYN8eYp6w2n|K_h1mTvODkVXU+}%RfA?tWVk1 zPe6CD$9O$pMYS)p!d?tzIf&Y%AQ`8yR25XCG#jT)DUWdIR^=2+An=i6Oy{V$CUXwy zn`YnH5WNvC(;+UDl?-{j_HmRKn>t=Oq6~TWUGPC;p+11?7*8}Jv4|i?3GxRYz*>My z2LWfLk=cS&SBbSat_ZBIf!Q2Wpt??LZoJt_LqO&bi*8g8ojY;vEYLg{PHdP-M%AA% zM1qSV$#iD~oFob(b8#fV3qxAaH3g9&>C!W)Q2(#3qS`sTkBQz}yEoyTttsvJhe@?b z`h;zYrE;oi^OYN)*KFp-+FA^kvu>b6vTdT+T?S;ax(QUMUsHiGEEfWkJ4j886o;0x%ON}iOWZ^EV@;H6CBL+Xk7&L+iWH>D@(l8D+ z-zmbj%`6{qB5A9pJH=9?rh;x!uC98Vs+)eQ@~5YQ)6?iEz2c5d%g9Uh8=RewEOJ|nBGFRr`JbE!;Eji`Z4BMAqk+6 zMf$hwan;i8r5k5$O6d0L;-@M)+9uXcv?k}xpZstVpLS%Tg{S1t8FNRQn@k-y3>-FX z>V!FqhuvG!yF&?fu|-hi)iHkBxc9dpEvjv0yYi;wzB?nx;C|xuu{m7no#`)TqQDI z!Hnhet2i=)Y>U#f5FnR_qGLao)|e{=74*OIyQ`y zcICAip51X^&#PZSZjOZQS_C*yzNow@U({rOWsuP&@IzD7+LR-h#aTL?pD@p8I_M2&t+UA&+pnc=-D|-%D=xy|f5Xv73mjZxih|d0+CMyf69FEfL-K&OSV@ zn;p*A<)f4D&mA-^Y2N5{A)m>bQL<_H>bCkM<;=#x!*(owrd)Vmy~-PYkg9qPII%Of zOZ$aGmJIF*5WqhHd`iObd69+v62Qk!@PVTeRz+byg>Vix^$&guB+)gvh>$H3ek3~- z_%BG<5>b<&u~WH1q@Bb@3LQf@ZvmX_IQoniO4^ zHKC$7!QJ7k$u$Z``CN0>gaY&U4;d*~)DR9??JA^$ykn0kGw!kTjGQ(5#}DGN=hDm7 zGe#)VK`F2O4KtS8B<{~%duaS%E_oZ-!T08j;=G?Z%04o;Eg#b>BBFhIc53VXT_<~D z*1kS%*eqY1*>3OHw!;nGBJG7q>B(&db)Vvnc{qd|)w~3P->}B-rDv2f?C66GDfwbr zG_5kb=KWzUUW!=ggE}9S>Lftn!ba3m!#E#Vf7FojuojYPkf{=N z3`ua%lERB&S}w^$dos1dL9-J^nrH0oJ!TKQg ztl1wS7uMhn&#>6%Gix)C$DX*s6q6Km@ z!yVa;L#%g0|F6yBZTum&=w+N@L%MAZhr4U zvpI#&dbi=@znD5UCB<%4l{xC;nYlIky*~d#w0B+p2lep(WBx}Zny%0PtUBJ? zWG>*HpIB-(7jx4Iz4epJoaQq9#FH38#Rh(_q&8G+6)8pX>5KUNO2dy0XZd6LOuXj|Vgv2PyxT%y3Xcc@0UN!@ffpg|g%xHIv0~cb z3gmA=bWy^pkV`TR`$49R7t$KSk;!bM46}Ec(yH5~&+l}a`5m7%tnT>IUA}($xNY3L zsOKV6M#Jc}TrRxgpT85zj$rRV9OfI0!Oq$>`7+Ri5Y{zm63P-( z#n4AsahN4iLB2GLBSv~fYN++e!I*|}Nt*55AV(|P*IfNx3Fm{l=?}{Ra~G_1eOj!> zFkyW_WI?rEtPkL7dVv-Qi;lS$CmW&zD;=ygnh(*AXj=AQ1o%`RHdpXPL#2A@NbUc1 z$S;K7Y2lW$l)Y-PMmw+0El)+fpK!VM zvi__2%}YJRdm4A^4@(;Xe?Ru+!Aies6wcAY3`aqAbQlF`1=#z>(AX0%+M1=ey+%t0 z3g81_=Ms}_2jnB@s3v1`i)7l|B8iSj9ok#iHW8&EG!y(ifIn8v+TETefll!MV@udO zhw2wl&&L_r4 zeiw||QT6XrvziJzNL38pv!q}vo2q0wQoEnpLpZh|1ygAVzY{4S4v#h7CgiD;n>=Tb z!XH}jBiT1@J|if1hXCO{}Mp1{pC2c`cb;^>0x;$ru8`<)P{64Zl&c>^Vx z(s*;q&j-?uq^;Q$^M+%d$Z*6>-HZfBl@xt^efp8~m!3q1L9k2cO&hxEpC zXOY@i{!Z!-b!i;ga`0*~bi;Ji=%hn}88xSr?)4XiqNq#<>spXyU{Qzw*$|o3kWbgl zNeEcD8C1W3zWcQ1LX^G<&QDzu>*A4Dq+pd`vpDz=inGeBVA*ArjgG`;@yT(5&u~N) zs1gw;Oe6lPVzx!Z#b4tqfKGFP>q4G1Bcl;ZHHJ>WC|D9C)(RkvELMe4`Hm4&K$$-+ zf=RO!dn1YlI-Sq@o=Coh-lUnm2XwMo%(-%BN3rI*MCKU--609iI7@ZQSv< zZ%*ztuUzoRYW>%3e;NN&M>B!wvd{DjqZOR+p;O7CObh@VSzxj}L|looX&unM)3gEsi0^={0A3uwwo`H)7QIsiC%ji6*I@qHPrJCZvD``{zCRvK8T&a@G3ankRc~Svc!c}rh z=a6>Kg6=YrLw0>cS%h#+#1E){LhKn}z{XkF0T?re`jKRkGk@Mn3x#VEmeM!-3l!*u z60~y|z6m$g-c&ljcE0|r9C!7f@-eBtAp&zybeCy2csYm_p1CaKBMwdlHy5I2foz}N z1zI1n^il!DSGeR#%<0%u(4(&`EM1zmT54W!+{{x=+bt2DQm!O}EQb^h`Ze}vLNXEl zocG0b_h^o&+iSl)nh>>kLYD$Z9M3xcbzPct(6x5srst!gmw)hGZ9??o@m<5>I`(?`rAZsJiq=n7-#Q`ppEtt$f1lvdDNx%v8uV2`d%*{^jQ**#=-Q@WB7-R!(!CLH7JK+Q~FRT`hZa@ zrbS~}s95)kRiM?u9GeUd38F10NMZ7veAH+pWr$X65+%w<(@txC>^O6+7&IKYHTHkX z#xl_?RKdl?V=E^z=$g-j_VA;2B9vaxR_Kb199*RO=>oc>hzZH8s4!dE@EXRYA`|y+7cS@h~9(<2JSU-wo@S}J&@2LN*Z{s&|D=dSl`d{=n zmunwA`LKEN$W4n@tXMyKvU%&)(-g1Thn)Oq(5WB0a6s!g2^m({&M5_225MPaV{IVT zWf;aBZIFZAH)z8UMDeirhJ4JpBFzhTGcT;$yVv(JbbA(6k!dmUmsAgQ4t6RtWr548 zvgt@l#uFn-)u~GA!Gcw^&$<7p4OUxWr|!coPf8K{@4I`0C(mkm(PZM;s|GDu z@}?!&xoBCOb3?z0@}movwd>xaxG>5*{r3Cs(T@~W=6DO^3cB8WV}3!Wz=9sIm5Ny_ zd9Zvd)|j9F`K;5z&hxI=`YQOJ0N(e>g#U%xpDVBT5H7S=jTj?$fOH-c#@X-*~QJf;?>Xtz{Ea6X*2n zkW&`x^j4-9_wS*<$WQUI4g*RBUQa41^52DQOfe)Qg~P%!k+u|Ru5qIcFHXivKgB93 z51|;Dc=w$AmUI@pYskW80T_xV58FoALS=(d8HnA)s0>)6ia#v#iS`gw0Y~9Pz}SHh zYPpBSx#$01Cs+e%P4GpDRw$iEV!~lt{~2f zs#Gg-KT%c-bh`tQEJQ=1AX=K@yf<8o7S!Z`{pzqlQ6r&gi=v{ONID|HgD4o<&{-er}yd=FTbTDHkq60)wkl?v~8QTe=FanPv5Ff<&O*8 z+$(L9vz4Q$JRBfq6$gQcogJKDkw5IA1R#5i@=MxA$pavV%u&e0L2&(PBPHy$BPfwP zwLn%A0-|XnrF%Vm#2^&a6?E!8(!4{m?ccO|y(?<^ntc+V?UA3TH4(WcmvvLFyXDKXVlHfiJ(U(f#_9X(qIWRiVqU2DELP=w+<;66_ z+7#qxkaDA>3~lV04S-`kil~DPVb@^H0X1N+D3MNILTV1EM$JZwQIr-qDOub~I7rRg z@L-Q6nOq}7CSRMLVN!$2c1TZKdUWeO(PHb?Z?&RG=GEN?Sk2vg6%SUP;+EHM-?Y_f z8{WM~7n|$w=392ji_HZcI<@Uql9d*n)iIdYp>4K#@{$!dmX3>$yP@ael}iPlen7qF zKGb_E_%k@5zG`fqCh9%0NDqiXy=Mfd--1cWK#V4d#ZaQsn^L5dAmV`^&LFLQ;yzer zidnx3m_{LwQ-;`;mz^*&b+kfB)ZkMcGhU0bpJ2!iPD9)bmE?%2!Qcig!^yiA^&#Z` zM#4soinL!(*iCCQ!>a^n)%X!Zd5Se`R97T>srOd?gVu!I#>+hqD`O4U^laSOLw$03vqdq-6mM4y#Iq9C9rHI;E+OHqpXI4f} z%6c_CXgzr6fIf2I%8@x`-O@7jwt&xVi0vJP+=@URP^^a#;)kpD<~0zs0=0#HL#8qf z`VH%dZcE|W-|_g9wF5?c{k8o0NzSo)*2)!u%jczq`~kTfvLwrpBzEjs_djkphhi$r z^QlKtrG=+Xp$o)5f6@o>t~iUvu9ISaBDg9B&Z_Yigr$VILGf}FEI>#XEsB<}L;y-w zs&S`k8JWV`6d@AZoI1G6)_aoG(qnYHjWON&*&X}zK{pl_7PhjiZD$`=F=e56FFPSU zCb=PxvBQ6pEQiEUio~98&AYrgV5KW7juwJ3M0B zw-YhE?XnkdP_ozfuAY+ahYUU_Rmpea-BE}-Ex~ScBn9GN$Jq-s7wM4}yXXz9Uu#gA z5q@#NM5A5wnySD=S%PLot3@m_{6FrZ*KFaoP$r~$Nz5H|#h!j*+cU8)->E0IJ^PNM z|EQsJqFj;vM-HEDH}R!gUOTXP>7%c_v3bm_xucejnmu;};0YURGV3F+k)MQ(^|hDw z@%fqq(2b4Q%ZVwq%3j$fq1gbLh~g?oM#_gvta_^s()3;RjV zG44Ul95b&_j*931Chqw~#$M&<=V!K1LYY6t@Q%JrzGUj;jArSkb*4@=wA1@%h|_Gg z3~*~N`` z8}0TGiTnl0Bl<^57-0!87Dc`T6d(xi{eW$nvD1qutB0vvKI&~4)E3)MHoR6W)p)Po znbC0aD!-M#*&hoT~?>}%8ZYSIr?aTPQuL2S?S%WrH=Ek! zfQ9-u+Ly6qqW?jVlere^-)KM5xI)}d>&r_8j*a#?jl=l_@Np67)&pD;ABPNF(zb_& zapwafIg2FkHYyRO6~cp>6i30H7VJH`UX%<_D$ge{NZVwh1R6^~_LtpoG1B0Ds&s4G zD^npvN|A{60G$*If+ZE_@ZmC%j_}s7v9X76$-6~LG8U&tIouv!T=UkNO=u?Z6!fI| zX~$XCnv*q7Ta-vxZ40ay`PNLJT}pUjk$LJ?B@1ka3+>D-=E&xK8O9t7eg0zVqckBnO4FMXC50bv2pA( zV6kBvx)ple1DNmfdHOo;dqA(#H(*!X!F=#-dKDjZn;z0bxAB2`HAsQAZG1|ZtNaW3 z;8v*Sy+6D+U2EimX*+f;%_!deW63UYCb`+IfZ~i6GCY^+&%%Lq299*OGg{#=`y5s$+MfsAO}F$$ zduP%AGDK}E!LuZDZU)bSwb%+Ha*t4~aN=m^EPIq#xJ;Wx!WJc=D^|c6D-U59l9X+# zi9`~*d=f6!%*3Z`I z|IRDtQTOk2Id9pl~WLY0Uz1_vb%X}!VFc!|^bmo$_AqJ_QPa>9-y)utQvg4%y$gP8A$fF( z*c`}XPNLnnm{y1YrkYM0sB3B2;Q(969_10}0e1cvViS21H!bQAUIdb0@aqtBZjK>{ z)nM>v4KJ{rui=XeQPCr(Oy6jKO^ViQ7ChCu|ACnw9!YaGwDa7tecD4K3OXO%c+a7d z9>45-?wK?8QBwv~wM+ea={D)S#IKlKlkQybG;h0e_vm@c=MQ$9?+aB78Zb=1e17?J zhdUH)$Q?Xo+>rU|g9FD^mVUgD+s&!BJi6DA2P5=yS_=hO_ZB!_#rp{xL9Bx@N1(lL z824MnUz9|AdnvbNd{4re=z_ z;Jv${EBv4q?5dA!n%GdE+A{qTA5-V94wmEeU!ep{6P^DFL1&j@LX% z+7huT*4=bw@T?5-z&aTbZ>4fmXaG1yN>;0UPK-+VGB2os7Pf^q&!&_b%>K@4yz}YG zNAeU)r%w9euH2h3q|JzdYdieV_0-TZUurA;l}|tZ?LzFjjdvYSh>d?_`5kZbkLtK@ zU>DP(P>)?RHpd2{p7Hd|yA^*mR{z&CpI_1c$`g*SIr`1MhdT}Zka(EZY-9=E8wxm^ z*|BK`?}<8F!P~>a_zel(Hrk1|jrL`Hp5Sexop_ttf!}!suNv*d+eZ7bSuOe(ylu44 z>4W>h!-HA1X^4qdms?;9EN0iOgb-mdnBE8g+hLm{_YncE#U6@OhlA*VIl_kM0F`(t zSeAsZrt}rneA+3MMH})V{DgwI=6%>I>YpX_Hm#AM7@_#f0MOBc6XkCc8|LE=z6?n| zk}Qopa6rG|{rBbI`|pdfPHbFh>TG&FY;U|8-cRcPwRR=oQ5D(x+^xHlbb1d70g_Ha z_PrC5P6!eriG(Pd4zeR*M<$UNa06r;4T#Y}{Dv7f-nhk}(g~5t;4*$Hh>W14;!{9| zr>Lkr@uA`Zbl!jJ-tHvod~caazUsPFcd2{tse9^Fo&TJZ2}x5}&?T{s%9kIOHci(YxS5RA|&NLctBuE}I?Br~&Njvu4qWI%w-zRUd8ZFP8kY z#t=&Ygn+>o*jAFWV+iuo1~qCMx_D|t=t$}>ScU%lx?6%2S>-o{O;YlPd70< z+U3}Ku=Y&pwtQKB)ZseWHXwM1H3~rKiJS8cSw!Ib1P_>E^uedZH?7w*576sZNDDE8 z>mj|Kc>vd=4=%*Qf4H7`fL_0(O4RH4F2PG?i0iMAQo$Kyv2K+Q`w=&gP!|mRF-GoA z5S;_j2>fwJ0!x$0Vho3g3rr9?*jAnKl_8Ln;T%O6D?v#LBLx-W<;-&ksmo?@@eVc= zvx44mX(;H;lLw%~L3KCWeY!ai0%RA27tw26T(ip~ev|kYeM0HwKJY8hi9;B~0kk2) z&}e0yIG4LgrImHBT9no0i64{{5@9))DkCNN=Q~8F!MdKJo82N*1+ykBarJfsUXzHf zc%XXk)g%9{{*`A^e}?&v|FsVJmbR1hw|!vW&wa+2Z}4w{wG(`r zX<@>64jMt00>77bU=2}$4p`thgfBQA$PHg`x(l(NDX&8w0}Sia@aN4UUM1YST`$7AyK!DX6iui6=k#c zRx!~)9js!7T$lG*3t;(y4By#?>Fd&*G->Yn(RW|2)bw)^d12>_-(31l@SD>~+jopu zIsEa88!I0DBtfo}3cv$utPzF-$;c?owaiEV4!5(bEm0r8ZScJ>Odmnc8Y<+h`>8XT zS4##LF`64DK7#uJr{4jOLo8>N+mrcyl`}i6%4c~>469+EDZT8_-^=*=^E-Bpn(7xF zHoT=XwhTtz4}|Y`XJ=euHp^w@>@){*nt{jHhg((=u($9Zje&x21+e zFP+)lw5#}v0}b!&_S!FwS1hW!{!YWXcEd|0SNv_&(c_=RFS~2`6X`%W;9HSyxQW?c ztPHbT=gga7bt^1G=1-eGFZk8*MXn^*=06I%+xqF#>!s2&fn$%~?#>*TGa$p=^4Q6? zCX?gFZQJpx!MpVNk`=tGLhz_1v|Gf^I;@^ly0kCgpG3qZ!B-JpvX98`fL9Vs9C)I@ zj&uQibwf>JPB|x*#jLBbV3KOpT0MRy$^T zqbc2+P=Lu+Vq&p2XzVrhW9p{O9OKQ-N=nYj#kYS({SW13?Q8Ji@d(9$5#99JE{BOR z+7Q@Ih1ZU*Nd1Pe64w#o#*n8#$4wm$43@B;#c9ZSXZxmP-ZIk<+|csPa@M~wToZ=Ksz+%#4FZ-(@TrhgK?NwjNNquF?wA4b5iUigJ}d*eLmf%FciX6?<|sNDO#loC8~9?jx; zi+Uufihe-5sjMgYA7cc?vYJFGN>ADAZS9fF|MmCar{WvMdsA|?0M^*w7vJdnnDg*E z#&ap7Mg0*`e?*#&c4ZpTL<)>$C6o~cahwnI0;1B$~56iLgSoq102JR0^jV@KhL^3kN0Jh7btNH+; z@31iKgln7riiw9KtZQe@tVfWPTW8OlD}PWiwQ4|k7X^ztUW=hKIf5!X|&sIm5!LPtWSU*A>T`&vQT1Lch1Tf)1(*)SjC|PCyecWGkGYk7<|an;0Zp&*VU*&c}Giu{6VGg&8dmF zZyh3ln`pNd^GL@2WMZD$nZ~n7Ak;eHa94z20@5%o5@VmtU{gjK4$c&@7e%EK$C`a; zw_-r^to*Ql@Q^usCIkjE)L58sazqym{`GdrnNZH}Qur4>5O>84_MjLieh2a|taHp9 z_oXrdYs{V)08d2>LmoMGB|>5vXbKPrOmmXUI-IOhu$2WOoq=d(i}0xc_^EI@(Hj#* zU=hv6N`+Wml1pn{TjI93?vaN|m!2wbuFNWK@ZWVXPLWQ#f}S|>8-Le5{^k<3eAS2# zze|y6+#t!GI$5wV6a5^8bJEY{V`I|Vd{7(G{JirV|3^F$Z+Th-s z9kekF9s`i@57!3<^o$7x1D@ESv3PlaXqevZ()5u4PTQb_?~2t+ShRPbWY@=qkQcX* zW79r9f#TW(S9z|kvsuVVTPbq7=)KLN$;W;lo3a^HQTPvb}RtA6hD&Ln4& z>Oa4qli+DkE2;}jx%j>znL|Htxh(XF@RHWQetd7e>D}=0=~T=0e4ctDbiH5PKc4sF z{-G<9I+Yys0r+84S5!n1Hq6}+>+64~8`jtQdn179s^A8v~4RUM_0*%zf^V;+MDaCl$6@xTNOu|IAlO~)YWxD~{^ zW@*~ue8y^vi5rs1u$45xR?u64?Pu6Z3OEKZ{klBOsIdN_!9vd#hOLYgu$9Xgwla2u z$-1Fxti@DWT{50QD|>Ej{k=UBpp{D^oiA@)`S^Pw%*xfjh**&^Vv`~%Nx)7x=w2hX ziG_OxRyDv@t>CpPLfUp(MQlPVItW}lN^D62xz!LO1Y9)`k;l%ZBfvF=fX^Z}uWbmv zaKu&mS!6JdI~5&)UubD-v|8UP@1Sr>UmmSOH0+YQa18B zq}fQBNE?tgA{|1SfOLbb(L_0#ic|-UKzY4dK-J12y4##d3pIPsQO!uygi-k zWtGOuuAV|Qo+^3U6vVN7{ARSdnG~dn@|885T=lQ@r{GX=)7MQ=_R#xtE?&_ECwt zjPBrfFY0#F+wyrjq1IA`G7t4jfm>^((`Y+d`I1)4gK39!vF8i|j~-GUrRQ<}9Qe9T zFg+=yo4%!;$~k&jfA9S6`zQ3A7nl|yI)rkjgORR4J_YaD7p4Q#qEAxC&~WT85VT-= zgc8%@&!BHRm5KMx@BSyrbdib$EtnpClB`e_Qmw4?oI@^QZMXu@8=?c#qBm`!acV2g zLfx`{iD~giie{Sdwajg_6kpIR?jy?EbXe||+{n);-TWP)uN%313utu=X@s7Dl_6;r zKBC3?_rP@Fq_xmq(@M;#th5h(- zi?TEZ#dMdg#`g>cN?KaynyUV`C{-tA+<4fmO*J#&CcY=GX`$dn%Q|?*mdD3$_CLyLi zW_!$@m?Hz)WBsvhaW!#!2IdWXCw@tM=b*SjHx6nayl#kT$f6=QjZ}{W9szlg z&t8gi=F$x~svdW*U%T&7-hRhT#&Jz_J#8@w3z(}X=svF|eEy=OO~p4W(s zF}Y_6uJ%iRXHm(tR6tb?tK4SLF#>W-6lfI<8rdPyILU=oFAuN~10c7vN40ohnFhlH zL;|9Oda>r04C}q2;09?x8DwDgnFR?j2fEBW%o8N9F##|q*I z^o)^I3GH|lT?(yzHJXmD%MOX}!y$hzaO);0mN_(|w>SHYwFWcUW20<_RHnocul zCOl%!rfX=9B*R901N@*r55L-{=r+Xlyn`N~C+HE(+&0k>c>1^p0n{|Q6H3h%dYO(( zW_pm?>08*posP#6zNq?iA=v80Q zZ{bt!9XbrEd_n&S-To3#;#&GO=+Hph(L0u*M{-YD4$7?neLn|^g`UHLKpbMGoskAg@jz+~mWCi+W1{2*K5u!$;(~%v1x7wv z&#Qb!US#CMjJ%9)Qj^_E-}ibM(#KA(Dg>?lf*}d^LJLtVXR~-qgs2YU4g?s`UFnF75-lxDVvT=EjEkdDkz$&fI)M zBj*v#i<;((8q0#l(1vBsY)F@a`FkfdBB2cj87==g_BD_W+ z3Wdl-y@2H=qYVdYtxw8WN3L0cR_rJ`#)XSE6z%2VVl;}j_;Atbt=>b{TYD&6 - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Font data copyright Google 2011 -Designer : Google -Foundry URL : Googlecom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/roboto/roboto-italic-webfont.ttf b/roboto/roboto-italic-webfont.ttf deleted file mode 100755 index e6e3d48b620ab3242180f4e62fb9f148a85ee688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38480 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

-
-

Loading Small Arms and Ammunition Trade Data from 1992 to 2010. Please wait...

-
- -
-
- -
-
- -
- - -
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Small Arms and Ammunition — Imports & Exports -
An interactive visualization of government-authorized small arms and ammunition transfers from 1992 to 2010.
-

-
- -
- - - - -
-
-
-
-
-
-
RELATIVE PERCENT CHANGE
-
EXPORTS
-
IMPORTS

-
-
-
-
    -
  • 1992
  • -
  • 93
  • -
  • 94
  • -
  • 95
  • -
  • 96
  • -
  • 97
  • -
  • 98
  • -
  • 99
  • -
  • 2000
  • -
  • 01
  • -
  • 02
  • -
  • 03
  • -
  • 04
  • -
  • 05
  • -
  • 06
  • -
  • 07
  • -
  • 08
  • -
  • 09
  • -
  • 2010
  • -
    -
-
-
-
-
-
Military
-
Civilian
-
Ammo

-
-
-
-
-
-
Imports

-
-
-
-
-
-
Exports

-
-
-
- -
-
-
-
Information about the data
-
- This data visualization was produced by Google as part of the Google Ideas INFO (Illicit Networks, Forces in Opposition) Summit with support from the Igarape Institute and data provided by the Peace Research Institute Oslo (PRIO) small arms database. The visualization includes >1 million individual import and export data points from annual custom reports and maps the transfer of small arms, light weapons and ammunition across 250 nation states and territories around the world between 1992 and 2010. -
- -
-
-