From 295f628ad0ac8f6d847fe431122283198ee87716 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Wed, 2 Jun 2021 09:51:26 +0200 Subject: [PATCH] Examples: Improve refraction demo. --- examples/js/shaders/WaterRefractionShader.js | 2 +- examples/jsm/shaders/WaterRefractionShader.js | 2 +- examples/screenshots/webgl_refraction.jpg | Bin 13638 -> 21925 bytes examples/webgl_refraction.html | 138 ++++++++++++------ 4 files changed, 93 insertions(+), 49 deletions(-) diff --git a/examples/js/shaders/WaterRefractionShader.js b/examples/js/shaders/WaterRefractionShader.js index f8a90a5cce374b..5e643d69c30b42 100644 --- a/examples/js/shaders/WaterRefractionShader.js +++ b/examples/js/shaders/WaterRefractionShader.js @@ -62,7 +62,7 @@ void main() { - float waveStrength = 0.1; + float waveStrength = 0.5; float waveSpeed = 0.03; // simple distortion (ripple) via dudv map (see https://www.youtube.com/watch?v=6B7IF6GOu7s) diff --git a/examples/jsm/shaders/WaterRefractionShader.js b/examples/jsm/shaders/WaterRefractionShader.js index 84c669d85f33e8..93f0da2e704cb5 100644 --- a/examples/jsm/shaders/WaterRefractionShader.js +++ b/examples/jsm/shaders/WaterRefractionShader.js @@ -65,7 +65,7 @@ const WaterRefractionShader = { void main() { - float waveStrength = 0.1; + float waveStrength = 0.5; float waveSpeed = 0.03; // simple distortion (ripple) via dudv map (see https://www.youtube.com/watch?v=6B7IF6GOu7s) diff --git a/examples/screenshots/webgl_refraction.jpg b/examples/screenshots/webgl_refraction.jpg index 689caf17c6a40dab58ce053e7c3c5adea9637f1a..78076a50831fda861d57687d3403b2c1b0deabbf 100644 GIT binary patch delta 20826 zcmYJacT^MI_dOg$!9r0Hq(?B)-U%3n3i*2}2_WT>>lBHopC9ROT5AwXYs}qHRn! zkDU%^$UdysFiTx}7SuTsY3w>LsEnvT**P<#E|et${wSTyu`CVCihc^zs-=hSmWlGm zA(~>G5hrGKETM>!-nxcd#$aACXkYC`8N8?Kc!M6#eBhnHtx2VS>bfwcUQ52lfPR5h zO~omLKllrtXDw2PHVAqLwq~$bjqRF{WB~JORhCzvJ4F{U%}JzCr=X6d!}yEMeq|q6 zbBp!SgkM|z0;PpHjZj-p{H5|Ily`G()AF>`E~lMEM2s1Gn0teAjrgjzUs#uBu7dsK zst&`L4V^(`bmPmYoHrxf3(U7c+wSSth7Vgax!tjbLG}yaN10S{st0CqD`$2uqkuq- z1IoCSd(l0gMN3;)jMAt%08Y?w$kKd9rlUSMNJ@YP@wuvETxm^-3*Cn z#$Rf5lBKxdAiIwOy%1tx!PW!q`9a?h{n_=eHVR_Y-OAxIdRw^2H61 z8)MCvPsxi~vokuUN};j!u&5-W)4TEmY!IPiz}x?MB8dUUee&EzZaJQxqqF3US!;w$l5 z!tl7K{|YoyG0tZM9R?3d>#sEX&QAIV!=GG%;Bm^m6a4?p;9eXxJ8oZr3>y4)HI7t6 z;rq&5bRrj`?BMV|0jiegIcf8|jY#xw2t~)b_s-~pL;8l_MG{UNq6;gdzo*;<_#U@P z>&q$V#>Dx7jd$}0mE}?eo$fb28k9?g$Rh1_()bU65gvNuT=wFMoPXhGd3lfm-3_GY^KxW+In>2vkIT?BfCN{z=_Ks5V zZr5ZTIp%rYF}>R&Ct?rz5351h9$*;GPs?X#Pyi@Bg)a`~zgIg&^jHG0VTD4PiC=Lt z#sa)1dGDY5R(&uHmi()B!twHVjLXPx`@J9`!@uSNhd|q|737{bd%IVP*$&imdBF8s z^j?klN13rz)@7ik?L*0uZE?KiGA>$7;-6sJ<@JN)$eZK&Smo!;PZ z{O6^zyl@!?4n97#W-_iV-I8IDYK8ToU>2wD?lWYHpR!L!^|}`p($OdojY+rywUoI1 zlWb;Mq5RQ>RUx>OOnh2k*m(%v;<^|jH_GvM9Mz+k7+6DHDuX`9P zbu~YG3G`22ffn>gMz-KpR1uk0hyTqvO~Qs6o~(!!U4a6$$jXqrl$rcYtg-JTy z(=P|zXcsX4L}TaW6{w0jSV{H!6==Vhx3$dWQvTCzs+q#Bp^-*X&MVMq&@hvDv*zXY zXMPdLG`ZqC7jNX*ILOTyN&M-`@M_#9DUdJ$leBS2GeZy;$edAm*r@)_#r?lex%v)v z`jHL(?~c0B5PJJ4V8rk^lS=pPd99Tj;RiAu_7i>-Q?!j*+L|G{eGQO2OZo zzQy&DBrMJOn>zLvi?p|`j`iLO#jVvv$$aBq&D89pa8&&EbqqTUM z6x0O&%y19EMH)-k*PGZ&)tca2t4}9j;$&Aa8=0qwc9)9`F`@Q`^WrGC0LwkRbfRUI z(s71Onw3N+@7pvF8$hoR+dYT1`)ziA*qw9GE@-R6RneNl%6e|*gm(NEi~G7IR3ReG z&_RMVl7k*K>=w3{Kd2HX=)~4(*N`g1sfHUnKP*f)S%HT0)mn;uN6=Cim-dxlNucA* zGOClS;%|Y`I+%bueA=H&X&WaL7=o7!nO{!D8Fiz6`7ON!Zh#(uv`Ak5{|6G$bhlF; zxjTawD}qSYcE+$@r}1m7TRA19-?90k3BYRn$1~x6rCVisb>TSmw6&P62JT3a3jllf1fFI2N7BuU%~dd z%Qay156{psw9c9C4pSFR$!*V&-^x82yMQ0+w`ybM9A=hq@6e>J4-(>0r16t&TDNpH zhptRG$8N6dX~IMi&qPS6%>vk8G!0I%ut-`JK95|2=3ar?`TB@x`4loc*hOfj>Z}gg zrOYnj!|95(S~@W~?utjKfqodN_d64l*5k1AN50 z028Z1E<{EV^u((~WxfSqR{|sk)sfxYeksmB0&> z$wBJ9p0aR5^q$NW=zu4{zWEmRh@fMIFZp;WS^3H9ui1j&oxXBFw%P66K=2@k|Fn!- z&Bt$QVQ=Q}f*L(k^T+SfVDkH|nxPZXfF_^BM-+tX6T&#o{#m4t`7Iwe$lu;$rY_yh zWCN$^0>!63DF$W#E|A_xoS7w#Yf#dl;H>uw6hn>B-RTj7RnfvC3mx>!9H)!-UJVVgNiR+hWFE_cmCn`QlxC>?W2mV1$fgb_(L2GMgT zZ8perbf5Js7FLxQRG*M2`h?XNat_WUKDdZ<`P1*fLFJpz-d?)XhG*aAC<1qc2DglW zcE0|4lhXsFX87T#W_`lRB-HA|HiWh5#on7?5B0j0vo;CLaRL96?ad z*j?GaHGl2Hp83si2-T*W5*yzj&s-Zz{o*^)ZY=R#g@jA2zh9dFNbx%*VtW7%5v>Vx zjRy>V8p6;4HM6+Hb|;z&Qyyb+Y09VDJ<9%U)#JsY7V(f3; zX`8JF`^A^MoF1g_L=X#%ztmgadR!=8>YlRYuW13>*I!2O(VkuL>hA%v;7oaLwkbVr-WK zCRo(T9%Euf+h6!mZp)g*W#cWS?Q>&y$&HoYi|Ht32#qHg>3CR9B7+Y{0 zvUdt}q%l@_zHeG6azVu_J9tn0)B(nh<@sTVo!1UV_#KaaYdO!iZDXJ>XMpR=iShnn zwM(%-{dLGYQ&8=uoH2g$;rsBYgh1;Om1K^Ph~=E5E%z#}ek$g>Qeh*4L(3&9BWguO z@@a=ABQfhMMUK8sJCQtp#sQCh$U6aH{x{0f!8cmL-`S54ThTe|PY|_T!?g|LVwUvI)?`;wtEUU^Hw_Cz_BTh6fDL?sv@ojvJCg2<)YqSg }_dd{+PeR{K5AOzM5M9|KuDCH!W_w7I_~gKANoonbJazAUXS&x|8*x^G^F? z1pL7^a-xol5001o1{~1#Vp*gGm{E~J7~h-q*S$Ardqw@~yl0!Q8~wqdQ|!;24|)Hv z5JA(=Xt{h}(N5N)T4(6%GP7IQ$bIpWk(xXi73OO$SOZM1kN37g{U(6?&0NVBR$X$J zI`LV&t60ANKQQ(lVoNh;%{N@Qa~OK(o5@K;3KXjg32%u{GIn~=dq}+;sodeKA_ibp zWFtm*yBKKk8Zo$c{pqqZApd5&*KBT@m5ct!bmNx}lW(KQBro-Ic_MeERJzG&1$&ovrb?_rdLePuC_7&d3D_@wV3>A>Kq~0pSD{cr1;OJiD1o zrhfWe5vCy<-`X)I9198lL7x(w9`RK+o}d5Z4wWV?B}r(Z(Mo3FCkoX|M`~Jb3U#>! zhDQbtl=MS0KgU=9ZITIK5XY)pkIhSQx}6-x!;w!*M@OeRS^x(#xR9@ul!>bC73fEk zS(#X;{%CdVSA*SuwLAN;>9;%n5W80KL0a5WXhy;E+lG`BV~>obx~Tkm&Vepk+o03x z$8KR88)K{bA}^pO@0f3I7O<7a_sJ+yQPXY?$Dp-hz7)1~FE^`jpT2n0-V%bK-O{l} zC}fyj>dv!(Po?}16BfaKZD;&MzT7TA%n;+J%xs!7F0A(<3*ndPS0MR)Z@TCS@yZ)u ztk1(M(B~GXAzT+?JMdB~E=zz8Al+J+ns^^@5T`29D`ypX1-fM#Jrsr;{GQdFGIm^v zyNB;soM1yUlYBF53{QjhYCwa8u7XWq9b2)8VQPe-%t* zS@j*R-5I+#&FFNvqi$HP`U(_eQI1LIc9=dZ>i(XWC9fS}zuv$hqX`BB)XsZ=W%4v% zXl>22A?|7U^ipS|pKlJM&2L?So*=Viqt6qmxDYDaBiVQp-Jr4~Cr!Bg`4wnO;akMH z5Vd)Konh3>vln{J1RJii-`fE)@5wdDWE1fIF}Np=TQ!&8pI6C=VP>R%c#h|?WsOwf z+wXI>yEkaWzom}L7*{3%Mr@2l-$+SdwaDcQHgibN+*4JZMI7AULB9S@&q7BPX(e18Y!Gm{e+EEBWM?xEhSMxN=fSs(3Ti?FWR@ zfHY;?{qHRjU#%hL^`iF?hy9P!2zfSNy$j#H+oqdjf0C8SU(E!&3E=HSKetu}MU_3) zCrG;^j%vFk2Wmqva;JZv{xmj{eOoBDQEIke=n2qzCmT+?1PdDc-l&iYdvT!Ucw{l*ni>o`~=&f4YV#eQ+X?qpK@OSojJmZ_tq{ z?A0aJ4UFsXjW^mEG9|)mW;KIrJbTbFP{7GyP};CaIirKjTM75z+PMw*_rmwiU4+N8 z+D2T@nYusuz+QxX!H&Ma$%hbwACf3j6&Jz zRgdjYM5<*Ij&vbe{Hwz=E6j#Zr}me$t!_4##99w8eK7mVOHSJ@8bHN(qi|&<@7>h4 zT*fy;{>c1dL4JhloKQ7=i-wZzcJ7HZvj@Z(*hYSgyYK%oSb|pQ*|+V~L5WrfUkeFN z2wHzmt8;H9sbhLCZ3G#>n&GLr=5`^!C7_twB$<}ur&uPsTU|cUVraKvf##8zdKhc`B$L%>85fKN z!br15G3B5;SVKycj;HohpRy{B*6VByIi4JC+AGbH9+Z21=Sm2D9;~nWfczl8;@X;( z$6oYjm=0Hdx{I&{bj!po9?#X1Zuet&&=#x3`O178MVE5#AKKTvZ^`zXt8eqqA=hdi ziuGy}^CrDt5_2jGRS4K>pvS>~Xx9+urpm8(bQ^f0!U(3XP0U-xXt;;$hp%E3hmJm@7Y#>ZhWfwFb8W z2{5MbiA^y1FnEiD%_+Q*+3<$ZwogK_tx?9zoz~JE88r(TwRA;_YjzD0(JJ4ftN@+b z)z4fLnS)LgeN2~*Z#sN2Mte(BaXvQ0sAjBG{qh1J+)e=S371k+lL(V55Y5bMMW5+k zgO4F8d>hbGZzH8?7m7Sw)hgkP77MRE=aHX2)Z4(t=MpXyV5PV-#HKtp?f+ugCUWxY z$A%#hyp$LJ{Hw>Tsly?JZYX8PLA9;!Udm+|!TLmV7u7KC2f>_IHL zY|nk*V@d8Ws{d?F*FO)SqP?#~CS}Mxg-LpC@>Nz*X`*g@Ft<%fu20*~P|CVegORc> zJg`H&Sq(jUrdFoF4-fJf@de;g(IIsXuz@o}Q8<&k_wL?nInSRQuF3QH&!vF-5lM#a-Pl>T}^ zWPZmn$u4wmSm`3$-B?e8Ev$-MJ7*?JyzG`_^X)-TS>sHpfZH8%fj~|0&gX6Sl6x_q zxxQA*Wk;ndkF>q}&{RBLYOJJG@aYdKs1?Cm<|p(zQruno1%6@66meHpn|&x4GJgEp zg+f9tT~+aR!CLvW{+_CmM2XGJD^r*_LMPJX$9R;5e#J~$bZ4`z2(Q&}x7{hk`-|D9 zxbTTxehmdmlJ4z^NeaM4YiPhu_nT#`K!-eO`uG!4X#;x-YU*}lg8ZXL$r`U%BoK$a z?J7y#hd)0`>pi<2i_q^8tQB;0b&z_BD6dhLnFzVK0(I&lxX&JP4!filiH=r}x;mK{ zK}R*FSwpgk;K)vMpMfSWKih|=e8}5Roen_kbv{oSoio;91tZyCoI;tm3OfOCw9-704D=eTakJ8OoFGM>GSi zkQ`W4T_Q6I9D?k)sd@z>iGyCcU@E8Hxg!Sifp<&aGf?DtE`3<$7hkC+cTGL0^Z!11 zn{!&u8G-fZrm0Nv;LsDvic` zNhUTuKQD!y00_2wLa#j;X+OJ)FE^sF;i=CdhbLKTVKVJ8kRx5FNQc&XFU{_=3t`y8A{E=@Vbd0}R?%)R{ux#X zJ>{S%X}InNsXgfMacC9k(!z2-CJ862D+X%@ZgLZsBDq``pm>jt%{+v*n{D$&+4W?_ z`4{11#T932=?YYB=cteDMaOT?FCzfWpnUi9`Xy9t)$ybqzkli-|He)e(mDov41M>a z;bseqO0M?|ulrITzDl?nvu@}Ma5lE|pnTa5AoPz_%vslq^E4E8IMMFaYo5keAfYPb zx%pm$=-R4^f3$?}Jkdwrw%nabZx7qESB!5?Jy!BR4y$6TK3Jsc>B^L`{S5449N(;@ z8PL`+O5*Q2mu%a0v@^2R3~9Y{xj+Sex2lk$d?NCQbd#&Sbguti?RC}K47nN_ zia2rL-V1IZ{nK+7-;tm}v@Y;?cFn`o<4IP;`iWDM9Y;yYt&$S@7An(UJh5)wB8125 z37lgk9AggMH8XxSXHEl`@bx`Ai2z@$(aD$KCTmmltZMNhIGm2Jzo8OZ$2i{p%>=>Xy^Wjq$IMU@GmXYcD;tg?39-W;&uP(bb z{dL2SZ0m<;VD2M?Y%UVA{5;5eMCE%*M{UykA0_t35BRU&Ra8_mKRIK5_#InI`_8sz zM89Yup=x)aJWgFke_|7-**?qF>1_2;k&~w<$i(gGN`E)6!Kk{F%Anq|KAu6oRz#7KW$hcTTOUk#VDFga9B^*R2}}|bEiv3;sg<2j$c`J;ajj) z_#|)_A!w2zqO?!h$gHnBI}#cR<5%~c4A8W3y3-)Y`(t&vxk&<(WD>ve%6yJ0WavGX zHZOwtL$fV=qkPr{Eiqd_CQJ2z(?Z>d}^|5^PRegG%Dfr3E85 z2rdJft#n!tq({qo<8RCF4ZwfR=?_~g*KYK1+!xY^fE0LYUz^dei~6=1P2}`i)9Wh` zN{OffD-F|A<)=R;B%VPR%L9lE3toIUUrdYyF4CrjEoB;}QEDA*c2x!|yxQbmr4`2%hL#!bB^&>^Vcf{! z=nt$*m~;Pm-QZw5WE8i-RM`G@mTI>R?3K}yhBX{sou68NpwAbbA-dpK;xFcRs(w0# zLxu%>bM1Rw;?Eqr-dwZhbza7TOwL=7-`f?`&_iKuXmC!FW=|Z6T+CWOXCU({HG7`% z(;Z=^te9hcl9^AnfwoKaXGJMZFSjw_LqHvC_1Z+fv9(FIt)J&wgZp}uEvEca`aq7_ z_-9ZEHtdLV*nU{(1CNa-{t7fumlxv2x%08JD$mD%G?G$or+vKIWdIsy9>n-m)HP)w zo9U65@#zblid1WkQd7$c_B_7_PpsJzP>z2UeL8%VjqW;Q@!cP0hn~AK_IJ8^;{eXL z0~Q8}5~Y&^c7_2xD>8b=X@=qOwrR_x!iArhb%Ym_AHt+ezp=~!ts5d7Eox+Dj`~*J zXmDm;YmCq@<~-+6o}BYuM|M#7&0c}T-DIY=Bn4RIKtNcFdBa)qVG=wtowlM+e#_jl zR@xYTk7eZ@v;OGpbeMqCtmSgEoxSWveXt3Gmmo=pUsAwe?%#N;A2buq#W%4Of?VB? zHfBbeZC{)@Z{m#cRVP^p*aZ9@-xmmbxD(F>__$O4A(82$(w?bK9t_-vVD|X-4e^?L z1LRpJFzQw%Li(#K(4uPUiS*x=Z`jQL2~$eQ4O{3WL2$&w<@w<6ZD;kyQTwndJQszU zOg^LYUJ8y{_h~y`RifMmomw6mu66}dckV;*w2E|VVVSwOnx@dE z`u8yBV!xgy{|{_W!|x#(%9Y{ra>jSKD4X=k`nQS7luwznvtbJ(3p^~gmIC}-Ck!jh zpSw{MuaMV0Le(cuc-z0`EL$GEOdsq&5B}Qm-d6kPh$m!iEz`|IeIFo1-gz2RWs`t1#?DBK zM@2w4FG^C%q#~tQ=#q<97;J%K&S4%QSewa!;Q1LsGVfZP@G|NjJ>Sek{j(6>6>C%r z^d#*=n)7mfLZO|}b#k2D@APXX{31MR%((H*kz9FCi8*544m>t2P)Yx8zbb-081O=} zpk0KbQGBlL8(VLPoD3xurM#Zi_*J4zWyM8$!roe}bfAPe=!>}A8vv|wL11s!`s=(d z+We_r?m@ANikOa#oO)rkXR0xmT>!D}U7``J{k=$AjD9rL#&IOvfy)jyvCa22%|Sa2 zyNEhRM4P}jc&)0fvu&KdMWdktMz(`d<<-^-4(xl_<)$efO;(q&up{lNl#!IN=?FD- zIeV*Sdr6r-L4myulRs#4qJyRoq;PBRr3Bf3IAfNaEE1VSr<@e#%w|Tn0b#zwhwSb9 z_s+l9?AM}EiBjJ?z4~_Xc9&8-IVb)Nk$h|43}<5@Lu&aUUv!<+ctkJj{-Ys%4)3a*KZgWHe59alODXmYQ9DO znq6^rX#x(=p&7SJqHg6Howd=6C< z(-@9!JJ_i?+Fb>rjH=>~Oqsx~RjIQ)?_Q<}Z<-~WjE%(%e zx{F5r0v8s8m=X(8NSO|4(TK=r=Q{x$RVk#fHvMVx{th?29G3zM<543{e%87TIbda- zH@_jkjy!~AC>Cw%f$J9uxsx5a{`-wY95~Wl?sK^%)VBWmDv4SA*4v+M*nye{4|L(i zb6k&^Gir;3c$e|Mw||oJ6)!wwpUC?qQKobF8OMqD-@4Ubhk4 z=m^|CN8WqZ-6~PC;d}+MLhSRbTmtpB&C=DoMT;)FYfBM!>n`|lbp!OQ?-j`SbgW`= zLhC^hdKbD9EFo2iJMD`b!^lX!lg`TMg5>%4ziHNtE_=Aobb1WiahqeB5_^LWyn z<{&*$m2IaenPeP+_dytZm1z=IQ$=Uqx+s~+jLvR*-CN%@?Jcr1tb`0vl%|f9*1Q7U z+z1lUyh{e&l=Me2ubi{-ENq$YLFLi(#qP)y<$%4eku`6i%z{IkV51PQ%XWATS*3}2 zM6@#)0omzu%`##c*Prj;WH`=6Qsj5N%%oy5pk;SNG0i$CPzK(I^j(1zr6C>MQ1XxC zPM({i$l|Y>hiaP&^S+FS`LMX4ADBAwW|uLgk@ruHzM7&~UI&QMef*cVUT+!g8-Zcr zt~dV=OGR1fUhF)W@+7vu?PKFXY^0xKg!*Hno^JZlj%O*tPTIN;q1C*b=tf&lOgL`VG}dsAwWt?;;>muzv($2jcu_hb@;KiS#6p>YVQ2)*nxkl zoLkrxh@;{k;bEWl+@$IIl|KZ=i|LqQIF|vV5Nvv56+PXwrKH=FCi1wcesOUkex<1F zh3$J=FBV_JB02WT;4fba&EBP)etLa&Ff4%Jb4e5Nd!W6)G`xt z+q5&2TH3f zfEjr1eVl+W1F=99vU6C%gbYmK5^`hK=~T*}GE>^T0W)gXTJ0}JD4pd3e%=yc-f(JX zLBBk4Vwx0rp12q@n>V0oe9@hAYAPIlcQDP(G)`&wy`@=gVzWy>SSdK!mBD+xJ~!Gi zL7iMxjK$`uolbdhKwrHpd7gX6C+~!9bG1Jc^o!BH0OkeTikoty(Dp)L;(_wPXxov= zy($~JZO@pGF8*EiQp5Q#+5d{d-3LXd>pF!xlDp_U?H0yZ%N>&4PY|@}B5|1zbg=S}e5wLT|57Fil#Maw$oL0nR6PynC#_=W~!hThh;f{(}1dU=|N zZ~>*7jK)S0LL)*GN==$E=2#JvaOwz9?l#^5&AkZtdi1z7cN^X!^1x+hjSok5A4q}lb76lF z2IKw+GXm5($d7YM1LyB}+N^i5--cI4rJ(;s*#2{(f1iHY0qKW@oECgeN-+6y!FQma z24Iqb-L8Cjm(i39W%v-i%|o8`-IUc78JuwMkm``((_xIbZO}ifl`^*;_6n8qz`WEu z6G1F0MTTX7=)!J{is$3G2tC_`*)?LJ?5ig-uC=4iuSwam3n zOc66`zQFA`@I%jK7CGAZxiaEop#@mP_=8C432%~ZRqJ@wxbMdbgQUni0j7nQV|zD% zNsnwuRPmx(!xGy*p~{rxq%sP8lD&ERjB&!Z7Ok3e+iiPip+otXkduho#(I%GMPu0; znqIdkP7_k%yQyU#t8O((f0o!r{yghfMNEJ<70fnxM~DB!uI%4KNGI0;b#B6^(SyIG zOy+oF8|ZkirW9Yp#yX5gT`4dhZuAF$iH+__^4;#^FAyPoT45`~Sw}~07&-V5lF0VL zxH{8h+FH{gbE!X3NOt4JbQw)f_Y(#$uLSAQZz8|Ago_A3HLc$PyABRU~!Ah?*=fBXP>I*NLi(!%+PklgmK z(SeuW&2&_$F(lb{9_qUmD>Ex2x2o$h@ykWV*u$O9s17aneOrGhOS)|U9DPKD%bc|F zIN%#mrlSE+dTJ{TtP9OzNl(4Uc5=_n3gj&}&UiT0sI>?d0#~4+-!k73d(^k=mWrKO z>4aqmB@@r;Ai3C{z8xfRc=ss?`%EbJ)uTJ*`&# z@!&)4cy+YYC7)(p{iQUeNNa5nyeHHp(VjX%QBir((twt8G&fN=wk73kcU#9$fOqfA z8c1RKMUPDwdPcT?VS}dxB=GD^FqRR+D^SvR_hx)gy02Hmu0tw>>ku%f{ffjjM{Dj4 z?hz7o^AAeT^{=BY#v`Ii39q~4-EwN1!A|yK>NyzNwI2B1@QOy_UQE56_wDGEri;;D?9h(wANyM@t_EAiD_kKD5$XRq-O@3F6bUvu+5!ityz?jM{&N z*5tw_?>~`G96JAr^n&F5Kb%b+Vwb_!9{QJ z<>8>H=j>X+n`Shlw4W_qMlDVOCa zQHOq8ml46a`LyzIBIur8S(Y5}O8=&_@+2b2Y^#yJ5qJ%a>QQBY_4#{Uw;8~i>AT@l z)inuM7)mTjAhN(q6UGlP5(W-j6Czue6?Hrr&jc ztqj$J*Ho!$W&@?*^@R@GR3#5 zZ5wyZ`vh`Y4-~K8d$JwK+|1lcSxh>-xqgj9z(+2*moRrKTBq@QM?u;#7Q8=S5Mt9bBbhiS#GEljLqwl zLd8zjELm4K^Mn@})%0*W;E#5-n{4IcF1;8w)o*H&6y+zEa|L<{Nk+^yJl4U0n}2DR6lUoc=l~@MO+rF=W|X|4_*m@HQjzBE^v9 z`?Ims#u0n&uu)scu2q}`M?Xx{_va2-NZa6di>0n;cLWRNGY_&61l^MT^h(eD-x#LT znt5lpD$JI-fm>iv@|wr5sTPBTQHTF6!+ZKYS^;ewAj z4;OFGS>yaPv|w;K{+YgtRM`L!W`e|=8_L$>xsEjRp4qxa87c7joei9BT~;L!E)maG zVJs^TayY%;m_Uj9d$!mumS$qAUm}+K^r+WoEyehZ7Ob$kjRfObV!zrbei|cTtAiiG zDDLK+>iLgv3}h4}>io=&Gxu+{wV-?x$)h&YTN>E!KKf-!BRR6r)LF;bt|d)VC7wd{ z0vooUM?(zoOOSI8#bOk|h$$1X>@o3n6z$59KDNf(fey{nX>0wn9lR)p)GI;`G`Hb5 z3OW6Sj0=qP0oMqK!C*QX({@VqNSJ_~7E-f-)Mc|Y;CPxN?h3@ra|Qa13Tf9`@5#Ru zz5+493btXC9|A(a?^ke#MPOV^FR}hA8}#MC?pT@a5*E?>OF8Of@TqT=E!}b=3z{xk zC0))VHL4oUDaB^^Dvk*5!uFmr2a3z0E0DJYfphDdyR@l-Q-JS}ZJk(ZK*T+!JGv-G zwiW*k`F@|(U;bQL+6!SfyyOXm=XQ`}lUz`dt=Jj*sHq-G9W11SZp8V!5DA zf}*e|L@I4|biF36!VG={Z(|kx;9Oro|6(|Oj??!3r~euK#(;_A3kskob4j4-2KHaXvl!HFyQOrioEn86>+*nSdT>@ZGPvFXXRX zLq)!4c=_yC*X#wHZ`B4uQ+UjGYUtR4y#lQQ|DZZRpY0ZKpdM*!XX&>euH7XH@nM!^ zh*6SB>Z`{Eahzw};PblWu^|O%j3K=HWwv(Cc#oKig{w13hzlV6aUXSip8z3@ z$>t$C&Po6KMt^5SxMpY#Z_{FTfh63K6i%pZb^t$c{(1Im1bLo#@i;)mte42b{s=WW z57803%F``?Cb2vCq)X4m<8-`Rl)&t97duXYnNRGps*LcA@alve*O^JAjFzU=X>VY> z4W?J1UMs?1ijXO#w42zt!OU{#d6@2LG(K)_Yae|D%0>PIbO;B5gj*qn7h#s?eYXRT zZycOb6XF>QmQ!nzG;u@}Op}ixo6l*HOOq)*K)Iu=Kz16ue(A{jv=`LdvEgTy zuY8CXZjQxA_#5dSvn(7wmZtKBT@g)Xpj|_g@E&pm5Qb#)@cXSt`_aH}>+qIaHbdSW z9%JKG!_JTEQlu0^%g!w91oz%Os4(gKvCH#RQKF2aK`VT`c1Bn!WBg7-T31N9tim6}n!lRny0oQ;Ws1Y8BTKEv z4`RhStO`G-U~BLdBUZ)-Gq2vzNM0SwD-xQw^e7#p7#B3a1 zZ6D9=FpzQ_XV#84=Qm`AE^r|gz3IIhP>@xGkNBuRRQFpgVq8)D-#ZS|W&{iV8=o*kBOgta-XE%6WFW)3srSlDDORe(3tQ(Pn z21$PVYc4tFTA8Ik6lQad)~8R>FUf-Y$x5O0o_Hq}Psm0P5#SE%rXh?X8QCWMHM8>u zfk2!f+NGR(M{Z6<-bb{Ry171hokf)G+N+P`(@VH&qWwNGzJ6~K2%MqCAv%nx*dF(-1s4_1^ELTG%+d8Y_0A@tu%(D) zZq`?ya&00*dEM*10@CM4_8TcX1vJErJOG|f)Fn*dv!q3hywY~Zjaij& z$NJG%ppS@c*1LH--gbAudkgyxgo0D+Yg$<3&38-qc4Dv7^EGVRjey4|S^sAd0)J7E z4~Mep-U62;=TNvcS$)Ni(WqI)$OLl@sG zpd8knGgKhh=Q^Rm?#@Yl?7hwDqaINHO;^3c^n=@YNfupl4qBEI#f=kM>X$U>#mjB+ z?3BGXZ5nC3p+`Cvd&6V6fD?$*4r{a?wDO*&SCd9h#6~9zFRsnXvdB*eybMij`+V>~3q)Yl z9)~b%T^IEB6o^?P#FHqlw0+Md>=QwFiKH(06teb`!LS7k0>>Q?VR;3j{!IOk<4Y)z ziGVa_Qm8AvVonFDNP-GK$&;^TQd8h7AXXPJA%7_!X(=1(Q$oDjv}KgO^my0cEw>^5 zRade#sPFl_$P(ftoLeQ9k1D4szuRvwVl6v<~F>{L;L$ePvn-eWX z;5222!cF6NEN{i9(=*RFVKM$U{KE}tf^cUAK*oZ99C)FhAQ?6iZd2Y5?nw^5U&Gi` zq#wxBhJ^rL9f4=QTV@D%Izww!(Hgy(;B$1oI9SZl~&ZRAyuYXSh}aPd_6;` zE%PJxUJ5SO#U;)x8Y6YbT%@ow*E3dgf2{UFLby_%hUFG}R_Uxp-59f#cwSFGi`h-9 zRMIlj53WQ+o`vAD$bnsa%RJ;exR!AwNF+=_fLGNan|Be{zX7Gh87_4v zb{vLy@?!4QbLxGj<4lUiNp{ju6XJ=sq7AuTM7O}YIU{AV87}Qi*60RF})r!XT|Y%B5oUsvAEiKzux*r zQD&{A6Rug2L0H87XdjW40d*7fr{v;`^&;qYbG?=dd#d05m8wachrQDjP84cxFH4N+ z6*zgiiaN>tkV8v5L|FNz_awVU-X@;7L53L!058t8c`ca!(bxJ_BwqXK;n^>zg0tspDp8`@hB3rO0N}JTvkGB*WRVMQ+$MZ@ET}|9>@Hdpwle z*MCq6Nh#zyb#x-RElB%~4}4l49J_x4QVtpB@U3) z7T_0Qgx|ZXZDwWSqxGNju)mdayAy7HdNrf1lQH=D>z0q!vYO5(RbwGZ;h|lr#+r?n z)OiWJ@0BJu*wg$>?9YNpmgef~R?r`plH{XdQ&4L>5=%=X+9jSkX7&2!WlzmUh&gMn zw=YlOQMHGYCmefRyZ4ml?qb}JB&b@dR8;$5k|q?fm$fw__nK%{`)f@x-TC|DvHG0P zPgvXJ^Ax~!XJJx^mC77hb}2t6%seooxvrE8h-UXjn?WUKbj0o{p{oiiCDU321h z$0Zbw{B-odef}=o5eM?U0xf5`?+4r6+P{6KNgBVD&4(|Tw`KT|-(gM>TV(oVh7dCM z$cT6Mou6ebN&3eoS23-*0T_tHIlSij&G(s{ptqq{+AjH6mh{kaG6%Kjil+MzM|Jgw zb3Pb8!R%NrT#n}`te2A5?`+hvy;SkzS7eAcoBjy_NenTk&+ooPb+sja@CZilqlCN= zXwT~w9xc5af1)})V(vgN`icuBowd?iqehCTgGWEDtEm9s!}8<#7~Bca6^xZlE%Fb7 zbc-r1# z#Si~1SDbtOtf@i4`TY0i{i)@)7ue7E;(T~3@}&x%`J3zBZ}s8U@p-kf^2LU3oXDYI zy0%Dy(>>YzC-S=W%Ad;Gfl1qvP^>**?sr+32VIaX?hd}qO~3Lcv~ z?SH6qcW8_`r76|yMxuW6Z!0dam^kYWx*luPXtLwj%-eS2y!tB?DbR*mO0xdW>%QwZ zZ;8=zK(s9;(Uv7&UD0Ni2@|y1>h`&UH#Ko1PbHL0o~NJwBPhrztzmbH%VNRr$H+z! zM-21beHZ*M?g>U|)+Uh9}W8LfzI(^$Tixm#Wp z7Jo0;Q~e8X=k~6h6brzA6f5}){J}UeY!qv&9|wfgd6Gt#6ZlRd*%3v2);9R;9C!@!V&g2AL{ejl ze9?xGC!4(!*oZB^HiUUp-%u(K*v-{x1+k~s#AMFhR~e7BG!oJX+oYA9QA*J|zRCE1 zwnWZ2=qF%~AOm&9e>H6i`8{<;B8+6Mi}x0mK(IQ9$$LVKvR5m-()ItTgJ+ z%TBg0s$6Z6!QQoAj{10h(CJZxvX*^-$NuT3jOd*d+@U0mzX*L*#T4G2D10>vUsI8+ z_#<%(iTJIoV#w57U@ZY_{{fDXA&@7ZDh>**hIgp#HgdA26$)(zk_j@ z$7Hwip)0N#f6}{eZJ+s!U*nkl^K!KJ_M64dK!rgI)TE$w%w2tWU0{*ZD&=^QqabLD zLc0^0$A}S((g-b$d(Xo$v%|*4vpoL-zqq#(c>DoqSz<>#>M`*%-I_a>wRo9g_A5I& zdkt00bNqF!6GtoV=iG-sflbvO=tzL5tHDcwv0=t;_8m{>O+g*N5SUih2L1hc>oG z0!NHAo*%hB%-7&2xulr$zaWECquGy^q;tFUnUTI9l`6s>0wAJ+aSL1kLlI+X|WP{j%Djk>6mifKa?eqc7GGQhE2O>e{AD2-M zuM~vLKX_uF^{n;X$t35sfHLt*7G1hB&w@?Xw!hwyy>%8B6;Ucb7>J0E$M_}+T$WW( zD;JcoABt!zHO*#`UqHfQ*=F)*xU|cxy9?FolU2&L_Y*0=N2LJ0UZ4(`Zc%6b;DH8M9)bZSV5ej))k-=o{H!|Q0zK_@CNmnb+Jz=R|=vp0& z)n!C62J=L12Q8ODf`<0J6!OMmgMjBh`z!DU;Nw<%R^$b%hk^-V+MM*b;HW+)RE=(g zgFb)gh!k{)WQP@Ps`WVMTnlgr%&HntI2C&=pe%CHN-^6d1~BR`c{P#a5uMJz7OiTj zJTETLk&(GPQtz0pbpJ-$fxpp=8Psc-M&d{c@>737mv~yzPDW)CR_}wVn|?N_n3r%b z+Rkv<&SfQQJ3k9W8`DKH1e^g>E{VGB*+lpTbh;g$NF$EJ?BGf;?H?H!lDzV_|E1O3 zno)Z5I$COSVa)JlSZ>WEdHv~OY&hW|2r^V*kwF48Cm^v@;MRTAz8HI2GU)HMH1Wux=AiOMmecnElxy9iSv6IrZ*uX=mEa3=OMVe<1!ZSj zyTCDBYzjPcg4_L3DJ<@T2LA-_mwx+pod;6a?pE&%GJU7A(0s-xVCIYkzA#JEq43#O z_z$8Oir6q7-uLj;Z)GOc)OEd|%iZMC+xn3K`rBzCr_ZG>9{J7!r;Iokl2yM{fE5RM zCV(EblEVcddZhp@aF)Lsyi5nto?_XckSy4Xo1F%D@gNo7+MZix$< zcL6R=7j@k?>35KZAAk;{;~2u`qcEULt+2TcdOeAR)!9o!V24P^UKHRhl_L+xWj+3Y z>@@^HfDjcxJ|a@!2g(Q3g}2+4>3A3-mL=}rfJTbmC{ z((_t;56H&b!ya20kNBPf3lw%w|K?aO-Gh7Ig26lozglv?foF96q1jM^%xh6s?q680L z@&{Xr9DE=^bKZb>hvroX;7(~Y_Z1N1NYOjd(pFd?=Zi=*)y@hl5G4{hX_n4=sSUQ2 zfk73)b*5}Hw142;iK&qi7|}`=Ne2ksR4v8DM2P9Ty$^LJ4PgeB&Zgr`4kij?f3c?GTmU#91uQ+%gz6`{HH zzeG#%kPS04=(3`cpvf;RCZq7TTy0qJea1QB> z%udj&F`Jej+&zENKdrj3*R^qLVM$?2xpmM(UCHu{V~Y!BDruc#+__7RhikvcSggI^ x4BUioj0C;LxTt^ezEfN>kx36NATbX{xJ5C(-pNegqLEp9Od-?CKtpt+_kTcAAt(R< literal 13638 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

^f3mGr!o%zOEgM>~~8c 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 + @@ -21,37 +29,40 @@ import { Refractor } from './jsm/objects/Refractor.js'; import { WaterRefractionShader } from './jsm/shaders/WaterRefractionShader.js'; - let scene, camera, clock, renderer, refractor; + let camera, scene, renderer, clock; + + let refractor, smallSphere; init(); function init() { - // scene - - scene = new THREE.Scene(); - - // camera - - camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 200 ); - camera.position.set( - 10, 0, 15 ); - camera.lookAt( scene.position ); - - // clock + const container = document.getElementById( 'container' ); clock = new THREE.Clock(); - // mesh + // renderer + renderer = new THREE.WebGLRenderer( { antialias: true } ); + renderer.setPixelRatio( window.devicePixelRatio ); + renderer.setSize( window.innerWidth, window.innerHeight ); + container.appendChild( renderer.domElement ); - const geometry = new THREE.TorusKnotGeometry( 3, 1, 256, 32 ); - const material = new THREE.MeshStandardMaterial( { color: 0x6083c2 } ); + // scene + scene = new THREE.Scene(); + + // camera + camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 500 ); + camera.position.set( 0, 75, 160 ); - const mesh = new THREE.Mesh( geometry, material ); - scene.add( mesh ); + const controls = new OrbitControls( camera, renderer.domElement ); + controls.target.set( 0, 40, 0 ); + controls.maxDistance = 400; + controls.minDistance = 10; + controls.update(); // refractor - const refractorGeometry = new THREE.PlaneGeometry( 10, 10 ); + const refractorGeometry = new THREE.PlaneGeometry( 90, 90 ); refractor = new Refractor( refractorGeometry, { color: 0x999999, @@ -60,7 +71,7 @@ shader: WaterRefractionShader } ); - refractor.position.set( 0, 0, 5 ); + refractor.position.set( 0, 50, 0 ); scene.add( refractor ); @@ -73,32 +84,60 @@ } ); dudvMap.wrapS = dudvMap.wrapT = THREE.RepeatWrapping; - refractor.material.uniforms[ "tDudv" ].value = dudvMap; - - // light - - const ambientLight = new THREE.AmbientLight( 0xcccccc, 0.4 ); - scene.add( ambientLight ); - - const pointLight = new THREE.PointLight( 0xffffff, 0.8 ); - camera.add( pointLight ); - scene.add( camera ); - - // renderer - - renderer = new THREE.WebGLRenderer( { antialias: true } ); - renderer.setSize( window.innerWidth, window.innerHeight ); - renderer.setClearColor( 0x20252f ); - renderer.setPixelRatio( window.devicePixelRatio ); - document.body.appendChild( renderer.domElement ); + refractor.material.uniforms.tDudv.value = dudvMap; // - const controls = new OrbitControls( camera, renderer.domElement ); - controls.minDistance = 10; - controls.maxDistance = 100; - - // + const geometry = new THREE.IcosahedronGeometry( 5, 0 ); + const material = new THREE.MeshPhongMaterial( { color: 0xffffff, emissive: 0x333333, flatShading: true } ); + smallSphere = new THREE.Mesh( geometry, material ); + scene.add( smallSphere ); + + // walls + const planeGeo = new THREE.PlaneGeometry( 100.1, 100.1 ); + + const planeTop = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0xffffff } ) ); + planeTop.position.y = 100; + planeTop.rotateX( Math.PI / 2 ); + scene.add( planeTop ); + + const planeBottom = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0xffffff } ) ); + planeBottom.rotateX( - Math.PI / 2 ); + scene.add( planeBottom ); + + const planeBack = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0x7f7fff } ) ); + planeBack.position.z = - 50; + planeBack.position.y = 50; + scene.add( planeBack ); + + const planeRight = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0x00ff00 } ) ); + planeRight.position.x = 50; + planeRight.position.y = 50; + planeRight.rotateY( - Math.PI / 2 ); + scene.add( planeRight ); + + const planeLeft = new THREE.Mesh( planeGeo, new THREE.MeshPhongMaterial( { color: 0xff0000 } ) ); + planeLeft.position.x = - 50; + planeLeft.position.y = 50; + planeLeft.rotateY( Math.PI / 2 ); + scene.add( planeLeft ); + + // lights + const mainLight = new THREE.PointLight( 0xcccccc, 1.5, 250 ); + mainLight.position.y = 60; + scene.add( mainLight ); + + const greenLight = new THREE.PointLight( 0x00ff00, 0.25, 1000 ); + greenLight.position.set( 550, 50, 0 ); + scene.add( greenLight ); + + const redLight = new THREE.PointLight( 0xff0000, 0.25, 1000 ); + redLight.position.set( - 550, 50, 0 ); + scene.add( redLight ); + + const blueLight = new THREE.PointLight( 0x7f7fff, 0.25, 1000 ); + blueLight.position.set( 0, 50, 550 ); + scene.add( blueLight ); window.addEventListener( 'resize', onWindowResize ); @@ -108,6 +147,7 @@ camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); + renderer.setSize( window.innerWidth, window.innerHeight ); } @@ -116,13 +156,17 @@ requestAnimationFrame( animate ); - render(); - - } + const time = clock.getElapsedTime(); - function render() { + refractor.material.uniforms.time.value = time; - refractor.material.uniforms[ "time" ].value += clock.getDelta(); + smallSphere.position.set( + Math.cos( time ) * 30, + Math.abs( Math.cos( time * 2 ) ) * 20 + 5, + Math.sin( time ) * 30 + ); + smallSphere.rotation.y = ( Math.PI / 2 ) - time; + smallSphere.rotation.z = time * 8; renderer.render( scene, camera );