From 8d7c31095b09ad921babb78e43d9dc26512fbb43 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Fri, 9 Jun 2023 21:06:55 +0530 Subject: [PATCH] ice material --- data/textures/acubexneg2.png | Bin 0 -> 7261 bytes data/textures/acubexpos2.png | Bin 0 -> 6665 bytes data/textures/acubeyneg2.png | Bin 0 -> 571 bytes data/textures/acubeypos2.png | Bin 0 -> 6339 bytes data/textures/acubezneg2.png | Bin 0 -> 6484 bytes data/textures/acubezpos2.png | Bin 0 -> 6055 bytes src/DifBuilder.hx | 41 +++++++++- src/InstanceManager.hx | 73 +++++++++++------- src/InteriorObject.hx | 2 +- src/shaders/DefaultCubemapMaterial.hx | 104 ++++++++++++++++++++++++++ src/shaders/DefaultMaterial.hx | 2 +- src/shaders/DefaultNormalMaterial.hx | 2 +- src/shaders/NoiseTileMaterial.hx | 2 +- 13 files changed, 190 insertions(+), 36 deletions(-) create mode 100644 data/textures/acubexneg2.png create mode 100644 data/textures/acubexpos2.png create mode 100644 data/textures/acubeyneg2.png create mode 100644 data/textures/acubeypos2.png create mode 100644 data/textures/acubezneg2.png create mode 100644 data/textures/acubezpos2.png create mode 100644 src/shaders/DefaultCubemapMaterial.hx diff --git a/data/textures/acubexneg2.png b/data/textures/acubexneg2.png new file mode 100644 index 0000000000000000000000000000000000000000..2c626cfc78f1d2abc4b95d0033041b510f01701c GIT binary patch literal 7261 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 TGM2>000000NkvXXu0mjfBJ!P= literal 0 HcmV?d00001 diff --git a/data/textures/acubeyneg2.png b/data/textures/acubeyneg2.png new file mode 100644 index 0000000000000000000000000000000000000000..0254fbd3ac827abe684f88dfed153fd540d4b731 GIT binary patch literal 571 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 FV1mqPO%DJ7 literal 0 HcmV?d00001 diff --git a/data/textures/acubezneg2.png b/data/textures/acubezneg2.png new file mode 100644 index 0000000000000000000000000000000000000000..94d38eff38c581d359a0743415b51726eb8ce02c GIT binary patch literal 6484 zcmV-a8LQ@rP)qNkl4R#Tbc*bF(M1rR(!8lDPe&xBFu;>Mi?#KE}+p2fd4N4w^ox zm+Xu9)_NT*%OWBeo``VyFraK-wCc~V@Diy;qZ6oZ>9498+Lz4({{ApeJztG>0FlA1 z$!6!c+nY2XCJ%ZFu2p-qaJ1d&RI6KD;wFUP4uX!Lp#q$Jdpm&Y8Ja-993M>e3fe=1 zGzb98xL8RXz~u|v^LCPoEj*C_hl4XFJ60u&U1G1$P(e)*(1YCoH!k#h{iulJ z;gfvB;_5!(azn-P`i$&7`~cBaV`#gwR8lc}PyReMo@y{WB!6nKW#4O|$2VoU>O(Ez zlg9@<0eYI_RvL0ZMfH^?#9+vqFpog5(L-1!I-$gSDoq2c^NE2#RD`YLpi@n`HAX{@^T;rH7- z)VG3Wni?aj3lkN_xGYQCZ9>4?+Z&ifpT_y+a-ot8XDqPlyt0mFSYDs6m3cFPo>;)i zvMfqvR9fhj3c)Kv2raj154fvvz#zG#1`$Wv=#wFY3V?WejWKe=Qwn!(j4&eV(YT!z z4}Ummdq_EqF_F4x;8H787p2ec^UD`ka*)S2u3EYx0QkXgu!@7AlK$jH#8rkB+$GeY zk?Ux#mx*Ww6SOCAtCOCw7#d3Ny_Ear<6ubKp+ZZhmNXLrlufWwXD+nF0LkQ0O|30L zn3S{E=Y?EjmkxEp+(Q5l$-jDDJE?je;MfJXwQ;JqBm{si$Y5Uow9v0ahrY>cF z4(b5fB2TOXXvhS+9H1T{=~#EY&H)^BLe}La(ysD))~6lY6#?6}VQ}oBR~kXob8b+3 z_o!LI2Ufo{tpnQUW8==F^5@lz^a0zbBoQf!O`|uItXI=`) z@jiFQ$)#>kG8gkM+QY%Re*JO<7STl_M+uo~;rEASOV^nsX)YO6c@CUsa(hPzuxz*- z-{o>~t+91oD@z|o2`rKbLh>*;(*xb!+fJskYS^&vmGMDRS8EyS7-Gi&VPh<<`hkErk_Co>JOjs;U4=@SyFXatX8~@3Kfw<+?GG){xET!k(D!o*1PYZjDQ}P=J5~Dm{z` z)Rj_AWaW;+l!l-x7HMO`6_KI=`rObOmt095Pp2Na4=Go?0P*-Cj810W6`_N-Q0W3- z&kE8j+LS@Z_K&mSGAU`irBIQs2`m$FZQGS4ZSfr4gCz)ioNn5zKfJZA?eYx> zwiA>x8pw?c4@X>QivU+ZTNedRT!=Gw^#PZpS4}B2J{kOJ2S??!UDKXB5v%sGDxB4G z^m0GKtb&vq@1{uY_s0Znvt$r*qgDyiFt|MM%2i638;416Wjilw+~t)e4mNU`nQ6jX zxhsoo#EFe-sPdF(gNo*ohNv;CfWM@KfhcPT;~`wJk75K$(P9D)c(MKj4gDalfJ@-g z)_ZD4iGGyurLl=yZCuGHi~-6Jze3x#E&1QG`5$9pn^P${sa)Bzp+EhV8=v4Z?}&{` zzzK{fJthPY)gDw!+A&7BiMXRGsiAHvp%!y{Y)Nci)Y3=KU5rxY!kD%lxrYcZPZCM&@q8kD_LwQ@sMkb8Y{CG z+T_k6d0kf(M@mMiQ8!0{y@Z4ic*i`gfNWF|w(F{J&X$;ajDvjqZ zu;=AZm1@^}vPBFYUe`1=Zp2_EqqS#Cp;qx${U35^v=XK5YK3GJk!q^{Cbt0Kqy8(zBufplE1<@JfON660%R|Fz*<>7_xocqIQE@sGw**AZyARiiT>S)jBGhV%I+xdKkBuq#psq9qgXZG<#HZIY~$2E>A zU3GwXnQr(~b*wh#I%0eXn)58o<>WC8^3)@<;~%_SF1WGfhKX1NC~1qg!Y6Vf6Fluz z)rYm)*6PIrD>Vx-b)4Bz#@v*m?Ko6=ia4gu+uIw2fR$k3CY_1u)zjs2v9>m>FCAgb zP5Yr{!AYJyzT|eb-@n{)(eeOt>>-CWm`n^c|969i9RP?aga8h+w_^uRwX;-`iwrR#|zjG0|09Xhg9jI{__m9(KF z0h4XHVc|o48O_5GkmVjODTc41#C05ZA}^TSzH8;Ock6bxeT7@A%s6U-u9f3jj}{Z| zqLDq_ZY@G>zybQ?ehg&S%R6Jwgfe9f&m*EqMD1i6^%NeV7Dss06ET3|peJUDfmjkHopZf7j_F}wx4k+t-Fysa(*jo@9<6K8> z{K>rrXChGzeJi3Zv)WtS30B*akq%&wOa@Ldk=o&N1H?6H0ROHlQYlh~t}MVbSP)e! z3D`@^vc%i~7b-_Mm{%wny0?3h%fJ@;S5d4(0ufk!IZl_N+m)3&J7l;-wTM*qas~a+ zVM+Xv@-;+QM30n35tqlRAA16+f?N_@*>Y1raAUU79uBxv`!j?Hm;eD>n(0)osM+&q zNwYp!F(oQvPw0qC|E-9$z8&>(Dn)P^iA+f{ftPfLILbM0a@iuK>$nn005~=sIgnB01f~_CGWQe5ALS^^8&4s4B9XeSW~zQr=B)t7wxc$xaoci^&#SyJq}xS zAw!*HkkCvFL)5HZJWyFjS6~scnm8pfiNxGZI!aDkPk82(4xMKwH!;NQCq|M-L3lgH zNhM`iIiQby`SOKml)(s~i_|NBE_ua1gJI|ZtmBe9lKh?*q@5~hqk*zQY3+gWV~m&F zU=hB(y;W9+zBVH>CyXTokVK&b_w+Yq)98BN{2&CA9O-E-5or^%*_)(Q_}Xi`l2?(1 zslkW>1h#F%)Y#L7v9x+aZs4AI57Js$&~CWHQumJ^Kj7Yid4N|g%VKeWe$bMP;aaM; ztcD{C@v`tRwbo61W6zsUjWde-)=?U2jHlBHVnihmb%vo3vu}*?4oSTg8VON|AQ5R( z94e(Grv3Qw18-2_QKTk_bFuBgq*ULG=uoBnZ=f=&@aka1&(S zHAN~DW!tvX>4cLnU%r5(q?3$nO#|QqFo9q|W9D5i-dY*vu?bx0MI6srNpiCiv5_yZ zXUKW1>71#ul&RVJd|w|dRC$SeJ_BZFhe$8aM_Vtz0-oNsyJhwE_7*~@tQsAB2>0|E zh#ma!bUNVyDiuQ)0RSj|6U+4^Q9=GTy|7BQ(LpGPA(uFWbzLLVASaGXt0{D{ovRhU z0!4>fS(DXzMH~9ZbkHC#5HsML#d1EMLEuo@>?Q64=-akkasvb|&BBew2!Pbn`0XV( zII}9w)u_6Z<^e{gGr`=zo1FO|a&kySriGXmPR@ytkDSa?9Jg$e-WJZ}1~=S^x%=g% z@!E2es{>PF%MG9e+AvSt6%j>%&QxRF(1oYd3H`X)uH0GA8V)$!vla{xId2t^((q4X zFhEI({KUK^z)40jq<*q8HiYBTM(AzIKnKdOc+Qh0u)S&}j zAp})%`tx{eRW>J;Mu?PQH8LJCO+AWbK*m0{ETM`L(_UEnM(LM|+gy_Ebp_?zLU=t& z{yeO0qvv{Zxm-eS_98qDRMKf|pihlWiQih|)kY3Et=P`RC7{0O)R#0QzZ@ zw4t#v7@Zm@s3!^hh*%Gw4McM1b2^<)K!9|Lt+g~KO{pJg5=8LEaZNgIQXtl&g_c_MwCAOOqBhYU zA{BI`pwS5^lq=kFizFTK6J@tSau2FeMb zSw(C*Pqg!S%bX#6? zzkjE47!YEBoir=kDog}4pf}(HRuImy?j2B7YpNUtdQZx&G^a6W58FqTb~_~;0V4ni zFjC(Xvy(5bJ}4>U*t>-FN!mJ}GX7{auyMH>xqCvd-YyN&iWpaU&ck847aF>i9g-@& zF7OMgmi-z8^y=rlqG|BRdeb25$NRjcQ=O|nR5?1Zr%bZf&tVaCxP_s}x<>-8X%TU| zmH^0az4|b8cg@{KxN?ImVW|c!!}roNDs_AW2eg$79$ui$PzN_jB_dKqx5?8+>}}WX zmCb!@Y|onGBO-`8Jn?ksb3d?EZPMonKYK43Up^W6(^v$JB}=L_zkfVTBNdGUYHD=0 z&uq=+z#gaGu1t>n;p0IBNUykd5gH-nm?Yo*l5mzXOj4plNHb1>mK^nBUg$vE&GmIoj*x@fzZzJX5yw4G9$VViCkoF_4Jbh{9xtHzTSD zjfsrDH9_PfsVy@iUMa<0PXRqtAa8xFp1z0-WcN|q$eTsa0W5Mre$x9n;6N4%=O6BQRpDJy+liiL()1I%?6!n-K3VSvg{{r&w;rO+< zXK%l>&`9mOKVQjoCnEEF)M`cX$p2SKp%3E#+9OKoY#8D8J7PQ`g3>;(axE%m^S{XN zFa3LR|7<svjJ|52puin>($;3U8#hY^7MdJIm>ZO8Jn7p|bJ9zZ`L z#lEf7LS4O?y`mXaZ|!$*T>Ek$@uev*rTE~oGA5VBf}||6(W}5R=BEP)&{xWwK6Fh5 z@+!k#9~LLp_=^0-r}&PzsoeN#rdcgf>z2=@zh$T07V08Ebjy7#>OIK84+-r0->Fle z?XlLDY=1cdnCl(oAvat7WMD1mQOe|$J6B0kMv^zli+)&ole7#={}ucd!TsMi&m|>#bwpH!51qkO;{;sssq-Jq5Z%L)BS8T zGw*(Z>Zo}=Nn20jfMr>*uM_nfC~p)+Y4F__RArdNG*XwhgA%rz>)yX=eIgT7IS};X z08T;xfS&8hynX%p6@wUT+wAR>2LhgQO+lTm{h5%dC zQf$&L?IWy5p)+VWO1Ynb1MC=nS$euf7!A|#e-9>Lc4Ah~L;!o=ws*ISQo{rT^7+j~ zP^%hOHlOY!4=7{bh?t7EV=>Y*2FBa3+z+AI*7Mb%A~3V_VIVi))0;Imh}-Wf0#;bS z>Ypeeg&I;QNQZZW3YTTESJ2Sy`Uz>|bB?F-5g}#;Aj0ZEQ8mCCC_yDOZ1a!hHy`lB zD+1(6>4h^Jss1-2hQ0ivYjJG8f4Uo0PjQRQ=Zk@=5Q6K2S>Kb_*0U)Ket!X=KTfF>QbtM==JT{wmcV%ni4QYlSIZyj^#KH(}|Hoe+5(Tii%}y{Vr(!c>STk@ZC)lPLG<`^lme~ zi-2AK`?Jt6sh?f1Au|*Cb&AHk%l%y>H22{Jm9&$HKdQslkAZ$WpYcrGoLt#U$fZ5< zr{ULN=ST8P5j5ig7MUqVMKjaboe6t|@y7zXcbz-i7s&gR$nL-<=l&oE5PdWgOiqU1 zu~S9%b}Z3D!t=QX@k-MK^&$g*u-fA3%6YVB{7}P-JXdSFh5nNf(CZGXi4cmUSm5@9t%ey>1}CZFCK6-)2+=Av}@Y=R;BOPc|p4#As1fl^B`5X zRs?&=m%rS(_H>c*%ymHTqD*WQCGRs+A_aNUvj3V! umwRaFA%M-6t5|+~nda=mmx`cY-u?&Wr}u8JoUl&-0000!4&|NGB> zsa8@-%uGbMiilqApD08$O%pzqypRkO)L(tBO%#RKVqZf!o!(PQ^E~T2cx@O4+h-k1 zN*C0@W^}%3z7^s`wfC7>L{dsx|1b>r236^=cwrpJYP%C1S|afE7YmWj7DWW$(3`!L zXww#3o9)^+Et&dXDIQ&jfGWaq)jzdTQ2QY`+y%RpqEi7E^yl$zboQipO`BF6=nMX) zivtSW`aka*b2Pl@xuq$zh#TCaK!(6JhdB2D9m44FP?~qpMI(&^(BJPb;;EjjL`EG zyOHak+OXBWH^)FuPp^tj^v|OK?OraI^Z7gs!!%8&(X@#6S%;46?T3`DO>c`n1SpAl)7T?8s4fen!)a5c0NHP6jp%^m^@`_`7vNy> zoxZPCj={=1rTOoNfP zJF=P;#$n#FK}x<7rW_C&a-{d;I8M_9m*hOpYoyRpK0iOD7Ppg9!VUVS;ZMadwGUWP zqg)}dejcuqxZ)7@vSHgF5K^LikJijJ<2IXuKk<{oo#N0d>eE&q6c3xT*YpCw?NVmi z{(y*+fCL3S$Wxpy(1rzXaVJnsePgjYeWTs|96)jhWbEh<>3 zn*(~{81_cYSsX-7|8g8a&3Gga6eW4ioxK{1d0%gEq={b&?P6QB@ zQ52pqMTBe7tIxoJZ)LYBqF^GCY@9@O+tv#J-56?hdVkOl@pwP4mG5j}k^roQ5L6L4 zhSs2`b3hb#&&_p%JdOMh7C}8T`=e?Q(cK&n&4H1+@>KFCs?0`h4hWTw=m#6y#NQe_ z7D=9HBMQg9AbJ{K-i_UGAqK@u%U9U@EZ>U&>M-okFR%Q3As~wDx3(0qigUnYg9~q| zLQS7r1k)avR>_cDyAN&}EG!@F`Wd~y#uM!@Zcg;SRlX&>@F5QPcA4HoCihuj`t^(N z)PlaTZRQ?(4$axqQ1b|v}OcxS5CC}0#>-wywW|MkMs{Na`ZZ5>M@F4cjR74 z@1G8OIdq*dNpnAi91%7ByTd(Fv<{i%r@g)5f64#Qb;i^gW%th{e`-n|Isy$-yKQ-i z8}c_L|5uBkXQu=Djg%icZk-V#K%KyQcWia)*A3TWHTa2{tJ-&?e&6$G4RKV)!8<;g z=-=`LhWI^fLBCPqJl_Zfn&>MKAhOTp_Ut))Z+{*a9mgi<{Fei^Wp@?IM-kR;1RSzo zmk!;F`qcV8v4=5n|8l@qtJ{i$-sk<8|n4B7^>ZPIfbT(P{z&3zdx*L3G=J0i3;=Uz~f@mUTR#d+v_zg z%Z$aeom@S{;|&cfNnNx2tl#Y;)!cEk{JH!kWa>0RBu=EY^nC?)ejSEsttqV|T}HQ5 zIr|Y^uS*)C+t^V9u6K)|)Oi&_I6F4(3T=Ni^vLv0L5v+T{IJ*a)_*MGq7lBC=lu9j#V(wyV%DZhW!R;^%*ocYz^CEJ&T(B#4SPNc8jo6@x)IfvVnLW?*<#NG? z@9*y)A0MaF>Fw~U0`!` zfI~z+nm9mj0A*xfnx@I7p8?{>wJcj@Q?duh>1#j|FoY-Qz&MT|{As!-s^$E|HOk?l zsXVoBcPDQwkP)6ECULAw@uj77`w51vWplnli-6`l&qzEx48tFPzE5ibNzQ8#5gLbWHiK$`h{xxTO%2S%D`7{*gd$q0#NsD%sr~#Hu z@uRMCznC&+wc8m2WQIWDIJ3+79x_K&sZ3R%q zX0f-ow~vpHar_c801e=RgJQ&;2?H)ELdWo2zqQ0jM1TJI=Wr|NHW2XR#}B+;6d|Jc zyt>GPO&w;`D+ge}eiDx6lj86iJl7q4%4pJYs2zF_OuWCpzrDTT3E+Y`8I?<3@GS}+ z0Sy4X7CRy~NAs{d;Q@V+Jj)PXE{uTO-1;ib#8UN17{m56ux15})L8TtXBTlkFp!l( zut5|kIClgyBp3n@i?-OL|I$7K^!lcr9dOOICmz?`l_CQW=qteLbGK*Z7 z3u&Ht;6-w+$|AJJbqdvi(bB?rnoi5upnU@q+BOlLhSU1zG>(6a<2a}D&(DSSty-x! zRGWJ-(?WDmP5l*fxS_)1=g*%Uh+Kcz$7Cy*i_NvB*C)IvGX{p5pw;31e1qarHp97I_jP6YAYJyXJ zem!;c*;cXQ$efRi(bP7JRF4w8kmfvY6v)&))PRh_^fhB2swM zM8q3ey|B`1?LD9YZ5s%{Iik}vLH)z~%v{Z>LxnL;YBCYb%*rB^MGHn0PO59}mQ?h_6WAnw;Hk#dl&TU-I_0FG4KdxXJ8 z=aF)rMhR*j<#{k|B}1zr)m29{G?n#M8R{dgmW8_MKE{^B&?7^8HV9}KC2f2PdL|V3OWF;n z=nqJNDZJrnOR0hY+ZZ!@+p3Boybo3tL&e%9;7nnJtC|qBX)u}BI-)s7GrppWlB+|V zT2|HLExG9CS~ATk(uhUGbFLK~DR&H{ThR(rPR`ti0I9hXI6vVViWz==dwYY&5jChs z#oKGSnF&M@U<(CeM?@k7U?ndS9wI?ie?S8Ps3_$I7Ut~S3XBbO$oZ0jY6-a6!NRX} zIGhD~W6;#6k-Jk*bZ`$>;mks1Oh@JCDDQO;*w?V`k{ zg5*pKM5S@9I6)q24`?55WN$;p^Z*w;x|Ez1p&GQI{qfH&mw?WIW7*mv+_Q~o^3)nZ z+)AD*;4oCn%Mu`vACrfT86zIMy!cQ#mNc)6rbS+Xhuaiy}Upe zUZC9Ng1G_9RIAim0NE*xYO@9ExAeizKOrK~D$<_iK{hfD9L+gq3LoaKQx)}PTq)1x zS(p|Er_x>K3mZop;Lf>gOhl@tX69CGM`!1$?{n)Xu-^i~;uH#TKo*UTt_Cq!ko9aT zZ#=Ie4**qi#+w+xcq=e2;#ZuEM>z{h4NTgibgTe~HiDU>z%oTZp^rj5N^bvYbYQAB zQ^;uPh<@?7jr0wLBRi9!{%SdZh-53)wJoo??|4Y5DXEPti)_3mVzft#1Ig7H_Uiz} zBn6$=8*DdhMLw-&Jv^5S%kqv zB~n_1*scS#XOc%mwZ+H|1Q1oH$6_hZ&QzOnVLIeXUy6eRMWoP4`uneR4H;;mS*6J8 zVbH}_(wxt)3o$S(pbrFCTgonV!a;$UORElLFBB)vku}y+%v)ZD5S5$AM0V`WQ<$P4 zsDYZQgoQg9g++Uw@;D{02u-TqqF^yOj-&bmIQQcJ{P~k=NpE2V1mLQX3dKX8W*DvW z@D(aqc$W&IE8ejnc&CVh|Q*H-~$jIZU5~5#qZ1Hm5et_ABO83%_V@0HR=hn#Mz z_(N~lC5k{V+1UX(2iCZ*zk*%~Qx#!4M3YUn|j@^6iF zWF6HIY~AHmnIladDb*|=Zlp*<8=uM zIFEu*xb{wHana6gS4<-*YhxN?m$9Zg@z`HkeZtlZtx!XOMl|FG-od$BDPJ_nmdzlt zw}??gs~jT%0va|CaYhC2hhQ$_%xr&pQW!`uAvffYRz7L0z2xo-a`q+)qT#HLPc;WD zZJBPOp-OFEg49;RJw!@115ta0EK=DFQ+3u$fP*4oFBGfdvXOZLUQ(m;tM8Qf@T%f}>)`*ywjX}%jlG8*9pu%uw zO;YFUmf!&(UQ+ceXV5Kk!)*@)Y3?9u_%>3}B6)X$xelkgf%*OY9s1#%JBTI`@&0!T z5}y)P+ygzS#CKVPiMB15cNqF#llE7d>jSLvpyp->5Ru5IBU>4yC0IrfQI7%|J&~YG zbT8^$5PQpb5ni{$3=O~?1%^Tpb4 z9)bWWkG$aOxKJi)l7GWV!~p`Nj|sevq528uL9g-v2Z)r3&m*69gn+&8FNyq!s=HaS zWeG@tAi5%;>Z=rIF)l{sZEX^3DeW1e>iQo#Vq563^Tm1qy&LyZnpo6mXjh0pz%mCE z(#n!d=PW8xG5^vY=vyd6(HMu2e`9GHA>aCFPK6*!HNoEuixpgT^|= zBkys&rN5G+GVpo<^e^tMSawr z!sVoid, baseTexture:String, normalTexture:String, shininess:Float, specularColor:Vector, + uvScaleFactor:Float = 1) { + var worker = new ResourceLoaderWorker(() -> { + var diffuseTex = ResourceLoader.getTexture(baseTexture).resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + var normalTex = ResourceLoader.getTexture(normalTexture).resource; + normalTex.wrap = Repeat; + normalTex.mipMap = Nearest; + + var cubemapTex = new h3d.mat.Texture(128, 128, [Cube]); + var cubemapFace1 = ResourceLoader.getImage('data/textures/acubexpos2.png').resource; + var cubemapFace2 = ResourceLoader.getImage('data/textures/acubexneg2.png').resource; + var cubemapFace3 = ResourceLoader.getImage('data/textures/acubezneg2.png').resource; + var cubemapFace4 = ResourceLoader.getImage('data/textures/acubezpos2.png').resource; + var cubemapFace5 = ResourceLoader.getImage('data/textures/acubeypos2.png').resource; + var cubemapFace6 = ResourceLoader.getImage('data/textures/acubeyneg2.png').resource; + cubemapTex.uploadPixels(cubemapFace1.getPixels(), 0, 0); + cubemapTex.uploadPixels(cubemapFace2.getPixels(), 0, 1); + cubemapTex.uploadPixels(cubemapFace3.getPixels(), 0, 2); + cubemapTex.uploadPixels(cubemapFace4.getPixels(), 0, 3); + cubemapTex.uploadPixels(cubemapFace5.getPixels(), 0, 4); + cubemapTex.uploadPixels(cubemapFace6.getPixels(), 0, 5); + + var shader = new DefaultCubemapMaterial(diffuseTex, normalTex, shininess, specularColor, uvScaleFactor, cubemapTex); + onFinish(shader); + }); + worker.loadFile(baseTexture); + worker.loadFile(normalTexture); + worker.run(); + } + static function createDefaultNormalMaterial(onFinish:hxsl.Shader->Void, baseTexture:String, shininess:Float, specularColor:Vector, uvScaleFactor:Float = 1) { var worker = new ResourceLoaderWorker(() -> { @@ -294,10 +327,10 @@ class DifBuilder { 'beam' => (onFinish) -> createDefaultMaterial(onFinish, 'data/textures/beam.png', 'data/textures/beam.normal.png', 12, new Vector(0.8, 0.8, 0.6, 1)), 'beam_side' => (onFinish) -> createDefaultMaterial(onFinish, 'data/textures/beam_side.png', 'data/textures/beam_side.normal.png', 12, new Vector(0.8, 0.8, 0.6, 1)), - // 'friction_low.png' => (onFinish) -> createPhongMaterial(onFinish, 'data/textures/friction_low.png', 'data/textures/friction_low.normal.png', 128, - // new Vector(1, 1, 1, 0.8)), - // 'friction_low_shadow' => (onFinish) -> createPhongMaterial(onFinish, 'data/textures/friction_low_shadow.png', 'data/textures/friction_low.normal.png', - // 128, new Vector(0.3, 0.3, 0.35, 1)), + 'friction_low' => (onFinish) -> createDefaultCubemapMaterial(onFinish, 'data/textures/friction_low.png', 'data/textures/friction_low.normal.png', 128, + new Vector(1, 1, 1, 0.8)), + 'friction_low_shadow' => (onFinish) -> createDefaultCubemapMaterial(onFinish, 'data/textures/friction_low_shadow.png', + 'data/textures/friction_low.normal.png', 128, new Vector(0.3, 0.3, 0.35, 1)), 'friction_high' => (onFinish) -> createDefaultMaterial(onFinish, 'data/textures/friction_high.png', 'data/textures/friction_high.normal.png', 10, new Vector(0.3, 0.3, 0.35, 1)), 'friction_high_shadow' => (onFinish) -> createDefaultMaterial(onFinish, 'data/textures/friction_high_shadow.png', diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index f5610585..2b4b01eb 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -138,38 +138,55 @@ class InstanceManager { } if (isMesh) { var mat = cast(obj, Mesh).material; - var dtsshader = mat.mainPass.getShader(DtsTexture); - if (dtsshader != null) { - minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); - minfo.meshbatch.material.mainPass.addShader(dtsshader); - minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; - minfo.meshbatch.material.mainPass.depthWrite = mat.mainPass.depthWrite; + var minfoshaders = []; + for (shader in minfo.meshbatch.material.mainPass.getShaders()) { + minfoshaders.push(shader); } - var phongshader = mat.mainPass.getShader(PhongMaterial); - if (phongshader != null) { - minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); - minfo.meshbatch.material.mainPass.addShader(phongshader); - // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; - } - var noiseshder = mat.mainPass.getShader(NoiseTileMaterial); - if (noiseshder != null) { - minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); - minfo.meshbatch.material.mainPass.addShader(noiseshder); - // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; - } - var nmapshdr = mat.mainPass.getShader(NormalMaterial); - if (nmapshdr != null) { - minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); - minfo.meshbatch.material.mainPass.addShader(nmapshdr); - // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; - } - var cubemapshdr = mat.mainPass.getShader(EnvMap); - if (cubemapshdr != null) { - minfo.meshbatch.material.mainPass.addShader(cubemapshdr); + for (shader in minfoshaders) + minfo.meshbatch.material.mainPass.removeShader(shader); + for (shader in mat.mainPass.getShaders()) { + minfo.meshbatch.material.mainPass.addShader(shader); } + // var dtsshader = mat.mainPass.getShader(DtsTexture); + // if (dtsshader != null) { + // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); + // minfo.meshbatch.material.mainPass.addShader(dtsshader); + // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; + // minfo.meshbatch.material.mainPass.depthWrite = mat.mainPass.depthWrite; + // } + // var phongshader = mat.mainPass.getShader(PhongMaterial); + // if (phongshader != null) { + // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); + // minfo.meshbatch.material.mainPass.addShader(phongshader); + // // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; + // } + // var noiseshder = mat.mainPass.getShader(NoiseTileMaterial); + // if (noiseshder != null) { + // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); + // minfo.meshbatch.material.mainPass.addShader(noiseshder); + // // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; + // } + // var nmapshdr = mat.mainPass.getShader(NormalMaterial); + // if (nmapshdr != null) { + // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); + // minfo.meshbatch.material.mainPass.addShader(nmapshdr); + // // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; + // } + // var cubemapshdr = mat.mainPass.getShader(EnvMap); + // if (cubemapshdr != null) { + // minfo.meshbatch.material.mainPass.addShader(cubemapshdr); + // } minfo.transparencymeshbatch = new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene); + minfoshaders = []; + for (shader in minfo.transparencymeshbatch.material.mainPass.getShaders()) { + minfoshaders.push(shader); + } + for (shader in minfoshaders) + minfo.transparencymeshbatch.material.mainPass.removeShader(shader); minfo.transparencymeshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); - minfo.transparencymeshbatch.material.mainPass.addShader(dtsshader); + for (shader in mat.mainPass.getShaders()) { + minfo.transparencymeshbatch.material.mainPass.addShader(shader); + } // minfo.transparencymeshbatch.material.mainPass.culling = mat.mainPass.culling; // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.mainPass.getShader(PropsValues)); diff --git a/src/InteriorObject.hx b/src/InteriorObject.hx index 597fea2d..9aeaf8f2 100644 --- a/src/InteriorObject.hx +++ b/src/InteriorObject.hx @@ -10,7 +10,7 @@ import h3d.scene.Object; class InteriorObject extends GameObject { public var collider:CollisionEntity; public var interiorFile:String; - public var useInstancing = false; + public var useInstancing = true; public var level:MarbleWorld; public function new() { diff --git a/src/shaders/DefaultCubemapMaterial.hx b/src/shaders/DefaultCubemapMaterial.hx new file mode 100644 index 00000000..200a2078 --- /dev/null +++ b/src/shaders/DefaultCubemapMaterial.hx @@ -0,0 +1,104 @@ +package shaders; + +class DefaultCubemapMaterial extends hxsl.Shader { + static var SRC = { + @param var diffuseMap:Sampler2D; + @param var specularColor:Vec4; + @param var normalMap:Sampler2D; + @param var cubeMap:SamplerCube; + @param var shininess:Float; + @param var secondaryMapUvFactor:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + @global var global:{ + @perObject var modelView:Mat4; + @perObject var modelViewInverse:Mat4; + }; + @input var input:{ + var position:Vec3; + var normal:Vec3; + var uv:Vec2; + var t:Vec3; + var b:Vec3; + var n:Vec3; + }; + var calculatedUV:Vec2; + var pixelColor:Vec4; + var specColor:Vec3; + var specPower:Float; + var pixelTransformedPosition:Vec3; + var transformedNormal:Vec3; + // @var var outReflectVec:Vec3; + @var var outLightVec:Vec4; + @var var outPos:Vec3; + @var var outEyePos:Vec3; + function lambert(normal:Vec3, lightPosition:Vec3):Float { + var result = dot(normal, lightPosition); + return saturate(result); + } + function vertex() { + var eyePos = camera.position * mat3x4(global.modelViewInverse); + // eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); + var cubeTrans = mat3(global.modelView); + var cubeEyePos = camera.position - global.modelView[3].xyz; + + calculatedUV = input.uv; + + var objToTangentSpace = mat3(input.t, input.b, input.n); + outLightVec = vec4(0); + + var inLightVec = vec3(-0.5732, 0.27536, -0.77176) * mat3(global.modelViewInverse); + outLightVec.xyz = -inLightVec * objToTangentSpace; + // var cubeVertPos = input.position * cubeTrans; + // var cubeNormal = input.normal * cubeTrans; + // var eyeToVert = (cubeVertPos - cubeEyePos).normalize(); + // outReflectVec = reflect(eyeToVert, cubeNormal); + outPos = (input.position / 100.0) * objToTangentSpace; + outEyePos = (eyePos / 100.0) * objToTangentSpace; + outLightVec.w = step(-0.5, dot(input.normal, -inLightVec)); + } + function fragment() { + var ambient = vec4(0.472, 0.424, 0.475, 1.00); + var shading = vec4(1.08, 1.03, 0.90, 1); + + var diffuse = diffuseMap.get(calculatedUV); + var outCol = diffuse; + var bumpNormal = unpackNormal(normalMap.get(calculatedUV * secondaryMapUvFactor)); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var bumpDot = ((dot(bumpNormal, outLightVec.xyz) + 1) * 0.5); + outCol *= (shading * bumpDot) + ambient; + outCol += diffuse.a * cubeMap.get(reflectionRay); + + var eyeVec = (outEyePos - outPos).normalize(); + var halfAng = (eyeVec + outLightVec.xyz).normalize(); + var specValue = saturate(bumpNormal.dot(halfAng)) * outLightVec.w; + var specular = specularColor * pow(specValue, shininess); + + outCol += specular * diffuse.a; + + // Gamma correction using our regression model + var a = 1.00759; + var b = 1.18764; + outCol.x = a * pow(outCol.x, b); + outCol.y = a * pow(outCol.y, b); + outCol.z = a * pow(outCol.z, b); + + pixelColor = outCol; + } + } + + public function new(diffuse, normal, shininess, specularColor, secondaryMapUvFactor, skybox) { + super(); + this.diffuseMap = diffuse; + this.cubeMap = skybox; + this.normalMap = normal; + this.shininess = shininess; + this.specularColor = specularColor; + this.secondaryMapUvFactor = secondaryMapUvFactor; + } +} diff --git a/src/shaders/DefaultMaterial.hx b/src/shaders/DefaultMaterial.hx index aeba064d..e134e269 100644 --- a/src/shaders/DefaultMaterial.hx +++ b/src/shaders/DefaultMaterial.hx @@ -44,7 +44,7 @@ class DefaultMaterial extends hxsl.Shader { outLightVec = vec4(0); var inLightVec = vec3(-0.5732, 0.27536, -0.77176) * mat3(global.modelViewInverse); var eyePos = camera.position * mat3x4(global.modelViewInverse); - eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); + // eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); outLightVec.xyz = -inLightVec * objToTangentSpace; outPos = (input.position / 100.0) * objToTangentSpace; outEyePos = (eyePos / 100.0) * objToTangentSpace; diff --git a/src/shaders/DefaultNormalMaterial.hx b/src/shaders/DefaultNormalMaterial.hx index ac622aea..d025111f 100644 --- a/src/shaders/DefaultNormalMaterial.hx +++ b/src/shaders/DefaultNormalMaterial.hx @@ -38,7 +38,7 @@ class DefaultNormalMaterial extends hxsl.Shader { outLightVec = vec4(0); var inLightVec = vec3(-0.5732, 0.27536, -0.77176) * mat3(global.modelViewInverse); var eyePos = camera.position * mat3x4(global.modelViewInverse); - eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); + // eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); outLightVec.xyz = -inLightVec; outLightVec.w = step(-0.5, dot(input.normal, -inLightVec)); outEyePos = eyePos; diff --git a/src/shaders/NoiseTileMaterial.hx b/src/shaders/NoiseTileMaterial.hx index ea6e25dd..71e91e85 100644 --- a/src/shaders/NoiseTileMaterial.hx +++ b/src/shaders/NoiseTileMaterial.hx @@ -41,7 +41,7 @@ class NoiseTileMaterial extends hxsl.Shader { outLightVec = vec4(0); var inLightVec = vec3(-0.5732, 0.27536, -0.77176) * mat3(global.modelViewInverse); var eyePos = camera.position * mat3x4(global.modelViewInverse); - eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); + // eyePos /= vec3(global.modelViewInverse[0].x, global.modelViewInverse[1].y, global.modelViewInverse[2].z); outLightVec.xyz = -inLightVec * objToTangentSpace; outPos = (input.position / 100.0) * objToTangentSpace; outEyePos = (eyePos / 100.0) * objToTangentSpace;