From ca50b58d34e78594b3585a0198d8d120418d7711 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Wed, 28 Feb 2024 21:10:57 +0100 Subject: [PATCH 01/15] 3DS init and some demos lol --- demos/3d/simple/.fscache | 2 + demos/3d/simple/cube.dae | 101 + demos/3d/simple/cube.scn | Bin 0 -> 5101 bytes demos/3d/simple/engine.cfg | 5 + demos/3d/simple/icon.png | Bin 0 -> 3639 bytes demos/3d/simple/icon.png.flags | 1 + demos/3d/simple/main.scn | Bin 0 -> 1637 bytes demos/misc/simple_audio/.fscache | 4 + demos/misc/simple_audio/engine.cfg | 5 + demos/misc/simple_audio/icon.png | Bin 0 -> 3639 bytes demos/misc/simple_audio/icon.png.flags | 1 + demos/misc/simple_audio/k_jose_-_its_time.ogg | Bin 0 -> 1356839 bytes demos/misc/simple_audio/k_jose_-_its_time.spx | Bin 0 -> 452838 bytes demos/misc/simple_audio/main.scn | Bin 0 -> 1590 bytes drivers/unix/dir_access_unix.cpp | 6 +- drivers/unix/dir_access_unix.h | 2 +- drivers/unix/file_access_unix.cpp | 4 +- drivers/unix/file_access_unix.h | 2 +- platform/3ds/SCsub | 13 + platform/3ds/detect.py | 92 + platform/3ds/godot_3ds.cpp | 59 + platform/3ds/logo.png | Bin 0 -> 2162 bytes platform/3ds/os_3ds.cpp | 307 +++ platform/3ds/os_3ds.h | 133 ++ platform/3ds/platform_config.h | 30 + platform/3ds/rasterizer_3ds.cpp | 2007 +++++++++++++++++ platform/3ds/rasterizer_3ds.h | 802 +++++++ platform/psp/SCsub | 1 + platform/psp/audio_driver_psp.cpp | 161 ++ platform/psp/audio_driver_psp.h | 83 + platform/psp/detect.py | 2 +- platform/psp/godot_psp.cpp | 7 - platform/psp/os_psp.cpp | 4 +- platform/psp/os_psp.h | 12 +- platform/psp/rasterizer_psp.cpp | 7 +- scene/audio/stream_player.cpp | 3 +- 36 files changed, 3824 insertions(+), 32 deletions(-) create mode 100644 demos/3d/simple/.fscache create mode 100644 demos/3d/simple/cube.dae create mode 100644 demos/3d/simple/cube.scn create mode 100644 demos/3d/simple/engine.cfg create mode 100644 demos/3d/simple/icon.png create mode 100644 demos/3d/simple/icon.png.flags create mode 100644 demos/3d/simple/main.scn create mode 100644 demos/misc/simple_audio/.fscache create mode 100644 demos/misc/simple_audio/engine.cfg create mode 100644 demos/misc/simple_audio/icon.png create mode 100644 demos/misc/simple_audio/icon.png.flags create mode 100644 demos/misc/simple_audio/k_jose_-_its_time.ogg create mode 100644 demos/misc/simple_audio/k_jose_-_its_time.spx create mode 100644 demos/misc/simple_audio/main.scn create mode 100644 platform/3ds/SCsub create mode 100644 platform/3ds/detect.py create mode 100644 platform/3ds/godot_3ds.cpp create mode 100644 platform/3ds/logo.png create mode 100644 platform/3ds/os_3ds.cpp create mode 100644 platform/3ds/os_3ds.h create mode 100644 platform/3ds/platform_config.h create mode 100644 platform/3ds/rasterizer_3ds.cpp create mode 100644 platform/3ds/rasterizer_3ds.h create mode 100644 platform/psp/audio_driver_psp.cpp create mode 100644 platform/psp/audio_driver_psp.h diff --git a/demos/3d/simple/.fscache b/demos/3d/simple/.fscache new file mode 100644 index 00000000..a6b02d80 --- /dev/null +++ b/demos/3d/simple/.fscache @@ -0,0 +1,2 @@ +::res://::1708965924 +icon.png::ImageTexture::1708965924:: diff --git a/demos/3d/simple/cube.dae b/demos/3d/simple/cube.dae new file mode 100644 index 00000000..d9293d60 --- /dev/null +++ b/demos/3d/simple/cube.dae @@ -0,0 +1,101 @@ + + + + + Blender User + Blender 2.80.75 commit date:2019-07-29, commit time:14:47, hash:f6cb5f54494e + + 2024-02-26T17:50:03 + 2024-02-26T17:50:03 + + Z_UP + + + + + + + + 0 0 0 1 + + + 0.8 0.8 0.8 1 + + + 1.45 + + + + + + + + + + + + + + + + + 1 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 + + + + + + + + + + 0 0 1 0 -1 0 -1 0 0 0 0 -1 1 0 0 0 1 0 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

4 0 0 2 0 1 0 0 2 2 1 3 7 1 4 3 1 5 6 2 6 5 2 7 7 2 8 1 3 9 7 3 10 5 3 11 0 4 12 3 4 13 1 4 14 4 5 15 1 5 16 5 5 17 4 0 18 6 0 19 2 0 20 2 1 21 6 1 22 7 1 23 6 2 24 4 2 25 5 2 26 1 3 27 3 3 28 7 3 29 0 4 30 2 4 31 3 4 32 4 5 33 0 5 34 1 5 35

+
+
+
+
+ + + + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/demos/3d/simple/cube.scn b/demos/3d/simple/cube.scn new file mode 100644 index 0000000000000000000000000000000000000000..d28d5903476ee855fb094d4c941ff1dc9e536ca1 GIT binary patch literal 5101 zcmbW5>y9k75ywqJLV$!zxCRnfZb`W9>^aLh3Q>~bA|WAxK<7Mw@pOB3TJ&@`?Vdfm ze1MU70A3|e!14g_i4S=kQa^WBk9*kV1C~6l{#UtNE|<&p+`4`1T{D!sl#urKQa^Ut zr#`=(`O2Fg9!{9QfP6#x{7UMfiKF~R$agmjZ+;DSXdaU0?W$P2uBfYzOLy*D^MGKj z5A~+a{H$_oACYD0PQvW82*slG<`I$Uk-XjrU_+7nJb{bq)VG~oy37aj;3&PR!pb4} zhY_kP+trPEd<4qkWYw)*V}-Lhy>6ZuIayu0wsq&W2sX4Q3-d=|HLi8*FcTxH+^*}~ zr)ch*Ze{b<-AU21sJy*X-?WeN|-nz0`IrC?R-Q$P>b!(#y=IKlLOerv0L=eWcnb8u@y(LekrEY9F|8!Cl|2dQH_mf+sr06yC z#XUVr3XsJX$xPDEVaO`;HMvd-{&|m$_Mz*1Te#A^DhS%Bj65=aD<5Ptav6%1{@p-J z6FY!YutjNRtMZJjG?|FmP%s4={aAdrR0?aOdRRQAi8rN5iAod7O0!sefB)SFbFIc~ z=R_0uv~1_3yUTEvr?=7cwb7 z|9v2m*h6_vs_K4TXvJSh@D~&Or3C+Lg8wbS|DND4C-^G~PLSxhuO;~F34WO1vjiuw zKJ;M~6=8`l*Mv9qq*X4Rhw!Qfm9Od?kf);^^1ibe!X zYCKz2a*S~RMr_(*U3A51e^#@SaESVN{`6xp29EBXzP%u@q-qPD)_t7s6jNH;`M~Ep zt>BmO_OVn>c`0_0j1R3cil;3+k1Y@x2EjXC?~OX=U2eOkUR z2G;f}8velBUQJ_rEZe~rKK5uJ3hSWdGCJzossuKtwt?^LNypV5+Y6E(b?2`Gu}@{c z{f{wk4faASj!cT1L`HFBQhY1@DdXh!lsR-L z=-{A14>~w#(1Q*R3iP0Zg9bh5;BY|?Iyg|S58u*UTIiQPI~em=Drt~$u%9tWS;3Iz zpOK1GoX+h=9uRVHGqf$%jpRwWk;wHLyA|kKSA}@}V+QdhQIth@K0YcKBqm_gke=VK zLg%W?M-$@XBt*}g_dvRu@1;h(A*VS7Gh^bZwzBFN(k*N*y!7ndz6 zc{-G~t?PA|+RfWx;pD|=NT*mGR!^-W_7I};nS;f_ipBQ!VD}3rp-^u%dnAv|5 z5>Jh+z(Ss;v!<=(RTuil7T1iCll!IHl%4G#V_hL{M

W%-J`V2;_*hDj+k89 z<%UT(?sSA0;%+0)L@^=8B6~p6a=A29)6 zujDK@I@$NMWJ3C~475ZfElWVFW0FVEtyz!^i0-uDCMve79gIs>#5P>an4|*wlJT&O zl!9HvH+FG_#x9C_lt}A63d-yPf7;mNJbIpC4*T~`?tHu`FRmTkeDnCm8%IaiuD|JT z`uxV?#&U7<*yT5l|8bPNIAx~g^iP?%we7MA(YtsAZ|vAvSqM)T9nb7|%c7L)XV`_p zv}^pwV^sV6q-)*C?v?*B@^S1*ef zgP!$jea{@jo+Tb$;r%~C(LW18as9~Qf0{nMU% zTW=dlcE^8J-Ay*{q(oh9OO|A7;eH2=!1Jp z5C0zc2KWk?215PXe!_SUJO=(_`Q?+}^=cr_UI+yL7Pwg`9{-fgeKe$#8Ss_y?O8>1 zDB#}G!+!<-;e!b-1SoaIE+k4R;A;IqOA-IJ{PM{^Hm_;TFCScZ03nDbM;V)%qgpAV zJa@3iq{h_D5(tUasPG|#2dFpdnBmCJC$dwcx%}?$A+UhJ?En2k2yd7%l9_Qv(pe_s z$=3DPdz<7oUk}trW@45vW^T29?^jA3og8v(-Z~!X}2)dbauR$Nz~^-i5>BH$VGpJf)DL(?!{?OWC$qeYZlra&i@RNhdS! zmtQ`a(}K7E+j^sZ>CS}I_|=176Vh}vAy9x2UH%n4p5i#adv0Gh7VeQWBY^1YLkKW+ zo$KS**gn_}6nVMfVTL2=iR{#S34C)^({GM#DFjl;t~UqZcplTq42Bu?F9^}`5kjJe zOr}zqR$ph~_bq*zS9Gp{%-=}-dH(X~!Duh&(r0{fdI10_HKf#oj|M`J%1#s3^p=q4 z;))6g@Rg1qa)YN&Q&A4fQPDM z6V;6io9j{|e#S`}QtRtDd!gaER~`ZZLIc>^MerG^SdFW9H6ZG??bH1LIyhee1B`DG zj8``>%Z~x26w31uasdBxfehy=K+^^=>5$16U;c{8coOf!nB|4YMq}K+|7(nJ^uo5< z1;bLC$WDFRD+b7n&+z5qJ%kyjbdm>Dmo~?5EOKxD4pAf2GjRE-;3*Zv1J|()lk!Qv zjki-Cre>E|y19g{g{Tydy81E05%gXJqNyxj%-+URin;6rbJ+==uD_}*?r{yWd{MZyDi44zI{t(Oxisa}NU(VfWwf$^rhH9lq`8e0rm$fBI zr%q5QW)|+9D||aXHQ_IU6oRO3Ff)I*^Lq13Vq}Whkuf}V{&e;!3w{xAo>E*-jgTI{ zarz8^)O6-=ECeR>0b-+16it7ybbSFCOpg-4b6qSah_3z&Q1@Is*8y5XK=J0yGE&Ia zLgW78{4vQY#Yz>22BzThah|AdM>J8Z1&u>NkFTD5_$Ys@Xq5RFCf&YM;P zvp&y+J=bG&e557(Nuk91)h%{5b1l7^kuVEOH&6Q;0>fE=0NZhx|7^B(X=81N=P#b2 zX?|BPUaYV%cbi+E&oOmloVC}RJ-bp$VHgIwp<_2JT(`HPG)-gj+8D0u@#CXs931A5 zng&X-va-TgUq56dn?~0)rf*EJv9^t_>jPWeP!^y(MI>TkM*IcS@!<*2pFhRWL#>>> zVT5?Q_L|+z9Ft{(kjd*;{yw0PXGjFjDwc?~ zc76<9Cln6#vi&S^ zzx&^RCbxA)@ zsgxp-OtgMC>W!gRv_mOCN=dm?ZVA13X935xyV}`ygU^;e!*#qXr^{{2U$xE8-okM@ z1DR&w#N6Tx0M$y3hGh*EB@Q+mu zK44-x%fxh+zn%UY^0^~Cr5K+a1z>k;pL(r6c`D@^nb9P%M2yji5nRXRC|}^{pg^@+L({Zw zh7=&^@Ff72W%rF{r6$>Yzr)FKiA*-d*yJceK)u$WT&!@EFVLu4ms0kn6oB#rlzO$! zZnfSy<^l;c*+clYHsw-A4r+2E;`34GbHE4`L~Oo@+L53heVm*YxLj9ty?dXW!#k{*aTJ z9&E1q({oD!W-P`1`8zOwhxMa8d%N!_9_~P!0;CYE?(d+KBArN)2$^V747|5LOsZ`V zg?dV1c`ml=QneZsipOM9BdzK*T}pE05_Y3XVq}u($r;9D37))JrcyZQRDcm|aC%BH zJCdbg)yP##9mE=*M{es4p6jsJd@dZtFr$P*5hAe!H%BL0%DRkD?eu!JFIo+D4|CLO zWo)aCRjagidH`zGB9pi8wY@a|`r_;&X0Tujg(5U#$Cd(I$7z{4(03UtH61gSVqtcP z-0?oe!U6Siftos^aNuDzYJ7fuzU#R{z0TTJXFjeyY;CXj(De{^W^Q%)9w`J*SH8z{ zEQHh$QW8y!kW7t|O=ehL{;qpVKj_1DT|!dx_XgS&)>44gsC7OVjI?~ULN*%ng>Q~N zAxN7h>8Tl*nrXFr`TYByN(0zE+@*Y+L+XYvc-vSOZGSx1L3u96~u2A!v9mCnY~S)js+f)p8F7)Jh#rB^>f&`4=nyi_~?JnF+?T(>>R$o>G`b z=-jlF49st7>1$G9vuBNup=qs((!PrtrI1o5tZ99R$!_U{ot-u6m6O&6NJu~RQ&zp) zlA}X~YxzAE#->_z0V9bNyN5YSCwU47+Y}DA{D-=hz(K)ckhkl{IDo+S4}E9-ra-FG z4|EF}L{w+46%ThP9`2wSAtH$k>C8AcM#fr>dM&@-!Oy7zgkX2$6$@iiEnkodo1~^^ z@up@d+YJhpGW)p=Mzhy@^R8(Wj}LgQ>6m7ecsNSh47U;(P5Jsc$)8)w%O7~b!s#HlPP?g|DnKcea(TJ4&eHTOXAw6- z#M7h9WU@Wk)})3JieNWtWzFhd;y<6`yTJiO0((sLT0opZSN_?gN3`n zcMlL<@yo{XA&qLWqt7lcaS4~ zpkdW%)T>yHDz0M_4V_<>n2aaM8zDlGIAJqJI2<7yiVzMNg!K@nZnT`=SsqS#>kNpb z5EQKj>#IL@(d#OaY2xdLe>HIB=0#|KQ-cOLgSH(64cFn(@^`*NY~!V~LZl5sNFM+2 zUz`NhV?%9|ox!Q_YM@B))XG$c#a)(e$+md%?0Y=N?pa^lQvphOD9>g2>33`#=Y#Qf zIVCiQkQB02Fnv*bUCLI~`DLuYQ+|QeZs~;Or~lKj8{9m+wYSOY%SRXGBrP4-0dDrZ9dvlSx6ThoImV~wSs0rF=qN+`Q=+|$PYS`> z;XZrYt2nL5_S_e?qvM~eyLk~I$EvgQ{yDoFuef>Z9@ELppImr2b(DMMB5&XP;E(me z@mQP4PDRXcI-!#vDmeOAG+8chj+y4APrA+Q{m*UYL zZXeG+2%3kcnt{-_>15`T$L18ubtxQdQ8?J*H4u&^i6=)%#8X5j&@?n5(E=~u zj#EW=*h=Ag3fpzCU6;Dupj1AgTs)#)F0`HzLS999@K48{t|oqxgOdS-kVxG>A0&cJ zP5+>jPhKenO5rIF<+^yD6D*5Ae8t+?)1yD_(b=959sgQTU0*&p&OJH{kjwA>ej+>d z-V8?`nBhqJDrX5lC8U!X%y8sA@K4JxpZs(Cy}mB`&*k|1{{iVth5oYr`Az@;002ov JPDHLkV1hBt8>9dL literal 0 HcmV?d00001 diff --git a/demos/3d/simple/icon.png.flags b/demos/3d/simple/icon.png.flags new file mode 100644 index 00000000..dbef2209 --- /dev/null +++ b/demos/3d/simple/icon.png.flags @@ -0,0 +1 @@ +gen_mipmaps=true diff --git a/demos/3d/simple/main.scn b/demos/3d/simple/main.scn new file mode 100644 index 0000000000000000000000000000000000000000..7d1f13050ed8557ce060397e331e473f9a187ed0 GIT binary patch literal 1637 zcmX9SHAxs67(Nbp{A?EY70uFh*m8`2v&dFzgpWe*QsVc0uZh$X30KORq5CED22+g<-&_Uah4;W^ZmF7(5Fxna2 z3(!XQ>l%o(UEB#9Xxj#l`EJ8AS>7>f3=;Gy-lFdr`mbhfPMVT5t5$ctK%+h4JoH3jcQWt{$1l5H4bn7|T(EqrXxUb& zWm$iq({ydu^YbOETyFSG|Ekr4mxYE+|Edhe{duG0F0Kb&YbF!uOlqO~z` zTyx81p9PSiZ%2@h`?gzWnx9LE3^qkVUnlcxTCHIRR^7Ikr@!4ABSpL6Wv>gqpA(d+ zU!N9SulP%PSnv$&kQZ9J^-o}9BpgZBj3upP`GMh>QLGnyS|x$D$c$n{o^QV1dR{rL z9D{}Ih3roSp5X5&FJZ5emQ2@iG}CQl-{;1Dgs>l+?6FAfSH`ek{dQu(@GQd#eAq&F z$r6$f6cXb?orEX`QKn11giomxcoye{%`h?u+Oz3+-ELGYN6W^=fcd$9;_Y}3@4JMt zg5HB0kl^)1-CAO{<~v4RzXJjLk&xrAThp%r(4S*B{w23JO5BY%1-E?a4Q|`PZ|y>& zKZ1|R@9_N;j5p88*RV(VjFec}mS1SoJU7sm^;z+;cWDIEa9mx)3IVvK;y9+%XHepc zdlXD#kt|qjv2f?91ssywRxG^qA#BG%^5(^pGENk}2TOQD&ycUyPVNsgupB{##32eX zg9Wg2w)&`Xulxk|73O665&4IFk~=VrH*k3LO>y3>sQ-;(Tkt1B-Ti((A`op1Id2p3 zh`>Qe$U~fo1U_LVYG0rFqA$bftx$e%>ix?@Ke$8v(WN(VXyh~)TU(%+=ZfdUp{b+9 zs1>bk7n?()pKrTg?VGHTp^v8&EF8 z@f%=~t5>evhcgG(!l#MvRf_r;CmvL1>7f3a`m&%cnbYFL^fCP`^wI6Buto41TL(lI z1lv|tr6GJWX*T@8t!ai=@p%p|$L_Z2sBfJ^Tit_&@^|HZ>yE5;oQatpW6styNO8yL ze^ygB<9k0gCUc*BmYv|`jY@D4yJ)fYstxEu5@5k`R1K%P(P@oB3#@1RulR9ug9ttnuGNxp}6b@jDCrv)h zDfY_UnCJ9)OexFZ9!&ose=vgs@)wv^(wIIl!KE~VdF44AP^WMpNML(D2^*3j!z%O zE*PLEunL1z!buq7MZ|Y F{s%`q^pOAn literal 0 HcmV?d00001 diff --git a/demos/misc/simple_audio/.fscache b/demos/misc/simple_audio/.fscache new file mode 100644 index 00000000..e8de5dcf --- /dev/null +++ b/demos/misc/simple_audio/.fscache @@ -0,0 +1,4 @@ +::res://::1708967223 +icon.png::ImageTexture::1708966717:: +k_jose_-_its_time.ogg::AudioStreamOGGVorbis::1708967006:: +main.scn::PackedScene::1708967223:: diff --git a/demos/misc/simple_audio/engine.cfg b/demos/misc/simple_audio/engine.cfg new file mode 100644 index 00000000..23c8a3d0 --- /dev/null +++ b/demos/misc/simple_audio/engine.cfg @@ -0,0 +1,5 @@ +[application] + +name="simple_audio" +main_scene="res://main.scn" +icon="icon.png" diff --git a/demos/misc/simple_audio/icon.png b/demos/misc/simple_audio/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c422e37b0ea9e6ad2901c8d425cb12f4d37694f GIT binary patch literal 3639 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 JPDHLkV1hBt8>9dL literal 0 HcmV?d00001 diff --git a/demos/misc/simple_audio/icon.png.flags b/demos/misc/simple_audio/icon.png.flags new file mode 100644 index 00000000..dbef2209 --- /dev/null +++ b/demos/misc/simple_audio/icon.png.flags @@ -0,0 +1 @@ +gen_mipmaps=true diff --git a/demos/misc/simple_audio/k_jose_-_its_time.ogg b/demos/misc/simple_audio/k_jose_-_its_time.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4781561656b23d6ffc8e7f45416e6e14ddf94a91 GIT binary patch literal 1356839 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�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 z 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

    ~zuqPt$t*wvG%Zhp_+9PK5JZwm2|$%w!# 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 z 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 z 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 XZQNT(Bd&hBXWOBK{NGFM|6czO#SFKN literal 0 HcmV?d00001 diff --git a/demos/misc/simple_audio/k_jose_-_its_time.spx b/demos/misc/simple_audio/k_jose_-_its_time.spx new file mode 100644 index 0000000000000000000000000000000000000000..21f049bda3120bdbb258e96fc384f60676ccb98a GIT binary patch literal 452838 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

    H>cIPj#x~N@(yl?5Ue9MmhI2k}4gq|-& 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:mjddDoCNRVwGm~kl?B|RRsPT-%OHB<6|zB_(9zo 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 literal 0 HcmV?d00001 diff --git a/demos/misc/simple_audio/main.scn b/demos/misc/simple_audio/main.scn new file mode 100644 index 0000000000000000000000000000000000000000..a96e7b6d66cfbe218000bffd47b605ffa326ed4e GIT binary patch literal 1590 zcmWkvU2Ggz6+SbwyJN5IwPPpo@7j00c9N2$>m)=4i?(MxiygO(RBS*Hs@{8d_If>Z zcJ6d$cKwr7Oej&>QYcDPP$D4~=tGf$suqPjK$TSjFSI=LDS#q0eF&&hB_vt|RO096 zO6T13aDKk;+@o{X)@>W^pCN!V{Q%QB01Y6~KudBApr2&(PjcrOQD1k2FUUZ85+Fk! zVH66arx1!rwn9f#eBKn$OZJ$w*7EC~sI%!@>MRd?lj917lqDRP`t zM;9xVXXw{uB8_3NZ=gu;*6js7MN8?ImR#6}E#A^wsA}3Q)Jo@*$6#-oAH#LnpXNuCr(iVAk9UMs zV4_fQ8@>z$ZOT?8U{Cj$R*A@&&R%4DBX?KO4UadX%BBq6UFpZ% zA&*_j|Iib1zac73*H4WBjc@b)$)pj*B1rXu5%7lK)ufnfbFU>}ki411j)^ z)fBW|W7~@FRrVQst23enymSfb><;vhpY*gv7`f61gY?-2TVHxQ>qy_HPN@%KHi6Kc zFnn1TsXk#NPT<|%HV<9y#}Q1E1&dktx`2nURvj?ZU_Xk32y9SKUbLC1!D3=+$)6L` zfQz<4vUoU|Nj&><=5#A^ofLkU6t(20{SF?(OZFFm@;_x|NCU4`#vF}e9*d~-4VC=M zN*1)^RW^(TG^~snxZA>`kzcxt52)FlKttP=SDty|1uZTP{wqJt?B3fNZ1z68oL`jWP25_ zPiz$u=^L`m6c_mP5{_WaXuD#o`u6z_&Rf~ve1f;Mx?3W;?+7+^zZZy$Rui`IY-eAx zgZp47g?+~F-+kiOco?hTk?MhmAmk^lzvGxaWD!&NZ8wyDvpmLT6sZ~fE6&V6mD!XH z>Cg4PZ^U>_4`jsmrv{`)y2-O?wyXRurakwsvGhOP^mkqB?&nLliwAzJ)rIrYtzTiW z{CtMDyqG#K)UI}mE4IO#HFx&Cq&Q#HJsGl5VGAS@qLRjwmg-$PhBj?{V{&FaHwulxcVFihs~ z@zoPJxKu@R^=D|Vd=_U`eSF0#qG_GRv( #endif @@ -294,7 +294,7 @@ Error DirAccessUnix::remove(String p_path) { size_t DirAccessUnix::get_space_left() { -#ifndef PSP +#if !defined(PSP) || !defined(__3DS__) struct statvfs vfs; if (statvfs(current_dir.utf8().get_data(), &vfs) != 0) { diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h index 467c007d..6b97e14c 100644 --- a/drivers/unix/dir_access_unix.h +++ b/drivers/unix/dir_access_unix.h @@ -29,7 +29,7 @@ #ifndef DIR_ACCESS_UNIX_H #define DIR_ACCESS_UNIX_H -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) +#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) || defined(__3DS__) #include #include diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index f7a592a1..cf03f69b 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -28,14 +28,14 @@ /*************************************************************************/ #include "file_access_unix.h" -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) +#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) || defined(__3DS__) #include #include #include "print_string.h" #include "core/os/os.h" -#ifndef PSP +#if !defined(PSP) || !defined(__3DS__) #include #endif diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h index 3cc6987d..5ae7cf78 100644 --- a/drivers/unix/file_access_unix.h +++ b/drivers/unix/file_access_unix.h @@ -33,7 +33,7 @@ #include "os/memory.h" #include -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) +#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) || defined(__3DS__) /** @author Juan Linietsky diff --git a/platform/3ds/SCsub b/platform/3ds/SCsub new file mode 100644 index 00000000..e3cde0be --- /dev/null +++ b/platform/3ds/SCsub @@ -0,0 +1,13 @@ +import shlex +from SCons.Node import NodeList + +Import('env') + + +common_3ds=[\ + "os_3ds.cpp",\ + "rasterizer_3ds.cpp",\ + #"thread_3ds.cpp",\ +] + +prog = env.Program('#bin/godot_3ds',['godot_3ds.cpp']+common_3ds) diff --git a/platform/3ds/detect.py b/platform/3ds/detect.py new file mode 100644 index 00000000..3af00e3e --- /dev/null +++ b/platform/3ds/detect.py @@ -0,0 +1,92 @@ + +import os +import sys + + +def is_active(): + return True + + +def get_name(): + return "Server" + + +def can_build(): + if (os.name!="posix"): + return False + + return True # enabled + + +def get_opts(): + return [] + + +def get_flags(): + return [ + ('builtin_zlib', 'no'), + ('theora','no'), #use builtin openssl + ] + +def build_shader_gen(target, source, env, for_signature): + return "picasso -o {} {}".format(target[0], source[0]) + + +def build_shader_header(target, source, env): + import os + data = source[0].get_contents() + data_str = ",".join([str(x) for x in data]) + name = os.path.basename(str(target[0]))[:-2] + target[0].prepare() + with open(str(target[0]), 'w') as f: + f.write("/* Auto-generated from {} */\n".format(str(source[0]))) + f.write("static uint8_t shader_builtin_{}[] =\n{{{}}};".format( + name, data_str)) + + +def configure(env): + + env.Append(CPPPATH=['#platform/3ds']) + + devkit_path = os.environ["DEVKITPRO"] + dev_path = os.environ["DEVKITARM"] + + + env.Append(BUILDERS={'PICA': env.Builder(generator=build_shader_gen, suffix='.shbin', src_suffix='.pica')}) + env.Append(BUILDERS={'PICA_HEADER': env.Builder(action=build_shader_header, suffix='.h', src_suffix='.shbin')}) + + + env["CC"]=dev_path+"/bin/arm-none-eabi-gcc" + env["CXX"]=dev_path+"/bin/arm-none-eabi-g++" + env["LD"]=dev_path+"/bin/arm-none-eabi-g++" + env["AR"]=dev_path+"/bin/arm-none-eabi-ar" + env["AS"]=dev_path+"/bin/arm-none-eabi-as" + env["RANLIB"]=dev_path+"/bin/arm-none-eabi-ranlib" + + env["bits"]="32" + + + + arch = ['-march=armv6k', '-mtune=mpcore','-mfloat-abi=hard','-mtp=soft' ] + + env.Append(CPPPATH=[dev_path+"/arm-none-eabi/include/", devkit_path+"/portlibs/3ds/include/", devkit_path+"/libctru/include/"]) + env.Append(LIBPATH=[dev_path+"/arm-none-eabi/lib/armv6k/fpu/", devkit_path+"/portlibs/3ds/lib/", devkit_path+"/libctru/lib/"]) + + + + if env["target"]=="release": + env.Append(CCFLAGS=['-mword-relocations','-ffunction-sections', '-fno-rtti', '-fno-exceptions']+arch) + elif env["target"]=="release_debug": + env.Append(CCFLAGS=['-O2','-ffast-math','-DDEBUG_ENABLED']) + elif env["target"]=="debug": + env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED']) + + env.Append(CCFLAGS=['-D__3DS__','-DNEED_LONG_INT', '-D_3DS_ENABLED', '-DNO_THREADS','-DNO_SAFE_CAST']) + env.Append(LIBS=['pthread', 'z', 'citro3d', 'ctru']) + env.Append(LINKFLAGS=['-specs=3dsx.specs', '-g'] + arch) + + if (env["CXX"]=="clang++"): + env.Append(CPPFLAGS=['-DTYPED_METHOD_BIND']) + env["CC"]="clang" + env["LD"]="clang++" + diff --git a/platform/3ds/godot_3ds.cpp b/platform/3ds/godot_3ds.cpp new file mode 100644 index 00000000..e1ff26d9 --- /dev/null +++ b/platform/3ds/godot_3ds.cpp @@ -0,0 +1,59 @@ +/*************************************************************************/ +/* godot_server.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "main/main.h" +#include "os_3ds.h" + + +extern "C" { +#include <3ds/gfx.h> +#include <3ds/console.h> +u32 __stacksize__ = 1024 * 128; +}; + +int main(int argc, char* argv[]) { + + gfxInitDefault(); + consoleInit(GFX_BOTTOM, NULL); + + OS_3DS os; + + char* args[] = {"-path", "./fe"}; + + Error err = Main::setup("3ds", 2, args, true); + if (err!=OK) + return 255; + + if (Main::start()) { + printf("game running\n"); + os.run(); // it is actually the OS that decides how to run + } + Main::cleanup(); + + return 0; +} diff --git a/platform/3ds/logo.png b/platform/3ds/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7490097fe5ad81be6faf40a4ac9377beafdff8 GIT binary patch literal 2162 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 literal 0 HcmV?d00001 diff --git a/platform/3ds/os_3ds.cpp b/platform/3ds/os_3ds.cpp new file mode 100644 index 00000000..ae3b4702 --- /dev/null +++ b/platform/3ds/os_3ds.cpp @@ -0,0 +1,307 @@ +/*************************************************************************/ +/* OS_3DS.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "servers/visual/visual_server_raster.h" +#include "rasterizer_3ds.h" + +#include "os_3ds.h" +#include +#include +#include "print_string.h" +#include "servers/physics/physics_server_sw.h" +#include "drivers/unix/memory_pool_static_malloc.h" +#include "drivers/unix/dir_access_unix.h" +#include "drivers/unix/file_access_unix.h" +#include "os/memory_pool_dynamic_static.h" +#include "core/os/thread_dummy.h" +#include "main/main.h" +#include +#include + +int OS_3DS::get_video_driver_count() const { + + return 1; +} +const char * OS_3DS::get_video_driver_name(int p_driver) const { + + return "citro3D"; +} +OS::VideoMode OS_3DS::get_default_video_mode() const { + + return OS::VideoMode(800,600,false); +} + +static MemoryPoolStaticMalloc *mempool_static=NULL; +static MemoryPoolDynamicStatic *mempool_dynamic=NULL; + + +void OS_3DS::initialize_core() { + + ThreadDummy::make_default(); + SemaphoreDummy::make_default(); + MutexDummy::make_default(); + + FileAccess::make_default(FileAccess::ACCESS_RESOURCES); + FileAccess::make_default(FileAccess::ACCESS_USERDATA); + FileAccess::make_default(FileAccess::ACCESS_FILESYSTEM); + //FileAccessBufferedFA::make_default(); + DirAccess::make_default(DirAccess::ACCESS_RESOURCES); + DirAccess::make_default(DirAccess::ACCESS_USERDATA); + DirAccess::make_default(DirAccess::ACCESS_FILESYSTEM); + + + mempool_static = new MemoryPoolStaticMalloc; + mempool_dynamic = memnew( MemoryPoolDynamicStatic ); + + ticks_start = 0; + ticks_start = get_ticks_usec(); + + FileAccess::make_default(FileAccess::ACCESS_RESOURCES); + FileAccess::make_default(FileAccess::ACCESS_USERDATA); + FileAccess::make_default(FileAccess::ACCESS_FILESYSTEM); + //FileAccessBufferedFA::make_default(); + DirAccess::make_default(DirAccess::ACCESS_RESOURCES); + DirAccess::make_default(DirAccess::ACCESS_USERDATA); + DirAccess::make_default(DirAccess::ACCESS_FILESYSTEM); +} + +void OS_3DS::finalize_core() { + if (mempool_dynamic) + memdelete( mempool_dynamic ); + delete mempool_static; +} + +void OS_3DS::initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver) { + + args=OS::get_singleton()->get_cmdline_args(); + current_videomode=p_desired; + main_loop=NULL; + + + rasterizer = memnew( Rasterizer3DS ); + + visual_server = memnew( VisualServerRaster(rasterizer) ); + + AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton(); + + if (AudioDriverManagerSW::get_driver(p_audio_driver)->init()!=OK) { + + ERR_PRINT("Initializing audio failed."); + } + + sample_manager = memnew( SampleManagerMallocSW ); + audio_server = memnew( AudioServerSW(sample_manager) ); + audio_server->init(); + spatial_sound_server = memnew( SpatialSoundServerSW ); + spatial_sound_server->init(); + spatial_sound_2d_server = memnew( SpatialSound2DServerSW ); + spatial_sound_2d_server->init(); + + + ERR_FAIL_COND(!visual_server); + + visual_server->init(); + // + physics_server = memnew( PhysicsServerSW ); + physics_server->init(); + physics_2d_server = memnew( Physics2DServerSW ); + physics_2d_server->init(); + + input = memnew( InputDefault ); + +} +void OS_3DS::finalize() { + + if(main_loop) + memdelete(main_loop); + main_loop=NULL; + + spatial_sound_server->finish(); + memdelete(spatial_sound_server); + spatial_sound_2d_server->finish(); + memdelete(spatial_sound_2d_server); + + //if (debugger_connection_console) { +// memdelete(debugger_connection_console); +//} + + audio_server->finish(); + memdelete(audio_server); + memdelete(sample_manager); + + visual_server->finish(); + memdelete(visual_server); + memdelete(rasterizer); + + physics_server->finish(); + memdelete(physics_server); + + physics_2d_server->finish(); + memdelete(physics_2d_server); + + memdelete(input); + + args.clear(); +} + +void OS_3DS::set_mouse_show(bool p_show) { + + +} +void OS_3DS::set_mouse_grab(bool p_grab) { + + grab=p_grab; +} +bool OS_3DS::is_mouse_grab_enabled() const { + + return grab; +} + +int OS_3DS::get_mouse_button_state() const { + + return 0; +} + +Point2 OS_3DS::get_mouse_pos() const { + + return Point2(); +} + +void OS_3DS::set_window_title(const String& p_title) { + + +} + +void OS_3DS::set_video_mode(const VideoMode& p_video_mode,int p_screen) { + + +} + +OS::Date OS_3DS::get_date() const { + Date ret; + return ret; +} + +OS::Time OS_3DS::get_time() const { + Time ret; + return ret; +} + + +void OS_3DS::delay_usec(uint32_t p_usec) const{ + usleep(p_usec); +} + +uint64_t OS_3DS::get_ticks_usec() const{ + struct timeval tv_now; + gettimeofday(&tv_now, NULL); + + uint64_t longtime = (uint64_t)tv_now.tv_usec + (uint64_t)tv_now.tv_sec * 1000000L; + longtime -= ticks_start; + + return longtime; +} + +OS::VideoMode OS_3DS::get_video_mode(int p_screen) const { + + return current_videomode; +} +void OS_3DS::get_fullscreen_mode_list(List *p_list,int p_screen) const { + + +} + + +MainLoop *OS_3DS::get_main_loop() const { + + return main_loop; +} + +void OS_3DS::delete_main_loop() { + + if (main_loop) + memdelete(main_loop); + main_loop=NULL; +} + +void OS_3DS::set_main_loop( MainLoop * p_main_loop ) { + + main_loop=p_main_loop; + input->set_main_loop(p_main_loop); +} + +bool OS_3DS::can_draw() const { + + return true; +}; + + +String OS_3DS::get_name() { + + return "Nintendo 3DS"; +} + + + +void OS_3DS::move_window_to_foreground() { + +} + +void OS_3DS::set_cursor_shape(CursorShape p_shape) { + + +} + +void OS_3DS::run() { + + force_quit = false; + + if (!main_loop) + return; + + main_loop->init(); + + while (!force_quit) { + + if (Main::iteration()==true) + break; + }; + + main_loop->finish(); +} + +void OS_3DS::swap_buffers() { +} + +OS_3DS::OS_3DS() { + + AudioDriverManagerSW::add_driver(&driver_3ds); + //adriver here + grab=false; + +}; diff --git a/platform/3ds/os_3ds.h b/platform/3ds/os_3ds.h new file mode 100644 index 00000000..5411ed62 --- /dev/null +++ b/platform/3ds/os_3ds.h @@ -0,0 +1,133 @@ +/*************************************************************************/ +/* os_server.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef OS_3DS_H +#define OS_3DS_H + +#include "os/input.h" +#include "drivers/unix/os_unix.h" +#include "servers/visual_server.h" +#include "servers/visual/rasterizer.h" +#include "servers/audio/audio_driver_dummy.h" +#include "servers/physics_server.h" +#include "servers/audio/audio_server_sw.h" +#include "servers/audio/sample_manager_sw.h" +#include "servers/spatial_sound/spatial_sound_server_sw.h" +#include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h" +#include "drivers/rtaudio/audio_driver_rtaudio.h" +#include "servers/physics_2d/physics_2d_server_sw.h" + +#undef CursorShape + +class OS_3DS : public OS { + + Rasterizer *rasterizer; + VisualServer *visual_server; + VideoMode current_videomode; + List args; + MainLoop *main_loop; + + + AudioDriverDummy driver_3ds; + bool grab; + uint64_t ticks_start; + + PhysicsServer *physics_server; + Physics2DServer *physics_2d_server; + + virtual void delete_main_loop(); + // IP_Unix *ip_unix; + + AudioServerSW *audio_server; + SampleManagerMallocSW *sample_manager; + SpatialSoundServerSW *spatial_sound_server; + SpatialSound2DServerSW *spatial_sound_2d_server; + + bool force_quit; + + InputDefault *input; + + + +protected: + + virtual int get_video_driver_count() const; + virtual const char * get_video_driver_name(int p_driver) const; + virtual VideoMode get_default_video_mode() const; + + virtual void initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver); + virtual void finalize(); + + virtual void set_main_loop( MainLoop * p_main_loop ); + +public: + virtual void initialize_core(); + virtual void finalize_core(); + virtual String get_name(); + + virtual void set_cursor_shape(CursorShape p_shape); + + virtual int get_audio_driver_count() const { return 1; }; + virtual const char * get_audio_driver_name(int p_driver) const { return "Dummy"; }; + virtual void vprint(const char* p_format, va_list p_list, bool p_stderr=false) {}; + virtual void alert(const String& p_alert,const String& p_title="ALERT!") {}; + virtual String get_stdin_string(bool p_block = true) { return ""; }; + virtual Error execute(const String& p_path, const List& p_arguments,bool p_blocking,ProcessID *r_child_id=NULL,String* r_pipe=NULL,int *r_exitcode=NULL) { return FAILED; }; + virtual Error kill(const ProcessID& p_pid) { return FAILED; }; + virtual bool has_environment(const String& p_var) const { return false; }; + virtual String get_environment(const String& p_var) const { return ""; }; + virtual Date get_date() const; + virtual Time get_time() const; + // virtual TimeZoneInfo get_time_zone_info() const; + virtual void delay_usec(uint32_t p_usec) const; + virtual uint64_t get_ticks_usec() const; + + virtual void set_mouse_show(bool p_show); + virtual void set_mouse_grab(bool p_grab); + virtual bool is_mouse_grab_enabled() const; + virtual Point2 get_mouse_pos() const; + virtual int get_mouse_button_state() const; + virtual void set_window_title(const String& p_title); + + virtual MainLoop *get_main_loop() const; + + virtual bool can_draw() const; + + virtual void set_video_mode(const VideoMode& p_video_mode,int p_screen=0); + virtual VideoMode get_video_mode(int p_screen=0) const; + virtual void get_fullscreen_mode_list(List *p_list,int p_screen=0) const; + + virtual void move_window_to_foreground(); + virtual void swap_buffers(); + + void run(); + + OS_3DS(); +}; + +#endif diff --git a/platform/3ds/platform_config.h b/platform/3ds/platform_config.h new file mode 100644 index 00000000..1bb5afb0 --- /dev/null +++ b/platform/3ds/platform_config.h @@ -0,0 +1,30 @@ +/*************************************************************************/ +/* platform_config.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include + diff --git a/platform/3ds/rasterizer_3ds.cpp b/platform/3ds/rasterizer_3ds.cpp new file mode 100644 index 00000000..7675b912 --- /dev/null +++ b/platform/3ds/rasterizer_3ds.cpp @@ -0,0 +1,2007 @@ +/*************************************************************************/ +/* rasterizer_3ds.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "rasterizer_3ds.h" + + +#define DISPLAY_TRANSFER_FLAGS \ + (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + +/* TEXTURE API */ + + +RID Rasterizer3DS::texture_create() { + + Texture *texture = memnew(Texture); + ERR_FAIL_COND_V(!texture,RID()); + return texture_owner.make_rid( texture ); + +} + +void Rasterizer3DS::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { + + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + C3D_TexInit(&texture->texture, p_width, p_height, GPU_RGBA8); + texture->width=p_width; + texture->height=p_height; + texture->format=p_format; + texture->flags=p_flags; +} + +void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + ERR_FAIL_COND(texture->format != p_image.get_format() ); + + texture->image[p_cube_side]=p_image; + + DVector d = p_image.get_data(); + const u32* buffer = reinterpret_cast(d.read().ptr()); + + C3D_TexUpload(&texture->texture, buffer); +} + +Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image()); + + return texture->image[p_cube_side]; +} + +void Rasterizer3DS::texture_set_flags(RID p_texture,uint32_t p_flags) { + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; + texture->flags=p_flags|cube; // can't remove a cube from being a cube + +} +uint32_t Rasterizer3DS::texture_get_flags(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->flags; + +} +Image::Format Rasterizer3DS::texture_get_format(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); + + return texture->format; +} +uint32_t Rasterizer3DS::texture_get_width(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->width; +} +uint32_t Rasterizer3DS::texture_get_height(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->height; +} + +bool Rasterizer3DS::texture_has_alpha(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return false; + +} + +void Rasterizer3DS::texture_set_size_override(RID p_texture,int p_width, int p_height) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + + ERR_FAIL_COND(p_width<=0 || p_width>4096); + ERR_FAIL_COND(p_height<=0 || p_height>4096); + //real texture size is in alloc width and height +// texture->width=p_width; +// texture->height=p_height; + +} + +void Rasterizer3DS::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { + + +} + +static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { + ERR_FAIL_COND(!p_vertices); + ERR_FAIL_COND(p_points <1 || p_points>4); + + // int type = prim_type[p_points - 1]; + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, p_vertices, sizeof(Vector3), 2, 0x10); + + C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); +}; + +static void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { + Vector3 texcoords[4]= { + Vector3( p_src_region.pos.x/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + + Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + + Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + + Vector3( p_src_region.pos.x/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0) + }; + + + if (p_flip_h) { + SWAP( texcoords[0], texcoords[1] ); + SWAP( texcoords[2], texcoords[3] ); + } + if (p_flip_v) { + SWAP( texcoords[1], texcoords[2] ); + SWAP( texcoords[0], texcoords[3] ); + } + + Vector3 coords[4]= { + Vector3( p_rect.pos.x, p_rect.pos.y, 0 ), + Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0 ), + Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0 ), + Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) + }; + + // _draw_primitive(4,coords,0,0,texcoords); +} + +/* SHADER API */ + +/* SHADER API */ + +RID Rasterizer3DS::shader_create(VS::ShaderMode p_mode) { + + Shader *shader = memnew( Shader ); + shader->mode=p_mode; + shader->fragment_line=0; + shader->vertex_line=0; + shader->light_line=0; + RID rid = shader_owner.make_rid(shader); + + return rid; + +} + + + +void Rasterizer3DS::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) { + + ERR_FAIL_INDEX(p_mode,3); + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + shader->mode=p_mode; + +} +VS::ShaderMode Rasterizer3DS::shader_get_mode(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL); + return shader->mode; +} + +void Rasterizer3DS::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { + + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + shader->fragment_code=p_fragment; + shader->vertex_code=p_vertex; + shader->light_code=p_light; + shader->fragment_line=p_fragment_ofs; + shader->vertex_line=p_vertex_ofs; + shader->light_line=p_vertex_ofs; + +} + + +String Rasterizer3DS::shader_get_vertex_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->vertex_code; + +} + +String Rasterizer3DS::shader_get_fragment_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->fragment_code; + +} + +String Rasterizer3DS::shader_get_light_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->light_code; + +} + +void Rasterizer3DS::shader_get_param_list(RID p_shader, List *p_param_list) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + +} + +/* COMMON MATERIAL API */ + + +RID Rasterizer3DS::material_create() { + + return material_owner.make_rid( memnew( Material ) ); +} + +void Rasterizer3DS::material_set_shader(RID p_material, RID p_shader) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->shader=p_shader; + +} + +RID Rasterizer3DS::material_get_shader(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,RID()); + return material->shader; +} + +void Rasterizer3DS::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + + if (p_value.get_type()==Variant::NIL) + material->shader_params.erase(p_param); + else + material->shader_params[p_param]=p_value; +} +Variant Rasterizer3DS::material_get_param(RID p_material, const StringName& p_param) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,Variant()); + + if (material->shader_params.has(p_param)) + return material->shader_params[p_param]; + else + return Variant(); +} + + +void Rasterizer3DS::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX); + material->flags[p_flag]=p_enabled; + +} +bool Rasterizer3DS::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,false); + ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false); + return material->flags[p_flag]; + + +} + +void Rasterizer3DS::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->depth_draw_mode=p_mode; +} + +VS::MaterialDepthDrawMode Rasterizer3DS::material_get_depth_draw_mode(RID p_material) const{ + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); + return material->depth_draw_mode; + +} + + +void Rasterizer3DS::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->blend_mode=p_mode; + +} +VS::MaterialBlendMode Rasterizer3DS::material_get_blend_mode(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD); + return material->blend_mode; +} + +void Rasterizer3DS::material_set_line_width(RID p_material,float p_line_width) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->line_width=p_line_width; + +} +float Rasterizer3DS::material_get_line_width(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,0); + + return material->line_width; +} + +/* MESH API */ + + +RID Rasterizer3DS::mesh_create() { + + + return mesh_owner.make_rid( memnew( Mesh ) ); +} + + +void Rasterizer3DS::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); + ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); + + Surface s; + + + s.format=0; + + for(int i=0;imorph_target_count; + s.morph_format=s.format; + + + Surface *surface = memnew( Surface ); + *surface=s; + + mesh->surfaces.push_back(surface); + + +} + + + +void Rasterizer3DS::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) { + + ERR_EXPLAIN("Dummy Rasterizer does not support custom surfaces. Running on wrong platform?"); + ERR_FAIL_V(); +} + +Array Rasterizer3DS::mesh_get_surface_arrays(RID p_mesh,int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->data; + + +} +Array Rasterizer3DS::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->morph_data; + +} + + +void Rasterizer3DS::mesh_set_morph_target_count(RID p_mesh,int p_amount) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_COND( mesh->surfaces.size()!=0 ); + + mesh->morph_target_count=p_amount; + +} + +int Rasterizer3DS::mesh_get_morph_target_count(RID p_mesh) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->morph_target_count; + +} + +void Rasterizer3DS::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { + + ERR_FAIL_INDEX(p_mode,2); + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->morph_target_mode=p_mode; + +} + +VS::MorphTargetMode Rasterizer3DS::mesh_get_morph_target_mode(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); + + return mesh->morph_target_mode; + +} + + + +void Rasterizer3DS::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND( !surface); + + if (surface->material_owned && surface->material.is_valid()) + free(surface->material); + + surface->material_owned=p_owned; + surface->material=p_material; +} + +RID Rasterizer3DS::mesh_surface_get_material(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,RID()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, RID() ); + + return surface->material; +} + +int Rasterizer3DS::mesh_surface_get_array_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + Vector3Array arr = surface->data[VS::ARRAY_VERTEX]; + return arr.size(); + +} + +int Rasterizer3DS::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + IntArray arr = surface->data[VS::ARRAY_INDEX]; + return arr.size(); + +} +uint32_t Rasterizer3DS::mesh_surface_get_format(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,0); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, 0 ); + + return surface->format; +} +VS::PrimitiveType Rasterizer3DS::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS ); + + return surface->primitive; +} + +void Rasterizer3DS::mesh_remove_surface(RID p_mesh,int p_index) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_index, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_index]; + ERR_FAIL_COND( !surface); + + memdelete( mesh->surfaces[p_index] ); + mesh->surfaces.remove(p_index); + +} +int Rasterizer3DS::mesh_get_surface_count(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->surfaces.size(); +} + +AABB Rasterizer3DS::mesh_get_aabb(RID p_mesh,RID p_skeleton) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + AABB aabb; + + for (int i=0;isurfaces.size();i++) { + + if (i==0) + aabb=mesh->surfaces[i]->aabb; + else + aabb.merge_with(mesh->surfaces[i]->aabb); + } + + return aabb; +} + +void Rasterizer3DS::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->custom_aabb=p_aabb; +} + +AABB Rasterizer3DS::mesh_get_custom_aabb(RID p_mesh) const { + + const Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + return mesh->custom_aabb; + +} + +/* MULTIMESH API */ + +RID Rasterizer3DS::multimesh_create() { + + return multimesh_owner.make_rid( memnew( MultiMesh )); +} + +void Rasterizer3DS::multimesh_set_instance_count(RID p_multimesh,int p_count) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->elements.clear(); // make sure to delete everything, so it "fails" in all implementations + multimesh->elements.resize(p_count); + +} +int Rasterizer3DS::multimesh_get_instance_count(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + + return multimesh->elements.size(); +} + +void Rasterizer3DS::multimesh_set_mesh(RID p_multimesh,RID p_mesh) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->mesh=p_mesh; + +} +void Rasterizer3DS::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->aabb=p_aabb; +} +void Rasterizer3DS::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + multimesh->elements[p_index].xform=p_transform; + +} +void Rasterizer3DS::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh) + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + multimesh->elements[p_index].color=p_color; + +} + +RID Rasterizer3DS::multimesh_get_mesh(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,RID()); + + return multimesh->mesh; +} +AABB Rasterizer3DS::multimesh_get_aabb(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,AABB()); + + return multimesh->aabb; +} + +Transform Rasterizer3DS::multimesh_instance_get_transform(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Transform()); + + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform()); + + return multimesh->elements[p_index].xform; + +} +Color Rasterizer3DS::multimesh_instance_get_color(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Color()); + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color()); + + return multimesh->elements[p_index].color; +} + +void Rasterizer3DS::multimesh_set_visible_instances(RID p_multimesh,int p_visible) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->visible=p_visible; + +} + +int Rasterizer3DS::multimesh_get_visible_instances(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + return multimesh->visible; + +} + +/* IMMEDIATE API */ + + +RID Rasterizer3DS::immediate_create() { + + Immediate *im = memnew( Immediate ); + return immediate_owner.make_rid(im); + +} + +void Rasterizer3DS::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture){ + + +} +void Rasterizer3DS::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ + + +} +void Rasterizer3DS::immediate_normal(RID p_immediate,const Vector3& p_normal){ + + +} +void Rasterizer3DS::immediate_tangent(RID p_immediate,const Plane& p_tangent){ + + +} +void Rasterizer3DS::immediate_color(RID p_immediate,const Color& p_color){ + + +} +void Rasterizer3DS::immediate_uv(RID p_immediate,const Vector2& tex_uv){ + + +} +void Rasterizer3DS::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ + + +} + +void Rasterizer3DS::immediate_end(RID p_immediate){ + + +} +void Rasterizer3DS::immediate_clear(RID p_immediate) { + + +} + +AABB Rasterizer3DS::immediate_get_aabb(RID p_immediate) const { + + return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); +} + +void Rasterizer3DS::immediate_set_material(RID p_immediate,RID p_material) { + + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + im->material=p_material; + +} + +RID Rasterizer3DS::immediate_get_material(RID p_immediate) const { + + const Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND_V(!im,RID()); + return im->material; + +} + +/* PARTICLES API */ + +RID Rasterizer3DS::particles_create() { + + Particles *particles = memnew( Particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles_owner.make_rid(particles); +} + +void Rasterizer3DS::particles_set_amount(RID p_particles, int p_amount) { + + ERR_FAIL_COND(p_amount<1); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.amount=p_amount; + +} + +int Rasterizer3DS::particles_get_amount(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.amount; + +} + +void Rasterizer3DS::particles_set_emitting(RID p_particles, bool p_emitting) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.emitting=p_emitting;; + +} +bool Rasterizer3DS::particles_is_emitting(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.emitting; + +} + +void Rasterizer3DS::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.visibility_aabb=p_visibility; + +} + +void Rasterizer3DS::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_half_extents=p_half_extents; +} +Vector3 Rasterizer3DS::particles_get_emission_half_extents(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_half_extents; +} + +void Rasterizer3DS::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_base_velocity=p_base_velocity; +} + +Vector3 Rasterizer3DS::particles_get_emission_base_velocity(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_base_velocity; +} + + +void Rasterizer3DS::particles_set_emission_points(RID p_particles, const DVector& p_points) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_points=p_points; +} + +DVector Rasterizer3DS::particles_get_emission_points(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,DVector()); + + return particles->data.emission_points; + +} + +void Rasterizer3DS::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.gravity_normal=p_normal; + +} +Vector3 Rasterizer3DS::particles_get_gravity_normal(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.gravity_normal; +} + + +AABB Rasterizer3DS::particles_get_visibility_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; + +} + +void Rasterizer3DS::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) { + + ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX); + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_vars[p_variable]=p_value; + +} +float Rasterizer3DS::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_vars[p_variable]; +} + +void Rasterizer3DS::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_randomness[p_variable]=p_randomness; + +} +float Rasterizer3DS::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_randomness[p_variable]; + +} + +void Rasterizer3DS::particles_set_color_phases(RID p_particles, int p_phases) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES ); + particles->data.color_phase_count=p_phases; + +} +int Rasterizer3DS::particles_get_color_phases(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phase_count; +} + + +void Rasterizer3DS::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + if (p_pos<0.0) + p_pos=0.0; + if (p_pos>1.0) + p_pos=1.0; + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].pos=p_pos; + +} +float Rasterizer3DS::particles_get_color_phase_pos(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phases[p_phase].pos; + +} + +void Rasterizer3DS::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].color=p_color; + + //update alpha + particles->has_alpha=false; + for(int i=0;idata.color_phases[i].color.a<0.99) + particles->has_alpha=true; + } + +} + +Color Rasterizer3DS::particles_get_color_phase_color(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color()); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Color()); + return particles->data.color_phases[p_phase].color; + +} + +void Rasterizer3DS::particles_set_attractors(RID p_particles, int p_attractors) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS ); + particles->data.attractor_count=p_attractors; + +} +int Rasterizer3DS::particles_get_attractors(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.attractor_count; +} + +void Rasterizer3DS::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].pos=p_pos;; +} +Vector3 Rasterizer3DS::particles_get_attractor_pos(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3()); + return particles->data.attractors[p_attractor].pos; +} + +void Rasterizer3DS::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].force=p_force; +} + +float Rasterizer3DS::particles_get_attractor_strength(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,0); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0); + return particles->data.attractors[p_attractor].force; +} + +void Rasterizer3DS::particles_set_material(RID p_particles, RID p_material,bool p_owned) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + if (particles->material_owned && particles->material.is_valid()) + free(particles->material); + + particles->material_owned=p_owned; + + particles->material=p_material; + +} +RID Rasterizer3DS::particles_get_material(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles->material; + +} + +void Rasterizer3DS::particles_set_use_local_coordinates(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.local_coordinates=p_enable; + +} + +bool Rasterizer3DS::particles_is_using_local_coordinates(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.local_coordinates; +} +bool Rasterizer3DS::particles_has_height_from_velocity(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.height_from_velocity; +} + +void Rasterizer3DS::particles_set_height_from_velocity(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.height_from_velocity=p_enable; + +} + +AABB Rasterizer3DS::particles_get_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; +} + +/* SKELETON API */ + +RID Rasterizer3DS::skeleton_create() { + + Skeleton *skeleton = memnew( Skeleton ); + ERR_FAIL_COND_V(!skeleton,RID()); + return skeleton_owner.make_rid( skeleton ); +} +void Rasterizer3DS::skeleton_resize(RID p_skeleton,int p_bones) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + if (p_bones == skeleton->bones.size()) { + return; + }; + + skeleton->bones.resize(p_bones); + +} +int Rasterizer3DS::skeleton_get_bone_count(RID p_skeleton) const { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, -1); + return skeleton->bones.size(); +} +void Rasterizer3DS::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + ERR_FAIL_INDEX( p_bone, skeleton->bones.size() ); + + skeleton->bones[p_bone] = p_transform; +} + +Transform Rasterizer3DS::skeleton_bone_get_transform(RID p_skeleton,int p_bone) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, Transform()); + ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() ); + + // something + return skeleton->bones[p_bone]; +} + + +/* LIGHT API */ + +RID Rasterizer3DS::light_create(VS::LightType p_type) { + + Light *light = memnew( Light ); + light->type=p_type; + return light_owner.make_rid(light); +} + +VS::LightType Rasterizer3DS::light_get_type(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI); + return light->type; +} + +void Rasterizer3DS::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_type, 3 ); + light->colors[p_type]=p_color; +} +Color Rasterizer3DS::light_get_color(RID p_light,VS::LightColor p_type) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light, Color()); + ERR_FAIL_INDEX_V( p_type, 3, Color() ); + return light->colors[p_type]; +} + +void Rasterizer3DS::light_set_shadow(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->shadow_enabled=p_enabled; +} + +bool Rasterizer3DS::light_has_shadow(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->shadow_enabled; +} + +void Rasterizer3DS::light_set_volumetric(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->volumetric_enabled=p_enabled; + +} +bool Rasterizer3DS::light_is_volumetric(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->volumetric_enabled; +} + +void Rasterizer3DS::light_set_projector(RID p_light,RID p_texture) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->projector=p_texture; +} +RID Rasterizer3DS::light_get_projector(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,RID()); + return light->projector; +} + +void Rasterizer3DS::light_set_var(RID p_light, VS::LightParam p_var, float p_value) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX ); + + light->vars[p_var]=p_value; +} +float Rasterizer3DS::light_get_var(RID p_light, VS::LightParam p_var) const { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,0); + + ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 ); + + return light->vars[p_var]; +} + +void Rasterizer3DS::light_set_operator(RID p_light,VS::LightOp p_op) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + + +}; + +VS::LightOp Rasterizer3DS::light_get_operator(RID p_light) const { + + return VS::LightOp(0); +}; + +void Rasterizer3DS::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) { + + +} + +VS::LightOmniShadowMode Rasterizer3DS::light_omni_get_shadow_mode(RID p_light) const{ + + return VS::LightOmniShadowMode(0); +} + +void Rasterizer3DS::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) { + + +} + +VS::LightDirectionalShadowMode Rasterizer3DS::light_directional_get_shadow_mode(RID p_light) const { + + return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL; +} + +void Rasterizer3DS::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) { + + +} + +float Rasterizer3DS::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const { + + return 0; +} + + +AABB Rasterizer3DS::light_get_aabb(RID p_light) const { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,AABB()); + + switch( light->type ) { + + case VS::LIGHT_SPOT: { + + float len=light->vars[VS::LIGHT_PARAM_RADIUS]; + float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len; + return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) ); + } break; + case VS::LIGHT_OMNI: { + + float r = light->vars[VS::LIGHT_PARAM_RADIUS]; + return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 ); + } break; + case VS::LIGHT_DIRECTIONAL: { + + return AABB(); + } break; + default: {} + } + + ERR_FAIL_V( AABB() ); +} + + +RID Rasterizer3DS::light_instance_create(RID p_light) { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light, RID()); + + LightInstance *light_instance = memnew( LightInstance ); + + light_instance->light=p_light; + light_instance->base=light; + + + return light_instance_owner.make_rid( light_instance ); +} +void Rasterizer3DS::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + lighti->transform=p_transform; + +} + +bool Rasterizer3DS::light_instance_has_shadow(RID p_light_instance) const { + + return false; + +} + + +bool Rasterizer3DS::light_instance_assign_shadow(RID p_light_instance) { + + return false; + +} + + +Rasterizer::ShadowType Rasterizer3DS::light_instance_get_shadow_type(RID p_light_instance) const { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE); + + switch(lighti->base->type) { + + case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break; + case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break; + case VS::LIGHT_SPOT: return SHADOW_SIMPLE; break; + } + + return Rasterizer::SHADOW_NONE; +} + +Rasterizer::ShadowType Rasterizer3DS::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const { + + return SHADOW_NONE; +} +void Rasterizer3DS::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + +} + +int Rasterizer3DS::light_instance_get_shadow_passes(RID p_light_instance) const { + + return 0; +} + +bool Rasterizer3DS::light_instance_get_pssm_shadow_overlap(RID p_light_instance) const { + + return false; +} + + +void Rasterizer3DS::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + + ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL); + ERR_FAIL_INDEX(p_index,1); + + lighti->custom_projection=p_camera; + lighti->custom_transform=p_transform; + +} +void Rasterizer3DS::shadow_clear_near() { + + +} + +bool Rasterizer3DS::shadow_allocate_near(RID p_light) { + + return false; +} + +bool Rasterizer3DS::shadow_allocate_far(RID p_light) { + + return false; +} + +/* PARTICLES INSTANCE */ + +RID Rasterizer3DS::particles_instance_create(RID p_particles) { + + ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID()); + ParticlesInstance *particles_instance = memnew( ParticlesInstance ); + ERR_FAIL_COND_V(!particles_instance, RID() ); + particles_instance->particles=p_particles; + return particles_instance_owner.make_rid(particles_instance); +} + +void Rasterizer3DS::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) { + + ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance); + ERR_FAIL_COND(!particles_instance); + particles_instance->transform=p_transform; +} + + +/* RENDER API */ +/* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + +RID Rasterizer3DS::viewport_data_create() { + + return RID(); +} + +RID Rasterizer3DS::render_target_create(){ + + return RID(); + +} +void Rasterizer3DS::render_target_set_size(RID p_render_target, int p_width, int p_height){ + + +} +RID Rasterizer3DS::render_target_get_texture(RID p_render_target) const{ + + return RID(); + +} +bool Rasterizer3DS::render_target_renedered_in_frame(RID p_render_target){ + + return false; +} + + +void Rasterizer3DS::begin_frame() { + C3D_FrameBegin(C3D_FRAME_SYNCDRAW); + C3D_RenderTargetClear(top_rt->target, C3D_CLEAR_ALL, clear_color_top, 0); + C3D_FrameDrawOn(top_rt->target); +} + +void Rasterizer3DS::capture_viewport(Image* r_capture) { + + +} + + +void Rasterizer3DS::clear_viewport(const Color& p_color) { + + clear_color_top = convert_color(&p_color); +}; + +void Rasterizer3DS::set_viewport(const VS::ViewportRect& p_viewport) { + + + +} + +void Rasterizer3DS::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { + + +} + + +void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { + + +}; + +void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { + +} + +void Rasterizer3DS::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { + + +} + +void Rasterizer3DS::add_light( RID p_light_instance ) { + + + +} + + + + +void Rasterizer3DS::add_mesh( const RID& p_mesh, const InstanceData *p_data) { + + +} + +void Rasterizer3DS::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ + + + + +} + +void Rasterizer3DS::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ + + + +} + + + +void Rasterizer3DS::end_scene() { + + +} +void Rasterizer3DS::end_shadow_map() { + +} + + +void Rasterizer3DS::end_frame() { + + C3D_FrameEnd(0); +} + +/* CANVAS API */ + + +void Rasterizer3DS::canvas_begin() { + + + +} +void Rasterizer3DS::canvas_disable_blending() { + + + +} + +void Rasterizer3DS::canvas_set_opacity(float p_opacity) { + + +} + +void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { + + +} + + +void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) { + + + +} + +void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { + + + + +} + +void Rasterizer3DS::canvas_end_rect() { + + +} + +void Rasterizer3DS::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { + + + +} + +void Rasterizer3DS::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { + + + // _set_glcoloro( p_modulate,canvas_opacity ); + + if ( p_texture.is_valid() ) { + + // sceGuEnable(GU_TEXTURE_2D); + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + // glActiveTexture(GL_TEXTURE0); + // glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexBind(0, &texture->texture); + + if (!(p_flags&CANVAS_RECT_REGION)) { + + Rect2 region = Rect2(0,0,texture->width,texture->height); + _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); + + } else { + + + _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); + + } + + } else { + + WARN_PRINT("p_texture is not valid"); + + // sceGuDisable(GU_TEXTURE_2D); + // _draw_quad( p_rect ); + + } + +} +void Rasterizer3DS::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { + + +} +void Rasterizer3DS::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { + + + +} + + +void Rasterizer3DS::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { + + + +} + +void Rasterizer3DS::canvas_set_transform(const Matrix32& p_transform) { + + +} + +/* ENVIRONMENT */ + +RID Rasterizer3DS::environment_create() { + + Environment * env = memnew( Environment ); + return environment_owner.make_rid(env); +} + +void Rasterizer3DS::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { + + ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_mode=p_bg; +} + +VS::EnvironmentBG Rasterizer3DS::environment_get_background(RID p_env) const{ + + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX); + return env->bg_mode; +} + +void Rasterizer3DS::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_param[p_param]=p_value; + +} +Variant Rasterizer3DS::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->bg_param[p_param]; + +} + +void Rasterizer3DS::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ + + ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_enabled[p_effect]=p_enabled; +} +bool Rasterizer3DS::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{ + + ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,false); + return env->fx_enabled[p_effect]; + +} + +void Rasterizer3DS::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_param[p_param]=p_value; +} +Variant Rasterizer3DS::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->fx_param[p_param]; + +} + + +RID Rasterizer3DS::sampled_light_dp_create(int p_width,int p_height) { + + return sampled_light_owner.make_rid(memnew(SampledLight)); +} + +void Rasterizer3DS::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) { + + +} + + +/*MISC*/ + +bool Rasterizer3DS::is_texture(const RID& p_rid) const { + + return texture_owner.owns(p_rid); +} +bool Rasterizer3DS::is_material(const RID& p_rid) const { + + return material_owner.owns(p_rid); +} +bool Rasterizer3DS::is_mesh(const RID& p_rid) const { + + return mesh_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_immediate(const RID& p_rid) const { + + return immediate_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_multimesh(const RID& p_rid) const { + + return multimesh_owner.owns(p_rid); +} +bool Rasterizer3DS::is_particles(const RID &p_beam) const { + + return particles_owner.owns(p_beam); +} + +bool Rasterizer3DS::is_light(const RID& p_rid) const { + + return light_owner.owns(p_rid); +} +bool Rasterizer3DS::is_light_instance(const RID& p_rid) const { + + return light_instance_owner.owns(p_rid); +} +bool Rasterizer3DS::is_particles_instance(const RID& p_rid) const { + + return particles_instance_owner.owns(p_rid); +} +bool Rasterizer3DS::is_skeleton(const RID& p_rid) const { + + return skeleton_owner.owns(p_rid); +} +bool Rasterizer3DS::is_environment(const RID& p_rid) const { + + return environment_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_shader(const RID& p_rid) const { + + return false; +} + +void Rasterizer3DS::free(const RID& p_rid) { + + if (texture_owner.owns(p_rid)) { + + // delete the texture + Texture *texture = texture_owner.get(p_rid); + texture_owner.free(p_rid); + memdelete(texture); + + } else if (shader_owner.owns(p_rid)) { + + // delete the texture + Shader *shader = shader_owner.get(p_rid); + shader_owner.free(p_rid); + memdelete(shader); + + } else if (material_owner.owns(p_rid)) { + + Material *material = material_owner.get( p_rid ); + material_owner.free(p_rid); + memdelete(material); + + } else if (mesh_owner.owns(p_rid)) { + + Mesh *mesh = mesh_owner.get(p_rid); + + for (int i=0;isurfaces.size();i++) { + + memdelete( mesh->surfaces[i] ); + }; + + mesh->surfaces.clear(); + mesh_owner.free(p_rid); + memdelete(mesh); + + } else if (multimesh_owner.owns(p_rid)) { + + MultiMesh *multimesh = multimesh_owner.get(p_rid); + multimesh_owner.free(p_rid); + memdelete(multimesh); + + } else if (immediate_owner.owns(p_rid)) { + + Immediate *immediate = immediate_owner.get(p_rid); + immediate_owner.free(p_rid); + memdelete(immediate); + + } else if (particles_owner.owns(p_rid)) { + + Particles *particles = particles_owner.get(p_rid); + particles_owner.free(p_rid); + memdelete(particles); + } else if (particles_instance_owner.owns(p_rid)) { + + ParticlesInstance *particles_isntance = particles_instance_owner.get(p_rid); + particles_instance_owner.free(p_rid); + memdelete(particles_isntance); + + } else if (skeleton_owner.owns(p_rid)) { + + Skeleton *skeleton = skeleton_owner.get( p_rid ); + skeleton_owner.free(p_rid); + memdelete(skeleton); + + } else if (light_owner.owns(p_rid)) { + + Light *light = light_owner.get( p_rid ); + light_owner.free(p_rid); + memdelete(light); + + } else if (light_instance_owner.owns(p_rid)) { + + LightInstance *light_instance = light_instance_owner.get( p_rid ); + light_instance_owner.free(p_rid); + memdelete( light_instance ); + + + } else if (environment_owner.owns(p_rid)) { + + Environment *env = environment_owner.get( p_rid ); + environment_owner.free(p_rid); + memdelete( env ); + } else if (sampled_light_owner.owns(p_rid)) { + + SampledLight *sampled_light = sampled_light_owner.get( p_rid ); + ERR_FAIL_COND(!sampled_light); + + sampled_light_owner.free(p_rid); + memdelete( sampled_light ); + + }; +} + + +void Rasterizer3DS::custom_shade_model_set_shader(int p_model, RID p_shader) { + + +}; + +RID Rasterizer3DS::custom_shade_model_get_shader(int p_model) const { + + return RID(); +}; + +void Rasterizer3DS::custom_shade_model_set_name(int p_model, const String& p_name) { + +}; + +String Rasterizer3DS::custom_shade_model_get_name(int p_model) const { + + return String(); +}; + +void Rasterizer3DS::custom_shade_model_set_param_info(int p_model, const List& p_info) { + +}; + +void Rasterizer3DS::custom_shade_model_get_param_info(int p_model, List* p_info) const { + +}; + + + +void Rasterizer3DS::init() { + C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); + + top_rt = memnew(RenderTarget); + + top_rt->target = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + C3D_RenderTargetSetOutput(top_rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); +} + +void Rasterizer3DS::finish() { + + +} + +int Rasterizer3DS::get_render_info(VS::RenderInfo p_info) { + + return 0; +} + +bool Rasterizer3DS::needs_to_draw_next_frame() const { + + return false; +} + + +bool Rasterizer3DS::has_feature(VS::Features p_feature) const { + + return false; + +} + + +Rasterizer3DS::Rasterizer3DS() { + +}; + +Rasterizer3DS::~Rasterizer3DS() { + C3D_Fini(); +}; + diff --git a/platform/3ds/rasterizer_3ds.h b/platform/3ds/rasterizer_3ds.h new file mode 100644 index 00000000..c96dcfe8 --- /dev/null +++ b/platform/3ds/rasterizer_3ds.h @@ -0,0 +1,802 @@ +/*************************************************************************/ +/* rasterizer_3ds.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef RASTERIZER_3DS_H +#define RASTERIZER_3DS_H + +#ifdef __3DS__ +extern "C" { +#include <3ds/types.h> +#include <3ds/gpu/gpu.h> +#include <3ds/gfx.h> +#include <3ds/gpu/gx.h> +#include <3ds/gpu/shaderProgram.h> +#include <3ds/allocator/linear.h> +} +#undef __3DS__ +#include +#define __3DS__ +#endif + +#include "servers/visual/rasterizer.h" + +#include "image.h" +#include "rid.h" +#include "servers/visual_server.h" +#include "list.h" +#include "map.h" +#include "camera_matrix.h" +#include "sort.h" + + +#include "servers/visual/particle_system_sw.h" + +static uint32_t convert_color(const Color* ic) { + + uint32_t c=(uint8_t)(ic->r*255); + c<<=8; + c|=(uint8_t)(ic->g*255); + c<<=8; + c|=(uint8_t)(ic->b*255); + c<<=8; + c|=(uint8_t)(ic->a*255); + + return c; +} + +class Rasterizer3DS : public Rasterizer { + + struct Texture { + + uint32_t flags; + int width,height; + Image::Format format; + Image image[6]; + C3D_Tex texture; + Texture() { + + flags=width=height=0; + format=Image::FORMAT_GRAYSCALE; + } + + ~Texture() { + + } + }; + + mutable RID_Owner texture_owner; + + struct RenderTarget { + C3D_RenderTarget* target; + }; + + mutable RID_Owner render_target_owner; + uint32_t clear_color_top; + + struct Shader { + + String vertex_code; + String fragment_code; + String light_code; + VS::ShaderMode mode; + Map params; + int fragment_line; + int vertex_line; + int light_line; + bool valid; + bool has_alpha; + bool use_world_transform; + + }; + + mutable RID_Owner shader_owner; + + + struct Material { + + bool flags[VS::MATERIAL_FLAG_MAX]; + + VS::MaterialDepthDrawMode depth_draw_mode; + + VS::MaterialBlendMode blend_mode; + + float line_width; + float point_size; + + RID shader; // shader material + + Map shader_params; + + + Material() { + + + for(int i=0;i material_owner; + + void _material_check_alpha(Material *p_material); + + + struct Geometry { + + enum Type { + GEOMETRY_INVALID, + GEOMETRY_SURFACE, + GEOMETRY_POLY, + GEOMETRY_PARTICLES, + GEOMETRY_MULTISURFACE, + }; + + Type type; + RID material; + bool has_alpha; + bool material_owned; + + Geometry() { has_alpha=false; material_owned = false; } + virtual ~Geometry() {}; + }; + + struct GeometryOwner { + + virtual ~GeometryOwner() {} + }; + + class Mesh; + + struct Surface : public Geometry { + + Array data; + Array morph_data; + + bool packed; + bool alpha_sort; + int morph_target_count; + AABB aabb; + + VS::PrimitiveType primitive; + + uint32_t format; + uint32_t morph_format; + + RID material; + bool material_owned; + + + Surface() { + + packed=false; + morph_target_count=0; + material_owned=false; + format=0; + morph_format=0; + + primitive=VS::PRIMITIVE_POINTS; + } + + ~Surface() { + + } + }; + + + struct Mesh { + + bool active; + Vector surfaces; + int morph_target_count; + VS::MorphTargetMode morph_target_mode; + AABB custom_aabb; + + mutable uint64_t last_pass; + Mesh() { + morph_target_mode=VS::MORPH_MODE_NORMALIZED; + morph_target_count=0; + last_pass=0; + active=false; + } + }; + mutable RID_Owner mesh_owner; + + struct MultiMesh; + + struct MultiMeshSurface : public Geometry { + + Surface *surface; + MultiMeshSurface() { type=GEOMETRY_MULTISURFACE; } + }; + + struct MultiMesh : public GeometryOwner { + + struct Element { + + Transform xform; + Color color; + }; + + AABB aabb; + RID mesh; + int visible; + + //IDirect3DVertexBuffer9* instance_buffer; + Vector elements; + + MultiMesh() { + visible=-1; + } + + + }; + + + mutable RID_Owner multimesh_owner; + + struct Immediate { + + + RID material; + int empty; + }; + + mutable RID_Owner immediate_owner; + + struct Particles : public Geometry { + + ParticleSystemSW data; // software particle system + + Particles() { + type=GEOMETRY_PARTICLES; + + } + }; + + mutable RID_Owner particles_owner; + + + struct ParticlesInstance : public GeometryOwner { + + RID particles; + + ParticleSystemProcessSW particles_process; + Transform transform; + + ParticlesInstance() { } + }; + + mutable RID_Owner particles_instance_owner; + ParticleSystemDrawInfoSW particle_draw_info; + + struct Skeleton { + + Vector bones; + + }; + + mutable RID_Owner skeleton_owner; + + + struct Light { + + VS::LightType type; + float vars[VS::LIGHT_PARAM_MAX]; + Color colors[3]; + bool shadow_enabled; + RID projector; + bool volumetric_enabled; + Color volumetric_color; + + + Light() { + + vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1; + vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45; + vars[VS::LIGHT_PARAM_ATTENUATION]=1.0; + vars[VS::LIGHT_PARAM_ENERGY]=1.0; + vars[VS::LIGHT_PARAM_RADIUS]=1.0; + vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.05; + + colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1); + colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1); + shadow_enabled=false; + volumetric_enabled=false; + } + }; + + + struct Environment { + + + VS::EnvironmentBG bg_mode; + Variant bg_param[VS::ENV_BG_PARAM_MAX]; + bool fx_enabled[VS::ENV_FX_MAX]; + Variant fx_param[VS::ENV_FX_PARAM_MAX]; + + Environment() { + + bg_mode=VS::ENV_BG_DEFAULT_COLOR; + bg_param[VS::ENV_BG_PARAM_COLOR]=Color(0,0,0); + bg_param[VS::ENV_BG_PARAM_TEXTURE]=RID(); + bg_param[VS::ENV_BG_PARAM_CUBEMAP]=RID(); + bg_param[VS::ENV_BG_PARAM_ENERGY]=1.0; + + for(int i=0;i environment_owner; + + struct SampledLight { + + int w,h; + }; + + mutable RID_Owner sampled_light_owner; + + struct ShadowBuffer; + + struct LightInstance { + + struct SplitInfo { + + CameraMatrix camera; + Transform transform; + float near; + float far; + }; + + RID light; + Light *base; + Transform transform; + CameraMatrix projection; + + Transform custom_transform; + CameraMatrix custom_projection; + + Vector3 light_vector; + Vector3 spot_vector; + float linear_att; + + + LightInstance() { linear_att=1.0; } + + }; + + mutable RID_Owner light_owner; + mutable RID_Owner light_instance_owner; + + + RID default_material; + + RenderTarget* top_rt; + + +public: + + /* TEXTURE API */ + + virtual RID texture_create(); + virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT); + virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT); + virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const; + virtual void texture_set_flags(RID p_texture,uint32_t p_flags); + virtual uint32_t texture_get_flags(RID p_texture) const; + virtual Image::Format texture_get_format(RID p_texture) const; + virtual uint32_t texture_get_width(RID p_texture) const; + virtual uint32_t texture_get_height(RID p_texture) const; + virtual bool texture_has_alpha(RID p_texture) const; + virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); + virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; + + /* SHADER API */ + + virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); + + virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode); + virtual VS::ShaderMode shader_get_mode(RID p_shader) const; + + virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0); + virtual String shader_get_fragment_code(RID p_shader) const; + virtual String shader_get_vertex_code(RID p_shader) const; + virtual String shader_get_light_code(RID p_shader) const; + + virtual void shader_get_param_list(RID p_shader, List *p_param_list) const; + + /* COMMON MATERIAL API */ + + virtual RID material_create(); + + virtual void material_set_shader(RID p_shader_material, RID p_shader); + virtual RID material_get_shader(RID p_shader_material) const; + + virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value); + virtual Variant material_get_param(RID p_material, const StringName& p_param) const; + + virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled); + virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const; + + virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode); + virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const; + + virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode); + virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const; + + virtual void material_set_line_width(RID p_material,float p_line_width); + virtual float material_get_line_width(RID p_material) const; + + /* MESH API */ + + + virtual RID mesh_create(); + + virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false); + virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const; + virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const; + virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat); + + virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount); + virtual int mesh_get_morph_target_count(RID p_mesh) const; + + virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode); + virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const; + + virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false); + virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const; + + virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const; + virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const; + virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const; + virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const; + + virtual void mesh_remove_surface(RID p_mesh,int p_index); + virtual int mesh_get_surface_count(RID p_mesh) const; + + virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const; + + virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb); + virtual AABB mesh_get_custom_aabb(RID p_mesh) const; + + + /* MULTIMESH API */ + + virtual RID multimesh_create(); + + virtual void multimesh_set_instance_count(RID p_multimesh,int p_count); + virtual int multimesh_get_instance_count(RID p_multimesh) const; + + virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh); + virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb); + virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform); + virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color); + + virtual RID multimesh_get_mesh(RID p_multimesh) const; + virtual AABB multimesh_get_aabb(RID p_multimesh) const;; + + virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const; + virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const; + + virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible); + virtual int multimesh_get_visible_instances(RID p_multimesh) const; + + /* IMMEDIATE API */ + + virtual RID immediate_create(); + virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID()); + virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex); + virtual void immediate_normal(RID p_immediate,const Vector3& p_normal); + virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent); + virtual void immediate_color(RID p_immediate,const Color& p_color); + virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv); + virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv); + virtual void immediate_end(RID p_immediate); + virtual void immediate_clear(RID p_immediate); + virtual void immediate_set_material(RID p_immediate,RID p_material); + virtual RID immediate_get_material(RID p_immediate) const; + + virtual AABB immediate_get_aabb(RID p_mesh) const; + + /* PARTICLES API */ + + virtual RID particles_create(); + + virtual void particles_set_amount(RID p_particles, int p_amount); + virtual int particles_get_amount(RID p_particles) const; + + virtual void particles_set_emitting(RID p_particles, bool p_emitting); + virtual bool particles_is_emitting(RID p_particles) const; + + virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility); + virtual AABB particles_get_visibility_aabb(RID p_particles) const; + + virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents); + virtual Vector3 particles_get_emission_half_extents(RID p_particles) const; + + virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity); + virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const; + + virtual void particles_set_emission_points(RID p_particles, const DVector& p_points); + virtual DVector particles_get_emission_points(RID p_particles) const; + + virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal); + virtual Vector3 particles_get_gravity_normal(RID p_particles) const; + + virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value); + virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const; + + virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness); + virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const; + + virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos); + virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const; + + virtual void particles_set_color_phases(RID p_particles, int p_phases); + virtual int particles_get_color_phases(RID p_particles) const; + + virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color); + virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const; + + virtual void particles_set_attractors(RID p_particles, int p_attractors); + virtual int particles_get_attractors(RID p_particles) const; + + virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos); + virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const; + + virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force); + virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const; + + virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false); + virtual RID particles_get_material(RID p_particles) const; + + virtual AABB particles_get_aabb(RID p_particles) const; + + virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable); + virtual bool particles_has_height_from_velocity(RID p_particles) const; + + virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable); + virtual bool particles_is_using_local_coordinates(RID p_particles) const; + + /* SKELETON API */ + + virtual RID skeleton_create(); + virtual void skeleton_resize(RID p_skeleton,int p_bones); + virtual int skeleton_get_bone_count(RID p_skeleton) const; + virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform); + virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone); + + + /* LIGHT API */ + + virtual RID light_create(VS::LightType p_type); + virtual VS::LightType light_get_type(RID p_light) const; + + virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color); + virtual Color light_get_color(RID p_light,VS::LightColor p_type) const; + + virtual void light_set_shadow(RID p_light,bool p_enabled); + virtual bool light_has_shadow(RID p_light) const; + + virtual void light_set_volumetric(RID p_light,bool p_enabled); + virtual bool light_is_volumetric(RID p_light) const; + + virtual void light_set_projector(RID p_light,RID p_texture); + virtual RID light_get_projector(RID p_light) const; + + virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value); + virtual float light_get_var(RID p_light, VS::LightParam p_var) const; + + virtual void light_set_operator(RID p_light,VS::LightOp p_op); + virtual VS::LightOp light_get_operator(RID p_light) const; + + virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode); + virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const; + + + virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode); + virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const; + virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value); + virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const; + + virtual AABB light_get_aabb(RID p_poly) const; + + + virtual RID light_instance_create(RID p_light); + virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform); + + virtual bool light_instance_has_shadow(RID p_light_instance) const; + virtual bool light_instance_assign_shadow(RID p_light_instance); + virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const; + virtual int light_instance_get_shadow_passes(RID p_light_instance) const; + virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const; + virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); + virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const { return 1; } + + virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const; + virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); + + virtual void shadow_clear_near(); + virtual bool shadow_allocate_near(RID p_light); + virtual bool shadow_allocate_far(RID p_light); + + + /* PARTICLES INSTANCE */ + + virtual RID particles_instance_create(RID p_particles); + virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform); + + /* VIEWPORT */ + + virtual RID viewport_data_create(); + + virtual RID render_target_create(); + virtual void render_target_set_size(RID p_render_target, int p_width, int p_height); + virtual RID render_target_get_texture(RID p_render_target) const; + virtual bool render_target_renedered_in_frame(RID p_render_target); + + /* RENDER API */ + /* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + virtual void begin_frame(); + + virtual void set_viewport(const VS::ViewportRect& p_viewport); + virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false); + virtual void clear_viewport(const Color& p_color); + virtual void capture_viewport(Image* r_capture); + + + virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug); + virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass ); + + virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection); + + virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls + + + virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); + virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); + virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} + virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); + + virtual void end_scene(); + virtual void end_shadow_map(); + + virtual void end_frame(); + + /* CANVAS API */ + + virtual void canvas_begin(); + virtual void canvas_disable_blending(); + virtual void canvas_set_opacity(float p_opacity); + virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode); + virtual void canvas_begin_rect(const Matrix32& p_transform); + virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect); + virtual void canvas_end_rect(); + virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width); + virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate); + virtual void canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1)); + virtual void canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width); + virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor); + virtual void canvas_set_transform(const Matrix32& p_transform); + + /* ENVIRONMENT */ + + virtual RID environment_create(); + + virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg); + virtual VS::EnvironmentBG environment_get_background(RID p_env) const; + + virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value); + virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const; + + virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled); + virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const; + + virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value); + virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const; + + /* SAMPLED LIGHT */ + virtual RID sampled_light_dp_create(int p_width,int p_height); + virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier); + + + /*MISC*/ + + virtual bool is_texture(const RID& p_rid) const; + virtual bool is_material(const RID& p_rid) const; + virtual bool is_mesh(const RID& p_rid) const; + virtual bool is_immediate(const RID& p_rid) const; + virtual bool is_multimesh(const RID& p_rid) const; + virtual bool is_particles(const RID &p_beam) const; + + virtual bool is_light(const RID& p_rid) const; + virtual bool is_light_instance(const RID& p_rid) const; + virtual bool is_particles_instance(const RID& p_rid) const; + virtual bool is_skeleton(const RID& p_rid) const; + virtual bool is_environment(const RID& p_rid) const; + + virtual bool is_shader(const RID& p_rid) const; + + virtual void free(const RID& p_rid); + + virtual void custom_shade_model_set_shader(int p_model, RID p_shader); + virtual RID custom_shade_model_get_shader(int p_model) const; + virtual void custom_shade_model_set_name(int p_model, const String& p_name); + virtual String custom_shade_model_get_name(int p_model) const; + virtual void custom_shade_model_set_param_info(int p_model, const List& p_info); + virtual void custom_shade_model_get_param_info(int p_model, List* p_info) const; + + + virtual void init(); + virtual void finish(); + + virtual int get_render_info(VS::RenderInfo p_info); + + virtual bool needs_to_draw_next_frame() const; + + virtual bool has_feature(VS::Features p_feature) const; + + + Rasterizer3DS(); + virtual ~Rasterizer3DS(); +}; + + +#endif // RASTERIZER_DUMMY_H diff --git a/platform/psp/SCsub b/platform/psp/SCsub index 921e9b8c..dd43ea2a 100644 --- a/platform/psp/SCsub +++ b/platform/psp/SCsub @@ -7,6 +7,7 @@ Import('env') common_psp=[\ "os_psp.cpp",\ "rasterizer_psp.cpp",\ + "audio_driver_psp.cpp",\ ] prog = env.Program('#bin/godot_psp',['godot_psp.cpp']+common_psp) diff --git a/platform/psp/audio_driver_psp.cpp b/platform/psp/audio_driver_psp.cpp new file mode 100644 index 00000000..91c7989f --- /dev/null +++ b/platform/psp/audio_driver_psp.cpp @@ -0,0 +1,161 @@ +/*************************************************************************/ +/* audio_driver_psp.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "audio_driver_psp.h" +#include "core/os/thread.h" +#include "globals.h" +#include "os/os.h" +#include + + +static int channel_num = 1; + +int32_t* buffer; + +Error AudioDriverPSP::init() { + thread_exited=false; + exit_thread=false; + pcm_open = false; + samples_in = NULL; + + mix_rate = 44100; + output_format = OUTPUT_STEREO; + channels = 2; + + int latency = GLOBAL_DEF("audio/output_latency",25); + buffer_size = nearest_power_of_2( latency * mix_rate / 1000 ); + + samples_in = memnew_arr(int32_t, buffer_size*channels); + samples_out = memnew_arr(int16_t, buffer_size*channels); + + sceAudioOutput2Reserve(buffer_size); + + mutex = Mutex::create(); + // thread = Thread::create(AudioDriverPSP::thread_func, this); + SceUID thid; + thid = sceKernelCreateThread("audio_thread", (SceKernelThreadEntry)AudioDriverPSP::thread_func, 0x18, 0x10000, 0, NULL); + sceKernelStartThread(thid, sizeof(AudioDriverPSP), this); + + return OK; +}; + +void AudioDriverPSP::thread_func(void *p_udata) { + int buffer_index = 0; + AudioDriverPSP* ad = (AudioDriverPSP*)p_udata; + + int sample_count = ad->buffer_size ; + uint64_t usdelay = (ad->buffer_size / float(ad->mix_rate)) * 1000000; + + while (!ad->exit_thread) { + + + if (ad->exit_thread) + break; + + if (ad->active) { + ad->lock(); + + ad->audio_server_process(ad->buffer_size, ad->samples_in); + + ad->unlock(); + + for(int i = 0; i < sample_count*2; ++i) { + ad->samples_out[i] = ad->samples_in[i] >> 16; + } + + + } else + { + for (int i = 0; i < sample_count*2; i++) { + + ad->samples_out[i] = 0; + } + } + + sceAudioOutput2OutputBlocking(0x8000*3, ad->samples_out); + } + + + ad->thread_exited=true; +}; + +void AudioDriverPSP::start() { + active = true; +}; + +int AudioDriverPSP::get_mix_rate() const { + + return mix_rate; +}; + +AudioDriverSW::OutputFormat AudioDriverPSP::get_output_format() const { + + return output_format; +}; +void AudioDriverPSP::lock() { + + if (!thread || !mutex) + return; + mutex->lock(); +}; +void AudioDriverPSP::unlock() { + + if (!thread || !mutex) + return; + mutex->unlock(); +}; + +void AudioDriverPSP::finish() { + exit_thread = true; + Thread::wait_to_finish(thread); + + sceAudioOutput2Release(); + + if (samples_in) { + memdelete_arr(samples_in); + }; + if (samples_out) { + memdelete_arr(samples_out); + }; + + + if (mutex) + memdelete(mutex); + +}; + +AudioDriverPSP::AudioDriverPSP() { + + mutex = NULL; + active = false; +}; + +AudioDriverPSP::~AudioDriverPSP() { + +}; diff --git a/platform/psp/audio_driver_psp.h b/platform/psp/audio_driver_psp.h new file mode 100644 index 00000000..15a94c09 --- /dev/null +++ b/platform/psp/audio_driver_psp.h @@ -0,0 +1,83 @@ +/*************************************************************************/ +/* audio_driver_psp.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef AUDIO_DRIVER_PSP_H +#define AUDIO_DRIVER_PSP_H + +#include "servers/audio/audio_server_sw.h" + +#include "core/os/thread.h" +#include "core/os/mutex.h" + +#include +#include +#include +#include + +class AudioDriverPSP : public AudioDriverSW { + + Thread *thread; + Mutex *mutex; + int32_t* samples_in; + int16_t* samples_out; + + static void thread_func(void *p_udata); + + + int buffer_size; + + unsigned int mix_rate; + OutputFormat output_format; + + int channels; + + bool active; + bool thread_exited; + bool exit_thread; + bool pcm_open; + +public: + + const char* get_name() const { + return "PSP Audio"; + }; + + virtual Error init(); + virtual void start(); + virtual int get_mix_rate() const; + virtual OutputFormat get_output_format() const; + + virtual void lock(); + virtual void unlock(); + virtual void finish(); + + AudioDriverPSP(); + ~AudioDriverPSP(); +}; + +#endif diff --git a/platform/psp/detect.py b/platform/psp/detect.py index 49d6e75d..0eceee16 100644 --- a/platform/psp/detect.py +++ b/platform/psp/detect.py @@ -55,7 +55,7 @@ def configure(env): env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED']) env.Append(CPPFLAGS=['-DNEED_LONG_INT', '-DPSP_ENABLED', '-DGLES1_ENABLED', '-DNO_THREADS']) - env.Append(LIBS=['pthread', 'z', 'pspdisplay', 'pspge', 'pspgu', 'pspgum', 'pspvfpu', 'pspctrl']) #TODO detect linux/BSD! + env.Append(LIBS=['pthread', 'z', 'pspdisplay', 'pspge', 'pspgu', 'pspgum', 'pspvfpu', 'pspctrl', 'pspaudio']) #TODO detect linux/BSD! if (env["CXX"]=="clang++"): env.Append(CPPFLAGS=['-DTYPED_METHOD_BIND']) diff --git a/platform/psp/godot_psp.cpp b/platform/psp/godot_psp.cpp index 248289b7..1386ee76 100644 --- a/platform/psp/godot_psp.cpp +++ b/platform/psp/godot_psp.cpp @@ -44,13 +44,6 @@ PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER | THREAD_ATTR_VFPU); PSP_HEAP_SIZE_KB(-1); int main(int argc, char* argv[]) { - // glutInit(&argc, argv); - // - // glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH); - // - // glutInitWindowSize(480, 272); - // glutInitWindowPosition(0, 0); - // glutCreateWindow("Godot"); OS_PSP os; char* args[] = {"-path", "."}; diff --git a/platform/psp/os_psp.cpp b/platform/psp/os_psp.cpp index b63a2dc6..a78f67f8 100644 --- a/platform/psp/os_psp.cpp +++ b/platform/psp/os_psp.cpp @@ -53,7 +53,7 @@ const char * OS_PSP::get_video_driver_name(int p_driver) const { } OS::VideoMode OS_PSP::get_default_video_mode() const { - return OS::VideoMode(480,272,false); + return OS::VideoMode(800,600,false); } static MemoryPoolStaticMalloc *mempool_static=NULL; @@ -301,7 +301,7 @@ void OS_PSP::swap_buffers() { OS_PSP::OS_PSP() { - AudioDriverManagerSW::add_driver(&driver_dummy); + AudioDriverManagerSW::add_driver(&driver_psp); //adriver here grab=false; diff --git a/platform/psp/os_psp.h b/platform/psp/os_psp.h index eaa0fea3..16a2a8bb 100644 --- a/platform/psp/os_psp.h +++ b/platform/psp/os_psp.h @@ -29,7 +29,7 @@ #ifndef OS_PSP_H #define OS_PSP_H - +#include "audio_driver_psp.h" #include "os/input.h" #include "drivers/unix/os_unix.h" #include "servers/visual_server.h" @@ -44,11 +44,6 @@ #include "servers/physics_2d/physics_2d_server_sw.h" #undef CursorShape -// #define GLdouble float -// #include -// #include - -// void glutSwapBuffers(); class OS_PSP : public OS { @@ -57,8 +52,9 @@ class OS_PSP : public OS { VideoMode current_videomode; List args; MainLoop *main_loop; - - AudioDriverDummy driver_dummy; + + + AudioDriverDummy driver_psp; bool grab; uint64_t ticks_start; diff --git a/platform/psp/rasterizer_psp.cpp b/platform/psp/rasterizer_psp.cpp index a6d95a37..b400c56c 100644 --- a/platform/psp/rasterizer_psp.cpp +++ b/platform/psp/rasterizer_psp.cpp @@ -3003,8 +3003,6 @@ void RasterizerPSP::set_render_target(RID p_render_target, bool p_transparent_bg void RasterizerPSP::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { - - opaque_render_list.clear(); alpha_render_list.clear(); light_instance_count=0; @@ -4032,7 +4030,6 @@ void RasterizerPSP::_render(const Geometry *p_geometry,const Material *p_materia switch(p_geometry->type) { case Geometry::GEOMETRY_SURFACE: { - Surface *s = (Surface*)p_geometry; _rinfo.vertex_count+=s->array_len; @@ -4145,7 +4142,6 @@ void RasterizerPSP::_setup_shader_params(const Material *p_material) { } void RasterizerPSP::_render_list_forward(RenderList *p_render_list,bool p_reverse_cull) { - const Material *prev_material=NULL; uint64_t prev_light_key=0; const Skeleton *prev_skeleton=NULL; @@ -4160,7 +4156,7 @@ void RasterizerPSP::_render_list_forward(RenderList *p_render_list,bool p_revers uint64_t light_key = e->light_key; const Skeleton *skeleton = e->skeleton; const Geometry *geometry = e->geometry; - + if (material!=prev_material || geometry->type!=prev_geometry_type) { _setup_material(e->geometry,material); _rinfo.mat_change_count++; @@ -4241,7 +4237,6 @@ void RasterizerPSP::_render_list_forward(RenderList *p_render_list,bool p_revers void RasterizerPSP::end_scene() { - sceGuEnable(GU_BLEND); sceGuDepthMask(GU_TRUE); sceGuEnable(GU_DEPTH_TEST); diff --git a/scene/audio/stream_player.cpp b/scene/audio/stream_player.cpp index 73025fb5..4752c5ff 100644 --- a/scene/audio/stream_player.cpp +++ b/scene/audio/stream_player.cpp @@ -74,7 +74,7 @@ Ref StreamPlayer::get_stream() const { void StreamPlayer::play() { - + ERR_FAIL_COND(!is_inside_tree()); if (stream.is_null()) return; @@ -82,6 +82,7 @@ void StreamPlayer::play() { stop(); stream->play(); + AudioServer::get_singleton()->stream_set_active(stream_rid,true); AudioServer::get_singleton()->stream_set_volume_scale(stream_rid,volume); // if (stream->get_update_mode()!=AudioStream::UPDATE_NONE) From a56abb3aea175dbdf32b4e9fe3c58db8c5a1381a Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Thu, 29 Feb 2024 19:09:44 +0100 Subject: [PATCH 02/15] Backported mem improvements and updated 3ds rasterizer --- core/typedefs.h | 27 ++++ core/vector.h | 31 ++++- drivers/unix/memory_pool_static_malloc.cpp | 27 +++- platform/3ds/SCsub | 1 + platform/3ds/rasterizer_3ds.cpp | 155 ++++++++++++++++++--- platform/3ds/rasterizer_3ds.h | 18 ++- platform/3ds/shaders/SCsub | 11 ++ platform/3ds/shaders/simple_2d.h | 3 + platform/3ds/shaders/simple_2d.pica | 38 +++++ platform/3ds/shaders/simple_2d.shbin | Bin 0 -> 292 bytes platform/3ds/shaders/simple_3d.h | 3 + platform/3ds/shaders/simple_3d.pica | 87 ++++++++++++ platform/3ds/shaders/simple_3d.shbin | Bin 0 -> 520 bytes 13 files changed, 373 insertions(+), 28 deletions(-) create mode 100644 platform/3ds/shaders/SCsub create mode 100644 platform/3ds/shaders/simple_2d.h create mode 100644 platform/3ds/shaders/simple_2d.pica create mode 100644 platform/3ds/shaders/simple_2d.shbin create mode 100644 platform/3ds/shaders/simple_3d.h create mode 100644 platform/3ds/shaders/simple_3d.pica create mode 100644 platform/3ds/shaders/simple_3d.shbin diff --git a/core/typedefs.h b/core/typedefs.h index f62071c1..89f6299d 100644 --- a/core/typedefs.h +++ b/core/typedefs.h @@ -155,7 +155,21 @@ inline void __swap_tmpl(T &x, T &y ) { ((m_hex>='a' && m_hex<='f')?(10+m_hex-'a'):0))) +// Macro to check whether we are compiled by clang +// and we have a specific builtin +#if defined(__llvm__) && defined(__has_builtin) + #define _llvm_has_builtin(x) __has_builtin(x) +#else + #define _llvm_has_builtin(x) 0 +#endif +#if (defined(__GNUC__) && (__GNUC__ >= 5)) || _llvm_has_builtin(__builtin_mul_overflow) +# define _mul_overflow __builtin_mul_overflow +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 5)) || _llvm_has_builtin(__builtin_add_overflow) +# define _add_overflow __builtin_add_overflow +#endif /** Function to find the nearest (bigger) power of 2 to an integer */ @@ -167,6 +181,19 @@ static _FORCE_INLINE_ unsigned int nearest_power_of_2(unsigned int x) { x |= x >> 4; x |= x >> 8; x |= x >> 16; + + return ++x; +} + +template +static _FORCE_INLINE_ T nearest_power_of_2_templated(T x) { + + --x; + // If the compiler is smart, it unrolls this loop + // If its dumb, this is a bit slow. + for (size_t i = 0; i < sizeof(T); i++) + x |= x >> (1 << i); + return ++x; } diff --git a/core/vector.h b/core/vector.h index 90a9bf71..f87e9a72 100644 --- a/core/vector.h +++ b/core/vector.h @@ -69,10 +69,26 @@ class Vector { } - _FORCE_INLINE_ int _get_alloc_size(int p_elements) const { - - return nearest_power_of_2(p_elements*sizeof(T)+sizeof(SafeRefCount)+sizeof(int)); + _FORCE_INLINE_ size_t _get_alloc_size(size_t p_elements) const { + + return nearest_power_of_2_templated(p_elements*sizeof(T)+sizeof(SafeRefCount)+sizeof(int)); } + + _FORCE_INLINE_ bool _get_alloc_size_checked(size_t p_elements, size_t *out) const { +#if defined(_add_overflow) && defined(_mul_overflow) + size_t o; + size_t p; + if (_mul_overflow(p_elements, sizeof(T), &o)) return false; + if (_add_overflow(o, sizeof(SafeRefCount)+sizeof(int), &p)) return false; + *out = nearest_power_of_2_templated(p); + return true; +#else + // Speed is more important than correctness here, do the operations unchecked + // and hope the best + *out = _get_alloc_size(p_elements); + return true; +#endif + } void _unref(void *p_data); @@ -247,18 +263,21 @@ Error Vector::resize(int p_size) { // possibly changing size, copy on write _copy_on_write(); + size_t alloc_size; + ERR_FAIL_COND_V(!_get_alloc_size_checked(p_size, &alloc_size), ERR_OUT_OF_MEMORY); + if (p_size>size()) { if (size()==0) { // alloc from scratch - _ptr = (T*)memalloc(_get_alloc_size(p_size)); + _ptr = (T*)memalloc(alloc_size); ERR_FAIL_COND_V( !_ptr ,ERR_OUT_OF_MEMORY); _get_refcount()->init(); // init refcount *_get_size()=0; // init size (currently, none) } else { - void *_ptrnew = (T*)memrealloc(_ptr,_get_alloc_size(p_size)); + void *_ptrnew = (T*)memrealloc(_ptr, alloc_size); ERR_FAIL_COND_V( !_ptrnew ,ERR_OUT_OF_MEMORY); _ptr=_ptrnew; } @@ -282,7 +301,7 @@ Error Vector::resize(int p_size) { t->~T(); } - void *_ptrnew = (T*)memrealloc(_ptr,_get_alloc_size(p_size)); + void *_ptrnew = (T*)memrealloc(_ptr, alloc_size); ERR_FAIL_COND_V( !_ptrnew ,ERR_OUT_OF_MEMORY); _ptr=_ptrnew; diff --git a/drivers/unix/memory_pool_static_malloc.cpp b/drivers/unix/memory_pool_static_malloc.cpp index fa1266b2..cbadad11 100644 --- a/drivers/unix/memory_pool_static_malloc.cpp +++ b/drivers/unix/memory_pool_static_malloc.cpp @@ -49,7 +49,13 @@ void* MemoryPoolStaticMalloc::alloc(size_t p_bytes,const char *p_description) { #else - int total = p_bytes + DEFAULT_ALIGNMENT; + + size_t total; + #if defined(_add_overflow) + if (_add_overflow(p_bytes, DEFAULT_ALIGNMENT, &total)) return NULL; + #else + total = p_bytes + DEFAULT_ALIGNMENT; + #endif uint8_t* ptr = (uint8_t*)_alloc(total, p_description); ERR_FAIL_COND_V( !ptr, ptr ); int ofs = (DEFAULT_ALIGNMENT - ((uintptr_t)ptr & (DEFAULT_ALIGNMENT - 1))); @@ -65,11 +71,17 @@ void* MemoryPoolStaticMalloc::_alloc(size_t p_bytes,const char *p_description) { MutexLock lock(mutex); #ifdef DEBUG_MEMORY_ENABLED - void *mem=malloc(p_bytes+sizeof(RingPtr)); /// add for size and ringlist + size_t total; + #if defined(_add_overflow) + if (_add_overflow(p_bytes, sizeof(RingPtr), &total)) return NULL; + #else + total = p_bytes + sizeof(RingPtr); + #endif + void *mem=malloc(total); /// add for size and ringlist if (!mem) { - printf("**ERROR: out of memory while allocating %i bytes by %s?\n",(int) p_bytes, p_description); - printf("**ERROR: memory usage is %i\n", (int)get_total_usage()); + printf("**ERROR: out of memory while allocating %lu bytes by %s?\n", (unsigned long) p_bytes, p_description); + printf("**ERROR: memory usage is %lu\n", (unsigned long) get_total_usage()); }; ERR_FAIL_COND_V(!mem,0); //out of memory, or unreasonable request @@ -130,7 +142,12 @@ void* MemoryPoolStaticMalloc::realloc(void *p_memory,size_t p_bytes) { if (!p_memory) return alloc(p_bytes); - int total = p_bytes + DEFAULT_ALIGNMENT; + size_t total; + #if defined(_add_overflow) + if (_add_overflow(p_bytes, DEFAULT_ALIGNMENT, &total)) return NULL; + #else + total = p_bytes + DEFAULT_ALIGNMENT; + #endif uint8_t* mem = (uint8_t*)p_memory; int ofs = *(mem-1); mem = mem - ofs; diff --git a/platform/3ds/SCsub b/platform/3ds/SCsub index e3cde0be..6d7fe7fe 100644 --- a/platform/3ds/SCsub +++ b/platform/3ds/SCsub @@ -3,6 +3,7 @@ from SCons.Node import NodeList Import('env') +SConscript("shaders/SCsub") common_3ds=[\ "os_3ds.cpp",\ diff --git a/platform/3ds/rasterizer_3ds.cpp b/platform/3ds/rasterizer_3ds.cpp index 7675b912..1494cea1 100644 --- a/platform/3ds/rasterizer_3ds.cpp +++ b/platform/3ds/rasterizer_3ds.cpp @@ -27,7 +27,73 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "rasterizer_3ds.h" +#include "shaders/simple_3d.h" +#include "shaders/simple_2d.h" + +static const vertex3ds vertex_list[] = +{ + // First face (PZ) + // First triangle + { {-0.5f, -0.5f, +0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, +1.0f} }, + { {+0.5f, -0.5f, +0.5f}, {1.0f, 0.0f}, {0.0f, 0.0f, +1.0f} }, + { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, +1.0f} }, + // Second triangle + { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, +1.0f} }, + { {-0.5f, +0.5f, +0.5f}, {0.0f, 1.0f}, {0.0f, 0.0f, +1.0f} }, + { {-0.5f, -0.5f, +0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, +1.0f} }, + + // Second face (MZ) + // First triangle + { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, -1.0f} }, + { {-0.5f, +0.5f, -0.5f}, {1.0f, 0.0f}, {0.0f, 0.0f, -1.0f} }, + { {+0.5f, +0.5f, -0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }, + // Second triangle + { {+0.5f, +0.5f, -0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }, + { {+0.5f, -0.5f, -0.5f}, {0.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }, + { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, -1.0f} }, + + // Third face (PX) + // First triangle + { {+0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {+1.0f, 0.0f, 0.0f} }, + { {+0.5f, +0.5f, -0.5f}, {1.0f, 0.0f}, {+1.0f, 0.0f, 0.0f} }, + { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {+1.0f, 0.0f, 0.0f} }, + // Second triangle + { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {+1.0f, 0.0f, 0.0f} }, + { {+0.5f, -0.5f, +0.5f}, {0.0f, 1.0f}, {+1.0f, 0.0f, 0.0f} }, + { {+0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {+1.0f, 0.0f, 0.0f} }, + + // Fourth face (MX) + // First triangle + { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, + { {-0.5f, -0.5f, +0.5f}, {1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, + { {-0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, + // Second triangle + { {-0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, + { {-0.5f, +0.5f, -0.5f}, {0.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, + { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, + + // Fifth face (PY) + // First triangle + { {-0.5f, +0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, +1.0f, 0.0f} }, + { {-0.5f, +0.5f, +0.5f}, {1.0f, 0.0f}, {0.0f, +1.0f, 0.0f} }, + { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, +1.0f, 0.0f} }, + // Second triangle + { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, +1.0f, 0.0f} }, + { {+0.5f, +0.5f, -0.5f}, {0.0f, 1.0f}, {0.0f, +1.0f, 0.0f} }, + { {-0.5f, +0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, +1.0f, 0.0f} }, + + // Sixth face (MY) + // First triangle + { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, -1.0f, 0.0f} }, + { {+0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, {0.0f, -1.0f, 0.0f} }, + { {+0.5f, -0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, -1.0f, 0.0f} }, + // Second triangle + { {+0.5f, -0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, -1.0f, 0.0f} }, + { {-0.5f, -0.5f, +0.5f}, {0.0f, 1.0f}, {0.0f, -1.0f, 0.0f} }, + { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, -1.0f, 0.0f} }, +}; +#define vertex_list_count (sizeof(vertex_list)/sizeof(vertex_list[0])) #define DISPLAY_TRANSFER_FLAGS \ (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ @@ -70,6 +136,7 @@ void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::Cube const u32* buffer = reinterpret_cast(d.read().ptr()); C3D_TexUpload(&texture->texture, buffer); + C3D_TexBind(0, &texture->texture); } Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { @@ -165,38 +232,70 @@ static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vecto C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); }; -static void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { - Vector3 texcoords[4]= { - Vector3( p_src_region.pos.x/p_tex_size.width, +void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { + VertexArray dscoords[4]= { + {Vector3( p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0), - - Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + Vector2( p_rect.pos.x, p_rect.pos.y )}, + + + {Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, - Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + {Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, - Vector3( p_src_region.pos.x/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0) + {Vector3( p_src_region.pos.x/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} }; if (p_flip_h) { - SWAP( texcoords[0], texcoords[1] ); - SWAP( texcoords[2], texcoords[3] ); + SWAP( dscoords[0], dscoords[1] ); + SWAP( dscoords[2], dscoords[3] ); } if (p_flip_v) { - SWAP( texcoords[1], texcoords[2] ); - SWAP( texcoords[0], texcoords[3] ); + SWAP( dscoords[1], dscoords[2] ); + SWAP( dscoords[0], dscoords[3] ); } Vector3 coords[4]= { - Vector3( p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0 ), - Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) + }; + /* + void* vbo_data = linearAlloc(sizeof(dscoords)); + memcpy(vbo_data, dscoords, sizeof(dscoords)); + // memcpy(vbo_data+sizeof(coords), texcoords, sizeof(texcoords)); + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, vbo_data, sizeof(VertexArray), 2, 0x10);*/ + + + // Mtx_Identity(&modelView); + + // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); + + // Draw the triangle directly + C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); + C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y, 0.0f, 0.0f); // v1=color + + C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0.0f, 0.0f); + C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); + + C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); + + C3D_ImmDrawEnd(); // _draw_primitive(4,coords,0,0,texcoords); } @@ -1972,6 +2071,28 @@ void Rasterizer3DS::init() { top_rt->target = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); C3D_RenderTargetSetOutput(top_rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + + + simple_2ds = DVLB_ParseFile((u32*)shader_builtin_simple_2d, sizeof(shader_builtin_simple_2d)); + shaderProgramInit(&program); + shaderProgramSetVsh(&program, &simple_2ds->DVLE[0]); + C3D_BindProgram(&program); + + uLoc_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); + + // Configure attributes for use with the vertex shader + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 3); // v1=color + + // Mtx_PerspTilt(&projection, C3D_AngleFromDegrees(80.0f), C3D_AspectRatioTop, 0.01f, 1000.0f, false); + Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvInit(env); + C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, (GPU_TEVSRC)0, (GPU_TEVSRC)0); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); } void Rasterizer3DS::finish() { @@ -2002,6 +2123,8 @@ Rasterizer3DS::Rasterizer3DS() { }; Rasterizer3DS::~Rasterizer3DS() { + shaderProgramFree(&program); + DVLB_Free(simple_2ds); C3D_Fini(); }; diff --git a/platform/3ds/rasterizer_3ds.h b/platform/3ds/rasterizer_3ds.h index c96dcfe8..123edd68 100644 --- a/platform/3ds/rasterizer_3ds.h +++ b/platform/3ds/rasterizer_3ds.h @@ -68,9 +68,25 @@ static uint32_t convert_color(const Color* ic) { return c; } +typedef struct { float position[3]; float texcoord[2]; float normal[3]; } vertex3ds; -class Rasterizer3DS : public Rasterizer { +typedef struct { + Vector3 position; + Vector2 texcoord; +} VertexArray; +class Rasterizer3DS : public Rasterizer { + + + void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h,bool p_flip_v ); + DVLB_s* simple_3ds; + DVLB_s* simple_2ds; + shaderProgram_s program; + + C3D_Mtx projection; + C3D_Mtx modelView; + int uLoc_projection, uLoc_modelView; + struct Texture { uint32_t flags; diff --git a/platform/3ds/shaders/SCsub b/platform/3ds/shaders/SCsub new file mode 100644 index 00000000..111f1f57 --- /dev/null +++ b/platform/3ds/shaders/SCsub @@ -0,0 +1,11 @@ +Import('env') + +shaders = [ + 'simple_3d', + 'simple_2d' +] + +if 'PICA' in env['BUILDERS']: + for shader in shaders: + env.PICA(shader) + env.PICA_HEADER(shader) diff --git a/platform/3ds/shaders/simple_2d.h b/platform/3ds/shaders/simple_2d.h new file mode 100644 index 00000000..5c7fe9c9 --- /dev/null +++ b/platform/3ds/shaders/simple_2d.h @@ -0,0 +1,3 @@ +/* Auto-generated from platform/3ds/shaders/simple_2d.shbin */ +static uint8_t shader_builtin_simple_2d[] = +{68,86,76,66,1,0,0,0,140,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,8,0,0,0,72,0,0,0,7,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,8,2,8,3,24,2,8,4,40,2,8,5,56,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,8,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,2,0,0,0,136,0,0,0,16,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,2,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,120,0,120,0,112,114,111,106,101,99,116,105,111,110,0,116,101,115,116,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/simple_2d.pica b/platform/3ds/shaders/simple_2d.pica new file mode 100644 index 00000000..ca9498cb --- /dev/null +++ b/platform/3ds/shaders/simple_2d.pica @@ -0,0 +1,38 @@ +; Example PICA200 vertex shader + +; Uniforms +.fvec projection[4] + +; Constants +.constf myconst(0.0, 1.0, -1.0, 0.1) +.constf myconst2(0.3, 0.0, 0.0, 0.0) +.alias zeros myconst.xxxx ; Vector full of zeros +.alias ones myconst.yyyy ; Vector full of ones + +; Outputs +.out outpos position +.out outclr color + +; Inputs (defined as aliases for convenience) +.alias inpos v0 +.alias inclr v1 + +.bool test + +.proc main + ; Force the w component of inpos to be 1.0 + mov r0.xyz, inpos + mov r0.w, ones + + ; outpos = projectionMatrix * inpos + dp4 outpos.x, projection[0], r0 + dp4 outpos.y, projection[1], r0 + dp4 outpos.z, projection[2], r0 + dp4 outpos.w, projection[3], r0 + + ; outclr = inclr + mov outclr, inclr + + ; We're finished + end +.end diff --git a/platform/3ds/shaders/simple_2d.shbin b/platform/3ds/shaders/simple_2d.shbin new file mode 100644 index 0000000000000000000000000000000000000000..85150af4c9d714f16772b970e74d555d594c39bd GIT binary patch literal 292 zcmZ<>^KoKiU|{G0VwW(V03gMn0mK|Y>;c5=K->VtXuyy01G^s+2NMUg1QQ2~1``LX z1rrCGfPxQDT}K`>MD;>02%T}54a`V^(n(M{5lZJn)dTH!WfFks0ol*M0FiJ2vY3E4 z1BgKYM1%MhP`U$1gS0U*!~;nXum|G(3^Qk11I6MPjE!x^KoKiU|`Sz5-wpr0YD~$1`sO&@dhB~17Zb`0#x9~_<`Mz$wP^YIYNnxB}0je zwL*!jiGzuwS%Qh9MT3c>)q;tGO+dkiL4m=K9ZfC!2X((T2}d?I1xLF!4MnA<4kk8^ zAM8w>Gnm-8ey|%cb1*8gJy7!FUg4yqwoTBwV- zIBFpmgw8n324L5=0 literal 0 HcmV?d00001 From 59803e40a6dfd12469d48de99420375aaec05cc3 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Fri, 1 Mar 2024 17:14:40 +0100 Subject: [PATCH 03/15] 3ds changes --- platform/3ds/rasterizer_3ds.cpp | 130 +++++++++++++++++++++++---- platform/3ds/shaders/simple_2d.h | 2 +- platform/3ds/shaders/simple_2d.pica | 21 +++-- platform/3ds/shaders/simple_2d.shbin | Bin 292 -> 328 bytes 4 files changed, 132 insertions(+), 21 deletions(-) diff --git a/platform/3ds/rasterizer_3ds.cpp b/platform/3ds/rasterizer_3ds.cpp index 1494cea1..b6d8519a 100644 --- a/platform/3ds/rasterizer_3ds.cpp +++ b/platform/3ds/rasterizer_3ds.cpp @@ -100,6 +100,67 @@ static const vertex3ds vertex_list[] = GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + +#define TEXTURE_TRANSFER_FLAGS (GX_TRANSFER_FLIP_VERT(1) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_RAW_COPY(0) | GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | \ + GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + + +void _set_uniform(int uniform_location, const Matrix32& p_transform) +{ + const Matrix32& tr = p_transform; + + C3D_Mtx mtx; + + float matrix[16] = { /* build a 16x16 matrix */ + tr.elements[2][0], 0, tr.elements[1][0], tr.elements[0][0], + tr.elements[2][1], 0, tr.elements[1][1], tr.elements[0][1], + 0, 1, 0, 0, + 1, 0, 0, 0, + }; + + memcpy(mtx.m, matrix, sizeof(matrix)); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} + +void _set_uniform(int uniform_location, const CameraMatrix& p_matrix) +{ + // Swap X/Y axis due to 3DS screens being sideways + // and adjust clipping range from [-1, 1] to [-1, 0] + float m[16] = { + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 0.5, 0, + 0, 0, -0.5, 1, + }; + + CameraMatrix p = *reinterpret_cast(m) * p_matrix; + + C3D_Mtx mtx; + float *to = mtx.m; + const float *from = reinterpret_cast(p.matrix); + + + to[0] = from[12]; + to[1] = from[8]; + to[2] = from[4]; + to[3] = from[0]; + to[4] = from[13]; + to[5] = from[9]; + to[6] = from[5]; + to[7] = from[1]; + to[8] = from[14]; + to[9] = from[10]; + to[10] = from[6]; + to[11] = from[2]; + to[12] = from[15]; + to[13] = from[11]; + to[14] = from[7]; + to[15] = from[3]; + + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} + /* TEXTURE API */ @@ -134,9 +195,30 @@ void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::Cube DVector d = p_image.get_data(); const u32* buffer = reinterpret_cast(d.read().ptr()); + u8 * gpuBuffer = (u8 *)linearAlloc(texture->width * texture->height * 4); + + u32 * src = (u32 *)buffer; + u32 * dst = (u32 *)gpuBuffer; + + for (unsigned y = 0; y < texture->height; y++) + { + for (unsigned x = 0; x < texture->width; x++) + { + u32 clr = *src; + *dst = __builtin_bswap32(clr); + } + dst += 4; + } - C3D_TexUpload(&texture->texture, buffer); + GSPGPU_FlushDataCache((u32 *)gpuBuffer, texture->width * texture->height * 4); + + C3D_SyncDisplayTransfer((u32 *)gpuBuffer, GX_BUFFER_DIM(texture->width, texture->height), (u32 *)texture->texture.data, GX_BUFFER_DIM(texture->width, texture->height), TEXTURE_TRANSFER_FLAGS); + + // gspWaitForPPF(); + C3D_TexSetFilter(&texture->texture, GPU_LINEAR, GPU_NEAREST); C3D_TexBind(0, &texture->texture); + + linearFree(gpuBuffer); } Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { @@ -266,22 +348,25 @@ void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_ }; /* - void* vbo_data = linearAlloc(sizeof(dscoords)); - memcpy(vbo_data, dscoords, sizeof(dscoords)); + void* vbo_data = linearAlloc(sizeof(vertex_list)); + memcpy(vbo_data, vertex_list, sizeof(vertex_list)); // memcpy(vbo_data+sizeof(coords), texcoords, sizeof(texcoords)); C3D_BufInfo* bufInfo = C3D_GetBufInfo(); BufInfo_Init(bufInfo); - BufInfo_Add(bufInfo, vbo_data, sizeof(VertexArray), 2, 0x10);*/ + BufInfo_Add(bufInfo, vbo_data, sizeof(vertex3ds), 3, 0x210); + + C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count);;*/ // Mtx_Identity(&modelView); // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); - C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); // Draw the triangle directly + C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); // v0=position C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y, 0.0f, 0.0f); // v1=color @@ -1632,8 +1717,15 @@ void Rasterizer3DS::set_render_target(RID p_render_target, bool p_transparent_bg void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR, (GPU_TEVSRC)0); + // C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexBind(0, NULL); - + C3D_BindProgram(&program); + _set_uniform(uLoc_modelView, Matrix32()); }; void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { @@ -1642,7 +1734,7 @@ void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) void Rasterizer3DS::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { - + _set_uniform(uLoc_projection, p_projection); } void Rasterizer3DS::add_light( RID p_light_instance ) { @@ -1675,7 +1767,7 @@ void Rasterizer3DS::add_particles( const RID& p_particle_instance, const Instanc void Rasterizer3DS::end_scene() { - + // C3D_Flush(); } void Rasterizer3DS::end_shadow_map() { @@ -1686,15 +1778,24 @@ void Rasterizer3DS::end_shadow_map() { void Rasterizer3DS::end_frame() { C3D_FrameEnd(0); + C3D_FrameBufTransfer(&top_rt->target->frameBuf, top_rt->target->screen, top_rt->target->side, top_rt->target->transferFlags); + gfxSwapBuffersGpu(); } /* CANVAS API */ void Rasterizer3DS::canvas_begin() { - - - + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 3); // v1=color + + Mtx_OrthoTilt(&projection, 0.0, 800.0, 480.0, 0.0, 0.0, 1.0, true); + + C3D_BindProgram(&program); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); } void Rasterizer3DS::canvas_disable_blending() { @@ -1714,9 +1815,7 @@ void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) { - - - + _set_uniform(uLoc_modelView, p_transform); } void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { @@ -2079,6 +2178,7 @@ void Rasterizer3DS::init() { C3D_BindProgram(&program); uLoc_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); + uLoc_modelView = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); // Configure attributes for use with the vertex shader C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); @@ -2087,7 +2187,7 @@ void Rasterizer3DS::init() { AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 3); // v1=color // Mtx_PerspTilt(&projection, C3D_AngleFromDegrees(80.0f), C3D_AspectRatioTop, 0.01f, 1000.0f, false); - Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + Mtx_OrthoTilt(&projection, 0.0, 800.0, 0.0, 440.0, 0.0, 1.0, true); C3D_TexEnv* env = C3D_GetTexEnv(0); C3D_TexEnvInit(env); diff --git a/platform/3ds/shaders/simple_2d.h b/platform/3ds/shaders/simple_2d.h index 5c7fe9c9..e820bd54 100644 --- a/platform/3ds/shaders/simple_2d.h +++ b/platform/3ds/shaders/simple_2d.h @@ -1,3 +1,3 @@ /* Auto-generated from platform/3ds/shaders/simple_2d.shbin */ static uint8_t shader_builtin_simple_2d[] = -{68,86,76,66,1,0,0,0,140,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,8,0,0,0,72,0,0,0,7,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,8,2,8,3,24,2,8,4,40,2,8,5,56,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,8,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,2,0,0,0,136,0,0,0,16,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,2,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,120,0,120,0,112,114,111,106,101,99,116,105,111,110,0,116,101,115,116,0}; \ No newline at end of file +{68,86,76,66,1,0,0,0,156,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,12,0,0,0,88,0,0,0,7,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,72,66,10,3,88,66,10,4,104,66,10,5,120,66,10,2,9,2,8,3,25,2,8,4,41,2,8,5,57,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,12,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,3,0,0,0,144,0,0,0,26,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,2,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,21,0,0,0,120,0,120,0,112,114,111,106,101,99,116,105,111,110,0,109,111,100,101,108,86,105,101,119,0,116,101,115,116,0,0,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/simple_2d.pica b/platform/3ds/shaders/simple_2d.pica index ca9498cb..c4fd5ce8 100644 --- a/platform/3ds/shaders/simple_2d.pica +++ b/platform/3ds/shaders/simple_2d.pica @@ -1,7 +1,7 @@ ; Example PICA200 vertex shader ; Uniforms -.fvec projection[4] +.fvec projection[4], modelView[4] ; Constants .constf myconst(0.0, 1.0, -1.0, 0.1) @@ -25,10 +25,21 @@ mov r0.w, ones ; outpos = projectionMatrix * inpos - dp4 outpos.x, projection[0], r0 - dp4 outpos.y, projection[1], r0 - dp4 outpos.z, projection[2], r0 - dp4 outpos.w, projection[3], r0 + ; dp4 outpos.x, projection[0], r0 + ; dp4 outpos.y, projection[1], r0 + ; dp4 outpos.z, projection[2], r0 + ; dp4 outpos.w, projection[3], r0 + + dp4 r2.x, modelView[0], r0 + dp4 r2.y, modelView[1], r0 + dp4 r2.z, modelView[2], r0 + dp4 r2.w, modelView[3], r0 + + ; outpos = projection * r2 + dp4 outpos.x, projection[0], r2 + dp4 outpos.y, projection[1], r2 + dp4 outpos.z, projection[2], r2 + dp4 outpos.w, projection[3], r2 ; outclr = inclr mov outclr, inclr diff --git a/platform/3ds/shaders/simple_2d.shbin b/platform/3ds/shaders/simple_2d.shbin index 85150af4c9d714f16772b970e74d555d594c39bd..c3f75d89eb3589e7b59eb17b5505ef3f1baa2139 100644 GIT binary patch delta 157 zcmZ3&bb=|$CCtZ(k%56>4iE#`0YHjD1BiKmI0A^-fp`KCqX9q05A1$S9!^}$5l&nz z8BScR6;51CoJ<_dl1v;dnoJz5mJ_}F7IE4gHSwgoh6sZ=gD8+w0fYrb d`B|ySC7Jno47vF!sX1YpspSkMsl_Egc>ush8p;3w delta 121 zcmX@Xw1mmaCCtZ(k%57s2Z({}03gMn0mK|Y>;c5=K->VtXuyy01G^s+2NMUg1QQ2~ x1``LX#l$E-MvjRq)j64fYCC{fVB$@8kqU+ihJvE}tkmR^%=|otlGNf71^~v16Wss+ From de4a521d3dd1c59017bf076951d1565d162a0404 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sun, 3 Mar 2024 20:11:56 +0100 Subject: [PATCH 04/15] random 3ds rasterizer stuff --- demos/3d/balls/.fscache | 4 +- drivers/SCsub | 6 +- drivers/gles2/shader_compiler_gles2.cpp | 4 +- drivers/theoraplayer/SCsub | 4 +- drivers/unix/packet_peer_udp_posix.cpp | 2 +- drivers/unix/semaphore_posix.cpp | 3 +- drivers/unix/stream_peer_tcp_posix.cpp | 5 +- platform/3ds/rasterizer_3ds.cpp | 89 +++++++++++++++++------- platform/3ds/shaders/simple_2d.h | 2 +- platform/3ds/shaders/simple_2d.pica | 7 +- platform/3ds/shaders/simple_2d.shbin | Bin 328 -> 328 bytes platform/javascript/detect.py | 21 +++--- platform/javascript/export/export.cpp | 2 +- platform/x11/detect.py | 2 +- scene/animation/tween_interpolaters.cpp | 4 ++ scene/gui/line_edit.cpp | 2 +- scene/gui/text_edit.cpp | 4 +- tools/docdump/doc_dump.cpp | 2 +- 18 files changed, 107 insertions(+), 56 deletions(-) diff --git a/demos/3d/balls/.fscache b/demos/3d/balls/.fscache index 46180da5..b9066d85 100644 --- a/demos/3d/balls/.fscache +++ b/demos/3d/balls/.fscache @@ -1,5 +1,5 @@ -::res://::1705846107 -char_controller.gd::GDScript::1705846107:: +::res://::1708862929 +char_controller.gd::GDScript::1708780813:: cube.scn::PackedScene::1705843654::scene_3d<>Models/cube.dae<>466036871213f4c3460df5cc83c6a860<>1682196562 floor.scn::PackedScene::1705844193::scene_3d<>Models/floor.dae<>b125887aa8250cd928758a60a3a1bfb5<>1682251078 icon.png::ImageTexture::1705843536:: diff --git a/drivers/SCsub b/drivers/SCsub index dd5a16b3..6991c452 100644 --- a/drivers/SCsub +++ b/drivers/SCsub @@ -8,8 +8,10 @@ Export('env') SConscript('unix/SCsub'); SConscript('alsa/SCsub'); SConscript('windows/SCsub'); -#SConscript('gles2/SCsub'); -SConscript('gles1/SCsub'); +if env['platform'] == "javascript": + SConscript('gles2/SCsub'); +else: + SConscript('gles1/SCsub'); SConscript('gl_context/SCsub'); SConscript('openssl/SCsub'); diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index 50b63e1a..ed636da5 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -488,10 +488,10 @@ Error ShaderCompilerGLES2::compile_node(SL::ProgramNode *p_program) { header+=_typestr(fnode->arguments[i].type)+" "+replace_string(fnode->arguments[i].name); } - header+=") {"ENDL; + header+=") {" ENDL; String fcode=header; fcode+=dump_node_code(fnode->body,1); - fcode+="}"ENDL; + fcode+="}" ENDL; global_code+=fcode; } diff --git a/drivers/theoraplayer/SCsub b/drivers/theoraplayer/SCsub index cd8cabcc..dd349af1 100644 --- a/drivers/theoraplayer/SCsub +++ b/drivers/theoraplayer/SCsub @@ -2,7 +2,7 @@ Import("env") import string -sources = string.split(""" +sources = """ src/TheoraVideoClip.cpp src/FFmpeg/TheoraVideoClip_FFmpeg.cpp src/TheoraAsync.cpp @@ -59,7 +59,7 @@ src/YUV/C/yuv420_grey_c.c src/YUV/C/yuv420_yuv_c.c src/YUV/C/yuv420_rgb_c.c src/TheoraVideoFrame.cpp -""") +""".split() if env["platform"] == "iphone": sources.append("src/AVFoundation/TheoraVideoClip_AVFoundation.mm") diff --git a/drivers/unix/packet_peer_udp_posix.cpp b/drivers/unix/packet_peer_udp_posix.cpp index 26a0b292..226f565a 100644 --- a/drivers/unix/packet_peer_udp_posix.cpp +++ b/drivers/unix/packet_peer_udp_posix.cpp @@ -117,7 +117,7 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) { struct sockaddr_in from = {0}; socklen_t len = sizeof(struct sockaddr_in); int ret; - while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.data_left()-12), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) { + while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.data_left()-12), 0, (struct sockaddr*)&from, &len)) > 0) { rb.write((uint8_t*)&from.sin_addr, 4); uint32_t port = ntohs(from.sin_port); rb.write((uint8_t*)&port, 4); diff --git a/drivers/unix/semaphore_posix.cpp b/drivers/unix/semaphore_posix.cpp index 6f1b8931..0f9c8179 100644 --- a/drivers/unix/semaphore_posix.cpp +++ b/drivers/unix/semaphore_posix.cpp @@ -56,8 +56,9 @@ Error SemaphorePosix::post() { int SemaphorePosix::get() const { int val; +#ifndef JAVASCRIPT_ENABLED sem_getvalue(&sem, &val); - +#endif return val; } diff --git a/drivers/unix/stream_peer_tcp_posix.cpp b/drivers/unix/stream_peer_tcp_posix.cpp index 8d937d9c..4767cd9e 100644 --- a/drivers/unix/stream_peer_tcp_posix.cpp +++ b/drivers/unix/stream_peer_tcp_posix.cpp @@ -201,8 +201,11 @@ Error StreamPeerTCPPosix::write(const uint8_t* p_data,int p_bytes, int &r_sent, int total_sent = 0; while (data_to_send) { - +#ifdef JAVASCRIPT_ENABLED + int sent_amount = send(sockfd, offset, data_to_send, 0); +#else int sent_amount = send(sockfd, offset, data_to_send, MSG_NOSIGNAL); +#endif //printf("Sent TCP data of %d bytes, errno %d\n", sent_amount, errno); if (sent_amount == -1) { diff --git a/platform/3ds/rasterizer_3ds.cpp b/platform/3ds/rasterizer_3ds.cpp index b6d8519a..3d35ae26 100644 --- a/platform/3ds/rasterizer_3ds.cpp +++ b/platform/3ds/rasterizer_3ds.cpp @@ -333,6 +333,25 @@ void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_ (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} }; + + VertexArray dscoords23[4]= { + {Vector3( 0, + 0, 0), + Vector2( p_rect.pos.x, p_rect.pos.y )}, + + + {Vector3(5, + 0, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, + + {Vector3( 0, + 5, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, + + {Vector3( 5, + 5, 0), + Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} + }; if (p_flip_h) { @@ -347,25 +366,21 @@ void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_ Vector3 coords[4]= { }; - /* - void* vbo_data = linearAlloc(sizeof(vertex_list)); - memcpy(vbo_data, vertex_list, sizeof(vertex_list)); + + // void* vbo_data = linearAlloc(sizeof(dscoords)); + // memcpy(vbo_data, dscoords, sizeof(dscoords)); // memcpy(vbo_data+sizeof(coords), texcoords, sizeof(texcoords)); + /* + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color C3D_BufInfo* bufInfo = C3D_GetBufInfo(); BufInfo_Init(bufInfo); - BufInfo_Add(bufInfo, vbo_data, sizeof(vertex3ds), 3, 0x210); - - C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count);;*/ - + BufInfo_Add(bufInfo, dscoords, sizeof(VertexArray), 2, 0x10); - // Mtx_Identity(&modelView); - - // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); - - // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); - - // Draw the triangle directly + C3D_DrawArrays(GPU_TRIANGLE_STRIP, 0, sizeof(dscoords));*/ C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); // v0=position @@ -381,7 +396,20 @@ void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_ C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); C3D_ImmDrawEnd(); + + + // Mtx_Identity(&modelView); + + // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); + + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); + + // Draw the triangle directly + + // _draw_primitive(4,coords,0,0,texcoords); + + // linearFree(vbo_data); } /* SHADER API */ @@ -1724,7 +1752,7 @@ void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugM C3D_TexBind(0, NULL); - C3D_BindProgram(&program); + // C3D_BindProgram(&program); _set_uniform(uLoc_modelView, Matrix32()); }; @@ -1734,7 +1762,7 @@ void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) void Rasterizer3DS::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { - _set_uniform(uLoc_projection, p_projection); + // _set_uniform(uLoc_projection, p_projection); } void Rasterizer3DS::add_light( RID p_light_instance ) { @@ -1787,15 +1815,24 @@ void Rasterizer3DS::end_frame() { void Rasterizer3DS::canvas_begin() { // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); - C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); - AttrInfo_Init(attrInfo); - AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position - AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 3); // v1=color + - Mtx_OrthoTilt(&projection, 0.0, 800.0, 480.0, 0.0, 0.0, 1.0, true); + Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + + // C3D_BindProgram(&program); - C3D_BindProgram(&program); C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + /* + C3D_ImmDrawBegin(GPU_TRIANGLES); + C3D_ImmSendAttrib(200.0f, 200.0f, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib(1.0f, 0.0f, 0.0f, 1.0f); // v1=color + + C3D_ImmSendAttrib(100.0f, 40.0f, 0.5f, 0.0f); + C3D_ImmSendAttrib(1.0f, 1.0f, 0.0f, 1.0f); + + C3D_ImmSendAttrib(300.0f, 40.0f, 0.5f, 0.0f); + C3D_ImmSendAttrib(0.0f, 0.0f, 1.0f, 1.0f); + C3D_ImmDrawEnd();*/ } void Rasterizer3DS::canvas_disable_blending() { @@ -1815,7 +1852,7 @@ void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) { - _set_uniform(uLoc_modelView, p_transform); + // _set_uniform(uLoc_modelView, p_transform); } void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { @@ -2184,15 +2221,17 @@ void Rasterizer3DS::init() { C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); AttrInfo_Init(attrInfo); AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position - AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 3); // v1=color + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color // Mtx_PerspTilt(&projection, C3D_AngleFromDegrees(80.0f), C3D_AspectRatioTop, 0.01f, 1000.0f, false); - Mtx_OrthoTilt(&projection, 0.0, 800.0, 0.0, 440.0, 0.0, 1.0, true); + Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); C3D_TexEnv* env = C3D_GetTexEnv(0); C3D_TexEnvInit(env); C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, (GPU_TEVSRC)0, (GPU_TEVSRC)0); C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); + + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); } void Rasterizer3DS::finish() { diff --git a/platform/3ds/shaders/simple_2d.h b/platform/3ds/shaders/simple_2d.h index e820bd54..85a82b9b 100644 --- a/platform/3ds/shaders/simple_2d.h +++ b/platform/3ds/shaders/simple_2d.h @@ -1,3 +1,3 @@ /* Auto-generated from platform/3ds/shaders/simple_2d.shbin */ static uint8_t shader_builtin_simple_2d[] = -{68,86,76,66,1,0,0,0,156,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,12,0,0,0,88,0,0,0,7,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,72,66,10,3,88,66,10,4,104,66,10,5,120,66,10,2,9,2,8,3,25,2,8,4,41,2,8,5,57,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,12,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,3,0,0,0,144,0,0,0,26,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,2,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,21,0,0,0,120,0,120,0,112,114,111,106,101,99,116,105,111,110,0,109,111,100,101,108,86,105,101,119,0,116,101,115,116,0,0,0}; \ No newline at end of file +{68,86,76,66,1,0,0,0,156,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,12,0,0,0,88,0,0,0,7,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,72,66,10,3,88,66,10,4,104,66,10,5,120,66,10,2,9,2,8,3,25,2,8,4,41,2,8,5,57,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,12,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,3,0,0,0,144,0,0,0,26,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,3,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,21,0,0,0,120,0,120,0,112,114,111,106,101,99,116,105,111,110,0,109,111,100,101,108,86,105,101,119,0,116,101,115,116,0,0,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/simple_2d.pica b/platform/3ds/shaders/simple_2d.pica index c4fd5ce8..876c1ef3 100644 --- a/platform/3ds/shaders/simple_2d.pica +++ b/platform/3ds/shaders/simple_2d.pica @@ -11,11 +11,12 @@ ; Outputs .out outpos position -.out outclr color +; .out outclr color +.out outtc0 texcoord0 ; Inputs (defined as aliases for convenience) .alias inpos v0 -.alias inclr v1 +.alias intex v1 .bool test @@ -42,7 +43,7 @@ dp4 outpos.w, projection[3], r2 ; outclr = inclr - mov outclr, inclr + mov outtc0, intex ; We're finished end diff --git a/platform/3ds/shaders/simple_2d.shbin b/platform/3ds/shaders/simple_2d.shbin index c3f75d89eb3589e7b59eb17b5505ef3f1baa2139..ed0144b1aaa15370742b472d3944978975bbca08 100644 GIT binary patch delta 13 UcmX@Xbb@IE4get_settings_path()+"/templates/"; if (!FileAccess::exists(exe_path+"javascript_debug.zip") || !FileAccess::exists(exe_path+"javascript_release.zip")) { - valid=false; + // valid=false; err+="No export templates found.\nDownload and install export templates.\n"; } diff --git a/platform/x11/detect.py b/platform/x11/detect.py index fce43db6..df95580b 100644 --- a/platform/x11/detect.py +++ b/platform/x11/detect.py @@ -54,7 +54,7 @@ def get_flags(): return [ ('builtin_zlib', 'no'), ("builtin_openssl", "yes"), - ("theora","no"), + ("theora","yes"), ] diff --git a/scene/animation/tween_interpolaters.cpp b/scene/animation/tween_interpolaters.cpp index 7d0f2cd4..01fe88db 100644 --- a/scene/animation/tween_interpolaters.cpp +++ b/scene/animation/tween_interpolaters.cpp @@ -142,6 +142,10 @@ namespace quart { /////////////////////////////////////////////////////////////////////////// // quad /////////////////////////////////////////////////////////////////////////// +#ifdef JAVASCRIPT_ENABLED +#undef quad +#endif + namespace quad { static real_t in(real_t t, real_t b, real_t c, real_t d) { diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 68c99003..1aa15045 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -272,7 +272,7 @@ void LineEdit::_input_event(InputEvent p_event) { if (editable) { selection_delete(); - CharType ucodestr[2]={k.unicode,0}; + CharType ucodestr[2]={(wchar_t)k.unicode,(wchar_t)0}; append_at_cursor(ucodestr); emit_signal("text_changed",text); _change_notify("text"); diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index ba68948e..11dad873 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1156,7 +1156,7 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { } else { //different char, go back - const CharType chr[2] = {k.unicode, 0}; + const CharType chr[2] = {(wchar_t)k.unicode, (wchar_t)0}; if(auto_brace_completion_enabled && _is_pair_symbol(chr[0])) { _consume_pair_symbol(chr[0]); } else { @@ -1778,7 +1778,7 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { if (readonly) break; - const CharType chr[2] = {k.unicode, 0}; + const CharType chr[2] = {(wchar_t)k.unicode, (wchar_t)0}; if(auto_brace_completion_enabled && _is_pair_symbol(chr[0])) { _consume_pair_symbol(chr[0]); diff --git a/tools/docdump/doc_dump.cpp b/tools/docdump/doc_dump.cpp index 9fece389..f10ba7f0 100644 --- a/tools/docdump/doc_dump.cpp +++ b/tools/docdump/doc_dump.cpp @@ -67,7 +67,7 @@ static String _escape_string(const String& p_str) { ret=ret.replace("\"","""); for (int i=1;i<32;i++) { - char chr[2]={i,0}; + char chr[2]={(char)i,(char)0}; ret=ret.replace(chr,"&#"+String::num(i)+";"); } ret=ret.utf8(); From 4a856cfd63e0269a2a2ae70b14a988a2871a5e1d Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Mon, 6 May 2024 16:52:59 +0200 Subject: [PATCH 05/15] Big 3ds update --- .gitignore | 3 +- demos/2d/rubegoldberg/.fscache | 16 + demos/3d/fixed_materials/.fscache | 14 + demos/3d/sat_test/.fscache | 7 + drivers/unix/ip_unix.cpp | 22 +- drivers/unix/ip_unix.h | 2 +- drivers/unix/stream_peer_tcp_posix.cpp | 40 +- drivers/unix/stream_peer_tcp_posix.h | 2 +- drivers/unix/tcp_server_posix.cpp | 4 +- drivers/unix/tcp_server_posix.h | 2 +- platform/3ds/SCsub | 4 +- platform/3ds/audio_driver_3ds.cpp | 182 + platform/3ds/audio_driver_3ds.h | 90 + platform/3ds/godot_3ds.cpp | 3 + platform/3ds/os_3ds.cpp | 112 +- platform/3ds/os_3ds.h | 19 +- platform/3ds/rasterizer_3ds Kopie Kopie.cpp | 2268 +++++++ platform/3ds/rasterizer_3ds Kopie.cpp | 2268 +++++++ platform/3ds/rasterizer_3ds Kopie.h | 818 +++ platform/3ds/rasterizer_3ds.cpp | 3762 +++++++++-- platform/3ds/rasterizer_3ds.h | 612 +- platform/3ds/shaders/2d.h | 3 + platform/3ds/shaders/2d.pica | 48 + platform/3ds/shaders/2d.shbin | Bin 0 -> 336 bytes platform/3ds/shaders/3d.h | 3 + platform/3ds/shaders/3d.pica | 77 + platform/3ds/shaders/3d.shbin | Bin 0 -> 484 bytes platform/3ds/shaders/SCsub | 4 +- platform/3ds/shaders/simple_2d.h | 2 +- platform/3ds/shaders/simple_2d.pica | 30 +- platform/3ds/shaders/simple_2d.pica Kopie | 50 + platform/3ds/shaders/simple_2d.shbin | Bin 328 -> 280 bytes platform/3ds/shaders/simple_3d.pica | 2 + platform/3ds/thread_3ds.cpp | 71 + platform/3ds/thread_3ds.h | 99 + platform/3ds/thread_wrap.cpp | 48 + platform/3ds/thread_wrap.h | 64 + platform/wiiu/SCsub | 26 + platform/wiiu/audio_driver_3ds.cpp | 171 + platform/wiiu/audio_driver_3ds.h | 84 + platform/wiiu/detect.py | 81 + platform/wiiu/export/export.cpp | 51 + platform/wiiu/export/export.h | 31 + platform/wiiu/godot_wiiu.cpp | 80 + platform/wiiu/logo.gen.h | 2 + platform/wiiu/logo.png | Bin 0 -> 405 bytes platform/wiiu/mutex_wiiu.cpp | 74 + platform/wiiu/mutex_wiiu.h | 61 + platform/wiiu/os_wiiu.cpp | 442 ++ platform/wiiu/os_wiiu.h | 169 + platform/wiiu/platform_config.h | 31 + platform/wiiu/rasterizer_wiiu.cpp | 6304 +++++++++++++++++++ platform/wiiu/rasterizer_wiiu.h | 1292 ++++ platform/wiiu/thread_wiiu.cpp | 137 + platform/wiiu/thread_wiiu.h | 74 + servers/visual/visual_server_raster.cpp | 14 +- 56 files changed, 19176 insertions(+), 699 deletions(-) create mode 100644 demos/2d/rubegoldberg/.fscache create mode 100644 demos/3d/fixed_materials/.fscache create mode 100644 demos/3d/sat_test/.fscache create mode 100644 platform/3ds/audio_driver_3ds.cpp create mode 100644 platform/3ds/audio_driver_3ds.h create mode 100644 platform/3ds/rasterizer_3ds Kopie Kopie.cpp create mode 100644 platform/3ds/rasterizer_3ds Kopie.cpp create mode 100644 platform/3ds/rasterizer_3ds Kopie.h create mode 100644 platform/3ds/shaders/2d.h create mode 100644 platform/3ds/shaders/2d.pica create mode 100644 platform/3ds/shaders/2d.shbin create mode 100644 platform/3ds/shaders/3d.h create mode 100644 platform/3ds/shaders/3d.pica create mode 100644 platform/3ds/shaders/3d.shbin create mode 100644 platform/3ds/shaders/simple_2d.pica Kopie create mode 100644 platform/3ds/thread_3ds.cpp create mode 100644 platform/3ds/thread_3ds.h create mode 100644 platform/3ds/thread_wrap.cpp create mode 100644 platform/3ds/thread_wrap.h create mode 100644 platform/wiiu/SCsub create mode 100644 platform/wiiu/audio_driver_3ds.cpp create mode 100644 platform/wiiu/audio_driver_3ds.h create mode 100644 platform/wiiu/detect.py create mode 100644 platform/wiiu/export/export.cpp create mode 100644 platform/wiiu/export/export.h create mode 100644 platform/wiiu/godot_wiiu.cpp create mode 100644 platform/wiiu/logo.gen.h create mode 100644 platform/wiiu/logo.png create mode 100644 platform/wiiu/mutex_wiiu.cpp create mode 100644 platform/wiiu/mutex_wiiu.h create mode 100644 platform/wiiu/os_wiiu.cpp create mode 100644 platform/wiiu/os_wiiu.h create mode 100644 platform/wiiu/platform_config.h create mode 100644 platform/wiiu/rasterizer_wiiu.cpp create mode 100644 platform/wiiu/rasterizer_wiiu.h create mode 100644 platform/wiiu/thread_wiiu.cpp create mode 100644 platform/wiiu/thread_wiiu.h diff --git a/.gitignore b/.gitignore index c9b39be5..c1b75428 100644 --- a/.gitignore +++ b/.gitignore @@ -43,7 +43,8 @@ platform/android/libs/play_licensing/gen/* *.d *.so *.os - +*.rpx +*.3dsx # QT project files *.config *.creator diff --git a/demos/2d/rubegoldberg/.fscache b/demos/2d/rubegoldberg/.fscache new file mode 100644 index 00000000..50c0d2b3 --- /dev/null +++ b/demos/2d/rubegoldberg/.fscache @@ -0,0 +1,16 @@ +::res://::1705781638 +ball.xml::PackedScene::1705781638:: +box.xml::PackedScene::1705781638:: +domino.xml::PackedScene::1705781638:: +icon.png::ImageTexture::1705781638:: +pendulum.xml::PackedScene::1705781638:: +platform.xml::PackedScene::1705781638:: +rubegoldberg.xml::PackedScene::1705781638:: +seesaw.xml::PackedScene::1705781638:: +::res://art::1705781638 +bowling_ball.png::ImageTexture::1705781638:: +box.png::ImageTexture::1705781638:: +domino.png::ImageTexture::1705781638:: +platform.png::ImageTexture::1705781638:: +seesaw_base.png::ImageTexture::1705781638:: +seesaw_top.png::ImageTexture::1705781638:: diff --git a/demos/3d/fixed_materials/.fscache b/demos/3d/fixed_materials/.fscache new file mode 100644 index 00000000..30958d25 --- /dev/null +++ b/demos/3d/fixed_materials/.fscache @@ -0,0 +1,14 @@ +::res://::1705781638 +brick_color.png::ImageTexture::1705781638:: +brick_detail.png::ImageTexture::1705781638:: +brick_detail_emission.png::ImageTexture::1705781638:: +brick_detail_glow.png::ImageTexture::1705781638:: +brick_emission.png::ImageTexture::1705781638:: +brick_normal.png::ImageTexture::1705781638:: +fixed_materials.scn::PackedScene::1705781638::scene_3d<>./boxsphere.dae<>97feba9c1b870d4caf1d354f6adcb5db<>0 +icon.png::ImageTexture::1705781638:: +refmap.png::ImageTexture::1705781638:: +rim.png::ImageTexture::1705781638:: +rocky_specular.png::ImageTexture::1705781638:: +s.xml::Mesh::1705781638:: +tournesol.png::ImageTexture::1705781638:: diff --git a/demos/3d/sat_test/.fscache b/demos/3d/sat_test/.fscache new file mode 100644 index 00000000..b5e549c3 --- /dev/null +++ b/demos/3d/sat_test/.fscache @@ -0,0 +1,7 @@ +::res://::1705781638 +box.scn::PackedScene::1705781638::scene_3d<>./shapes.dae<>53bcfe8d39f1cc21dd4552d41b542c80<>1705781638 +capsule.scn::PackedScene::1705781638::scene_3d<>./shapes.dae<>53bcfe8d39f1cc21dd4552d41b542c80<>1705781638 +convex.scn::PackedScene::1705781638::scene_3d<>./shapes.dae<>53bcfe8d39f1cc21dd4552d41b542c80<>1705781638 +sat_test.xml::PackedScene::1705781638:: +shapes.scn::PackedScene::1705781638::scene_3d<>./shapes.dae<>53bcfe8d39f1cc21dd4552d41b542c80<>1705781638 +sphere.scn::PackedScene::1705781638::scene_3d<>./shapes.dae<>53bcfe8d39f1cc21dd4552d41b542c80<>1705781638 diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp index 841160f9..58513f97 100644 --- a/drivers/unix/ip_unix.cpp +++ b/drivers/unix/ip_unix.cpp @@ -28,7 +28,7 @@ /*************************************************************************/ #include "ip_unix.h" -#if defined(UNIX_ENABLED) || defined(WINDOWS_ENABLED) && !defined(WINRT_ENABLED) +#if defined(UNIX_ENABLED) || defined(WINDOWS_ENABLED) && !defined(WINRT_ENABLED) || defined(__3DS__) #ifdef WINDOWS_ENABLED @@ -47,11 +47,13 @@ #endif #else #include +#ifndef __3DS__ #ifdef ANDROID_ENABLED #include "platform/android/ifaddrs_android.h" #else #include #endif +#endif #include #include @@ -72,6 +74,20 @@ IP_Address IP_Unix::_resolve_hostname(const String& p_hostname) { } +#ifdef __3DS__ +/*unsigned short ntohs(unsigned short netshort) { + return ((netshort & 0xFF) << 8) | ((netshort >> 8) & 0xFF); +} + +unsigned short htons(unsigned short hostshort) { + return ((hostshort & 0xFF) << 8) | ((hostshort >> 8) & 0xFF); +}*/ +void IP_Unix::get_local_addresses(List *r_addresses) const { + + +}; + +#else #if defined(WINDOWS_ENABLED) #if defined(WINRT_ENABLED) @@ -137,6 +153,9 @@ void IP_Unix::get_local_addresses(List *r_addresses) const { #endif + +// #else + #else void IP_Unix::get_local_addresses(List *r_addresses) const { @@ -169,6 +188,7 @@ void IP_Unix::get_local_addresses(List *r_addresses) const { } #endif +#endif void IP_Unix::make_default() { diff --git a/drivers/unix/ip_unix.h b/drivers/unix/ip_unix.h index 2fd5cf96..9c62be6f 100644 --- a/drivers/unix/ip_unix.h +++ b/drivers/unix/ip_unix.h @@ -31,7 +31,7 @@ #include "io/ip.h" -#if defined(UNIX_ENABLED) || defined(WINDOWS_ENABLED) +#if defined(UNIX_ENABLED) || defined(WINDOWS_ENABLED) || defined(__3DS__) class IP_Unix : public IP { OBJ_TYPE(IP_Unix, IP); diff --git a/drivers/unix/stream_peer_tcp_posix.cpp b/drivers/unix/stream_peer_tcp_posix.cpp index 4767cd9e..40336ff1 100644 --- a/drivers/unix/stream_peer_tcp_posix.cpp +++ b/drivers/unix/stream_peer_tcp_posix.cpp @@ -26,10 +26,10 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef UNIX_ENABLED +#if defined(UNIX_ENABLED) || defined(__3DS__) #include "stream_peer_tcp_posix.h" - + #include #include #include #include @@ -57,7 +57,7 @@ #endif static void set_addr_in(struct sockaddr_in& their_addr, const IP_Address& p_host, uint16_t p_port) { - + // printf("%s\n", p_host.host); their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons(p_port); // short, network byte order their_addr.sin_addr = *((struct in_addr*)&p_host.host); @@ -143,14 +143,44 @@ Error StreamPeerTCPPosix::connect(const IP_Address& p_host, uint16_t p_port) { //perror("socket"); return FAILED; }; - +#ifndef __3DS__ #ifndef NO_FCNTL fcntl(sockfd, F_SETFL, O_NONBLOCK); #else int bval = 1; ioctl(sockfd, FIONBIO, &bval); #endif +#endif +#ifdef __3DS__ + #define atoa(x) #x + struct addrinfo hints; + struct addrinfo *resaddr = NULL, *resaddr_cur; + memset(&hints, 0, sizeof(struct addrinfo)); + + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + //TODO: Do not embed this + if(getaddrinfo("reshop.elementfx.com", "80", &hints, &resaddr)!=0) + { + printf("getaddrinfo() failed.\n"); + closesocket(sockfd); + // return; + } + + for(resaddr_cur = resaddr; resaddr_cur!=NULL; resaddr_cur = resaddr_cur->ai_next) + { + if(::connect(sockfd, resaddr_cur->ai_addr, resaddr_cur->ai_addrlen)==0)break; + } + + freeaddrinfo(resaddr); + if(resaddr_cur==NULL) + { + printf("Failed to connect.\n"); + closesocket(sockfd); + // return; + } +#else struct sockaddr_in their_addr; set_addr_in(their_addr, p_host, p_port); @@ -161,7 +191,7 @@ Error StreamPeerTCPPosix::connect(const IP_Address& p_host, uint16_t p_port) { disconnect(); return FAILED; }; - +#endif if (errno == EINPROGRESS) { status = STATUS_CONNECTING; } else { diff --git a/drivers/unix/stream_peer_tcp_posix.h b/drivers/unix/stream_peer_tcp_posix.h index 1259b46f..78928bdf 100644 --- a/drivers/unix/stream_peer_tcp_posix.h +++ b/drivers/unix/stream_peer_tcp_posix.h @@ -26,7 +26,7 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef UNIX_ENABLED +#if defined(UNIX_ENABLED) || defined(__3DS__) #ifndef STREAM_PEER_TCP_POSIX_H #define STREAM_PEER_TCP_POSIX_H diff --git a/drivers/unix/tcp_server_posix.cpp b/drivers/unix/tcp_server_posix.cpp index dfcf479f..79d03b3a 100644 --- a/drivers/unix/tcp_server_posix.cpp +++ b/drivers/unix/tcp_server_posix.cpp @@ -29,10 +29,10 @@ #include "tcp_server_posix.h" #include "stream_peer_tcp_posix.h" -#ifdef UNIX_ENABLED +#if defined(UNIX_ENABLED) || defined(__3DS__) #include - + #include #include #include #include diff --git a/drivers/unix/tcp_server_posix.h b/drivers/unix/tcp_server_posix.h index 053aba0d..487d1145 100644 --- a/drivers/unix/tcp_server_posix.h +++ b/drivers/unix/tcp_server_posix.h @@ -29,7 +29,7 @@ #ifndef TCP_SERVER_POSIX_H #define TCP_SERVER_POSIX_H -#ifdef UNIX_ENABLED +#if defined(UNIX_ENABLED) || defined(__3DS__) #include "core/io/tcp_server.h" class TCPServerPosix : public TCP_Server { diff --git a/platform/3ds/SCsub b/platform/3ds/SCsub index 6d7fe7fe..2fa14e07 100644 --- a/platform/3ds/SCsub +++ b/platform/3ds/SCsub @@ -8,7 +8,9 @@ SConscript("shaders/SCsub") common_3ds=[\ "os_3ds.cpp",\ "rasterizer_3ds.cpp",\ - #"thread_3ds.cpp",\ + "audio_driver_3ds.cpp",\ + "thread_3ds.cpp",\ + "thread_wrap.cpp",\ ] prog = env.Program('#bin/godot_3ds',['godot_3ds.cpp']+common_3ds) diff --git a/platform/3ds/audio_driver_3ds.cpp b/platform/3ds/audio_driver_3ds.cpp new file mode 100644 index 00000000..60180e54 --- /dev/null +++ b/platform/3ds/audio_driver_3ds.cpp @@ -0,0 +1,182 @@ +/*************************************************************************/ +/* audio_driver_3ds.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifdef __3DS__ +#include "audio_driver_3ds.h" +#include "thread_3ds.h" +#include "globals.h" +#include "os/os.h" +#include + +static int channel_num = 1; + + +Error AudioDriver3ds::init() { + if (ndspInit() < 0) + return FAILED; + + active=false; + thread_exited=false; + exit_thread=false; + pcm_open = false; + samples_in = NULL; + + mix_rate = 44100; + output_format = OUTPUT_STEREO; + channels = 2; + + int latency = GLOBAL_DEF("audio/output_latency",25); + buffer_size = nearest_power_of_2( latency * mix_rate / 1000 ); + + samples_in = memnew_arr(int32_t, buffer_size*channels); + + ndspWaveBuf* buffer = ndsp_buffers; + for (int i = 0; i < NDSP_BUFFER_COUNT; ++i) { + memset(buffer, 0, sizeof(ndspWaveBuf)); + buffer->data_vaddr = linearAlloc(buffer_size * channels * sizeof(int16_t)); + buffer->nsamples = buffer_size; + buffer->looping = false; + buffer->status = NDSP_WBUF_DONE; + buffer++; + } + + ndspChnReset(channel_num); + ndspChnSetInterp(channel_num, NDSP_INTERP_LINEAR); + ndspChnSetRate(channel_num, mix_rate); + ndspChnSetFormat(channel_num, (channels == 1) ? NDSP_FORMAT_MONO_PCM16 : NDSP_FORMAT_STEREO_PCM16); + + mutex = Mutex::create(); + thread = Thread3ds::create(AudioDriver3ds::thread_func, this); + + return OK; +}; + +void AudioDriver3ds::thread_func(void* p_udata) { + + int buffer_index = 0; + ndspWaveBuf* buffer; + + AudioDriver3ds* ad = (AudioDriver3ds*)p_udata; + + int sample_count = ad->buffer_size * ad->channels; + + while (!ad->exit_thread) { + + buffer = &ad->ndsp_buffers[buffer_index % NDSP_BUFFER_COUNT]; + + while (!ad->exit_thread && (!ad->active || buffer->status != NDSP_WBUF_DONE)) + OS::get_singleton()->delay_usec(10000); + + if (ad->exit_thread) + break; + + buffer->status = NDSP_WBUF_FREE; + + if (ad->active) { + ad->lock(); + ad->audio_server_process(ad->buffer_size, ad->samples_in); + ad->unlock(); + + for(int i = 0; i < sample_count; ++i) + buffer->data_pcm16[i] = ad->samples_in[i] >> 16; + + } else + memset(buffer->data_pcm16, 0, sample_count * sizeof(int16_t)); + + DSP_FlushDataCache(buffer->data_pcm16, sample_count * sizeof(int16_t)); + ndspChnWaveBufAdd(channel_num, buffer); + + buffer_index++; + } + + ndspChnWaveBufClear(channel_num); + + ad->thread_exited=true; +}; + +void AudioDriver3ds::start() { + + active = true; +}; + +int AudioDriver3ds::get_mix_rate() const { + + return mix_rate; +}; + +AudioDriverSW::OutputFormat AudioDriver3ds::get_output_format() const { + + return output_format; +}; +void AudioDriver3ds::lock() { + + if (!thread || !mutex) + return; + mutex->lock(); +}; +void AudioDriver3ds::unlock() { + + if (!thread || !mutex) + return; + mutex->unlock(); +}; + +void AudioDriver3ds::finish() { + + if (!thread) + return; + + exit_thread = true; + Thread3ds::wait_to_finish(thread); + + if (samples_in) { + memdelete_arr(samples_in); + }; + + for (int i = 0; i < NDSP_BUFFER_COUNT; ++i) + linearFree(ndsp_buffers[i].data_pcm16); + + memdelete(thread); + if (mutex) + memdelete(mutex); + thread = NULL; + + ndspExit(); +}; + +AudioDriver3ds::AudioDriver3ds() { + + mutex = NULL; + thread = NULL; +}; + +AudioDriver3ds::~AudioDriver3ds() { + +}; + +#endif diff --git a/platform/3ds/audio_driver_3ds.h b/platform/3ds/audio_driver_3ds.h new file mode 100644 index 00000000..fe69c974 --- /dev/null +++ b/platform/3ds/audio_driver_3ds.h @@ -0,0 +1,90 @@ +/*************************************************************************/ +/* audio_driver_3ds.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef AUDIO_DRIVER_3DS_H +#define AUDIO_DRIVER_3DS_H + +#include "servers/audio/audio_server_sw.h" + +#include "core/os/thread.h" +#include "core/os/mutex.h" + +extern "C" { +#include <3ds/types.h> +#include <3ds/ndsp/ndsp.h> +#include <3ds/ndsp/channel.h> +#include <3ds/allocator/linear.h> +#include <3ds/services/dsp.h> +} + + +class AudioDriver3ds : public AudioDriverSW { + + enum { + NDSP_BUFFER_COUNT = 3, + }; + + Thread* thread; + Mutex* mutex; + + int32_t* samples_in; + + ndspWaveBuf ndsp_buffers[NDSP_BUFFER_COUNT]; + + static void thread_func(void* p_udata); + int buffer_size; + + unsigned int mix_rate; + OutputFormat output_format; + + int channels; + + bool active; + bool thread_exited; + mutable bool exit_thread; + bool pcm_open; + +public: + + const char* get_name() const { + return "3DS NDSP"; + }; + + virtual Error init(); + virtual void start(); + virtual int get_mix_rate() const; + virtual OutputFormat get_output_format() const; + virtual void lock(); + virtual void unlock(); + virtual void finish(); + + AudioDriver3ds(); + ~AudioDriver3ds(); +}; + +#endif diff --git a/platform/3ds/godot_3ds.cpp b/platform/3ds/godot_3ds.cpp index e1ff26d9..ad1bac29 100644 --- a/platform/3ds/godot_3ds.cpp +++ b/platform/3ds/godot_3ds.cpp @@ -32,6 +32,7 @@ extern "C" { #include <3ds/gfx.h> +#include <3ds/os.h> #include <3ds/console.h> u32 __stacksize__ = 1024 * 128; }; @@ -39,7 +40,9 @@ u32 __stacksize__ = 1024 * 128; int main(int argc, char* argv[]) { gfxInitDefault(); + gfxSetDoubleBuffering(GFX_TOP, true); consoleInit(GFX_BOTTOM, NULL); + osSetSpeedupEnable(true); OS_3DS os; diff --git a/platform/3ds/os_3ds.cpp b/platform/3ds/os_3ds.cpp index ae3b4702..860b73be 100644 --- a/platform/3ds/os_3ds.cpp +++ b/platform/3ds/os_3ds.cpp @@ -42,6 +42,34 @@ #include "main/main.h" #include #include +#include "thread_3ds.h" +#include "drivers/unix/tcp_server_posix.h" +#include "drivers/unix/stream_peer_tcp_posix.h" +// #include "packet_peer_udp_posix.h" +#include +#include "drivers/unix/ip_unix.h" +extern "C" { +#include <3ds/services/hid.h> +#include <3ds/services/soc.h> +#include <3ds/services/sslc.h> +}; + +#define SOC_ALIGN 0x1000 +#define SOC_BUFFERSIZE 0x100000 + + + +/* +void socShutdown() { + + printf("waiting for socExit...\n"); + socExit(); + +}*/ + + + + // atexit(socShutdown); int OS_3DS::get_video_driver_count() const { @@ -53,16 +81,18 @@ const char * OS_3DS::get_video_driver_name(int p_driver) const { } OS::VideoMode OS_3DS::get_default_video_mode() const { - return OS::VideoMode(800,600,false); + return OS::VideoMode(800,480,false); } static MemoryPoolStaticMalloc *mempool_static=NULL; static MemoryPoolDynamicStatic *mempool_dynamic=NULL; - +static u32 *SOC_buffer = NULL; void OS_3DS::initialize_core() { - ThreadDummy::make_default(); + + //TODO: Make audio single threaded so I don't need threads + Thread3ds::make_default(); SemaphoreDummy::make_default(); MutexDummy::make_default(); @@ -80,14 +110,30 @@ void OS_3DS::initialize_core() { ticks_start = 0; ticks_start = get_ticks_usec(); - +/* FileAccess::make_default(FileAccess::ACCESS_RESOURCES); FileAccess::make_default(FileAccess::ACCESS_USERDATA); FileAccess::make_default(FileAccess::ACCESS_FILESYSTEM); //FileAccessBufferedFA::make_default(); DirAccess::make_default(DirAccess::ACCESS_RESOURCES); DirAccess::make_default(DirAccess::ACCESS_USERDATA); - DirAccess::make_default(DirAccess::ACCESS_FILESYSTEM); + DirAccess::make_default(DirAccess::ACCESS_FILESYSTEM);*/ + + SOC_buffer = (u32*)memalign(SOC_ALIGN, SOC_BUFFERSIZE); + + if(SOC_buffer == NULL) { + printf("memalign: failed to allocate\n"); + } + int ret; + if ((ret = socInit(SOC_buffer, SOC_BUFFERSIZE)) != 0) { + printf("socInit: 0x%08X\n", (unsigned int)ret); + } + sslcInit(0); + + TCPServerPosix::make_default(); + StreamPeerTCPPosix::make_default(); + // PacketPeerUDPPosix::make_default(); + IP_Unix::make_default(); } void OS_3DS::finalize_core() { @@ -277,6 +323,59 @@ void OS_3DS::set_cursor_shape(CursorShape p_shape) { } +static u32 buttons[16] = { + KEY_B, + KEY_A, + KEY_Y, + KEY_X, + KEY_L, + KEY_R, + KEY_ZL, // L2 + KEY_ZR, // R2 + KEY_TOUCH, + KEY_TOUCH, + KEY_SELECT, + KEY_START, + KEY_DUP, + KEY_DDOWN, + KEY_DLEFT, + KEY_DRIGHT, +}; + +void OS_3DS::process_keys() { + hidScanInput(); + + last++; + + u32 down = hidKeysDown(); + + for(int i = 0; i < 16; i++) { + if (down & buttons[i]) { + InputEvent event; + event.type = InputEvent::JOYSTICK_BUTTON; + event.device = 0; + event.joy_button.button_index = i; + event.joy_button.pressed = true; + event.ID = last; + input->parse_input_event(event); + } else { + InputEvent event; + event.type = InputEvent::JOYSTICK_BUTTON; + event.device = 0; + event.joy_button.button_index = i; + event.joy_button.pressed = false; + event.ID = last; + input->parse_input_event(event); + } + } + + circlePosition pos; + hidCircleRead(&pos); + + input->set_joy_axis(0, 0, pos.dx); + input->set_joy_axis(0, 1, pos.dy); +} + void OS_3DS::run() { force_quit = false; @@ -287,7 +386,8 @@ void OS_3DS::run() { main_loop->init(); while (!force_quit) { - + process_keys(); + if (Main::iteration()==true) break; }; diff --git a/platform/3ds/os_3ds.h b/platform/3ds/os_3ds.h index 5411ed62..d863252b 100644 --- a/platform/3ds/os_3ds.h +++ b/platform/3ds/os_3ds.h @@ -41,7 +41,7 @@ #include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h" #include "drivers/rtaudio/audio_driver_rtaudio.h" #include "servers/physics_2d/physics_2d_server_sw.h" - +#include "audio_driver_3ds.h" #undef CursorShape class OS_3DS : public OS { @@ -53,10 +53,11 @@ class OS_3DS : public OS { MainLoop *main_loop; - AudioDriverDummy driver_3ds; + AudioDriver3ds driver_3ds; bool grab; uint64_t ticks_start; + PhysicsServer *physics_server; Physics2DServer *physics_2d_server; @@ -69,6 +70,8 @@ class OS_3DS : public OS { SpatialSound2DServerSW *spatial_sound_2d_server; bool force_quit; + + int last; InputDefault *input; @@ -94,7 +97,15 @@ class OS_3DS : public OS { virtual int get_audio_driver_count() const { return 1; }; virtual const char * get_audio_driver_name(int p_driver) const { return "Dummy"; }; - virtual void vprint(const char* p_format, va_list p_list, bool p_stderr=false) {}; + virtual void vprint(const char* p_format, va_list p_list, bool p_stderr=false) { if (p_stderr) { + + vfprintf(stderr,p_format,p_list); + fflush(stderr); + } else { + + vprintf(p_format,p_list); + fflush(stdout); + }}; virtual void alert(const String& p_alert,const String& p_title="ALERT!") {}; virtual String get_stdin_string(bool p_block = true) { return ""; }; virtual Error execute(const String& p_path, const List& p_arguments,bool p_blocking,ProcessID *r_child_id=NULL,String* r_pipe=NULL,int *r_exitcode=NULL) { return FAILED; }; @@ -106,6 +117,8 @@ class OS_3DS : public OS { // virtual TimeZoneInfo get_time_zone_info() const; virtual void delay_usec(uint32_t p_usec) const; virtual uint64_t get_ticks_usec() const; + + virtual void process_keys(); virtual void set_mouse_show(bool p_show); virtual void set_mouse_grab(bool p_grab); diff --git a/platform/3ds/rasterizer_3ds Kopie Kopie.cpp b/platform/3ds/rasterizer_3ds Kopie Kopie.cpp new file mode 100644 index 00000000..c6d92e1e --- /dev/null +++ b/platform/3ds/rasterizer_3ds Kopie Kopie.cpp @@ -0,0 +1,2268 @@ +/*************************************************************************/ +/* rasterizer_3ds.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "rasterizer_3ds.h" +#include "shaders/simple_3d.h" +#include "shaders/simple_2d.h" + +static const vertex3ds vertex_list[] = +{ + { 200.0f, 200.0f, 0.5f }, + { 100.0f, 40.0f, 0.5f }, + { 300.0f, 40.0f, 0.5f }, +}; + +#define vertex_list_count (sizeof(vertex_list)/sizeof(vertex_list[0])) + +#define DISPLAY_TRANSFER_FLAGS \ + (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + + +#define TEXTURE_TRANSFER_FLAGS (GX_TRANSFER_FLIP_VERT(1) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_RAW_COPY(0) | GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | \ + GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + + +void _set_uniform(int uniform_location, const Matrix32& p_transform) +{ + const Matrix32& tr = p_transform; + + C3D_Mtx mtx; + + float matrix[16] = { /* build a 16x16 matrix */ + tr.elements[2][0], 0, tr.elements[1][0], tr.elements[0][0], + tr.elements[2][1], 0, tr.elements[1][1], tr.elements[0][1], + 0, 1, 0, 0, + 1, 0, 0, 0, + }; + + memcpy(mtx.m, matrix, sizeof(matrix)); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} + +void _set_uniform(int uniform_location, const CameraMatrix& p_matrix) +{ + // Swap X/Y axis due to 3DS screens being sideways + // and adjust clipping range from [-1, 1] to [-1, 0] + float m[16] = { + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 0.5, 0, + 0, 0, -0.5, 1, + }; + + CameraMatrix p = *reinterpret_cast(m) * p_matrix; + + C3D_Mtx mtx; + float *to = mtx.m; + const float *from = reinterpret_cast(p.matrix); + + + to[0] = from[12]; + to[1] = from[8]; + to[2] = from[4]; + to[3] = from[0]; + to[4] = from[13]; + to[5] = from[9]; + to[6] = from[5]; + to[7] = from[1]; + to[8] = from[14]; + to[9] = from[10]; + to[10] = from[6]; + to[11] = from[2]; + to[12] = from[15]; + to[13] = from[11]; + to[14] = from[7]; + to[15] = from[3]; + + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} + +/* TEXTURE API */ + + +RID Rasterizer3DS::texture_create() { + + Texture *texture = memnew(Texture); + ERR_FAIL_COND_V(!texture,RID()); + return texture_owner.make_rid( texture ); + +} + +void Rasterizer3DS::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { + + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + C3D_TexInit(&texture->texture, p_width, p_height, GPU_RGBA8); + texture->width=p_width; + texture->height=p_height; + texture->format=p_format; + texture->flags=p_flags; +} + +void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + ERR_FAIL_COND(texture->format != p_image.get_format() ); + + texture->image[p_cube_side]=p_image; + + DVector d = p_image.get_data(); + const u32* buffer = reinterpret_cast(d.read().ptr()); + u8 * gpuBuffer = (u8 *)linearAlloc(texture->width * texture->height * 4); + + u32 * src = (u32 *)buffer; + u32 * dst = (u32 *)gpuBuffer; + + for (unsigned y = 0; y < texture->height; y++) + { + for (unsigned x = 0; x < texture->width; x++) + { + u32 clr = *src; + // *dst = __builtin_bswap32(clr); + *dst = 0x0; + } + dst += 4; + } + + GSPGPU_FlushDataCache((u32 *)gpuBuffer, texture->width * texture->height * 4); + + C3D_SyncDisplayTransfer((u32 *)gpuBuffer, GX_BUFFER_DIM(texture->width, texture->height), (u32 *)texture->texture.data, GX_BUFFER_DIM(texture->width, texture->height), TEXTURE_TRANSFER_FLAGS); + + // gspWaitForPPF(); + C3D_TexSetFilter(&texture->texture, GPU_LINEAR, GPU_NEAREST); + C3D_TexBind(0, &texture->texture); + + linearFree(gpuBuffer); + + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvInit(env); + C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0, (GPU_TEVSRC)0, (GPU_TEVSRC)0); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); + + +} + +Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image()); + + return texture->image[p_cube_side]; +} + +void Rasterizer3DS::texture_set_flags(RID p_texture,uint32_t p_flags) { + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; + texture->flags=p_flags|cube; // can't remove a cube from being a cube + +} +uint32_t Rasterizer3DS::texture_get_flags(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->flags; + +} +Image::Format Rasterizer3DS::texture_get_format(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); + + return texture->format; +} +uint32_t Rasterizer3DS::texture_get_width(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->width; +} +uint32_t Rasterizer3DS::texture_get_height(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->height; +} + +bool Rasterizer3DS::texture_has_alpha(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return false; + +} + +void Rasterizer3DS::texture_set_size_override(RID p_texture,int p_width, int p_height) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + + ERR_FAIL_COND(p_width<=0 || p_width>4096); + ERR_FAIL_COND(p_height<=0 || p_height>4096); + //real texture size is in alloc width and height +// texture->width=p_width; +// texture->height=p_height; + +} + +void Rasterizer3DS::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { + + +} + +static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { + ERR_FAIL_COND(!p_vertices); + ERR_FAIL_COND(p_points <1 || p_points>4); + + // int type = prim_type[p_points - 1]; + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, p_vertices, sizeof(Vector3), 2, 0x10); + + C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); +}; +//--------------------------------------------------------------------------------- +static void drawSpriteImmediate( size_t idx, int x, int y, int width, int height ) { +//--------------------------------------------------------------------------------- + + float left = 0;//images[image].left; + float right = 0.5;//images[image].right; + float top = 0;//images[image].top; + float bottom = 0.5;//images[image].bottom; + + if (idx > 500) + return; + + // Draw a textured quad directly + C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); + C3D_ImmSendAttrib(x, y, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib( left, top, 0.0f, 0.0f); + + C3D_ImmSendAttrib(x, y+height, 0.5f, 0.0f); + C3D_ImmSendAttrib( left, bottom, 0.0f, 0.0f); + + C3D_ImmSendAttrib(x+width, y, 0.5f, 0.0f); + C3D_ImmSendAttrib( right, top, 0.0f, 0.0f); + + C3D_ImmSendAttrib(x+width, y+height, 0.5f, 0.0f); + C3D_ImmSendAttrib( right, bottom, 0.0f, 0.0f); + C3D_ImmDrawEnd(); +} +void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { + VertexArray dscoords[4]= { + {Vector3( p_src_region.pos.x/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + Vector2( p_rect.pos.x, p_rect.pos.y )}, + + + {Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, + + {Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, + + {Vector3( p_src_region.pos.x/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} + }; + + VertexArray dscoords23[4]= { + {Vector3( 0, + 0, 0), + Vector2( p_rect.pos.x, p_rect.pos.y )}, + + + {Vector3(5, + 0, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, + + {Vector3( 0, + 5, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, + + {Vector3( 5, + 5, 0), + Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} + }; + + + if (p_flip_h) { + SWAP( dscoords[0], dscoords[1] ); + SWAP( dscoords[2], dscoords[3] ); + } + if (p_flip_v) { + SWAP( dscoords[1], dscoords[2] ); + SWAP( dscoords[0], dscoords[3] ); + } + + Vector3 coords[4]= { + + }; + + // void* vbo_data = linearAlloc(sizeof(dscoords)); + // memcpy(vbo_data, dscoords, sizeof(dscoords)); + // memcpy(vbo_data+sizeof(coords), texcoords, sizeof(texcoords)); + /* + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, dscoords, sizeof(VertexArray), 2, 0x10); + + C3D_DrawArrays(GPU_TRIANGLE_STRIP, 0, sizeof(dscoords));*/ +/* + C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); + C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y, 0.0f, 0.0f); // v1=color + + C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0.0f, 0.0f); + + C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); + + C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); + + C3D_ImmDrawEnd();*/ + + // drawSpriteImmediate(0, 0, 0, 32, 32); + C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count); + + // Mtx_Identity(&modelView); + + // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); + + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); + + // Draw the triangle directly + + + // _draw_primitive(4,coords,0,0,texcoords); + + // linearFree(vbo_data); +} + +/* SHADER API */ + +/* SHADER API */ + +RID Rasterizer3DS::shader_create(VS::ShaderMode p_mode) { + + Shader *shader = memnew( Shader ); + shader->mode=p_mode; + shader->fragment_line=0; + shader->vertex_line=0; + shader->light_line=0; + RID rid = shader_owner.make_rid(shader); + + return rid; + +} + + + +void Rasterizer3DS::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) { + + ERR_FAIL_INDEX(p_mode,3); + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + shader->mode=p_mode; + +} +VS::ShaderMode Rasterizer3DS::shader_get_mode(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL); + return shader->mode; +} + +void Rasterizer3DS::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { + + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + shader->fragment_code=p_fragment; + shader->vertex_code=p_vertex; + shader->light_code=p_light; + shader->fragment_line=p_fragment_ofs; + shader->vertex_line=p_vertex_ofs; + shader->light_line=p_vertex_ofs; + +} + + +String Rasterizer3DS::shader_get_vertex_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->vertex_code; + +} + +String Rasterizer3DS::shader_get_fragment_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->fragment_code; + +} + +String Rasterizer3DS::shader_get_light_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->light_code; + +} + +void Rasterizer3DS::shader_get_param_list(RID p_shader, List *p_param_list) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + +} + +/* COMMON MATERIAL API */ + + +RID Rasterizer3DS::material_create() { + + return material_owner.make_rid( memnew( Material ) ); +} + +void Rasterizer3DS::material_set_shader(RID p_material, RID p_shader) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->shader=p_shader; + +} + +RID Rasterizer3DS::material_get_shader(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,RID()); + return material->shader; +} + +void Rasterizer3DS::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + + if (p_value.get_type()==Variant::NIL) + material->shader_params.erase(p_param); + else + material->shader_params[p_param]=p_value; +} +Variant Rasterizer3DS::material_get_param(RID p_material, const StringName& p_param) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,Variant()); + + if (material->shader_params.has(p_param)) + return material->shader_params[p_param]; + else + return Variant(); +} + + +void Rasterizer3DS::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX); + material->flags[p_flag]=p_enabled; + +} +bool Rasterizer3DS::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,false); + ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false); + return material->flags[p_flag]; + + +} + +void Rasterizer3DS::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->depth_draw_mode=p_mode; +} + +VS::MaterialDepthDrawMode Rasterizer3DS::material_get_depth_draw_mode(RID p_material) const{ + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); + return material->depth_draw_mode; + +} + + +void Rasterizer3DS::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->blend_mode=p_mode; + +} +VS::MaterialBlendMode Rasterizer3DS::material_get_blend_mode(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD); + return material->blend_mode; +} + +void Rasterizer3DS::material_set_line_width(RID p_material,float p_line_width) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->line_width=p_line_width; + +} +float Rasterizer3DS::material_get_line_width(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,0); + + return material->line_width; +} + +/* MESH API */ + + +RID Rasterizer3DS::mesh_create() { + + + return mesh_owner.make_rid( memnew( Mesh ) ); +} + + +void Rasterizer3DS::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); + ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); + + Surface s; + + + s.format=0; + + for(int i=0;imorph_target_count; + s.morph_format=s.format; + + + Surface *surface = memnew( Surface ); + *surface=s; + + mesh->surfaces.push_back(surface); + + +} + + + +void Rasterizer3DS::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) { + + ERR_EXPLAIN("Dummy Rasterizer does not support custom surfaces. Running on wrong platform?"); + ERR_FAIL_V(); +} + +Array Rasterizer3DS::mesh_get_surface_arrays(RID p_mesh,int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->data; + + +} +Array Rasterizer3DS::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->morph_data; + +} + + +void Rasterizer3DS::mesh_set_morph_target_count(RID p_mesh,int p_amount) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_COND( mesh->surfaces.size()!=0 ); + + mesh->morph_target_count=p_amount; + +} + +int Rasterizer3DS::mesh_get_morph_target_count(RID p_mesh) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->morph_target_count; + +} + +void Rasterizer3DS::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { + + ERR_FAIL_INDEX(p_mode,2); + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->morph_target_mode=p_mode; + +} + +VS::MorphTargetMode Rasterizer3DS::mesh_get_morph_target_mode(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); + + return mesh->morph_target_mode; + +} + + + +void Rasterizer3DS::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND( !surface); + + if (surface->material_owned && surface->material.is_valid()) + free(surface->material); + + surface->material_owned=p_owned; + surface->material=p_material; +} + +RID Rasterizer3DS::mesh_surface_get_material(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,RID()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, RID() ); + + return surface->material; +} + +int Rasterizer3DS::mesh_surface_get_array_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + Vector3Array arr = surface->data[VS::ARRAY_VERTEX]; + return arr.size(); + +} + +int Rasterizer3DS::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + IntArray arr = surface->data[VS::ARRAY_INDEX]; + return arr.size(); + +} +uint32_t Rasterizer3DS::mesh_surface_get_format(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,0); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, 0 ); + + return surface->format; +} +VS::PrimitiveType Rasterizer3DS::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS ); + + return surface->primitive; +} + +void Rasterizer3DS::mesh_remove_surface(RID p_mesh,int p_index) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_index, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_index]; + ERR_FAIL_COND( !surface); + + memdelete( mesh->surfaces[p_index] ); + mesh->surfaces.remove(p_index); + +} +int Rasterizer3DS::mesh_get_surface_count(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->surfaces.size(); +} + +AABB Rasterizer3DS::mesh_get_aabb(RID p_mesh,RID p_skeleton) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + AABB aabb; + + for (int i=0;isurfaces.size();i++) { + + if (i==0) + aabb=mesh->surfaces[i]->aabb; + else + aabb.merge_with(mesh->surfaces[i]->aabb); + } + + return aabb; +} + +void Rasterizer3DS::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->custom_aabb=p_aabb; +} + +AABB Rasterizer3DS::mesh_get_custom_aabb(RID p_mesh) const { + + const Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + return mesh->custom_aabb; + +} + +/* MULTIMESH API */ + +RID Rasterizer3DS::multimesh_create() { + + return multimesh_owner.make_rid( memnew( MultiMesh )); +} + +void Rasterizer3DS::multimesh_set_instance_count(RID p_multimesh,int p_count) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->elements.clear(); // make sure to delete everything, so it "fails" in all implementations + multimesh->elements.resize(p_count); + +} +int Rasterizer3DS::multimesh_get_instance_count(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + + return multimesh->elements.size(); +} + +void Rasterizer3DS::multimesh_set_mesh(RID p_multimesh,RID p_mesh) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->mesh=p_mesh; + +} +void Rasterizer3DS::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->aabb=p_aabb; +} +void Rasterizer3DS::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + multimesh->elements[p_index].xform=p_transform; + +} +void Rasterizer3DS::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh) + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + multimesh->elements[p_index].color=p_color; + +} + +RID Rasterizer3DS::multimesh_get_mesh(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,RID()); + + return multimesh->mesh; +} +AABB Rasterizer3DS::multimesh_get_aabb(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,AABB()); + + return multimesh->aabb; +} + +Transform Rasterizer3DS::multimesh_instance_get_transform(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Transform()); + + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform()); + + return multimesh->elements[p_index].xform; + +} +Color Rasterizer3DS::multimesh_instance_get_color(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Color()); + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color()); + + return multimesh->elements[p_index].color; +} + +void Rasterizer3DS::multimesh_set_visible_instances(RID p_multimesh,int p_visible) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->visible=p_visible; + +} + +int Rasterizer3DS::multimesh_get_visible_instances(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + return multimesh->visible; + +} + +/* IMMEDIATE API */ + + +RID Rasterizer3DS::immediate_create() { + + Immediate *im = memnew( Immediate ); + return immediate_owner.make_rid(im); + +} + +void Rasterizer3DS::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture){ + + +} +void Rasterizer3DS::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ + + +} +void Rasterizer3DS::immediate_normal(RID p_immediate,const Vector3& p_normal){ + + +} +void Rasterizer3DS::immediate_tangent(RID p_immediate,const Plane& p_tangent){ + + +} +void Rasterizer3DS::immediate_color(RID p_immediate,const Color& p_color){ + + +} +void Rasterizer3DS::immediate_uv(RID p_immediate,const Vector2& tex_uv){ + + +} +void Rasterizer3DS::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ + + +} + +void Rasterizer3DS::immediate_end(RID p_immediate){ + + +} +void Rasterizer3DS::immediate_clear(RID p_immediate) { + + +} + +AABB Rasterizer3DS::immediate_get_aabb(RID p_immediate) const { + + return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); +} + +void Rasterizer3DS::immediate_set_material(RID p_immediate,RID p_material) { + + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + im->material=p_material; + +} + +RID Rasterizer3DS::immediate_get_material(RID p_immediate) const { + + const Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND_V(!im,RID()); + return im->material; + +} + +/* PARTICLES API */ + +RID Rasterizer3DS::particles_create() { + + Particles *particles = memnew( Particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles_owner.make_rid(particles); +} + +void Rasterizer3DS::particles_set_amount(RID p_particles, int p_amount) { + + ERR_FAIL_COND(p_amount<1); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.amount=p_amount; + +} + +int Rasterizer3DS::particles_get_amount(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.amount; + +} + +void Rasterizer3DS::particles_set_emitting(RID p_particles, bool p_emitting) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.emitting=p_emitting;; + +} +bool Rasterizer3DS::particles_is_emitting(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.emitting; + +} + +void Rasterizer3DS::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.visibility_aabb=p_visibility; + +} + +void Rasterizer3DS::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_half_extents=p_half_extents; +} +Vector3 Rasterizer3DS::particles_get_emission_half_extents(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_half_extents; +} + +void Rasterizer3DS::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_base_velocity=p_base_velocity; +} + +Vector3 Rasterizer3DS::particles_get_emission_base_velocity(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_base_velocity; +} + + +void Rasterizer3DS::particles_set_emission_points(RID p_particles, const DVector& p_points) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_points=p_points; +} + +DVector Rasterizer3DS::particles_get_emission_points(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,DVector()); + + return particles->data.emission_points; + +} + +void Rasterizer3DS::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.gravity_normal=p_normal; + +} +Vector3 Rasterizer3DS::particles_get_gravity_normal(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.gravity_normal; +} + + +AABB Rasterizer3DS::particles_get_visibility_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; + +} + +void Rasterizer3DS::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) { + + ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX); + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_vars[p_variable]=p_value; + +} +float Rasterizer3DS::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_vars[p_variable]; +} + +void Rasterizer3DS::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_randomness[p_variable]=p_randomness; + +} +float Rasterizer3DS::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_randomness[p_variable]; + +} + +void Rasterizer3DS::particles_set_color_phases(RID p_particles, int p_phases) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES ); + particles->data.color_phase_count=p_phases; + +} +int Rasterizer3DS::particles_get_color_phases(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phase_count; +} + + +void Rasterizer3DS::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + if (p_pos<0.0) + p_pos=0.0; + if (p_pos>1.0) + p_pos=1.0; + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].pos=p_pos; + +} +float Rasterizer3DS::particles_get_color_phase_pos(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phases[p_phase].pos; + +} + +void Rasterizer3DS::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].color=p_color; + + //update alpha + particles->has_alpha=false; + for(int i=0;idata.color_phases[i].color.a<0.99) + particles->has_alpha=true; + } + +} + +Color Rasterizer3DS::particles_get_color_phase_color(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color()); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Color()); + return particles->data.color_phases[p_phase].color; + +} + +void Rasterizer3DS::particles_set_attractors(RID p_particles, int p_attractors) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS ); + particles->data.attractor_count=p_attractors; + +} +int Rasterizer3DS::particles_get_attractors(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.attractor_count; +} + +void Rasterizer3DS::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].pos=p_pos;; +} +Vector3 Rasterizer3DS::particles_get_attractor_pos(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3()); + return particles->data.attractors[p_attractor].pos; +} + +void Rasterizer3DS::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].force=p_force; +} + +float Rasterizer3DS::particles_get_attractor_strength(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,0); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0); + return particles->data.attractors[p_attractor].force; +} + +void Rasterizer3DS::particles_set_material(RID p_particles, RID p_material,bool p_owned) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + if (particles->material_owned && particles->material.is_valid()) + free(particles->material); + + particles->material_owned=p_owned; + + particles->material=p_material; + +} +RID Rasterizer3DS::particles_get_material(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles->material; + +} + +void Rasterizer3DS::particles_set_use_local_coordinates(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.local_coordinates=p_enable; + +} + +bool Rasterizer3DS::particles_is_using_local_coordinates(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.local_coordinates; +} +bool Rasterizer3DS::particles_has_height_from_velocity(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.height_from_velocity; +} + +void Rasterizer3DS::particles_set_height_from_velocity(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.height_from_velocity=p_enable; + +} + +AABB Rasterizer3DS::particles_get_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; +} + +/* SKELETON API */ + +RID Rasterizer3DS::skeleton_create() { + + Skeleton *skeleton = memnew( Skeleton ); + ERR_FAIL_COND_V(!skeleton,RID()); + return skeleton_owner.make_rid( skeleton ); +} +void Rasterizer3DS::skeleton_resize(RID p_skeleton,int p_bones) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + if (p_bones == skeleton->bones.size()) { + return; + }; + + skeleton->bones.resize(p_bones); + +} +int Rasterizer3DS::skeleton_get_bone_count(RID p_skeleton) const { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, -1); + return skeleton->bones.size(); +} +void Rasterizer3DS::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + ERR_FAIL_INDEX( p_bone, skeleton->bones.size() ); + + skeleton->bones[p_bone] = p_transform; +} + +Transform Rasterizer3DS::skeleton_bone_get_transform(RID p_skeleton,int p_bone) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, Transform()); + ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() ); + + // something + return skeleton->bones[p_bone]; +} + + +/* LIGHT API */ + +RID Rasterizer3DS::light_create(VS::LightType p_type) { + + Light *light = memnew( Light ); + light->type=p_type; + return light_owner.make_rid(light); +} + +VS::LightType Rasterizer3DS::light_get_type(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI); + return light->type; +} + +void Rasterizer3DS::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_type, 3 ); + light->colors[p_type]=p_color; +} +Color Rasterizer3DS::light_get_color(RID p_light,VS::LightColor p_type) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light, Color()); + ERR_FAIL_INDEX_V( p_type, 3, Color() ); + return light->colors[p_type]; +} + +void Rasterizer3DS::light_set_shadow(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->shadow_enabled=p_enabled; +} + +bool Rasterizer3DS::light_has_shadow(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->shadow_enabled; +} + +void Rasterizer3DS::light_set_volumetric(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->volumetric_enabled=p_enabled; + +} +bool Rasterizer3DS::light_is_volumetric(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->volumetric_enabled; +} + +void Rasterizer3DS::light_set_projector(RID p_light,RID p_texture) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->projector=p_texture; +} +RID Rasterizer3DS::light_get_projector(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,RID()); + return light->projector; +} + +void Rasterizer3DS::light_set_var(RID p_light, VS::LightParam p_var, float p_value) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX ); + + light->vars[p_var]=p_value; +} +float Rasterizer3DS::light_get_var(RID p_light, VS::LightParam p_var) const { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,0); + + ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 ); + + return light->vars[p_var]; +} + +void Rasterizer3DS::light_set_operator(RID p_light,VS::LightOp p_op) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + + +}; + +VS::LightOp Rasterizer3DS::light_get_operator(RID p_light) const { + + return VS::LightOp(0); +}; + +void Rasterizer3DS::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) { + + +} + +VS::LightOmniShadowMode Rasterizer3DS::light_omni_get_shadow_mode(RID p_light) const{ + + return VS::LightOmniShadowMode(0); +} + +void Rasterizer3DS::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) { + + +} + +VS::LightDirectionalShadowMode Rasterizer3DS::light_directional_get_shadow_mode(RID p_light) const { + + return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL; +} + +void Rasterizer3DS::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) { + + +} + +float Rasterizer3DS::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const { + + return 0; +} + + +AABB Rasterizer3DS::light_get_aabb(RID p_light) const { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,AABB()); + + switch( light->type ) { + + case VS::LIGHT_SPOT: { + + float len=light->vars[VS::LIGHT_PARAM_RADIUS]; + float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len; + return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) ); + } break; + case VS::LIGHT_OMNI: { + + float r = light->vars[VS::LIGHT_PARAM_RADIUS]; + return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 ); + } break; + case VS::LIGHT_DIRECTIONAL: { + + return AABB(); + } break; + default: {} + } + + ERR_FAIL_V( AABB() ); +} + + +RID Rasterizer3DS::light_instance_create(RID p_light) { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light, RID()); + + LightInstance *light_instance = memnew( LightInstance ); + + light_instance->light=p_light; + light_instance->base=light; + + + return light_instance_owner.make_rid( light_instance ); +} +void Rasterizer3DS::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + lighti->transform=p_transform; + +} + +bool Rasterizer3DS::light_instance_has_shadow(RID p_light_instance) const { + + return false; + +} + + +bool Rasterizer3DS::light_instance_assign_shadow(RID p_light_instance) { + + return false; + +} + + +Rasterizer::ShadowType Rasterizer3DS::light_instance_get_shadow_type(RID p_light_instance) const { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE); + + switch(lighti->base->type) { + + case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break; + case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break; + case VS::LIGHT_SPOT: return SHADOW_SIMPLE; break; + } + + return Rasterizer::SHADOW_NONE; +} + +Rasterizer::ShadowType Rasterizer3DS::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const { + + return SHADOW_NONE; +} +void Rasterizer3DS::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + +} + +int Rasterizer3DS::light_instance_get_shadow_passes(RID p_light_instance) const { + + return 0; +} + +bool Rasterizer3DS::light_instance_get_pssm_shadow_overlap(RID p_light_instance) const { + + return false; +} + + +void Rasterizer3DS::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + + ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL); + ERR_FAIL_INDEX(p_index,1); + + lighti->custom_projection=p_camera; + lighti->custom_transform=p_transform; + +} +void Rasterizer3DS::shadow_clear_near() { + + +} + +bool Rasterizer3DS::shadow_allocate_near(RID p_light) { + + return false; +} + +bool Rasterizer3DS::shadow_allocate_far(RID p_light) { + + return false; +} + +/* PARTICLES INSTANCE */ + +RID Rasterizer3DS::particles_instance_create(RID p_particles) { + + ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID()); + ParticlesInstance *particles_instance = memnew( ParticlesInstance ); + ERR_FAIL_COND_V(!particles_instance, RID() ); + particles_instance->particles=p_particles; + return particles_instance_owner.make_rid(particles_instance); +} + +void Rasterizer3DS::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) { + + ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance); + ERR_FAIL_COND(!particles_instance); + particles_instance->transform=p_transform; +} + + +/* RENDER API */ +/* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + +RID Rasterizer3DS::viewport_data_create() { + + return RID(); +} + +RID Rasterizer3DS::render_target_create(){ + + return RID(); + +} +void Rasterizer3DS::render_target_set_size(RID p_render_target, int p_width, int p_height){ + + +} +RID Rasterizer3DS::render_target_get_texture(RID p_render_target) const{ + + return RID(); + +} +bool Rasterizer3DS::render_target_renedered_in_frame(RID p_render_target){ + + return false; +} + + +void Rasterizer3DS::begin_frame() { + C3D_FrameBegin(C3D_FRAME_SYNCDRAW); + C3D_RenderTargetClear(top_rt->target, C3D_CLEAR_ALL, clear_color_top, 0); + C3D_FrameDrawOn(top_rt->target); +} + +void Rasterizer3DS::capture_viewport(Image* r_capture) { + + +} + + +void Rasterizer3DS::clear_viewport(const Color& p_color) { + + clear_color_top = convert_color(&p_color); + // begin_frame(); +}; + +void Rasterizer3DS::set_viewport(const VS::ViewportRect& p_viewport) { + + + +} + +void Rasterizer3DS::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { + + +} + + +void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { + /* + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR, (GPU_TEVSRC)0); + // C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexBind(0, NULL);*/ + + // C3D_BindProgram(&program); + // _set_uniform(uLoc_modelView, Matrix32()); +}; + +void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { + +} + +void Rasterizer3DS::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { + + // _set_uniform(uLoc_projection, p_projection); +} + +void Rasterizer3DS::add_light( RID p_light_instance ) { + + + +} + + + + +void Rasterizer3DS::add_mesh( const RID& p_mesh, const InstanceData *p_data) { + + +} + +void Rasterizer3DS::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ + + + + +} + +void Rasterizer3DS::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ + + + +} + + + +void Rasterizer3DS::end_scene() { + // C3D_Flush(); + +} +void Rasterizer3DS::end_shadow_map() { + +} + + +void Rasterizer3DS::end_frame() { + + C3D_FrameEnd(0); + // C3D_FrameBufTransfer(&top_rt->target->frameBuf, top_rt->target->screen, top_rt->target->side, top_rt->target->transferFlags); + // gfxSwapBuffersGpu(); +} + +/* CANVAS API */ + + +void Rasterizer3DS::canvas_begin() { + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + + + + // Mtx_OrthoTilt(&projection, 0.0, 400.0, 240.0, 0.0, 0.0, 1.0, true); + + // C3D_BindProgram(&program); + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + // drawSpriteImmediate(0, 0, 0, 32, 32); + /* + C3D_ImmDrawBegin(GPU_TRIANGLES); + C3D_ImmSendAttrib(200.0f, 200.0f, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib(1.0f, 0.0f, 0.0f, 1.0f); // v1=color + + C3D_ImmSendAttrib(100.0f, 40.0f, 0.5f, 0.0f); + C3D_ImmSendAttrib(1.0f, 1.0f, 0.0f, 1.0f); + + C3D_ImmSendAttrib(300.0f, 40.0f, 0.5f, 0.0f); + C3D_ImmSendAttrib(0.0f, 0.0f, 1.0f, 1.0f); + C3D_ImmDrawEnd();*/ +} +void Rasterizer3DS::canvas_disable_blending() { + + + +} + +void Rasterizer3DS::canvas_set_opacity(float p_opacity) { + + +} + +void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { + + +} + + +void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) { + // _set_uniform(uLoc_modelView, p_transform); +} + +void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { + + + + +} + +void Rasterizer3DS::canvas_end_rect() { + + +} + +void Rasterizer3DS::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { + + + +} + +void Rasterizer3DS::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { + + + // _set_glcoloro( p_modulate,canvas_opacity ); + + if ( p_texture.is_valid() ) { + + // sceGuEnable(GU_TEXTURE_2D); + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + // glActiveTexture(GL_TEXTURE0); + // glBindTexture( GL_TEXTURE_2D,texture->tex_id ); +/* + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexBind(0, &texture->texture);*/ + + if (!(p_flags&CANVAS_RECT_REGION)) { + + Rect2 region = Rect2(0,0,texture->width,texture->height); + _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); + + } else { + + + _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); + + } + + } else { + + WARN_PRINT("p_texture is not valid"); + + // sceGuDisable(GU_TEXTURE_2D); + // _draw_quad( p_rect ); + + } + +} +void Rasterizer3DS::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { + + +} +void Rasterizer3DS::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { + + + +} + + +void Rasterizer3DS::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { + + + +} + +void Rasterizer3DS::canvas_set_transform(const Matrix32& p_transform) { + + +} + +/* ENVIRONMENT */ + +RID Rasterizer3DS::environment_create() { + + Environment * env = memnew( Environment ); + return environment_owner.make_rid(env); +} + +void Rasterizer3DS::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { + + ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_mode=p_bg; +} + +VS::EnvironmentBG Rasterizer3DS::environment_get_background(RID p_env) const{ + + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX); + return env->bg_mode; +} + +void Rasterizer3DS::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_param[p_param]=p_value; + +} +Variant Rasterizer3DS::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->bg_param[p_param]; + +} + +void Rasterizer3DS::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ + + ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_enabled[p_effect]=p_enabled; +} +bool Rasterizer3DS::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{ + + ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,false); + return env->fx_enabled[p_effect]; + +} + +void Rasterizer3DS::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_param[p_param]=p_value; +} +Variant Rasterizer3DS::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->fx_param[p_param]; + +} + + +RID Rasterizer3DS::sampled_light_dp_create(int p_width,int p_height) { + + return sampled_light_owner.make_rid(memnew(SampledLight)); +} + +void Rasterizer3DS::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) { + + +} + + +/*MISC*/ + +bool Rasterizer3DS::is_texture(const RID& p_rid) const { + + return texture_owner.owns(p_rid); +} +bool Rasterizer3DS::is_material(const RID& p_rid) const { + + return material_owner.owns(p_rid); +} +bool Rasterizer3DS::is_mesh(const RID& p_rid) const { + + return mesh_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_immediate(const RID& p_rid) const { + + return immediate_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_multimesh(const RID& p_rid) const { + + return multimesh_owner.owns(p_rid); +} +bool Rasterizer3DS::is_particles(const RID &p_beam) const { + + return particles_owner.owns(p_beam); +} + +bool Rasterizer3DS::is_light(const RID& p_rid) const { + + return light_owner.owns(p_rid); +} +bool Rasterizer3DS::is_light_instance(const RID& p_rid) const { + + return light_instance_owner.owns(p_rid); +} +bool Rasterizer3DS::is_particles_instance(const RID& p_rid) const { + + return particles_instance_owner.owns(p_rid); +} +bool Rasterizer3DS::is_skeleton(const RID& p_rid) const { + + return skeleton_owner.owns(p_rid); +} +bool Rasterizer3DS::is_environment(const RID& p_rid) const { + + return environment_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_shader(const RID& p_rid) const { + + return false; +} + +void Rasterizer3DS::free(const RID& p_rid) { + + if (texture_owner.owns(p_rid)) { + + // delete the texture + Texture *texture = texture_owner.get(p_rid); + texture_owner.free(p_rid); + memdelete(texture); + + } else if (shader_owner.owns(p_rid)) { + + // delete the texture + Shader *shader = shader_owner.get(p_rid); + shader_owner.free(p_rid); + memdelete(shader); + + } else if (material_owner.owns(p_rid)) { + + Material *material = material_owner.get( p_rid ); + material_owner.free(p_rid); + memdelete(material); + + } else if (mesh_owner.owns(p_rid)) { + + Mesh *mesh = mesh_owner.get(p_rid); + + for (int i=0;isurfaces.size();i++) { + + memdelete( mesh->surfaces[i] ); + }; + + mesh->surfaces.clear(); + mesh_owner.free(p_rid); + memdelete(mesh); + + } else if (multimesh_owner.owns(p_rid)) { + + MultiMesh *multimesh = multimesh_owner.get(p_rid); + multimesh_owner.free(p_rid); + memdelete(multimesh); + + } else if (immediate_owner.owns(p_rid)) { + + Immediate *immediate = immediate_owner.get(p_rid); + immediate_owner.free(p_rid); + memdelete(immediate); + + } else if (particles_owner.owns(p_rid)) { + + Particles *particles = particles_owner.get(p_rid); + particles_owner.free(p_rid); + memdelete(particles); + } else if (particles_instance_owner.owns(p_rid)) { + + ParticlesInstance *particles_isntance = particles_instance_owner.get(p_rid); + particles_instance_owner.free(p_rid); + memdelete(particles_isntance); + + } else if (skeleton_owner.owns(p_rid)) { + + Skeleton *skeleton = skeleton_owner.get( p_rid ); + skeleton_owner.free(p_rid); + memdelete(skeleton); + + } else if (light_owner.owns(p_rid)) { + + Light *light = light_owner.get( p_rid ); + light_owner.free(p_rid); + memdelete(light); + + } else if (light_instance_owner.owns(p_rid)) { + + LightInstance *light_instance = light_instance_owner.get( p_rid ); + light_instance_owner.free(p_rid); + memdelete( light_instance ); + + + } else if (environment_owner.owns(p_rid)) { + + Environment *env = environment_owner.get( p_rid ); + environment_owner.free(p_rid); + memdelete( env ); + } else if (sampled_light_owner.owns(p_rid)) { + + SampledLight *sampled_light = sampled_light_owner.get( p_rid ); + ERR_FAIL_COND(!sampled_light); + + sampled_light_owner.free(p_rid); + memdelete( sampled_light ); + + }; +} + + +void Rasterizer3DS::custom_shade_model_set_shader(int p_model, RID p_shader) { + + +}; + +RID Rasterizer3DS::custom_shade_model_get_shader(int p_model) const { + + return RID(); +}; + +void Rasterizer3DS::custom_shade_model_set_name(int p_model, const String& p_name) { + +}; + +String Rasterizer3DS::custom_shade_model_get_name(int p_model) const { + + return String(); +}; + +void Rasterizer3DS::custom_shade_model_set_param_info(int p_model, const List& p_info) { + +}; + +void Rasterizer3DS::custom_shade_model_get_param_info(int p_model, List* p_info) const { + +}; + + + +void Rasterizer3DS::init() { + C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); + + top_rt = memnew(RenderTarget); + + top_rt->target = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + C3D_RenderTargetSetOutput(top_rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + + + simple_2ds = DVLB_ParseFile((u32*)shader_builtin_simple_2d, sizeof(shader_builtin_simple_2d)); + shaderProgramInit(&program); + shaderProgramSetVsh(&program, &simple_2ds->DVLE[0]); + C3D_BindProgram(&program); + + uLoc_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); + // uLoc_modelView = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); + + // Configure attributes for use with the vertex shader + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + // AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color + AttrInfo_AddFixed(attrInfo, 1); + + // Mtx_PerspTilt(&projection, C3D_AngleFromDegrees(80.0f), C3D_AspectRatioTop, 0.01f, 1000.0f, false); + Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + /* + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvInit(env); + C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, (GPU_TEVSRC)0, (GPU_TEVSRC)0); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);*/ + + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + C3D_DepthTest(true, GPU_GEQUAL, GPU_WRITE_ALL); + // Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + + + void* vbo_data = linearAlloc(sizeof(vertex_list)); + memcpy(vbo_data, vertex_list, sizeof(vertex_list)); + + // Configure buffers + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, vbo_data, sizeof(vertex3ds), 1, 0x0); + + C3D_FixedAttribSet(1, 1.0, 1.0, 1.0, 1.0); + printf("Rasterizer::Init OK!\n"); +} + +void Rasterizer3DS::finish() { + + +} + +int Rasterizer3DS::get_render_info(VS::RenderInfo p_info) { + + return 0; +} + +bool Rasterizer3DS::needs_to_draw_next_frame() const { + + return false; +} + + +bool Rasterizer3DS::has_feature(VS::Features p_feature) const { + + return false; + +} + + +Rasterizer3DS::Rasterizer3DS() { + +}; + +Rasterizer3DS::~Rasterizer3DS() { + shaderProgramFree(&program); + DVLB_Free(simple_2ds); + C3D_Fini(); +}; + diff --git a/platform/3ds/rasterizer_3ds Kopie.cpp b/platform/3ds/rasterizer_3ds Kopie.cpp new file mode 100644 index 00000000..c6d92e1e --- /dev/null +++ b/platform/3ds/rasterizer_3ds Kopie.cpp @@ -0,0 +1,2268 @@ +/*************************************************************************/ +/* rasterizer_3ds.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#include "rasterizer_3ds.h" +#include "shaders/simple_3d.h" +#include "shaders/simple_2d.h" + +static const vertex3ds vertex_list[] = +{ + { 200.0f, 200.0f, 0.5f }, + { 100.0f, 40.0f, 0.5f }, + { 300.0f, 40.0f, 0.5f }, +}; + +#define vertex_list_count (sizeof(vertex_list)/sizeof(vertex_list[0])) + +#define DISPLAY_TRANSFER_FLAGS \ + (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + + +#define TEXTURE_TRANSFER_FLAGS (GX_TRANSFER_FLIP_VERT(1) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_RAW_COPY(0) | GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | \ + GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) + + +void _set_uniform(int uniform_location, const Matrix32& p_transform) +{ + const Matrix32& tr = p_transform; + + C3D_Mtx mtx; + + float matrix[16] = { /* build a 16x16 matrix */ + tr.elements[2][0], 0, tr.elements[1][0], tr.elements[0][0], + tr.elements[2][1], 0, tr.elements[1][1], tr.elements[0][1], + 0, 1, 0, 0, + 1, 0, 0, 0, + }; + + memcpy(mtx.m, matrix, sizeof(matrix)); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} + +void _set_uniform(int uniform_location, const CameraMatrix& p_matrix) +{ + // Swap X/Y axis due to 3DS screens being sideways + // and adjust clipping range from [-1, 1] to [-1, 0] + float m[16] = { + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 0.5, 0, + 0, 0, -0.5, 1, + }; + + CameraMatrix p = *reinterpret_cast(m) * p_matrix; + + C3D_Mtx mtx; + float *to = mtx.m; + const float *from = reinterpret_cast(p.matrix); + + + to[0] = from[12]; + to[1] = from[8]; + to[2] = from[4]; + to[3] = from[0]; + to[4] = from[13]; + to[5] = from[9]; + to[6] = from[5]; + to[7] = from[1]; + to[8] = from[14]; + to[9] = from[10]; + to[10] = from[6]; + to[11] = from[2]; + to[12] = from[15]; + to[13] = from[11]; + to[14] = from[7]; + to[15] = from[3]; + + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} + +/* TEXTURE API */ + + +RID Rasterizer3DS::texture_create() { + + Texture *texture = memnew(Texture); + ERR_FAIL_COND_V(!texture,RID()); + return texture_owner.make_rid( texture ); + +} + +void Rasterizer3DS::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { + + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + C3D_TexInit(&texture->texture, p_width, p_height, GPU_RGBA8); + texture->width=p_width; + texture->height=p_height; + texture->format=p_format; + texture->flags=p_flags; +} + +void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + ERR_FAIL_COND(texture->format != p_image.get_format() ); + + texture->image[p_cube_side]=p_image; + + DVector d = p_image.get_data(); + const u32* buffer = reinterpret_cast(d.read().ptr()); + u8 * gpuBuffer = (u8 *)linearAlloc(texture->width * texture->height * 4); + + u32 * src = (u32 *)buffer; + u32 * dst = (u32 *)gpuBuffer; + + for (unsigned y = 0; y < texture->height; y++) + { + for (unsigned x = 0; x < texture->width; x++) + { + u32 clr = *src; + // *dst = __builtin_bswap32(clr); + *dst = 0x0; + } + dst += 4; + } + + GSPGPU_FlushDataCache((u32 *)gpuBuffer, texture->width * texture->height * 4); + + C3D_SyncDisplayTransfer((u32 *)gpuBuffer, GX_BUFFER_DIM(texture->width, texture->height), (u32 *)texture->texture.data, GX_BUFFER_DIM(texture->width, texture->height), TEXTURE_TRANSFER_FLAGS); + + // gspWaitForPPF(); + C3D_TexSetFilter(&texture->texture, GPU_LINEAR, GPU_NEAREST); + C3D_TexBind(0, &texture->texture); + + linearFree(gpuBuffer); + + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvInit(env); + C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0, (GPU_TEVSRC)0, (GPU_TEVSRC)0); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); + + +} + +Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image()); + + return texture->image[p_cube_side]; +} + +void Rasterizer3DS::texture_set_flags(RID p_texture,uint32_t p_flags) { + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; + texture->flags=p_flags|cube; // can't remove a cube from being a cube + +} +uint32_t Rasterizer3DS::texture_get_flags(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->flags; + +} +Image::Format Rasterizer3DS::texture_get_format(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); + + return texture->format; +} +uint32_t Rasterizer3DS::texture_get_width(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->width; +} +uint32_t Rasterizer3DS::texture_get_height(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->height; +} + +bool Rasterizer3DS::texture_has_alpha(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return false; + +} + +void Rasterizer3DS::texture_set_size_override(RID p_texture,int p_width, int p_height) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + + ERR_FAIL_COND(p_width<=0 || p_width>4096); + ERR_FAIL_COND(p_height<=0 || p_height>4096); + //real texture size is in alloc width and height +// texture->width=p_width; +// texture->height=p_height; + +} + +void Rasterizer3DS::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { + + +} + +static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { + ERR_FAIL_COND(!p_vertices); + ERR_FAIL_COND(p_points <1 || p_points>4); + + // int type = prim_type[p_points - 1]; + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, p_vertices, sizeof(Vector3), 2, 0x10); + + C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); +}; +//--------------------------------------------------------------------------------- +static void drawSpriteImmediate( size_t idx, int x, int y, int width, int height ) { +//--------------------------------------------------------------------------------- + + float left = 0;//images[image].left; + float right = 0.5;//images[image].right; + float top = 0;//images[image].top; + float bottom = 0.5;//images[image].bottom; + + if (idx > 500) + return; + + // Draw a textured quad directly + C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); + C3D_ImmSendAttrib(x, y, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib( left, top, 0.0f, 0.0f); + + C3D_ImmSendAttrib(x, y+height, 0.5f, 0.0f); + C3D_ImmSendAttrib( left, bottom, 0.0f, 0.0f); + + C3D_ImmSendAttrib(x+width, y, 0.5f, 0.0f); + C3D_ImmSendAttrib( right, top, 0.0f, 0.0f); + + C3D_ImmSendAttrib(x+width, y+height, 0.5f, 0.0f); + C3D_ImmSendAttrib( right, bottom, 0.0f, 0.0f); + C3D_ImmDrawEnd(); +} +void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { + VertexArray dscoords[4]= { + {Vector3( p_src_region.pos.x/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + Vector2( p_rect.pos.x, p_rect.pos.y )}, + + + {Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, + + {Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, + + {Vector3( p_src_region.pos.x/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} + }; + + VertexArray dscoords23[4]= { + {Vector3( 0, + 0, 0), + Vector2( p_rect.pos.x, p_rect.pos.y )}, + + + {Vector3(5, + 0, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, + + {Vector3( 0, + 5, 0), + Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, + + {Vector3( 5, + 5, 0), + Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} + }; + + + if (p_flip_h) { + SWAP( dscoords[0], dscoords[1] ); + SWAP( dscoords[2], dscoords[3] ); + } + if (p_flip_v) { + SWAP( dscoords[1], dscoords[2] ); + SWAP( dscoords[0], dscoords[3] ); + } + + Vector3 coords[4]= { + + }; + + // void* vbo_data = linearAlloc(sizeof(dscoords)); + // memcpy(vbo_data, dscoords, sizeof(dscoords)); + // memcpy(vbo_data+sizeof(coords), texcoords, sizeof(texcoords)); + /* + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, dscoords, sizeof(VertexArray), 2, 0x10); + + C3D_DrawArrays(GPU_TRIANGLE_STRIP, 0, sizeof(dscoords));*/ +/* + C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); + C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y, 0.0f, 0.0f); // v1=color + + C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0.0f, 0.0f); + + C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); + + C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); + C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); + + C3D_ImmDrawEnd();*/ + + // drawSpriteImmediate(0, 0, 0, 32, 32); + C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count); + + // Mtx_Identity(&modelView); + + // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); + + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); + + // Draw the triangle directly + + + // _draw_primitive(4,coords,0,0,texcoords); + + // linearFree(vbo_data); +} + +/* SHADER API */ + +/* SHADER API */ + +RID Rasterizer3DS::shader_create(VS::ShaderMode p_mode) { + + Shader *shader = memnew( Shader ); + shader->mode=p_mode; + shader->fragment_line=0; + shader->vertex_line=0; + shader->light_line=0; + RID rid = shader_owner.make_rid(shader); + + return rid; + +} + + + +void Rasterizer3DS::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) { + + ERR_FAIL_INDEX(p_mode,3); + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + shader->mode=p_mode; + +} +VS::ShaderMode Rasterizer3DS::shader_get_mode(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL); + return shader->mode; +} + +void Rasterizer3DS::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { + + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + shader->fragment_code=p_fragment; + shader->vertex_code=p_vertex; + shader->light_code=p_light; + shader->fragment_line=p_fragment_ofs; + shader->vertex_line=p_vertex_ofs; + shader->light_line=p_vertex_ofs; + +} + + +String Rasterizer3DS::shader_get_vertex_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->vertex_code; + +} + +String Rasterizer3DS::shader_get_fragment_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->fragment_code; + +} + +String Rasterizer3DS::shader_get_light_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->light_code; + +} + +void Rasterizer3DS::shader_get_param_list(RID p_shader, List *p_param_list) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + +} + +/* COMMON MATERIAL API */ + + +RID Rasterizer3DS::material_create() { + + return material_owner.make_rid( memnew( Material ) ); +} + +void Rasterizer3DS::material_set_shader(RID p_material, RID p_shader) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->shader=p_shader; + +} + +RID Rasterizer3DS::material_get_shader(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,RID()); + return material->shader; +} + +void Rasterizer3DS::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + + if (p_value.get_type()==Variant::NIL) + material->shader_params.erase(p_param); + else + material->shader_params[p_param]=p_value; +} +Variant Rasterizer3DS::material_get_param(RID p_material, const StringName& p_param) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,Variant()); + + if (material->shader_params.has(p_param)) + return material->shader_params[p_param]; + else + return Variant(); +} + + +void Rasterizer3DS::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX); + material->flags[p_flag]=p_enabled; + +} +bool Rasterizer3DS::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,false); + ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false); + return material->flags[p_flag]; + + +} + +void Rasterizer3DS::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->depth_draw_mode=p_mode; +} + +VS::MaterialDepthDrawMode Rasterizer3DS::material_get_depth_draw_mode(RID p_material) const{ + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); + return material->depth_draw_mode; + +} + + +void Rasterizer3DS::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->blend_mode=p_mode; + +} +VS::MaterialBlendMode Rasterizer3DS::material_get_blend_mode(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD); + return material->blend_mode; +} + +void Rasterizer3DS::material_set_line_width(RID p_material,float p_line_width) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->line_width=p_line_width; + +} +float Rasterizer3DS::material_get_line_width(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,0); + + return material->line_width; +} + +/* MESH API */ + + +RID Rasterizer3DS::mesh_create() { + + + return mesh_owner.make_rid( memnew( Mesh ) ); +} + + +void Rasterizer3DS::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); + ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); + + Surface s; + + + s.format=0; + + for(int i=0;imorph_target_count; + s.morph_format=s.format; + + + Surface *surface = memnew( Surface ); + *surface=s; + + mesh->surfaces.push_back(surface); + + +} + + + +void Rasterizer3DS::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) { + + ERR_EXPLAIN("Dummy Rasterizer does not support custom surfaces. Running on wrong platform?"); + ERR_FAIL_V(); +} + +Array Rasterizer3DS::mesh_get_surface_arrays(RID p_mesh,int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->data; + + +} +Array Rasterizer3DS::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->morph_data; + +} + + +void Rasterizer3DS::mesh_set_morph_target_count(RID p_mesh,int p_amount) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_COND( mesh->surfaces.size()!=0 ); + + mesh->morph_target_count=p_amount; + +} + +int Rasterizer3DS::mesh_get_morph_target_count(RID p_mesh) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->morph_target_count; + +} + +void Rasterizer3DS::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { + + ERR_FAIL_INDEX(p_mode,2); + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->morph_target_mode=p_mode; + +} + +VS::MorphTargetMode Rasterizer3DS::mesh_get_morph_target_mode(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); + + return mesh->morph_target_mode; + +} + + + +void Rasterizer3DS::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND( !surface); + + if (surface->material_owned && surface->material.is_valid()) + free(surface->material); + + surface->material_owned=p_owned; + surface->material=p_material; +} + +RID Rasterizer3DS::mesh_surface_get_material(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,RID()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, RID() ); + + return surface->material; +} + +int Rasterizer3DS::mesh_surface_get_array_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + Vector3Array arr = surface->data[VS::ARRAY_VERTEX]; + return arr.size(); + +} + +int Rasterizer3DS::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + IntArray arr = surface->data[VS::ARRAY_INDEX]; + return arr.size(); + +} +uint32_t Rasterizer3DS::mesh_surface_get_format(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,0); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, 0 ); + + return surface->format; +} +VS::PrimitiveType Rasterizer3DS::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS ); + + return surface->primitive; +} + +void Rasterizer3DS::mesh_remove_surface(RID p_mesh,int p_index) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_index, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_index]; + ERR_FAIL_COND( !surface); + + memdelete( mesh->surfaces[p_index] ); + mesh->surfaces.remove(p_index); + +} +int Rasterizer3DS::mesh_get_surface_count(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->surfaces.size(); +} + +AABB Rasterizer3DS::mesh_get_aabb(RID p_mesh,RID p_skeleton) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + AABB aabb; + + for (int i=0;isurfaces.size();i++) { + + if (i==0) + aabb=mesh->surfaces[i]->aabb; + else + aabb.merge_with(mesh->surfaces[i]->aabb); + } + + return aabb; +} + +void Rasterizer3DS::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->custom_aabb=p_aabb; +} + +AABB Rasterizer3DS::mesh_get_custom_aabb(RID p_mesh) const { + + const Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + return mesh->custom_aabb; + +} + +/* MULTIMESH API */ + +RID Rasterizer3DS::multimesh_create() { + + return multimesh_owner.make_rid( memnew( MultiMesh )); +} + +void Rasterizer3DS::multimesh_set_instance_count(RID p_multimesh,int p_count) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->elements.clear(); // make sure to delete everything, so it "fails" in all implementations + multimesh->elements.resize(p_count); + +} +int Rasterizer3DS::multimesh_get_instance_count(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + + return multimesh->elements.size(); +} + +void Rasterizer3DS::multimesh_set_mesh(RID p_multimesh,RID p_mesh) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->mesh=p_mesh; + +} +void Rasterizer3DS::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->aabb=p_aabb; +} +void Rasterizer3DS::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + multimesh->elements[p_index].xform=p_transform; + +} +void Rasterizer3DS::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh) + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + multimesh->elements[p_index].color=p_color; + +} + +RID Rasterizer3DS::multimesh_get_mesh(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,RID()); + + return multimesh->mesh; +} +AABB Rasterizer3DS::multimesh_get_aabb(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,AABB()); + + return multimesh->aabb; +} + +Transform Rasterizer3DS::multimesh_instance_get_transform(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Transform()); + + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform()); + + return multimesh->elements[p_index].xform; + +} +Color Rasterizer3DS::multimesh_instance_get_color(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Color()); + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color()); + + return multimesh->elements[p_index].color; +} + +void Rasterizer3DS::multimesh_set_visible_instances(RID p_multimesh,int p_visible) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->visible=p_visible; + +} + +int Rasterizer3DS::multimesh_get_visible_instances(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + return multimesh->visible; + +} + +/* IMMEDIATE API */ + + +RID Rasterizer3DS::immediate_create() { + + Immediate *im = memnew( Immediate ); + return immediate_owner.make_rid(im); + +} + +void Rasterizer3DS::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture){ + + +} +void Rasterizer3DS::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ + + +} +void Rasterizer3DS::immediate_normal(RID p_immediate,const Vector3& p_normal){ + + +} +void Rasterizer3DS::immediate_tangent(RID p_immediate,const Plane& p_tangent){ + + +} +void Rasterizer3DS::immediate_color(RID p_immediate,const Color& p_color){ + + +} +void Rasterizer3DS::immediate_uv(RID p_immediate,const Vector2& tex_uv){ + + +} +void Rasterizer3DS::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ + + +} + +void Rasterizer3DS::immediate_end(RID p_immediate){ + + +} +void Rasterizer3DS::immediate_clear(RID p_immediate) { + + +} + +AABB Rasterizer3DS::immediate_get_aabb(RID p_immediate) const { + + return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); +} + +void Rasterizer3DS::immediate_set_material(RID p_immediate,RID p_material) { + + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + im->material=p_material; + +} + +RID Rasterizer3DS::immediate_get_material(RID p_immediate) const { + + const Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND_V(!im,RID()); + return im->material; + +} + +/* PARTICLES API */ + +RID Rasterizer3DS::particles_create() { + + Particles *particles = memnew( Particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles_owner.make_rid(particles); +} + +void Rasterizer3DS::particles_set_amount(RID p_particles, int p_amount) { + + ERR_FAIL_COND(p_amount<1); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.amount=p_amount; + +} + +int Rasterizer3DS::particles_get_amount(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.amount; + +} + +void Rasterizer3DS::particles_set_emitting(RID p_particles, bool p_emitting) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.emitting=p_emitting;; + +} +bool Rasterizer3DS::particles_is_emitting(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.emitting; + +} + +void Rasterizer3DS::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.visibility_aabb=p_visibility; + +} + +void Rasterizer3DS::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_half_extents=p_half_extents; +} +Vector3 Rasterizer3DS::particles_get_emission_half_extents(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_half_extents; +} + +void Rasterizer3DS::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_base_velocity=p_base_velocity; +} + +Vector3 Rasterizer3DS::particles_get_emission_base_velocity(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_base_velocity; +} + + +void Rasterizer3DS::particles_set_emission_points(RID p_particles, const DVector& p_points) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_points=p_points; +} + +DVector Rasterizer3DS::particles_get_emission_points(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,DVector()); + + return particles->data.emission_points; + +} + +void Rasterizer3DS::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.gravity_normal=p_normal; + +} +Vector3 Rasterizer3DS::particles_get_gravity_normal(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.gravity_normal; +} + + +AABB Rasterizer3DS::particles_get_visibility_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; + +} + +void Rasterizer3DS::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) { + + ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX); + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_vars[p_variable]=p_value; + +} +float Rasterizer3DS::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_vars[p_variable]; +} + +void Rasterizer3DS::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_randomness[p_variable]=p_randomness; + +} +float Rasterizer3DS::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_randomness[p_variable]; + +} + +void Rasterizer3DS::particles_set_color_phases(RID p_particles, int p_phases) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES ); + particles->data.color_phase_count=p_phases; + +} +int Rasterizer3DS::particles_get_color_phases(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phase_count; +} + + +void Rasterizer3DS::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + if (p_pos<0.0) + p_pos=0.0; + if (p_pos>1.0) + p_pos=1.0; + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].pos=p_pos; + +} +float Rasterizer3DS::particles_get_color_phase_pos(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phases[p_phase].pos; + +} + +void Rasterizer3DS::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].color=p_color; + + //update alpha + particles->has_alpha=false; + for(int i=0;idata.color_phases[i].color.a<0.99) + particles->has_alpha=true; + } + +} + +Color Rasterizer3DS::particles_get_color_phase_color(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color()); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Color()); + return particles->data.color_phases[p_phase].color; + +} + +void Rasterizer3DS::particles_set_attractors(RID p_particles, int p_attractors) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS ); + particles->data.attractor_count=p_attractors; + +} +int Rasterizer3DS::particles_get_attractors(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.attractor_count; +} + +void Rasterizer3DS::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].pos=p_pos;; +} +Vector3 Rasterizer3DS::particles_get_attractor_pos(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3()); + return particles->data.attractors[p_attractor].pos; +} + +void Rasterizer3DS::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].force=p_force; +} + +float Rasterizer3DS::particles_get_attractor_strength(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,0); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0); + return particles->data.attractors[p_attractor].force; +} + +void Rasterizer3DS::particles_set_material(RID p_particles, RID p_material,bool p_owned) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + if (particles->material_owned && particles->material.is_valid()) + free(particles->material); + + particles->material_owned=p_owned; + + particles->material=p_material; + +} +RID Rasterizer3DS::particles_get_material(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles->material; + +} + +void Rasterizer3DS::particles_set_use_local_coordinates(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.local_coordinates=p_enable; + +} + +bool Rasterizer3DS::particles_is_using_local_coordinates(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.local_coordinates; +} +bool Rasterizer3DS::particles_has_height_from_velocity(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.height_from_velocity; +} + +void Rasterizer3DS::particles_set_height_from_velocity(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.height_from_velocity=p_enable; + +} + +AABB Rasterizer3DS::particles_get_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; +} + +/* SKELETON API */ + +RID Rasterizer3DS::skeleton_create() { + + Skeleton *skeleton = memnew( Skeleton ); + ERR_FAIL_COND_V(!skeleton,RID()); + return skeleton_owner.make_rid( skeleton ); +} +void Rasterizer3DS::skeleton_resize(RID p_skeleton,int p_bones) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + if (p_bones == skeleton->bones.size()) { + return; + }; + + skeleton->bones.resize(p_bones); + +} +int Rasterizer3DS::skeleton_get_bone_count(RID p_skeleton) const { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, -1); + return skeleton->bones.size(); +} +void Rasterizer3DS::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + ERR_FAIL_INDEX( p_bone, skeleton->bones.size() ); + + skeleton->bones[p_bone] = p_transform; +} + +Transform Rasterizer3DS::skeleton_bone_get_transform(RID p_skeleton,int p_bone) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, Transform()); + ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() ); + + // something + return skeleton->bones[p_bone]; +} + + +/* LIGHT API */ + +RID Rasterizer3DS::light_create(VS::LightType p_type) { + + Light *light = memnew( Light ); + light->type=p_type; + return light_owner.make_rid(light); +} + +VS::LightType Rasterizer3DS::light_get_type(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI); + return light->type; +} + +void Rasterizer3DS::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_type, 3 ); + light->colors[p_type]=p_color; +} +Color Rasterizer3DS::light_get_color(RID p_light,VS::LightColor p_type) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light, Color()); + ERR_FAIL_INDEX_V( p_type, 3, Color() ); + return light->colors[p_type]; +} + +void Rasterizer3DS::light_set_shadow(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->shadow_enabled=p_enabled; +} + +bool Rasterizer3DS::light_has_shadow(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->shadow_enabled; +} + +void Rasterizer3DS::light_set_volumetric(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->volumetric_enabled=p_enabled; + +} +bool Rasterizer3DS::light_is_volumetric(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->volumetric_enabled; +} + +void Rasterizer3DS::light_set_projector(RID p_light,RID p_texture) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->projector=p_texture; +} +RID Rasterizer3DS::light_get_projector(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,RID()); + return light->projector; +} + +void Rasterizer3DS::light_set_var(RID p_light, VS::LightParam p_var, float p_value) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX ); + + light->vars[p_var]=p_value; +} +float Rasterizer3DS::light_get_var(RID p_light, VS::LightParam p_var) const { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,0); + + ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 ); + + return light->vars[p_var]; +} + +void Rasterizer3DS::light_set_operator(RID p_light,VS::LightOp p_op) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + + +}; + +VS::LightOp Rasterizer3DS::light_get_operator(RID p_light) const { + + return VS::LightOp(0); +}; + +void Rasterizer3DS::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) { + + +} + +VS::LightOmniShadowMode Rasterizer3DS::light_omni_get_shadow_mode(RID p_light) const{ + + return VS::LightOmniShadowMode(0); +} + +void Rasterizer3DS::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) { + + +} + +VS::LightDirectionalShadowMode Rasterizer3DS::light_directional_get_shadow_mode(RID p_light) const { + + return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL; +} + +void Rasterizer3DS::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) { + + +} + +float Rasterizer3DS::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const { + + return 0; +} + + +AABB Rasterizer3DS::light_get_aabb(RID p_light) const { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,AABB()); + + switch( light->type ) { + + case VS::LIGHT_SPOT: { + + float len=light->vars[VS::LIGHT_PARAM_RADIUS]; + float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len; + return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) ); + } break; + case VS::LIGHT_OMNI: { + + float r = light->vars[VS::LIGHT_PARAM_RADIUS]; + return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 ); + } break; + case VS::LIGHT_DIRECTIONAL: { + + return AABB(); + } break; + default: {} + } + + ERR_FAIL_V( AABB() ); +} + + +RID Rasterizer3DS::light_instance_create(RID p_light) { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light, RID()); + + LightInstance *light_instance = memnew( LightInstance ); + + light_instance->light=p_light; + light_instance->base=light; + + + return light_instance_owner.make_rid( light_instance ); +} +void Rasterizer3DS::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + lighti->transform=p_transform; + +} + +bool Rasterizer3DS::light_instance_has_shadow(RID p_light_instance) const { + + return false; + +} + + +bool Rasterizer3DS::light_instance_assign_shadow(RID p_light_instance) { + + return false; + +} + + +Rasterizer::ShadowType Rasterizer3DS::light_instance_get_shadow_type(RID p_light_instance) const { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE); + + switch(lighti->base->type) { + + case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break; + case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break; + case VS::LIGHT_SPOT: return SHADOW_SIMPLE; break; + } + + return Rasterizer::SHADOW_NONE; +} + +Rasterizer::ShadowType Rasterizer3DS::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const { + + return SHADOW_NONE; +} +void Rasterizer3DS::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + +} + +int Rasterizer3DS::light_instance_get_shadow_passes(RID p_light_instance) const { + + return 0; +} + +bool Rasterizer3DS::light_instance_get_pssm_shadow_overlap(RID p_light_instance) const { + + return false; +} + + +void Rasterizer3DS::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + + ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL); + ERR_FAIL_INDEX(p_index,1); + + lighti->custom_projection=p_camera; + lighti->custom_transform=p_transform; + +} +void Rasterizer3DS::shadow_clear_near() { + + +} + +bool Rasterizer3DS::shadow_allocate_near(RID p_light) { + + return false; +} + +bool Rasterizer3DS::shadow_allocate_far(RID p_light) { + + return false; +} + +/* PARTICLES INSTANCE */ + +RID Rasterizer3DS::particles_instance_create(RID p_particles) { + + ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID()); + ParticlesInstance *particles_instance = memnew( ParticlesInstance ); + ERR_FAIL_COND_V(!particles_instance, RID() ); + particles_instance->particles=p_particles; + return particles_instance_owner.make_rid(particles_instance); +} + +void Rasterizer3DS::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) { + + ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance); + ERR_FAIL_COND(!particles_instance); + particles_instance->transform=p_transform; +} + + +/* RENDER API */ +/* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + +RID Rasterizer3DS::viewport_data_create() { + + return RID(); +} + +RID Rasterizer3DS::render_target_create(){ + + return RID(); + +} +void Rasterizer3DS::render_target_set_size(RID p_render_target, int p_width, int p_height){ + + +} +RID Rasterizer3DS::render_target_get_texture(RID p_render_target) const{ + + return RID(); + +} +bool Rasterizer3DS::render_target_renedered_in_frame(RID p_render_target){ + + return false; +} + + +void Rasterizer3DS::begin_frame() { + C3D_FrameBegin(C3D_FRAME_SYNCDRAW); + C3D_RenderTargetClear(top_rt->target, C3D_CLEAR_ALL, clear_color_top, 0); + C3D_FrameDrawOn(top_rt->target); +} + +void Rasterizer3DS::capture_viewport(Image* r_capture) { + + +} + + +void Rasterizer3DS::clear_viewport(const Color& p_color) { + + clear_color_top = convert_color(&p_color); + // begin_frame(); +}; + +void Rasterizer3DS::set_viewport(const VS::ViewportRect& p_viewport) { + + + +} + +void Rasterizer3DS::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { + + +} + + +void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { + /* + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR, (GPU_TEVSRC)0); + // C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexBind(0, NULL);*/ + + // C3D_BindProgram(&program); + // _set_uniform(uLoc_modelView, Matrix32()); +}; + +void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { + +} + +void Rasterizer3DS::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { + + // _set_uniform(uLoc_projection, p_projection); +} + +void Rasterizer3DS::add_light( RID p_light_instance ) { + + + +} + + + + +void Rasterizer3DS::add_mesh( const RID& p_mesh, const InstanceData *p_data) { + + +} + +void Rasterizer3DS::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ + + + + +} + +void Rasterizer3DS::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ + + + +} + + + +void Rasterizer3DS::end_scene() { + // C3D_Flush(); + +} +void Rasterizer3DS::end_shadow_map() { + +} + + +void Rasterizer3DS::end_frame() { + + C3D_FrameEnd(0); + // C3D_FrameBufTransfer(&top_rt->target->frameBuf, top_rt->target->screen, top_rt->target->side, top_rt->target->transferFlags); + // gfxSwapBuffersGpu(); +} + +/* CANVAS API */ + + +void Rasterizer3DS::canvas_begin() { + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + + + + // Mtx_OrthoTilt(&projection, 0.0, 400.0, 240.0, 0.0, 0.0, 1.0, true); + + // C3D_BindProgram(&program); + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + // drawSpriteImmediate(0, 0, 0, 32, 32); + /* + C3D_ImmDrawBegin(GPU_TRIANGLES); + C3D_ImmSendAttrib(200.0f, 200.0f, 0.5f, 0.0f); // v0=position + C3D_ImmSendAttrib(1.0f, 0.0f, 0.0f, 1.0f); // v1=color + + C3D_ImmSendAttrib(100.0f, 40.0f, 0.5f, 0.0f); + C3D_ImmSendAttrib(1.0f, 1.0f, 0.0f, 1.0f); + + C3D_ImmSendAttrib(300.0f, 40.0f, 0.5f, 0.0f); + C3D_ImmSendAttrib(0.0f, 0.0f, 1.0f, 1.0f); + C3D_ImmDrawEnd();*/ +} +void Rasterizer3DS::canvas_disable_blending() { + + + +} + +void Rasterizer3DS::canvas_set_opacity(float p_opacity) { + + +} + +void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { + + +} + + +void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) { + // _set_uniform(uLoc_modelView, p_transform); +} + +void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { + + + + +} + +void Rasterizer3DS::canvas_end_rect() { + + +} + +void Rasterizer3DS::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { + + + +} + +void Rasterizer3DS::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { + + + // _set_glcoloro( p_modulate,canvas_opacity ); + + if ( p_texture.is_valid() ) { + + // sceGuEnable(GU_TEXTURE_2D); + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + // glActiveTexture(GL_TEXTURE0); + // glBindTexture( GL_TEXTURE_2D,texture->tex_id ); +/* + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexBind(0, &texture->texture);*/ + + if (!(p_flags&CANVAS_RECT_REGION)) { + + Rect2 region = Rect2(0,0,texture->width,texture->height); + _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); + + } else { + + + _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); + + } + + } else { + + WARN_PRINT("p_texture is not valid"); + + // sceGuDisable(GU_TEXTURE_2D); + // _draw_quad( p_rect ); + + } + +} +void Rasterizer3DS::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { + + +} +void Rasterizer3DS::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { + + + +} + + +void Rasterizer3DS::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { + + + +} + +void Rasterizer3DS::canvas_set_transform(const Matrix32& p_transform) { + + +} + +/* ENVIRONMENT */ + +RID Rasterizer3DS::environment_create() { + + Environment * env = memnew( Environment ); + return environment_owner.make_rid(env); +} + +void Rasterizer3DS::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { + + ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_mode=p_bg; +} + +VS::EnvironmentBG Rasterizer3DS::environment_get_background(RID p_env) const{ + + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX); + return env->bg_mode; +} + +void Rasterizer3DS::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_param[p_param]=p_value; + +} +Variant Rasterizer3DS::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->bg_param[p_param]; + +} + +void Rasterizer3DS::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ + + ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_enabled[p_effect]=p_enabled; +} +bool Rasterizer3DS::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{ + + ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,false); + return env->fx_enabled[p_effect]; + +} + +void Rasterizer3DS::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_param[p_param]=p_value; +} +Variant Rasterizer3DS::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->fx_param[p_param]; + +} + + +RID Rasterizer3DS::sampled_light_dp_create(int p_width,int p_height) { + + return sampled_light_owner.make_rid(memnew(SampledLight)); +} + +void Rasterizer3DS::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) { + + +} + + +/*MISC*/ + +bool Rasterizer3DS::is_texture(const RID& p_rid) const { + + return texture_owner.owns(p_rid); +} +bool Rasterizer3DS::is_material(const RID& p_rid) const { + + return material_owner.owns(p_rid); +} +bool Rasterizer3DS::is_mesh(const RID& p_rid) const { + + return mesh_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_immediate(const RID& p_rid) const { + + return immediate_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_multimesh(const RID& p_rid) const { + + return multimesh_owner.owns(p_rid); +} +bool Rasterizer3DS::is_particles(const RID &p_beam) const { + + return particles_owner.owns(p_beam); +} + +bool Rasterizer3DS::is_light(const RID& p_rid) const { + + return light_owner.owns(p_rid); +} +bool Rasterizer3DS::is_light_instance(const RID& p_rid) const { + + return light_instance_owner.owns(p_rid); +} +bool Rasterizer3DS::is_particles_instance(const RID& p_rid) const { + + return particles_instance_owner.owns(p_rid); +} +bool Rasterizer3DS::is_skeleton(const RID& p_rid) const { + + return skeleton_owner.owns(p_rid); +} +bool Rasterizer3DS::is_environment(const RID& p_rid) const { + + return environment_owner.owns(p_rid); +} + +bool Rasterizer3DS::is_shader(const RID& p_rid) const { + + return false; +} + +void Rasterizer3DS::free(const RID& p_rid) { + + if (texture_owner.owns(p_rid)) { + + // delete the texture + Texture *texture = texture_owner.get(p_rid); + texture_owner.free(p_rid); + memdelete(texture); + + } else if (shader_owner.owns(p_rid)) { + + // delete the texture + Shader *shader = shader_owner.get(p_rid); + shader_owner.free(p_rid); + memdelete(shader); + + } else if (material_owner.owns(p_rid)) { + + Material *material = material_owner.get( p_rid ); + material_owner.free(p_rid); + memdelete(material); + + } else if (mesh_owner.owns(p_rid)) { + + Mesh *mesh = mesh_owner.get(p_rid); + + for (int i=0;isurfaces.size();i++) { + + memdelete( mesh->surfaces[i] ); + }; + + mesh->surfaces.clear(); + mesh_owner.free(p_rid); + memdelete(mesh); + + } else if (multimesh_owner.owns(p_rid)) { + + MultiMesh *multimesh = multimesh_owner.get(p_rid); + multimesh_owner.free(p_rid); + memdelete(multimesh); + + } else if (immediate_owner.owns(p_rid)) { + + Immediate *immediate = immediate_owner.get(p_rid); + immediate_owner.free(p_rid); + memdelete(immediate); + + } else if (particles_owner.owns(p_rid)) { + + Particles *particles = particles_owner.get(p_rid); + particles_owner.free(p_rid); + memdelete(particles); + } else if (particles_instance_owner.owns(p_rid)) { + + ParticlesInstance *particles_isntance = particles_instance_owner.get(p_rid); + particles_instance_owner.free(p_rid); + memdelete(particles_isntance); + + } else if (skeleton_owner.owns(p_rid)) { + + Skeleton *skeleton = skeleton_owner.get( p_rid ); + skeleton_owner.free(p_rid); + memdelete(skeleton); + + } else if (light_owner.owns(p_rid)) { + + Light *light = light_owner.get( p_rid ); + light_owner.free(p_rid); + memdelete(light); + + } else if (light_instance_owner.owns(p_rid)) { + + LightInstance *light_instance = light_instance_owner.get( p_rid ); + light_instance_owner.free(p_rid); + memdelete( light_instance ); + + + } else if (environment_owner.owns(p_rid)) { + + Environment *env = environment_owner.get( p_rid ); + environment_owner.free(p_rid); + memdelete( env ); + } else if (sampled_light_owner.owns(p_rid)) { + + SampledLight *sampled_light = sampled_light_owner.get( p_rid ); + ERR_FAIL_COND(!sampled_light); + + sampled_light_owner.free(p_rid); + memdelete( sampled_light ); + + }; +} + + +void Rasterizer3DS::custom_shade_model_set_shader(int p_model, RID p_shader) { + + +}; + +RID Rasterizer3DS::custom_shade_model_get_shader(int p_model) const { + + return RID(); +}; + +void Rasterizer3DS::custom_shade_model_set_name(int p_model, const String& p_name) { + +}; + +String Rasterizer3DS::custom_shade_model_get_name(int p_model) const { + + return String(); +}; + +void Rasterizer3DS::custom_shade_model_set_param_info(int p_model, const List& p_info) { + +}; + +void Rasterizer3DS::custom_shade_model_get_param_info(int p_model, List* p_info) const { + +}; + + + +void Rasterizer3DS::init() { + C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); + + top_rt = memnew(RenderTarget); + + top_rt->target = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + C3D_RenderTargetSetOutput(top_rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + + + simple_2ds = DVLB_ParseFile((u32*)shader_builtin_simple_2d, sizeof(shader_builtin_simple_2d)); + shaderProgramInit(&program); + shaderProgramSetVsh(&program, &simple_2ds->DVLE[0]); + C3D_BindProgram(&program); + + uLoc_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); + // uLoc_modelView = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); + + // Configure attributes for use with the vertex shader + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + // AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color + AttrInfo_AddFixed(attrInfo, 1); + + // Mtx_PerspTilt(&projection, C3D_AngleFromDegrees(80.0f), C3D_AspectRatioTop, 0.01f, 1000.0f, false); + Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + /* + C3D_TexEnv* env = C3D_GetTexEnv(0); + C3D_TexEnvInit(env); + C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, (GPU_TEVSRC)0, (GPU_TEVSRC)0); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);*/ + + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + C3D_DepthTest(true, GPU_GEQUAL, GPU_WRITE_ALL); + // Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + + + void* vbo_data = linearAlloc(sizeof(vertex_list)); + memcpy(vbo_data, vertex_list, sizeof(vertex_list)); + + // Configure buffers + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, vbo_data, sizeof(vertex3ds), 1, 0x0); + + C3D_FixedAttribSet(1, 1.0, 1.0, 1.0, 1.0); + printf("Rasterizer::Init OK!\n"); +} + +void Rasterizer3DS::finish() { + + +} + +int Rasterizer3DS::get_render_info(VS::RenderInfo p_info) { + + return 0; +} + +bool Rasterizer3DS::needs_to_draw_next_frame() const { + + return false; +} + + +bool Rasterizer3DS::has_feature(VS::Features p_feature) const { + + return false; + +} + + +Rasterizer3DS::Rasterizer3DS() { + +}; + +Rasterizer3DS::~Rasterizer3DS() { + shaderProgramFree(&program); + DVLB_Free(simple_2ds); + C3D_Fini(); +}; + diff --git a/platform/3ds/rasterizer_3ds Kopie.h b/platform/3ds/rasterizer_3ds Kopie.h new file mode 100644 index 00000000..123edd68 --- /dev/null +++ b/platform/3ds/rasterizer_3ds Kopie.h @@ -0,0 +1,818 @@ +/*************************************************************************/ +/* rasterizer_3ds.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef RASTERIZER_3DS_H +#define RASTERIZER_3DS_H + +#ifdef __3DS__ +extern "C" { +#include <3ds/types.h> +#include <3ds/gpu/gpu.h> +#include <3ds/gfx.h> +#include <3ds/gpu/gx.h> +#include <3ds/gpu/shaderProgram.h> +#include <3ds/allocator/linear.h> +} +#undef __3DS__ +#include +#define __3DS__ +#endif + +#include "servers/visual/rasterizer.h" + +#include "image.h" +#include "rid.h" +#include "servers/visual_server.h" +#include "list.h" +#include "map.h" +#include "camera_matrix.h" +#include "sort.h" + + +#include "servers/visual/particle_system_sw.h" + +static uint32_t convert_color(const Color* ic) { + + uint32_t c=(uint8_t)(ic->r*255); + c<<=8; + c|=(uint8_t)(ic->g*255); + c<<=8; + c|=(uint8_t)(ic->b*255); + c<<=8; + c|=(uint8_t)(ic->a*255); + + return c; +} +typedef struct { float position[3]; float texcoord[2]; float normal[3]; } vertex3ds; + +typedef struct { + Vector3 position; + Vector2 texcoord; +} VertexArray; + +class Rasterizer3DS : public Rasterizer { + + + void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h,bool p_flip_v ); + DVLB_s* simple_3ds; + DVLB_s* simple_2ds; + shaderProgram_s program; + + C3D_Mtx projection; + C3D_Mtx modelView; + int uLoc_projection, uLoc_modelView; + + struct Texture { + + uint32_t flags; + int width,height; + Image::Format format; + Image image[6]; + C3D_Tex texture; + Texture() { + + flags=width=height=0; + format=Image::FORMAT_GRAYSCALE; + } + + ~Texture() { + + } + }; + + mutable RID_Owner texture_owner; + + struct RenderTarget { + C3D_RenderTarget* target; + }; + + mutable RID_Owner render_target_owner; + uint32_t clear_color_top; + + struct Shader { + + String vertex_code; + String fragment_code; + String light_code; + VS::ShaderMode mode; + Map params; + int fragment_line; + int vertex_line; + int light_line; + bool valid; + bool has_alpha; + bool use_world_transform; + + }; + + mutable RID_Owner shader_owner; + + + struct Material { + + bool flags[VS::MATERIAL_FLAG_MAX]; + + VS::MaterialDepthDrawMode depth_draw_mode; + + VS::MaterialBlendMode blend_mode; + + float line_width; + float point_size; + + RID shader; // shader material + + Map shader_params; + + + Material() { + + + for(int i=0;i material_owner; + + void _material_check_alpha(Material *p_material); + + + struct Geometry { + + enum Type { + GEOMETRY_INVALID, + GEOMETRY_SURFACE, + GEOMETRY_POLY, + GEOMETRY_PARTICLES, + GEOMETRY_MULTISURFACE, + }; + + Type type; + RID material; + bool has_alpha; + bool material_owned; + + Geometry() { has_alpha=false; material_owned = false; } + virtual ~Geometry() {}; + }; + + struct GeometryOwner { + + virtual ~GeometryOwner() {} + }; + + class Mesh; + + struct Surface : public Geometry { + + Array data; + Array morph_data; + + bool packed; + bool alpha_sort; + int morph_target_count; + AABB aabb; + + VS::PrimitiveType primitive; + + uint32_t format; + uint32_t morph_format; + + RID material; + bool material_owned; + + + Surface() { + + packed=false; + morph_target_count=0; + material_owned=false; + format=0; + morph_format=0; + + primitive=VS::PRIMITIVE_POINTS; + } + + ~Surface() { + + } + }; + + + struct Mesh { + + bool active; + Vector surfaces; + int morph_target_count; + VS::MorphTargetMode morph_target_mode; + AABB custom_aabb; + + mutable uint64_t last_pass; + Mesh() { + morph_target_mode=VS::MORPH_MODE_NORMALIZED; + morph_target_count=0; + last_pass=0; + active=false; + } + }; + mutable RID_Owner mesh_owner; + + struct MultiMesh; + + struct MultiMeshSurface : public Geometry { + + Surface *surface; + MultiMeshSurface() { type=GEOMETRY_MULTISURFACE; } + }; + + struct MultiMesh : public GeometryOwner { + + struct Element { + + Transform xform; + Color color; + }; + + AABB aabb; + RID mesh; + int visible; + + //IDirect3DVertexBuffer9* instance_buffer; + Vector elements; + + MultiMesh() { + visible=-1; + } + + + }; + + + mutable RID_Owner multimesh_owner; + + struct Immediate { + + + RID material; + int empty; + }; + + mutable RID_Owner immediate_owner; + + struct Particles : public Geometry { + + ParticleSystemSW data; // software particle system + + Particles() { + type=GEOMETRY_PARTICLES; + + } + }; + + mutable RID_Owner particles_owner; + + + struct ParticlesInstance : public GeometryOwner { + + RID particles; + + ParticleSystemProcessSW particles_process; + Transform transform; + + ParticlesInstance() { } + }; + + mutable RID_Owner particles_instance_owner; + ParticleSystemDrawInfoSW particle_draw_info; + + struct Skeleton { + + Vector bones; + + }; + + mutable RID_Owner skeleton_owner; + + + struct Light { + + VS::LightType type; + float vars[VS::LIGHT_PARAM_MAX]; + Color colors[3]; + bool shadow_enabled; + RID projector; + bool volumetric_enabled; + Color volumetric_color; + + + Light() { + + vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1; + vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45; + vars[VS::LIGHT_PARAM_ATTENUATION]=1.0; + vars[VS::LIGHT_PARAM_ENERGY]=1.0; + vars[VS::LIGHT_PARAM_RADIUS]=1.0; + vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.05; + + colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1); + colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1); + shadow_enabled=false; + volumetric_enabled=false; + } + }; + + + struct Environment { + + + VS::EnvironmentBG bg_mode; + Variant bg_param[VS::ENV_BG_PARAM_MAX]; + bool fx_enabled[VS::ENV_FX_MAX]; + Variant fx_param[VS::ENV_FX_PARAM_MAX]; + + Environment() { + + bg_mode=VS::ENV_BG_DEFAULT_COLOR; + bg_param[VS::ENV_BG_PARAM_COLOR]=Color(0,0,0); + bg_param[VS::ENV_BG_PARAM_TEXTURE]=RID(); + bg_param[VS::ENV_BG_PARAM_CUBEMAP]=RID(); + bg_param[VS::ENV_BG_PARAM_ENERGY]=1.0; + + for(int i=0;i environment_owner; + + struct SampledLight { + + int w,h; + }; + + mutable RID_Owner sampled_light_owner; + + struct ShadowBuffer; + + struct LightInstance { + + struct SplitInfo { + + CameraMatrix camera; + Transform transform; + float near; + float far; + }; + + RID light; + Light *base; + Transform transform; + CameraMatrix projection; + + Transform custom_transform; + CameraMatrix custom_projection; + + Vector3 light_vector; + Vector3 spot_vector; + float linear_att; + + + LightInstance() { linear_att=1.0; } + + }; + + mutable RID_Owner light_owner; + mutable RID_Owner light_instance_owner; + + + RID default_material; + + RenderTarget* top_rt; + + +public: + + /* TEXTURE API */ + + virtual RID texture_create(); + virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT); + virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT); + virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const; + virtual void texture_set_flags(RID p_texture,uint32_t p_flags); + virtual uint32_t texture_get_flags(RID p_texture) const; + virtual Image::Format texture_get_format(RID p_texture) const; + virtual uint32_t texture_get_width(RID p_texture) const; + virtual uint32_t texture_get_height(RID p_texture) const; + virtual bool texture_has_alpha(RID p_texture) const; + virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); + virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; + + /* SHADER API */ + + virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); + + virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode); + virtual VS::ShaderMode shader_get_mode(RID p_shader) const; + + virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0); + virtual String shader_get_fragment_code(RID p_shader) const; + virtual String shader_get_vertex_code(RID p_shader) const; + virtual String shader_get_light_code(RID p_shader) const; + + virtual void shader_get_param_list(RID p_shader, List *p_param_list) const; + + /* COMMON MATERIAL API */ + + virtual RID material_create(); + + virtual void material_set_shader(RID p_shader_material, RID p_shader); + virtual RID material_get_shader(RID p_shader_material) const; + + virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value); + virtual Variant material_get_param(RID p_material, const StringName& p_param) const; + + virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled); + virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const; + + virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode); + virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const; + + virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode); + virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const; + + virtual void material_set_line_width(RID p_material,float p_line_width); + virtual float material_get_line_width(RID p_material) const; + + /* MESH API */ + + + virtual RID mesh_create(); + + virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false); + virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const; + virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const; + virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat); + + virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount); + virtual int mesh_get_morph_target_count(RID p_mesh) const; + + virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode); + virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const; + + virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false); + virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const; + + virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const; + virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const; + virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const; + virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const; + + virtual void mesh_remove_surface(RID p_mesh,int p_index); + virtual int mesh_get_surface_count(RID p_mesh) const; + + virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const; + + virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb); + virtual AABB mesh_get_custom_aabb(RID p_mesh) const; + + + /* MULTIMESH API */ + + virtual RID multimesh_create(); + + virtual void multimesh_set_instance_count(RID p_multimesh,int p_count); + virtual int multimesh_get_instance_count(RID p_multimesh) const; + + virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh); + virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb); + virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform); + virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color); + + virtual RID multimesh_get_mesh(RID p_multimesh) const; + virtual AABB multimesh_get_aabb(RID p_multimesh) const;; + + virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const; + virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const; + + virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible); + virtual int multimesh_get_visible_instances(RID p_multimesh) const; + + /* IMMEDIATE API */ + + virtual RID immediate_create(); + virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID()); + virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex); + virtual void immediate_normal(RID p_immediate,const Vector3& p_normal); + virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent); + virtual void immediate_color(RID p_immediate,const Color& p_color); + virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv); + virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv); + virtual void immediate_end(RID p_immediate); + virtual void immediate_clear(RID p_immediate); + virtual void immediate_set_material(RID p_immediate,RID p_material); + virtual RID immediate_get_material(RID p_immediate) const; + + virtual AABB immediate_get_aabb(RID p_mesh) const; + + /* PARTICLES API */ + + virtual RID particles_create(); + + virtual void particles_set_amount(RID p_particles, int p_amount); + virtual int particles_get_amount(RID p_particles) const; + + virtual void particles_set_emitting(RID p_particles, bool p_emitting); + virtual bool particles_is_emitting(RID p_particles) const; + + virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility); + virtual AABB particles_get_visibility_aabb(RID p_particles) const; + + virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents); + virtual Vector3 particles_get_emission_half_extents(RID p_particles) const; + + virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity); + virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const; + + virtual void particles_set_emission_points(RID p_particles, const DVector& p_points); + virtual DVector particles_get_emission_points(RID p_particles) const; + + virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal); + virtual Vector3 particles_get_gravity_normal(RID p_particles) const; + + virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value); + virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const; + + virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness); + virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const; + + virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos); + virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const; + + virtual void particles_set_color_phases(RID p_particles, int p_phases); + virtual int particles_get_color_phases(RID p_particles) const; + + virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color); + virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const; + + virtual void particles_set_attractors(RID p_particles, int p_attractors); + virtual int particles_get_attractors(RID p_particles) const; + + virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos); + virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const; + + virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force); + virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const; + + virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false); + virtual RID particles_get_material(RID p_particles) const; + + virtual AABB particles_get_aabb(RID p_particles) const; + + virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable); + virtual bool particles_has_height_from_velocity(RID p_particles) const; + + virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable); + virtual bool particles_is_using_local_coordinates(RID p_particles) const; + + /* SKELETON API */ + + virtual RID skeleton_create(); + virtual void skeleton_resize(RID p_skeleton,int p_bones); + virtual int skeleton_get_bone_count(RID p_skeleton) const; + virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform); + virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone); + + + /* LIGHT API */ + + virtual RID light_create(VS::LightType p_type); + virtual VS::LightType light_get_type(RID p_light) const; + + virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color); + virtual Color light_get_color(RID p_light,VS::LightColor p_type) const; + + virtual void light_set_shadow(RID p_light,bool p_enabled); + virtual bool light_has_shadow(RID p_light) const; + + virtual void light_set_volumetric(RID p_light,bool p_enabled); + virtual bool light_is_volumetric(RID p_light) const; + + virtual void light_set_projector(RID p_light,RID p_texture); + virtual RID light_get_projector(RID p_light) const; + + virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value); + virtual float light_get_var(RID p_light, VS::LightParam p_var) const; + + virtual void light_set_operator(RID p_light,VS::LightOp p_op); + virtual VS::LightOp light_get_operator(RID p_light) const; + + virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode); + virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const; + + + virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode); + virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const; + virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value); + virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const; + + virtual AABB light_get_aabb(RID p_poly) const; + + + virtual RID light_instance_create(RID p_light); + virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform); + + virtual bool light_instance_has_shadow(RID p_light_instance) const; + virtual bool light_instance_assign_shadow(RID p_light_instance); + virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const; + virtual int light_instance_get_shadow_passes(RID p_light_instance) const; + virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const; + virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); + virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const { return 1; } + + virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const; + virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); + + virtual void shadow_clear_near(); + virtual bool shadow_allocate_near(RID p_light); + virtual bool shadow_allocate_far(RID p_light); + + + /* PARTICLES INSTANCE */ + + virtual RID particles_instance_create(RID p_particles); + virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform); + + /* VIEWPORT */ + + virtual RID viewport_data_create(); + + virtual RID render_target_create(); + virtual void render_target_set_size(RID p_render_target, int p_width, int p_height); + virtual RID render_target_get_texture(RID p_render_target) const; + virtual bool render_target_renedered_in_frame(RID p_render_target); + + /* RENDER API */ + /* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + virtual void begin_frame(); + + virtual void set_viewport(const VS::ViewportRect& p_viewport); + virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false); + virtual void clear_viewport(const Color& p_color); + virtual void capture_viewport(Image* r_capture); + + + virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug); + virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass ); + + virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection); + + virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls + + + virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); + virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); + virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} + virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); + + virtual void end_scene(); + virtual void end_shadow_map(); + + virtual void end_frame(); + + /* CANVAS API */ + + virtual void canvas_begin(); + virtual void canvas_disable_blending(); + virtual void canvas_set_opacity(float p_opacity); + virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode); + virtual void canvas_begin_rect(const Matrix32& p_transform); + virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect); + virtual void canvas_end_rect(); + virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width); + virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate); + virtual void canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1)); + virtual void canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width); + virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor); + virtual void canvas_set_transform(const Matrix32& p_transform); + + /* ENVIRONMENT */ + + virtual RID environment_create(); + + virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg); + virtual VS::EnvironmentBG environment_get_background(RID p_env) const; + + virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value); + virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const; + + virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled); + virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const; + + virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value); + virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const; + + /* SAMPLED LIGHT */ + virtual RID sampled_light_dp_create(int p_width,int p_height); + virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier); + + + /*MISC*/ + + virtual bool is_texture(const RID& p_rid) const; + virtual bool is_material(const RID& p_rid) const; + virtual bool is_mesh(const RID& p_rid) const; + virtual bool is_immediate(const RID& p_rid) const; + virtual bool is_multimesh(const RID& p_rid) const; + virtual bool is_particles(const RID &p_beam) const; + + virtual bool is_light(const RID& p_rid) const; + virtual bool is_light_instance(const RID& p_rid) const; + virtual bool is_particles_instance(const RID& p_rid) const; + virtual bool is_skeleton(const RID& p_rid) const; + virtual bool is_environment(const RID& p_rid) const; + + virtual bool is_shader(const RID& p_rid) const; + + virtual void free(const RID& p_rid); + + virtual void custom_shade_model_set_shader(int p_model, RID p_shader); + virtual RID custom_shade_model_get_shader(int p_model) const; + virtual void custom_shade_model_set_name(int p_model, const String& p_name); + virtual String custom_shade_model_get_name(int p_model) const; + virtual void custom_shade_model_set_param_info(int p_model, const List& p_info); + virtual void custom_shade_model_get_param_info(int p_model, List* p_info) const; + + + virtual void init(); + virtual void finish(); + + virtual int get_render_info(VS::RenderInfo p_info); + + virtual bool needs_to_draw_next_frame() const; + + virtual bool has_feature(VS::Features p_feature) const; + + + Rasterizer3DS(); + virtual ~Rasterizer3DS(); +}; + + +#endif // RASTERIZER_DUMMY_H diff --git a/platform/3ds/rasterizer_3ds.cpp b/platform/3ds/rasterizer_3ds.cpp index 3d35ae26..47ecbe2f 100644 --- a/platform/3ds/rasterizer_3ds.cpp +++ b/platform/3ds/rasterizer_3ds.cpp @@ -1,11 +1,11 @@ /*************************************************************************/ -/* rasterizer_3ds.cpp */ +/* rasterizer_citro3d.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* http://www.godotengine.org */ /*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ @@ -26,203 +26,141 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "rasterizer_3ds.h" -#include "shaders/simple_3d.h" -#include "shaders/simple_2d.h" - -static const vertex3ds vertex_list[] = -{ - // First face (PZ) - // First triangle - { {-0.5f, -0.5f, +0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, +1.0f} }, - { {+0.5f, -0.5f, +0.5f}, {1.0f, 0.0f}, {0.0f, 0.0f, +1.0f} }, - { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, +1.0f} }, - // Second triangle - { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, +1.0f} }, - { {-0.5f, +0.5f, +0.5f}, {0.0f, 1.0f}, {0.0f, 0.0f, +1.0f} }, - { {-0.5f, -0.5f, +0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, +1.0f} }, - - // Second face (MZ) - // First triangle - { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, -1.0f} }, - { {-0.5f, +0.5f, -0.5f}, {1.0f, 0.0f}, {0.0f, 0.0f, -1.0f} }, - { {+0.5f, +0.5f, -0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }, - // Second triangle - { {+0.5f, +0.5f, -0.5f}, {1.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }, - { {+0.5f, -0.5f, -0.5f}, {0.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }, - { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, 0.0f, -1.0f} }, - - // Third face (PX) - // First triangle - { {+0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {+1.0f, 0.0f, 0.0f} }, - { {+0.5f, +0.5f, -0.5f}, {1.0f, 0.0f}, {+1.0f, 0.0f, 0.0f} }, - { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {+1.0f, 0.0f, 0.0f} }, - // Second triangle - { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {+1.0f, 0.0f, 0.0f} }, - { {+0.5f, -0.5f, +0.5f}, {0.0f, 1.0f}, {+1.0f, 0.0f, 0.0f} }, - { {+0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {+1.0f, 0.0f, 0.0f} }, - - // Fourth face (MX) - // First triangle - { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, - { {-0.5f, -0.5f, +0.5f}, {1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, - { {-0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, - // Second triangle - { {-0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, - { {-0.5f, +0.5f, -0.5f}, {0.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, - { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, - - // Fifth face (PY) - // First triangle - { {-0.5f, +0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, +1.0f, 0.0f} }, - { {-0.5f, +0.5f, +0.5f}, {1.0f, 0.0f}, {0.0f, +1.0f, 0.0f} }, - { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, +1.0f, 0.0f} }, - // Second triangle - { {+0.5f, +0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, +1.0f, 0.0f} }, - { {+0.5f, +0.5f, -0.5f}, {0.0f, 1.0f}, {0.0f, +1.0f, 0.0f} }, - { {-0.5f, +0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, +1.0f, 0.0f} }, - - // Sixth face (MY) - // First triangle - { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, -1.0f, 0.0f} }, - { {+0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, {0.0f, -1.0f, 0.0f} }, - { {+0.5f, -0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, -1.0f, 0.0f} }, - // Second triangle - { {+0.5f, -0.5f, +0.5f}, {1.0f, 1.0f}, {0.0f, -1.0f, 0.0f} }, - { {-0.5f, -0.5f, +0.5f}, {0.0f, 1.0f}, {0.0f, -1.0f, 0.0f} }, - { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, {0.0f, -1.0f, 0.0f} }, -}; - -#define vertex_list_count (sizeof(vertex_list)/sizeof(vertex_list[0])) - -#define DISPLAY_TRANSFER_FLAGS \ - (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ - GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ - GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) - +// #ifdef _3DS -#define TEXTURE_TRANSFER_FLAGS (GX_TRANSFER_FLIP_VERT(1) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_RAW_COPY(0) | GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | \ - GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)) - - -void _set_uniform(int uniform_location, const Matrix32& p_transform) +#include "rasterizer_3ds.h" +#include "globals.h" +#include "os/os.h" +#include <3ds/services/gspgpu.h> +// #include "util.h" +#define TEX_MIN_SIZE 8 +u32 next_pow2(u32 v) { - const Matrix32& tr = p_transform; - - C3D_Mtx mtx; - - float matrix[16] = { /* build a 16x16 matrix */ - tr.elements[2][0], 0, tr.elements[1][0], tr.elements[0][0], - tr.elements[2][1], 0, tr.elements[1][1], tr.elements[0][1], - 0, 1, 0, 0, - 1, 0, 0, 0, - }; - - memcpy(mtx.m, matrix, sizeof(matrix)); - C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v >= TEX_MIN_SIZE ? v : TEX_MIN_SIZE; +} + +// Grabbed from Citra Emulator (citra/src/video_core/utils.h) +static inline u32 morton_interleave(u32 x, u32 y) +{ + u32 i = (x & 7) | ((y & 7) << 8); // ---- -210 + i = (i ^ (i << 2)) & 0x1313; // ---2 --10 + i = (i ^ (i << 1)) & 0x1515; // ---2 -1-0 + i = (i | ( i >> 7)) & 0x3F; + return i; } -void _set_uniform(int uniform_location, const CameraMatrix& p_matrix) +//Grabbed from Citra Emulator (citra/src/video_core/utils.h) +static inline u32 get_morton_offset(u32 x, u32 y, u32 bytes_per_pixel) { - // Swap X/Y axis due to 3DS screens being sideways - // and adjust clipping range from [-1, 1] to [-1, 0] - float m[16] = { - 0, -1, 0, 0, - 1, 0, 0, 0, - 0, 0, 0.5, 0, - 0, 0, -0.5, 1, - }; - - CameraMatrix p = *reinterpret_cast(m) * p_matrix; - - C3D_Mtx mtx; - float *to = mtx.m; - const float *from = reinterpret_cast(p.matrix); + u32 i = morton_interleave(x, y); + unsigned int offset = (x & ~7) * 8; + return (i + offset) * bytes_per_pixel; +} - - to[0] = from[12]; - to[1] = from[8]; - to[2] = from[4]; - to[3] = from[0]; - to[4] = from[13]; - to[5] = from[9]; - to[6] = from[5]; - to[7] = from[1]; - to[8] = from[14]; - to[9] = from[10]; - to[10] = from[6]; - to[11] = from[2]; - to[12] = from[15]; - to[13] = from[11]; - to[14] = from[7]; - to[15] = from[3]; - +void texture_tile_sw(C3D_Tex *tex, const void *data, int w, int h) +{ + const u32* src = reinterpret_cast(data); + u32* dest = reinterpret_cast(tex->data); + for (int y = 0; y < h; y++) + for (int x = 0; x < w; x++) + { + int dest_y = (tex->height - 1 - y); + u32 coarse_y = dest_y & ~7; + u32 dst_offset = get_morton_offset(x, dest_y, 1) + coarse_y * tex->width; - C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); + u32 v = src[x + y * w]; + dest[dst_offset] = __builtin_bswap32(v); + } + + C3D_TexFlush(tex); } -/* TEXTURE API */ +// Minimum texture dimension seems to be 64 pixels +void texture_tile_hw(C3D_Tex *tex, const void *data, int w, int h) +{ + const u32 flags = (GX_TRANSFER_FLIP_VERT(1) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_RAW_COPY(0) | + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGBA8) | + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO)); + + GSPGPU_FlushDataCache(data, w*h*4); + + GX_DisplayTransfer( + (u32*)data, + GX_BUFFER_DIM(w, h), + (u32*)tex->data, + GX_BUFFER_DIM(tex->width, tex->height), + flags + ); + + gspWaitForPPF(); + C3D_TexFlush(tex); +} +// Built-in shaders generated in byte array headers +#include "shaders/2d.h" +#include "shaders/3d.h" +#define CLEAR_COLOR 0x68B0D8FF +#define DISPLAY_TRANSFER_FLAGS \ + (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ + GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ + GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_XY)) + +/* TEXTURE API */ -RID Rasterizer3DS::texture_create() { +// #define print(...) printf(__VA_ARGS__) +#define print(...) +RID Rasterizer3DS::texture_create() +{ Texture *texture = memnew(Texture); ERR_FAIL_COND_V(!texture,RID()); return texture_owner.make_rid( texture ); - } -void Rasterizer3DS::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { - - +void Rasterizer3DS::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) +{ + u32 w = next_pow2(p_width); + u32 h = next_pow2(p_height); +// print("texture_allocate %u %u %u\n", w, h, p_texture.get_id()); Texture *texture = texture_owner.get( p_texture ); ERR_FAIL_COND(!texture); - C3D_TexInit(&texture->texture, p_width, p_height, GPU_RGBA8); + ERR_FAIL_COND(w > 1024 || h > 1024); + ERR_FAIL_COND(!C3D_TexInit(&texture->tex, w, h, GPU_RGBA8)); texture->width=p_width; texture->height=p_height; texture->format=p_format; texture->flags=p_flags; } -void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { - +void Rasterizer3DS::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) +{ Texture * texture = texture_owner.get(p_texture); - ERR_FAIL_COND(!texture); ERR_FAIL_COND(texture->format != p_image.get_format() ); - texture->image[p_cube_side]=p_image; - - DVector d = p_image.get_data(); - const u32* buffer = reinterpret_cast(d.read().ptr()); - u8 * gpuBuffer = (u8 *)linearAlloc(texture->width * texture->height * 4); - - u32 * src = (u32 *)buffer; - u32 * dst = (u32 *)gpuBuffer; - - for (unsigned y = 0; y < texture->height; y++) - { - for (unsigned x = 0; x < texture->width; x++) - { - u32 clr = *src; - *dst = __builtin_bswap32(clr); - } - dst += 4; - } + Image &image = texture->image[p_cube_side]; + image = p_image; + image.convert(Image::FORMAT_RGBA); + ERR_FAIL_COND(image.get_format() != Image::FORMAT_RGBA); - GSPGPU_FlushDataCache((u32 *)gpuBuffer, texture->width * texture->height * 4); + DVector d = image.get_data(); + const u32* imagedata = reinterpret_cast(d.read().ptr()); - C3D_SyncDisplayTransfer((u32 *)gpuBuffer, GX_BUFFER_DIM(texture->width, texture->height), (u32 *)texture->texture.data, GX_BUFFER_DIM(texture->width, texture->height), TEXTURE_TRANSFER_FLAGS); + texture_tile_sw(&texture->tex, imagedata, texture->width, texture->height); - // gspWaitForPPF(); - C3D_TexSetFilter(&texture->texture, GPU_LINEAR, GPU_NEAREST); - C3D_TexBind(0, &texture->texture); - - linearFree(gpuBuffer); +// texture->image[p_cube_side]=image; } -Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { - +Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const +{ + print("texture_get_data\n"); Texture * texture = texture_owner.get(p_texture); ERR_FAIL_COND_V(!texture,Image()); @@ -230,70 +168,55 @@ Image Rasterizer3DS::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) return texture->image[p_cube_side]; } -void Rasterizer3DS::texture_set_flags(RID p_texture,uint32_t p_flags) { - +void Rasterizer3DS::texture_set_flags(RID p_texture,uint32_t p_flags) +{ Texture *texture = texture_owner.get( p_texture ); ERR_FAIL_COND(!texture); uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; texture->flags=p_flags|cube; // can't remove a cube from being a cube - } uint32_t Rasterizer3DS::texture_get_flags(RID p_texture) const { - Texture * texture = texture_owner.get(p_texture); - ERR_FAIL_COND_V(!texture,0); - return texture->flags; - } -Image::Format Rasterizer3DS::texture_get_format(RID p_texture) const { - +Image::Format Rasterizer3DS::texture_get_format(RID p_texture) const +{ Texture * texture = texture_owner.get(p_texture); - ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); - return texture->format; } -uint32_t Rasterizer3DS::texture_get_width(RID p_texture) const { - +uint32_t Rasterizer3DS::texture_get_width(RID p_texture) const +{ Texture * texture = texture_owner.get(p_texture); - ERR_FAIL_COND_V(!texture,0); - return texture->width; } -uint32_t Rasterizer3DS::texture_get_height(RID p_texture) const { - +uint32_t Rasterizer3DS::texture_get_height(RID p_texture) const +{ Texture * texture = texture_owner.get(p_texture); - ERR_FAIL_COND_V(!texture,0); - return texture->height; } -bool Rasterizer3DS::texture_has_alpha(RID p_texture) const { - +bool Rasterizer3DS::texture_has_alpha(RID p_texture) const +{ Texture * texture = texture_owner.get(p_texture); - ERR_FAIL_COND_V(!texture,0); - return false; - } -void Rasterizer3DS::texture_set_size_override(RID p_texture,int p_width, int p_height) { - +void Rasterizer3DS::texture_set_size_override(RID p_texture,int p_width, int p_height) +{ Texture * texture = texture_owner.get(p_texture); ERR_FAIL_COND(!texture); - ERR_FAIL_COND(p_width<=0 || p_width>4096); - ERR_FAIL_COND(p_height<=0 || p_height>4096); + ERR_FAIL_COND(p_width<=0 || p_width>1024); + ERR_FAIL_COND(p_height<=0 || p_height>1024); //real texture size is in alloc width and height // texture->width=p_width; // texture->height=p_height; - } void Rasterizer3DS::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { @@ -301,123 +224,13 @@ void Rasterizer3DS::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const } -static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { - ERR_FAIL_COND(!p_vertices); - ERR_FAIL_COND(p_points <1 || p_points>4); - - // int type = prim_type[p_points - 1]; - - C3D_BufInfo* bufInfo = C3D_GetBufInfo(); - BufInfo_Init(bufInfo); - BufInfo_Add(bufInfo, p_vertices, sizeof(Vector3), 2, 0x10); - - C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); -}; - -void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { - VertexArray dscoords[4]= { - {Vector3( p_src_region.pos.x/p_tex_size.width, - p_src_region.pos.y/p_tex_size.height, 0), - Vector2( p_rect.pos.x, p_rect.pos.y )}, - - - {Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, - p_src_region.pos.y/p_tex_size.height, 0), - Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, - - {Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), - Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, - - {Vector3( p_src_region.pos.x/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), - Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} - }; - - VertexArray dscoords23[4]= { - {Vector3( 0, - 0, 0), - Vector2( p_rect.pos.x, p_rect.pos.y )}, - - - {Vector3(5, - 0, 0), - Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y )}, - - {Vector3( 0, - 5, 0), - Vector2( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height )}, - - {Vector3( 5, - 5, 0), - Vector2( p_rect.pos.x,p_rect.pos.y+p_rect.size.height )} - }; - - - if (p_flip_h) { - SWAP( dscoords[0], dscoords[1] ); - SWAP( dscoords[2], dscoords[3] ); - } - if (p_flip_v) { - SWAP( dscoords[1], dscoords[2] ); - SWAP( dscoords[0], dscoords[3] ); - } - - Vector3 coords[4]= { - - }; - - // void* vbo_data = linearAlloc(sizeof(dscoords)); - // memcpy(vbo_data, dscoords, sizeof(dscoords)); - // memcpy(vbo_data+sizeof(coords), texcoords, sizeof(texcoords)); - /* - C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); - AttrInfo_Init(attrInfo); - AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position - AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color - - C3D_BufInfo* bufInfo = C3D_GetBufInfo(); - BufInfo_Init(bufInfo); - BufInfo_Add(bufInfo, dscoords, sizeof(VertexArray), 2, 0x10); - - C3D_DrawArrays(GPU_TRIANGLE_STRIP, 0, sizeof(dscoords));*/ - - C3D_ImmDrawBegin(GPU_TRIANGLE_STRIP); - C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); // v0=position - C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y, 0.0f, 0.0f); // v1=color - - C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, p_src_region.pos.y/p_tex_size.height, 0.5f, 0.0f); - C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0.0f, 0.0f); - - C3D_ImmSendAttrib((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); - C3D_ImmSendAttrib(p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); - - C3D_ImmSendAttrib(p_src_region.pos.x/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0.5f, 0.0f); - C3D_ImmSendAttrib(p_rect.pos.x, p_rect.pos.y+p_rect.size.height, 0.0f, 0.0f); - - C3D_ImmDrawEnd(); - - - // Mtx_Identity(&modelView); - - // Mtx_Translate(&modelView, 0.0, 0.0, -2.5, true); - - // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); - - // Draw the triangle directly - - - // _draw_primitive(4,coords,0,0,texcoords); - - // linearFree(vbo_data); -} - /* SHADER API */ /* SHADER API */ -RID Rasterizer3DS::shader_create(VS::ShaderMode p_mode) { - +RID Rasterizer3DS::shader_create(VS::ShaderMode p_mode) +{ + print("shader_create\n"); Shader *shader = memnew( Shader ); shader->mode=p_mode; shader->fragment_line=0; @@ -426,7 +239,6 @@ RID Rasterizer3DS::shader_create(VS::ShaderMode p_mode) { RID rid = shader_owner.make_rid(shader); return rid; - } @@ -448,7 +260,6 @@ VS::ShaderMode Rasterizer3DS::shader_get_mode(RID p_shader) const { void Rasterizer3DS::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { - Shader *shader=shader_owner.get(p_shader); ERR_FAIL_COND(!shader); shader->fragment_code=p_fragment; @@ -492,11 +303,27 @@ void Rasterizer3DS::shader_get_param_list(RID p_shader, List *p_pa } + +void Rasterizer3DS::shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture) +{ + print("shader_set_default_texture_param\n"); +} + +RID Rasterizer3DS::shader_get_default_texture_param(RID p_shader, const StringName& p_name) const { + + return RID(); +} + +Variant Rasterizer3DS::shader_get_default_param(RID p_shader, const StringName& p_name) { + + return Variant(); +} + /* COMMON MATERIAL API */ RID Rasterizer3DS::material_create() { - + print("material_create\n"); return material_owner.make_rid( memnew( Material ) ); } @@ -515,23 +342,62 @@ RID Rasterizer3DS::material_get_shader(RID p_material) const { return material->shader; } -void Rasterizer3DS::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { - +void Rasterizer3DS::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) +{ Material *material = material_owner.get(p_material); ERR_FAIL_COND(!material); - if (p_value.get_type()==Variant::NIL) - material->shader_params.erase(p_param); - else - material->shader_params[p_param]=p_value; + Map::Element *E=material->shader_params.find(p_param); + if (E) + { + if (p_value.get_type()==Variant::NIL) { + material->shader_params.erase(E); +// material->shader_version=0; //get default! + } else { + E->get().value=p_value; + E->get().inuse=true; + } + } else { + if (p_value.get_type()==Variant::NIL) + return; + + Material::UniformData ud; + ud.index=-1; + ud.value=p_value; + ud.istexture=p_value.get_type()==Variant::_RID; /// cache it being texture + ud.inuse=true; + material->shader_params[p_param]=ud; //may be got at some point, or erased + } } -Variant Rasterizer3DS::material_get_param(RID p_material, const StringName& p_param) const { - +Variant Rasterizer3DS::material_get_param(RID p_material, const StringName& p_param) const +{ Material *material = material_owner.get(p_material); ERR_FAIL_COND_V(!material,Variant()); - if (material->shader_params.has(p_param)) - return material->shader_params[p_param]; +/* + if (material->shader.is_valid()) { + //update shader params if necesary + //make sure the shader is compiled and everything + //so the actual parameters can be properly retrieved! + material->shader_cache=shader_owner.get( material->shader ); + if (!material->shader_cache) { + //invalidate + material->shader=RID(); + material->shader_cache=NULL; + } else { + + if (material->shader_cache->dirty_list.in_list()) + _update_shader(material->shader_cache); + if (material->shader_cache->valid && material->shader_cache->version!=material->shader_version) { + //validate + _update_material_shader_params(material); + } + } + } +*/ + + if (material->shader_params.has(p_param) && material->shader_params[p_param].inuse) + return material->shader_params[p_param].value; else return Variant(); } @@ -567,16 +433,15 @@ VS::MaterialDepthDrawMode Rasterizer3DS::material_get_depth_draw_mode(RID p_mate Material *material = material_owner.get(p_material); ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); return material->depth_draw_mode; - } -void Rasterizer3DS::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { - +void Rasterizer3DS::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) +{ + print("material_set_blend_mode\n"); Material *material = material_owner.get(p_material); ERR_FAIL_COND(!material); material->blend_mode=p_mode; - } VS::MaterialBlendMode Rasterizer3DS::material_get_blend_mode(RID p_material) const { @@ -603,148 +468,604 @@ float Rasterizer3DS::material_get_line_width(RID p_material) const { /* MESH API */ -RID Rasterizer3DS::mesh_create() { - - +RID Rasterizer3DS::mesh_create() +{ + print("mesh_create\n"); return mesh_owner.make_rid( memnew( Mesh ) ); } +Error Rasterizer3DS::_surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main) { -void Rasterizer3DS::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { + uint32_t stride = p_main ? p_surface->stride : p_surface->local_stride; - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); + for(int ai=0;ai=p_arrays.size()) + break; + if (p_arrays[ai].get_type()==Variant::NIL) + continue; + Surface::ArrayData &a=p_surface->array[ai]; - ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); - ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); + switch(ai) { - Surface s; + case VS::ARRAY_VERTEX: { + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); - s.format=0; + DVector array = p_arrays[ai]; + ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - for(int i=0;i::Read read = array.read(); + const Vector3* src=read.ptr(); - s.format|=(1<array_len;i++) { + float vector[3]={ src[i].x, src[i].y, src[i].z }; + memcpy(&p_mem[a.ofs+i*stride], vector, a.size); - for(int i=0;iaabb=aabb; + p_surface->vertex_scale=scale; + } - } - } + } break; + case VS::ARRAY_NORMAL: { - ERR_FAIL_COND((s.format&VS::ARRAY_FORMAT_VERTEX)==0); // mandatory + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); - s.data=p_arrays; - s.morph_data=p_blend_shapes; - s.primitive=p_primitive; - s.alpha_sort=p_alpha_sort; - s.morph_target_count=mesh->morph_target_count; - s.morph_format=s.format; + DVector array = p_arrays[ai]; + ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - Surface *surface = memnew( Surface ); - *surface=s; + DVector::Read read = array.read(); + const Vector3* src=read.ptr(); - mesh->surfaces.push_back(surface); + // setting vertices means regenerating the AABB + for (int i=0;iarray_len;i++) { + float vector[3]={ src[i].x, src[i].y, src[i].z }; + memcpy(&p_mem[a.ofs+i*stride], vector, a.size); + } + } break; + case VS::ARRAY_TANGENT: { + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); -} + DVector array = p_arrays[ai]; + ERR_FAIL_COND_V( array.size() != p_surface->array_len*4, ERR_INVALID_PARAMETER ); + DVector::Read read = array.read(); + const real_t* src = read.ptr(); -void Rasterizer3DS::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) { + for (int i=0;iarray_len;i++) { - ERR_EXPLAIN("Dummy Rasterizer does not support custom surfaces. Running on wrong platform?"); - ERR_FAIL_V(); -} + float xyzw[4]={ + src[i*4+0], + src[i*4+1], + src[i*4+2], + src[i*4+3] + }; -Array Rasterizer3DS::mesh_get_surface_arrays(RID p_mesh,int p_surface) const { + memcpy(&p_mem[a.ofs+i*stride], xyzw, a.size); - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,Array()); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, Array() ); + } - return surface->data; + } break; + case VS::ARRAY_COLOR: { + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::COLOR_ARRAY, ERR_INVALID_PARAMETER ); -} -Array Rasterizer3DS::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ + DVector array = p_arrays[ai]; - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,Array()); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, Array() ); + ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - return surface->morph_data; + DVector::Read read = array.read(); + const Color* src = read.ptr(); + bool alpha=false; -} + for (int i=0;iarray_len;i++) { + if (src[i].a<0.98) // tolerate alpha a bit, for crappy exporters + alpha=true; -void Rasterizer3DS::mesh_set_morph_target_count(RID p_mesh,int p_amount) { + uint8_t colors[4]; - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_COND( mesh->surfaces.size()!=0 ); + for(int j=0;j<4;j++) { + colors[j]=CLAMP( int((src[i][j])*255.0), 0,255 ); + } - mesh->morph_target_count=p_amount; + memcpy(&p_mem[a.ofs+i*stride], colors, a.size); + } -} + if (p_main) + p_surface->has_alpha=alpha; -int Rasterizer3DS::mesh_get_morph_target_count(RID p_mesh) const{ + } break; + case VS::ARRAY_TEX_UV: + case VS::ARRAY_TEX_UV2: { - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY && p_arrays[ai].get_type() != Variant::VECTOR2_ARRAY, ERR_INVALID_PARAMETER ); - return mesh->morph_target_count; + DVector array = p_arrays[ai]; -} + ERR_FAIL_COND_V( array.size() != p_surface->array_len , ERR_INVALID_PARAMETER); -void Rasterizer3DS::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { + DVector::Read read = array.read(); - ERR_FAIL_INDEX(p_mode,2); - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); + const Vector2 * src=read.ptr(); + float scale=1.0; - mesh->morph_target_mode=p_mode; + for (int i=0;iarray_len;i++) { -} + float uv[2]={ src[i].x , src[i].y }; -VS::MorphTargetMode Rasterizer3DS::mesh_get_morph_target_mode(RID p_mesh) const { + memcpy(&p_mem[a.ofs+i*stride], uv, a.size); - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); + } - return mesh->morph_target_mode; + if (p_main) { + if (ai==VS::ARRAY_TEX_UV) { + p_surface->uv_scale=scale; + } + if (ai==VS::ARRAY_TEX_UV2) { + p_surface->uv2_scale=scale; + } + } -} + } break; + case VS::ARRAY_WEIGHTS: { + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); + DVector array = p_arrays[ai]; + ERR_FAIL_COND_V( array.size() != p_surface->array_len*VS::ARRAY_WEIGHTS_SIZE, ERR_INVALID_PARAMETER ); -void Rasterizer3DS::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); + DVector::Read read = array.read(); + + const real_t * src = read.ptr(); + + for (int i=0;iarray_len;i++) { + + float data[VS::ARRAY_WEIGHTS_SIZE]; + for (int j=0;j array = p_arrays[ai]; + + ERR_FAIL_COND_V( array.size() != p_surface->array_len*VS::ARRAY_WEIGHTS_SIZE, ERR_INVALID_PARAMETER ); + + + DVector::Read read = array.read(); + + const int * src = read.ptr(); + + p_surface->max_bone=0; + + for (int i=0;iarray_len;i++) { + + u8 data[VS::ARRAY_WEIGHTS_SIZE]; + for (int j=0;jmax_bone=MAX(data[j],p_surface->max_bone); + + } + + memcpy(&p_mem[a.ofs+i*stride], data, a.size); + } + + } break; + case VS::ARRAY_INDEX: { + +// ERR_FAIL_COND_V(a.size > 2, ERR_INVALID_DATA); + ERR_FAIL_COND_V( p_surface->index_array_len<=0, ERR_INVALID_DATA ); + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::INT_ARRAY, ERR_INVALID_PARAMETER ); + + DVector indices = p_arrays[ai]; + ERR_FAIL_COND_V( indices.size() == 0, ERR_INVALID_PARAMETER ); + ERR_FAIL_COND_V( indices.size() != p_surface->index_array_len, ERR_INVALID_PARAMETER ); + + /* determine wether using 8 or 16 bits indices */ + + DVector::Read read = indices.read(); + const int *src=read.ptr(); + + for (int i=0;iindex_array_len;i++) { + if (a.size==2) { + uint16_t v=src[i]; + memcpy(&p_index_mem[i*a.size], &v, a.size); + } else { + uint8_t v=src[i]; + memcpy(&p_index_mem[i*a.size], &v, a.size); + } + } + } break; + + default: { ERR_FAIL_V(ERR_INVALID_PARAMETER);} + } + + p_surface->configured_format|=(1<format&VS::ARRAY_FORMAT_BONES) { + //create AABBs for each detected bone + int total_bones = p_surface->max_bone+1; + if (p_main) { + p_surface->skeleton_bone_aabb.resize(total_bones); + p_surface->skeleton_bone_used.resize(total_bones); + for(int i=0;iskeleton_bone_used[i]=false; + } + DVector vertices = p_arrays[VS::ARRAY_VERTEX]; + DVector bones = p_arrays[VS::ARRAY_BONES]; + DVector weights = p_arrays[VS::ARRAY_WEIGHTS]; + + bool any_valid=false; + + if (vertices.size() && bones.size()==vertices.size()*4 && weights.size()==bones.size()) { + //print_line("MAKING SKELETHONG"); + int vs = vertices.size(); + DVector::Read rv =vertices.read(); + DVector::Read rb=bones.read(); + DVector::Read rw=weights.read(); + + Vector first; + first.resize(total_bones); + for(int i=0;iskeleton_bone_aabb.ptr(); + bool *fptr=first.ptr(); + bool *usedptr=p_surface->skeleton_bone_used.ptr(); + + for(int i=0;iskeleton_bone_aabb.clear(); + p_surface->skeleton_bone_used.clear(); + } + } + + return OK; +} + +void Rasterizer3DS::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) +{ + print("mesh_add_surface\n"); + ERR_FAIL_COND(p_primitive < VS::PRIMITIVE_TRIANGLES); + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); + ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); + + uint32_t format=0; + + // validation + int index_array_len=0; + int array_len=0; + + for(int i=0;imorph_target_count!=p_blend_shapes.size() ); + if (mesh->morph_target_count) { + //validate format for morphs + for(int i=0;iarray[i]; + ad.size=0; + ad.ofs=0; + int elem_size=0; + int elem_count=0; + bool valid_local=true; + bool normalize=false; + bool bind=false; + + if (!(format&(1< (1<<16)); // 32 bit index not supported + + /* determine wether using 8 or 16 bits indices */ + if (array_len > (1<<8)) { + elem_size=2; // C3D_UNSIGNED_SHORT + } else { + elem_size=1; // C3D_UNSIGNED_BYTE + } + + surface->index_array_len=index_array_len; // only way it can exist + ad.ofs=0; + ad.size=elem_size; + + continue; + } break; + default: { + ERR_FAIL( ); + } + } + + ad.ofs=total_elem_size; + ad.size=elem_size; +// ad.datatype=datatype; + ad.normalize=normalize; + ad.bind=bind; + ad.count=elem_count; + total_elem_size+=elem_size; + if (valid_local) { + surface->local_stride+=elem_size; + surface->morph_format|=(1<stride=total_elem_size; + surface->array_len=array_len; + surface->format=format; + surface->primitive=p_primitive; + surface->morph_target_count=mesh->morph_target_count; + surface->configured_format=0; + surface->mesh=mesh; +// if (keep_copies) { +// surface->data=p_arrays; +// surface->morph_data=p_blend_shapes; +// } + + surface->array_local = (u8*)linearAlloc(surface->array_len*surface->stride); +// u8 *array_ptr= (u8*)linearAlloc(surface->array_len*surface->stride); +// u8 *index_array_ptr=NULL; + +// DVector array_pre_vbo; +// DVector::Write vaw; +// DVector index_array_pre_vbo; +// DVector::Write iaw; + + /* create pointers */ +// array_pre_vbo.resize(surface->array_len*surface->stride); +// vaw = array_pre_vbo.write(); +// array_ptr=vaw.ptr(); + + if (surface->index_array_len) + { +// index_array_pre_vbo.resize(surface->index_array_len*surface->array[VS::ARRAY_INDEX].size); +// iaw = index_array_pre_vbo.write(); +// index_array_ptr=iaw.ptr(); + surface->index_array_local = (u8*) linearAlloc(surface->index_array_len*surface->array[VS::ARRAY_INDEX].size); +// index_array_ptr = (u8*) linearAlloc(surface->index_array_len*surface->array[VS::ARRAY_INDEX].size); + } + + _surface_set_arrays(surface,surface->array_local,surface->index_array_local,p_arrays,true); + + /* create buffers!! */ + + +// glGenBuffers(1,&surface->vertex_id); +// ERR_FAIL_COND(surface->vertex_id==0); +// glBindBuffer(GL_ARRAY_BUFFER,surface->vertex_id); +// glBufferData(GL_ARRAY_BUFFER,surface->array_len*surface->stride,array_ptr,GL_STATIC_DRAW); +// glBindBuffer(GL_ARRAY_BUFFER,0); //unbind +// if (surface->index_array_len) { +// +// glGenBuffers(1,&surface->index_id); +// ERR_FAIL_COND(surface->index_id==0); +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id); +// glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_len*surface->array[VS::ARRAY_INDEX].size,index_array_ptr,GL_STATIC_DRAW); +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind +// +// } + + mesh->surfaces.push_back(surface); +} + +void Rasterizer3DS::mesh_add_custom_surface(RID p_mesh,const Variant& p_dat) +{ + ERR_EXPLAIN("Rasterizer does not support custom surfaces. Running on wrong platform?"); + ERR_FAIL_V(); +} + +Array Rasterizer3DS::mesh_get_surface_arrays(RID p_mesh,int p_surface) const +{ + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->data; +} +Array Rasterizer3DS::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const +{ + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->morph_data; +} + + +void Rasterizer3DS::mesh_set_morph_target_count(RID p_mesh,int p_amount) +{ + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_COND( mesh->surfaces.size()!=0 ); + + mesh->morph_target_count=p_amount; +} + +int Rasterizer3DS::mesh_get_morph_target_count(RID p_mesh) const +{ + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->morph_target_count; +} + +void Rasterizer3DS::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) +{ + ERR_FAIL_INDEX(p_mode,2); + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->morph_target_mode=p_mode; +} + +VS::MorphTargetMode Rasterizer3DS::mesh_get_morph_target_mode(RID p_mesh) const +{ + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); + + return mesh->morph_target_mode; +} + + + +void Rasterizer3DS::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) +{ + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); Surface *surface = mesh->surfaces[p_surface]; ERR_FAIL_COND( !surface); @@ -864,13 +1185,13 @@ AABB Rasterizer3DS::mesh_get_custom_aabb(RID p_mesh) const { ERR_FAIL_COND_V(!mesh,AABB()); return mesh->custom_aabb; - } /* MULTIMESH API */ -RID Rasterizer3DS::multimesh_create() { - +RID Rasterizer3DS::multimesh_create() +{ + print("multimesh_create\n"); return multimesh_owner.make_rid( memnew( MultiMesh )); } @@ -881,7 +1202,6 @@ void Rasterizer3DS::multimesh_set_instance_count(RID p_multimesh,int p_count) { multimesh->elements.clear(); // make sure to delete everything, so it "fails" in all implementations multimesh->elements.resize(p_count); - } int Rasterizer3DS::multimesh_get_instance_count(RID p_multimesh) const { @@ -977,14 +1297,15 @@ int Rasterizer3DS::multimesh_get_visible_instances(RID p_multimesh) const { RID Rasterizer3DS::immediate_create() { + print("immediate_create\n"); Immediate *im = memnew( Immediate ); return immediate_owner.make_rid(im); } -void Rasterizer3DS::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture){ - - +void Rasterizer3DS::immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture) +{ + print("immediate_begin\n"); } void Rasterizer3DS::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ @@ -1013,7 +1334,7 @@ void Rasterizer3DS::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ void Rasterizer3DS::immediate_end(RID p_immediate){ - + print("immediate_end\n"); } void Rasterizer3DS::immediate_clear(RID p_immediate) { @@ -1043,20 +1364,19 @@ RID Rasterizer3DS::immediate_get_material(RID p_immediate) const { /* PARTICLES API */ -RID Rasterizer3DS::particles_create() { - +RID Rasterizer3DS::particles_create() +{ Particles *particles = memnew( Particles ); ERR_FAIL_COND_V(!particles,RID()); return particles_owner.make_rid(particles); } -void Rasterizer3DS::particles_set_amount(RID p_particles, int p_amount) { - +void Rasterizer3DS::particles_set_amount(RID p_particles, int p_amount) +{ ERR_FAIL_COND(p_amount<1); Particles* particles = particles_owner.get( p_particles ); ERR_FAIL_COND(!particles); particles->data.amount=p_amount; - } int Rasterizer3DS::particles_get_amount(RID p_particles) const { @@ -1410,7 +1730,7 @@ Transform Rasterizer3DS::skeleton_bone_get_transform(RID p_skeleton,int p_bone) /* LIGHT API */ RID Rasterizer3DS::light_create(VS::LightType p_type) { - + print("light_create\n"); Light *light = memnew( Light ); light->type=p_type; return light_owner.make_rid(light); @@ -1424,7 +1744,6 @@ VS::LightType Rasterizer3DS::light_get_type(RID p_light) const { } void Rasterizer3DS::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { - Light *light = light_owner.get(p_light); ERR_FAIL_COND(!light); ERR_FAIL_INDEX( p_type, 3 ); @@ -1580,7 +1899,6 @@ RID Rasterizer3DS::light_instance_create(RID p_light) { light_instance->light=p_light; light_instance->base=light; - return light_instance_owner.make_rid( light_instance ); } void Rasterizer3DS::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { @@ -1588,7 +1906,6 @@ void Rasterizer3DS::light_instance_set_transform(RID p_light_instance,const Tran LightInstance *lighti = light_instance_owner.get( p_light_instance ); ERR_FAIL_COND(!lighti); lighti->transform=p_transform; - } bool Rasterizer3DS::light_instance_has_shadow(RID p_light_instance) const { @@ -1690,35 +2007,63 @@ void Rasterizer3DS::particles_instance_set_transform(RID p_particles_instance,co /* all calls (inside begin/end shadow) are always warranted to be in the following order: */ -RID Rasterizer3DS::viewport_data_create() { - +RID Rasterizer3DS::viewport_data_create() +{ + print("viewport_data_create\n"); return RID(); } -RID Rasterizer3DS::render_target_create(){ - - return RID(); - +RID Rasterizer3DS::render_target_create() +{ + print("render_target_create\n"); + RenderTarget* rt = memnew(RenderTarget); + Texture *texture = memnew(Texture); + + rt->target = C3D_RenderTargetCreate(480, 800, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + C3D_RenderTargetSetOutput(rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + C3D_RenderTargetClear(rt->target,C3D_CLEAR_ALL,CLEAR_COLOR,0); + rt->texture_ptr = texture; + rt->texture = texture_owner.make_rid( texture ); + + return render_target_owner.make_rid( rt ); } -void Rasterizer3DS::render_target_set_size(RID p_render_target, int p_width, int p_height){ - - +void Rasterizer3DS::render_target_set_size(RID p_render_target, int p_width, int p_height) +{ + RenderTarget* rt = render_target_owner.get( p_render_target ); + } -RID Rasterizer3DS::render_target_get_texture(RID p_render_target) const{ - - return RID(); - +RID Rasterizer3DS::render_target_get_texture(RID p_render_target) const +{ + print("render_target_get_texture\n"); + const RenderTarget *rt = render_target_owner.get(p_render_target); + ERR_FAIL_COND_V(!rt,RID()); + return rt->texture; } -bool Rasterizer3DS::render_target_renedered_in_frame(RID p_render_target){ - +bool Rasterizer3DS::render_target_renedered_in_frame(RID p_render_target) +{ + RenderTarget *rt = render_target_owner.get(p_render_target); + ERR_FAIL_COND_V(!rt,false); +// return rt->last_pass==frame; return false; } -void Rasterizer3DS::begin_frame() { - C3D_FrameBegin(C3D_FRAME_SYNCDRAW); - C3D_RenderTargetClear(top_rt->target, C3D_CLEAR_ALL, clear_color_top, 0); - C3D_FrameDrawOn(top_rt->target); +void Rasterizer3DS::begin_frame() +{ + print("begin_frame\n"); + draw_next_frame = false; + + float time = (OS::get_singleton()->get_ticks_usec()/1000); // get msec + time/=1000.0; // make secs + if (frame != 0) { + time_delta = time_scale * (time - last_time); + } else { + time_delta = 0.0f; + } + scaled_time += time_delta; + last_time=time; + frame++; + C3D_FrameBegin(0); } void Rasterizer3DS::capture_viewport(Image* r_capture) { @@ -1727,227 +2072,1069 @@ void Rasterizer3DS::capture_viewport(Image* r_capture) { } -void Rasterizer3DS::clear_viewport(const Color& p_color) { - - clear_color_top = convert_color(&p_color); +void Rasterizer3DS::clear_viewport(const Color& p_color) +{ + print("clear_viewport\n"); + RenderTarget* rt = current_rt ? current_rt : base_framebuffer; + u32 c = (u8)(p_color.r*255); + c <<= 8; + c |= (u8)(p_color.g*255); + c <<= 8; + c |= (u8)(p_color.b*255); + c <<= 8; + c |= (u8)(p_color.a*255); + C3D_RenderTargetClear(rt->target,C3D_CLEAR_ALL,c,0); }; -void Rasterizer3DS::set_viewport(const VS::ViewportRect& p_viewport) { - - - +void Rasterizer3DS::set_viewport(const VS::ViewportRect& p_viewport) +{ + print("set_viewport %d %d %d %d\n", p_viewport.x, p_viewport.y, p_viewport.width, p_viewport.height); + u32 top = p_viewport.height - p_viewport.y; + //C3D_SetViewport(top, p_viewport.x, p_viewport.height, p_viewport.width); + C3D_SetViewport(0, 0, p_viewport.height, p_viewport.width); } -void Rasterizer3DS::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { - - +void Rasterizer3DS::set_time_scale(float p_scale) +{ + time_scale = p_scale; +} +void Rasterizer3DS::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) +{ + print("set_render_target\n"); + current_rt_vflip=p_vflip; + + if (p_render_target.is_valid()) + { + RenderTarget *rt = render_target_owner.get(p_render_target); + ERR_FAIL_COND(!rt); + ERR_FAIL_COND(!rt->target); + //C3D_RenderTargetSetOutput(rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + C3D_SetFrameBuf(&rt->target->frameBuf); + //C3D_RenderBufBind(&rt->target->renderBuf); + current_rt=rt; + current_rt_transparent=p_transparent_bg; + } + else + { + print("null target\n"); + current_rt = NULL; + current_rt_transparent = false; + C3D_SetFrameBuf(&base_framebuffer->target->frameBuf); + //C3D_RenderTargetSetOutput(base_framebuffer->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + //C3D_RenderBufBind(&base_framebuffer->target->renderBuf); + } } -void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { +void Rasterizer3DS::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) +{ + print("begin_scene\n"); + opaque_render_list.clear(); + alpha_render_list.clear(); + + RenderTarget* rt = current_rt ? current_rt : base_framebuffer; + + current_env = p_env.is_valid() ? environment_owner.get(p_env) : NULL; +// current_vd=viewport_data_owner.get(p_viewport_data); + C3D_TexEnv* env = C3D_GetTexEnv(0); - C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR, (GPU_TEVSRC)0); - // C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); C3D_TexBind(0, NULL); - // C3D_BindProgram(&program); - _set_uniform(uLoc_modelView, Matrix32()); + C3D_BindProgram(&scene_shader->program); + _set_uniform(scene_shader->location_modelview, Matrix32()); + _set_uniform(scene_shader->location_extra, Matrix32()); }; void Rasterizer3DS::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { } -void Rasterizer3DS::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { +void Rasterizer3DS::set_camera(const Transform& p_world, const CameraMatrix& p_projection) +{ + + + print("set_camera\n"); + camera_transform=p_world; +// if (current_rt && current_rt_vflip) { + if (current_rt_vflip) { +// m[4] = -1; +// camera_transform.basis.set_axis(1,-camera_transform.basis.get_axis(1)); + } +// camera_transform.basis.set_axis(0,-camera_transform.basis.get_axis(0)); + + camera_transform_inverse=camera_transform.inverse(); + camera_projection = p_projection; +// camera_projection.get_fov() +// camera_projection=*reinterpret_cast(m) * p_projection; +// camera_projection = camera_projection * m; +// camera_projection.invert(); + camera_plane = Plane( camera_transform.origin, -camera_transform.basis.get_axis(2) ); + camera_z_near=camera_projection.get_z_near(); + camera_z_far=camera_projection.get_z_far(); + camera_projection.get_viewport_size(camera_vp_size.x,camera_vp_size.y); + // camera_ortho=p_ortho_hint; + + print("z-near:%f z-far:%f\n", camera_z_near, camera_z_far); + print("x:%f y:%f\n", camera_vp_size.x,camera_vp_size.y); + +// for (int i = 0; i < 4; ++i) +// print("%f %f %f %f\n", m[i*4], m[i*4+1], m[i*4+2], m[i*4+3]); - // _set_uniform(uLoc_projection, p_projection); + _set_uniform(scene_shader->location_modelview, Matrix32()); +// _set_uniform(scene_shader->location_worldTransform, Matrix32()); + _set_uniform(scene_shader->location_worldTransform, camera_transform_inverse); + _set_uniform(scene_shader->location_projection, camera_projection); + +// C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, scene_shader->location_projection, &mtx); } -void Rasterizer3DS::add_light( RID p_light_instance ) { - +void Rasterizer3DS::add_light( RID p_light_instance ) +{ + // ERR_FAIL_COND( light_instance_count >= MAX_SCENE_LIGHTS ); + LightInstance *li = light_instance_owner.get(p_light_instance); + ERR_FAIL_COND(!li); + // light_instances[light_instance_count++]=li; + C3D_LightInit(&li->base->light, &lightEnv); } - +void Rasterizer3DS::add_immediate( const RID& p_immediate, const InstanceData *p_data) +{ + print("add_immediate\n"); +} void Rasterizer3DS::add_mesh( const RID& p_mesh, const InstanceData *p_data) { + Mesh *mesh = mesh_owner.get(p_mesh); + ERR_FAIL_COND(!mesh); -} - -void Rasterizer3DS::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ + int ssize = mesh->surfaces.size(); + for (int i=0;isurfaces[i]; + _add_geometry(s,p_data,s,NULL); + } + mesh->last_pass=frame; } -void Rasterizer3DS::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ - +void Rasterizer3DS::add_multimesh( const RID& p_multimesh, const InstanceData *p_data) +{ + print("add_multimesh\n"); +} +void Rasterizer3DS::add_particles( const RID& p_particle_instance, const InstanceData *p_data) +{ + ParticlesInstance *particles_instance = particles_instance_owner.get(p_particle_instance); + ERR_FAIL_COND(!particles_instance); + Particles *p=particles_owner.get( particles_instance->particles ); + ERR_FAIL_COND(!p); + _add_geometry(p, p_data, p, particles_instance); +// draw_next_frame=true; } -void Rasterizer3DS::end_scene() { - // C3D_Flush(); - +void Rasterizer3DS::end_scene() +{ + print("end_scene\n"); + +// opaque_render_list.sort_mat_light_type_flags(); + _render_list_forward(&opaque_render_list, camera_transform, camera_transform_inverse,camera_projection,false,fragment_lighting); + +// alpha_render_list.sort_z(); +// _render_list_forward(&alpha_render_list, camera_transform, camera_transform_inverse,camera_projection,false,fragment_lighting,true); + } void Rasterizer3DS::end_shadow_map() { } -void Rasterizer3DS::end_frame() { - - C3D_FrameEnd(0); - C3D_FrameBufTransfer(&top_rt->target->frameBuf, top_rt->target->screen, top_rt->target->side, top_rt->target->transferFlags); - gfxSwapBuffersGpu(); -} - -/* CANVAS API */ - - -void Rasterizer3DS::canvas_begin() { - // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); - +void Rasterizer3DS::end_frame() +{ + C3D_FrameEnd(GX_CMDLIST_UPDATE_GAS_ACC); - Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + print("end_frame %d %f\n", vertexArrays.size(), C3D_GetCmdBufUsage()); - // C3D_BindProgram(&program); + RenderTarget* rt = current_rt ? current_rt : base_framebuffer; + C3D_FrameBufTransfer(&rt->target->frameBuf,rt->target->screen,rt->target->side,rt->target->transferFlags); + VertexArray **varray = vertexArrays.ptr(); + for (int i = 0; i < vertexArrays.size(); ++i) + memdelete(*varray++); + vertexArrays.clear(); - C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); - /* - C3D_ImmDrawBegin(GPU_TRIANGLES); - C3D_ImmSendAttrib(200.0f, 200.0f, 0.5f, 0.0f); // v0=position - C3D_ImmSendAttrib(1.0f, 0.0f, 0.0f, 1.0f); // v1=color - - C3D_ImmSendAttrib(100.0f, 40.0f, 0.5f, 0.0f); - C3D_ImmSendAttrib(1.0f, 1.0f, 0.0f, 1.0f); + // OS::get_singleton()->swap_buffers(); + gfxSwapBuffersGpu(); + // if (use_vsync) + gspWaitForVBlank(); +} - C3D_ImmSendAttrib(300.0f, 40.0f, 0.5f, 0.0f); - C3D_ImmSendAttrib(0.0f, 0.0f, 1.0f, 1.0f); - C3D_ImmDrawEnd();*/ +void Rasterizer3DS::flush_frame() +{ } -void Rasterizer3DS::canvas_disable_blending() { - +RID Rasterizer3DS::canvas_light_occluder_create() +{ + CanvasOccluder *co = memnew( CanvasOccluder ); + co->index_id=0; + co->vertex_id=0; + co->len=0; + return canvas_occluder_owner.make_rid(co); } -void Rasterizer3DS::canvas_set_opacity(float p_opacity) { +void Rasterizer3DS::canvas_light_occluder_set_polylines(RID p_occluder, const DVector& p_lines) +{ + CanvasOccluder *co = canvas_occluder_owner.get(p_occluder); + ERR_FAIL_COND(!co); + return; + co->lines=p_lines; -} + if (p_lines.size()!=co->len) { -void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { +// if (co->index_id) +// glDeleteBuffers(1,&co->index_id); +// if (co->vertex_id) +// glDeleteBuffers(1,&co->vertex_id); + co->index_id=0; + co->vertex_id=0; + co->len=0; -} + } + + if (p_lines.size()) { + + + + DVector geometry; + DVector indices; + int lc = p_lines.size(); + + geometry.resize(lc*6); + indices.resize(lc*3); + + DVector::Write vw=geometry.write(); + DVector::Write iw=indices.write(); + + + DVector::Read lr=p_lines.read(); + + const int POLY_HEIGHT = 16384; + + for(int i=0;ivertex_id) { +// glGenBuffers(1,&co->vertex_id); +// glBindBuffer(GL_ARRAY_BUFFER,co->vertex_id); +// glBufferData(GL_ARRAY_BUFFER,lc*6*sizeof(real_t),vw.ptr(),GL_STATIC_DRAW); + } else { + +// glBindBuffer(GL_ARRAY_BUFFER,co->vertex_id); +// glBufferSubData(GL_ARRAY_BUFFER,0,lc*6*sizeof(real_t),vw.ptr()); + + } + +// glBindBuffer(GL_ARRAY_BUFFER,0); //unbind + if (!co->index_id) { -void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) { - // _set_uniform(uLoc_modelView, p_transform); +// glGenBuffers(1,&co->index_id); +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,co->index_id); +// glBufferData(GL_ELEMENT_ARRAY_BUFFER,lc*3*sizeof(uint16_t),iw.ptr(),GL_STATIC_DRAW); + } else { + + +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,co->index_id); +// glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,0,lc*3*sizeof(uint16_t),iw.ptr()); + } + +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind + + co->len=lc; + } } -void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { +RID Rasterizer3DS::canvas_light_shadow_buffer_create(int p_width) +{ + return RID(); + CanvasLightShadow *cls = memnew( CanvasLightShadow ); + if (p_width>1024) + p_width=1024; + + cls->size=p_width; + cls->height=16; + +/* + glActiveTexture(GL_TEXTURE0); + + glGenFramebuffers(1, &cls->fbo); + glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo); + + // Create a render buffer + glGenRenderbuffers(1, &cls->rbo); + glBindRenderbuffer(GL_RENDERBUFFER, cls->rbo); + + // Create a texture for storing the depth + glGenTextures(1, &cls->depth); + glBindTexture(GL_TEXTURE_2D, cls->depth); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // Remove artifact on the edges of the shadowmap + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +*/ + cls->renderTarget = C3D_RenderTargetCreate(480, 800, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + C3D_RenderTargetSetOutput(cls->renderTarget, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + C3D_RenderTargetClear(cls->renderTarget,C3D_CLEAR_ALL,C3D_CLEAR_COLOR,0); + +// ERR_FAIL_COND(!C3D_TexInit(&cls->texture, w, h, GPU_RGBA8)); + + +/* + //print_line("ERROR? "+itos(glGetError())); + if ( read_depth_supported ) { + + // We'll use a depth texture to store the depths in the shadow map + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, cls->size, cls->height, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + +#ifdef GLEW_ENABLED + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +#endif + + // Attach the depth texture to FBO depth attachment point + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_TEXTURE_2D, cls->depth, 0); +#ifdef GLEW_ENABLED + glDrawBuffer(GL_NONE); +#endif + } else { + // We'll use a RGBA texture into which we pack the depth info + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cls->size, cls->height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + // Attach the RGBA texture to FBO color attachment point + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, cls->depth, 0); + cls->rgba=cls->depth; + + // Allocate 16-bit depth buffer + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, cls->size, cls->height); + + // Attach the render buffer as depth buffer - will be ignored + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, cls->rbo); + } + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + //printf("errnum: %x\n",status); +#ifdef GLEW_ENABLED + if (read_depth_supported) { + //glDrawBuffer(GL_BACK); + } +#endif + glBindFramebuffer(GL_FRAMEBUFFER, base_framebuffer); + DEBUG_TEST_ERROR("2D Shadow Buffer Init"); + ERR_FAIL_COND_V( status != GL_FRAMEBUFFER_COMPLETE, RID() ); + +#ifdef GLEW_ENABLED + if (read_depth_supported) { + //glDrawBuffer(GL_BACK); + } +#endif +*/ + return canvas_light_shadow_owner.make_rid(cls); } -void Rasterizer3DS::canvas_end_rect() { +/* CANVAS API */ + + +void Rasterizer3DS::begin_canvas_bg() +{ + print("begin_canvas_bg\n"); +} +void Rasterizer3DS::canvas_begin() +{ + print("canvas_begin"); + + C3D_Mtx projection; + Mtx_OrthoTilt(&projection, 0.0, 800.0, 480.0, 0.0, 0.0, 1.0, true); + + C3D_BindProgram(&canvas_shader->program); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, canvas_shader->location_projection, &projection); + + _set_uniform(canvas_shader->location_modelview, Matrix32()); + _set_uniform(canvas_shader->location_extra, Matrix32()); + + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=texcoord + AttrInfo_AddFixed(attrInfo, 2); // v2=color + + canvas_opacity = 1.0; + + canvas_blend_mode = VS::MATERIAL_BLEND_MODE_MIX; + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA); + + print(" %f\n", C3D_GetCmdBufUsage()); +} +void Rasterizer3DS::canvas_disable_blending() +{ + print("canvas_disable_blending\n"); + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA); +} + +void Rasterizer3DS::canvas_set_opacity(float p_opacity) +{ + canvas_opacity = p_opacity; } -void Rasterizer3DS::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { +void Rasterizer3DS::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) +{ + if (p_mode==canvas_blend_mode) + return; + + switch(p_mode) + { + case VS::MATERIAL_BLEND_MODE_MIX: { + if (current_rt && current_rt_transparent) { + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + } + else { + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA); + } + + } break; + case VS::MATERIAL_BLEND_MODE_ADD: { + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE, GPU_SRC_ALPHA, GPU_ONE); + } break; + case VS::MATERIAL_BLEND_MODE_SUB: { + C3D_AlphaBlend(GPU_BLEND_REVERSE_SUBTRACT, GPU_BLEND_REVERSE_SUBTRACT, GPU_SRC_ALPHA, GPU_ONE, GPU_SRC_ALPHA, GPU_ONE); + } break; + case VS::MATERIAL_BLEND_MODE_MUL: { + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_DST_COLOR, GPU_ZERO, GPU_DST_COLOR, GPU_ZERO); + } break; + case VS::MATERIAL_BLEND_MODE_PREMULT_ALPHA: { + C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + } break; + } + canvas_blend_mode=p_mode; } -void Rasterizer3DS::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { +void Rasterizer3DS::canvas_begin_rect(const Matrix32& p_transform) +{ + _set_uniform(canvas_shader->location_modelview, p_transform); + _set_uniform(canvas_shader->location_extra, Matrix32()); +// canvas_transform = p_transform; +} +void Rasterizer3DS::canvas_set_clip(bool p_clip, const Rect2& p_rect) { - // _set_glcoloro( p_modulate,canvas_opacity ); - if ( p_texture.is_valid() ) { - // sceGuEnable(GU_TEXTURE_2D); - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - // glActiveTexture(GL_TEXTURE0); - // glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - C3D_TexEnv* env = C3D_GetTexEnv(0); - C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR); - C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); - C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); - C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); +} - C3D_TexBind(0, &texture->texture); +void Rasterizer3DS::canvas_end_rect() +{ + print("canvas_end_rect\n"); +} - if (!(p_flags&CANVAS_RECT_REGION)) { +void Rasterizer3DS::canvas_draw_line(const Point2& p_from, const Point2& p_to, const Color& p_color, float p_width) +{ + print("canvas_draw_line\n"); +} - Rect2 region = Rect2(0,0,texture->width,texture->height); +void Rasterizer3DS::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) +{ +// print("canvas_draw_rect %.1f %.1f %.1f %.1f\n", p_rect.pos.x, p_rect.pos.y, p_rect.size.width, p_rect.size.height); + + // Set the fixed attribute (color) + C3D_FixedAttribSet(2, p_modulate.r, p_modulate.g, p_modulate.b, p_modulate.a * canvas_opacity); +// C3D_FixedAttribSet(2, 1.f, 1.f, 1.f, 1.f); + C3D_TexEnv* env = C3D_GetTexEnv(0); + + + if (p_texture.is_valid()) + { + Texture* texture = texture_owner.get(p_texture); +// ERR_FAIL_COND(!texture); + + if (p_flags & CANVAS_RECT_TILE && !(texture->flags & VS::TEXTURE_FLAG_REPEAT)) + { + + } + + C3D_TexBind(0, &texture->tex); + + C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0, GPU_PRIMARY_COLOR); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_MODULATE); + + if (!(p_flags&CANVAS_RECT_REGION)) { +// // + Rect2 region = Rect2(0,0,texture->tex.width,texture->tex.height); _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); } else { - - _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); + _draw_textured_quad(p_rect, p_source, Size2(texture->tex.width,texture->tex.height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); } + } + else + { + C3D_TexBind(0, NULL); - } else { - - WARN_PRINT("p_texture is not valid"); + C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); + + _draw_quad(p_rect); + } +} +void Rasterizer3DS::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) +{ + print("canvas_draw_style_box\n"); + +// Color m = p_modulate; +// m.a*=canvas_opacity; +// _set_color_attrib(m); + C3D_FixedAttribSet(2, p_modulate.r, p_modulate.g, p_modulate.b, p_modulate.a * canvas_opacity); - // sceGuDisable(GU_TEXTURE_2D); - // _draw_quad( p_rect ); + Texture* texture=_bind_texture(p_texture); + ERR_FAIL_COND(!texture); + Rect2 region = p_rect; + + // Rect2 region( p_rect.pos+Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( p_rect.size.width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], p_rect.size.height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); + + // Rect2 src_center( Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( texture->width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], texture->height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); + + if (region.size.width <= 0 ) + region.size.width = texture->width; + if (region.size.height <= 0) + region.size.height = texture->height; + /* CORNERS */ + _draw_textured_quad( // top left + Rect2( p_rect.pos, Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), + Rect2( region.pos, Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // top right + Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), + Rect2( Point2(region.pos.x+region.size.width-p_margin[MARGIN_RIGHT], region.pos.y), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), + Size2( texture->width, texture->height ) ); + + + _draw_textured_quad( // bottom left + Rect2( Point2(p_rect.pos.x,p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), + Rect2( Point2(region.pos.x, region.pos.y+region.size.height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // bottom right + Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), + Rect2( Point2(region.pos.x+region.size.width-p_margin[MARGIN_RIGHT], region.pos.y+region.size.height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), + Size2( texture->width, texture->height ) ); + + Rect2 rect_center( p_rect.pos+Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( p_rect.size.width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], p_rect.size.height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); + + Rect2 src_center( Point2(region.pos.x+p_margin[MARGIN_LEFT], region.pos.y+p_margin[MARGIN_TOP]), Size2(region.size.width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], region.size.height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); + + + _draw_textured_quad( // top + Rect2( Point2(rect_center.pos.x,p_rect.pos.y),Size2(rect_center.size.width,p_margin[MARGIN_TOP])), + Rect2( Point2(src_center.pos.x,region.pos.y), Size2(src_center.size.width,p_margin[MARGIN_TOP])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // bottom + Rect2( Point2(rect_center.pos.x,rect_center.pos.y+rect_center.size.height),Size2(rect_center.size.width,p_margin[MARGIN_BOTTOM])), + Rect2( Point2(src_center.pos.x,src_center.pos.y+src_center.size.height), Size2(src_center.size.width,p_margin[MARGIN_BOTTOM])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // left + Rect2( Point2(p_rect.pos.x,rect_center.pos.y),Size2(p_margin[MARGIN_LEFT],rect_center.size.height)), + Rect2( Point2(region.pos.x,region.pos.y+p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_LEFT],src_center.size.height)), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // right + Rect2( Point2(rect_center.pos.x+rect_center.size.width,rect_center.pos.y),Size2(p_margin[MARGIN_RIGHT],rect_center.size.height)), + Rect2( Point2(src_center.pos.x+src_center.size.width,region.pos.y+p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_RIGHT],src_center.size.height)), + Size2( texture->width, texture->height ) ); + + if (p_draw_center) { + _draw_textured_quad( + rect_center, + src_center, + Size2( texture->width, texture->height )); } + _rinfo.ci_draw_commands++; +} +void Rasterizer3DS::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) +{ + print("canvas_draw_primitive\n"); } -void Rasterizer3DS::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { +void Rasterizer3DS::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) +{ + print("canvas_draw_polygon\n"); } -void Rasterizer3DS::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { +Rasterizer3DS::Texture* Rasterizer3DS::_bind_texture(const RID& p_texture) +{ + if (p_texture.is_valid()) + { + Texture*texture=texture_owner.get(p_texture); + C3D_TexBind(0, &texture->tex); + return texture; + } + + C3D_TexBind(0, NULL); + return NULL; +} +void Rasterizer3DS::_set_uniform(int uniform_location, const Matrix32& p_transform) +{ + const Matrix32& tr = p_transform; + + C3D_Mtx mtx; +// float matrix[16] = { /* build a 16x16 matrix */ +// tr.elements[2][0], tr.elements[2][1], 0, 1, +// 0, 0, 1, 0, +// tr.elements[1][0], tr.elements[1][1], 0, 0, +// tr.elements[0][0], tr.elements[0][1], 0, 0, +// }; + +// float m[16]={ /* build a 16x16 matrix */ +// tr.elements[0][0], tr.elements[0][1], 0, 0, +// tr.elements[1][0], tr.elements[1][1], 0, 0, +// 0, 0, 1, 0, +// tr.elements[2][0], tr.elements[2][1], 0, 1 +// }; + + float matrix[16] = { /* build a 16x16 matrix */ + tr.elements[2][0], 0, tr.elements[1][0], tr.elements[0][0], + tr.elements[2][1], 0, tr.elements[1][1], tr.elements[0][1], + 0, 1, 0, 0, + 1, 0, 0, 0, + }; + + memcpy(mtx.m, matrix, sizeof(matrix)); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} +void Rasterizer3DS::_set_uniform(int uniform_location, const Transform& p_transform) +{ + const Transform& tr = p_transform; + + C3D_Mtx mtx; +// float matrix[16]={ /* build a 16x16 matrix */ +// tr.basis.elements[0][0], tr.basis.elements[1][0], tr.basis.elements[2][0], 0, +// tr.basis.elements[0][1], tr.basis.elements[1][1], tr.basis.elements[2][1], 0, +// tr.basis.elements[0][2], tr.basis.elements[1][2], tr.basis.elements[2][2], 0, +// tr.origin.x, tr.origin.y, tr.origin.z, 1 +// }; + float matrix[16]={ /* build a 16x16 matrix */ + tr.origin.x, tr.basis.elements[0][2], tr.basis.elements[0][1], tr.basis.elements[0][0], + tr.origin.y, tr.basis.elements[1][2], tr.basis.elements[1][1], tr.basis.elements[1][0], + tr.origin.z, tr.basis.elements[2][2], tr.basis.elements[2][1], tr.basis.elements[2][0], + 1, 0, 0, 0, + }; + + memcpy(mtx.m, matrix, sizeof(matrix)); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); } -void Rasterizer3DS::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { +void Rasterizer3DS::_set_uniform(int uniform_location, const Color& p_color) +{/* + const Color& c = p_color; + + C3D_Mtx mat = {{ + { { c.r, c.g, c.b, 1.0f } }, // Ambient + { { c.r, c.g, c.b, 1.0f } }, // Diffuse + { { 1.0f, 0.0f, 0.0f, 1.0f } }, // Specular + { { 1.0f, 0.0f, 0.0f, 1.0f } }, // Emission + }};*/ + /* + C3D_Mtx material = +{ + { + { { 1.0f, 0.2f, 1.0f, 1.0f } }, // Ambient + { { 1.0f, 0.4f, 0.4f, 1.0f } }, // Diffuse + { { 1.0f, 0.8f, 0.8f, 1.0f } }, // Specular + { { 1.0f, 0.0f, 0.0f, 1.0f } }, // Emission + } +};*/ + // memcpy(mtx.m, matrix, sizeof(matrix)); + // C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mat); + +} +void Rasterizer3DS::_set_uniform(int uniform_location, const CameraMatrix& p_matrix) +{ + // Swap X/Y axis due to 3DS screens being sideways + // and adjust clipping range from [-1, 1] to [-1, 0] + float m[16] = { + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 0.5, 0, +// 0, 0, 1, 0, + 0, 0, -0.5, 1, + }; + + CameraMatrix p = *reinterpret_cast(m) * p_matrix; + + C3D_Mtx mtx; + float *to = mtx.m; + const float *from = reinterpret_cast(p.matrix); +// for (int i = 0; i < 4; ++i) +// { +// mtx.r[i].x = *from++; +// mtx.r[i].y = *from++; +// mtx.r[i].z = *from++; +// mtx.r[i].w = *from++; +// } + + to[0] = from[12]; + to[1] = from[8]; + to[2] = from[4]; + to[3] = from[0]; + to[4] = from[13]; + to[5] = from[9]; + to[6] = from[5]; + to[7] = from[1]; + to[8] = from[14]; + to[9] = from[10]; + to[10] = from[6]; + to[11] = from[2]; + to[12] = from[15]; + to[13] = from[11]; + to[14] = from[7]; + to[15] = from[3]; + +// for (int i = 0; i < 4; ++i) +// print("%f %f %f %f\n", to[i*4], to[i*4+1], to[i*4+2], to[i*4+3]); + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uniform_location, &mtx); +} +void Rasterizer3DS::canvas_set_transform(const Matrix32& p_transform) +{ + _set_uniform(canvas_shader->location_extra, p_transform); } -void Rasterizer3DS::canvas_set_transform(const Matrix32& p_transform) { +static void _set_scissor(int x, int y, int w, int h) +{ + print("set_scissor %d %d %d %d\n", x, y, w, h); + // Keep in mind the sideway 3ds screen, so it seems screwy + int bottom = 400 - x; + int top = 240 - y; + int left = top - h; + int right = bottom - w; + if (bottom < 0) bottom = 0; + if (top < 0) top = 0; + if (left < 0) left = 0; + if (right < 0) right = 0; + C3D_SetScissor(GPU_SCISSOR_NORMAL, left, right, top, bottom); +// C3D_SetScissor(GPU_SCISSOR_NORMAL, 240 - (y + h), 400 - (x + w), 240 - y, 400 - x); +} +#if 0 + +void Rasterizer3DS::_set_canvas_scissor(CanvasItem* p_item) +{ + int x, y, w, h; + + if (current_rt) { + x = p_item->final_clip_rect.pos.x; + y = p_item->final_clip_rect.pos.y; + w = p_item->final_clip_rect.size.x; + h = p_item->final_clip_rect.size.y; + } + else + { + x = p_item->final_clip_rect.pos.x; + y = 240 - (p_item->final_clip_rect.pos.y + p_item->final_clip_rect.size.y); + w = p_item->final_clip_rect.size.x; + h = p_item->final_clip_rect.size.y; + } + + _set_scissor(x, y, w, h); +} +template +void Rasterizer3DS::_canvas_item_render_commands(CanvasItem *p_item,CanvasItem *current_clip,bool &reclip) +{ + int cc=p_item->commands.size(); + CanvasItem::Command **commands = p_item->commands.ptr(); + +// print("_canvas_item_render_commands\n"); + + for(int i=0;itype) { + case CanvasItem::Command::TYPE_LINE: { + + CanvasItem::CommandLine* line = static_cast(c); + canvas_draw_line(line->from,line->to,line->color,line->width); + } break; + case CanvasItem::Command::TYPE_RECT: { + + CanvasItem::CommandRect* rect = static_cast(c); +// canvas_draw_rect(rect->rect,rect->region,rect->source,rect->flags&CanvasItem::CommandRect::FLAG_TILE,rect->flags&CanvasItem::CommandRect::FLAG_FLIP_H,rect->flags&CanvasItem::CommandRect::FLAG_FLIP_V,rect->texture,rect->modulate); +#if 0 + int flags=0; + + if (rect->flags&CanvasItem::CommandRect::FLAG_REGION) { + flags|=Rasterizer::CANVAS_RECT_REGION; + } + if (rect->flags&CanvasItem::CommandRect::FLAG_TILE) { + flags|=Rasterizer::CANVAS_RECT_TILE; + } + if (rect->flags&CanvasItem::CommandRect::FLAG_FLIP_H) { + + flags|=Rasterizer::CANVAS_RECT_FLIP_H; + } + if (rect->flags&CanvasItem::CommandRect::FLAG_FLIP_V) { + + flags|=Rasterizer::CANVAS_RECT_FLIP_V; + } +#else + + int flags=rect->flags; +#endif +// if (use_normalmap) +// _canvas_normal_set_flip(Vector2((flags&CANVAS_RECT_FLIP_H)?-1:1,(flags&CANVAS_RECT_FLIP_V)?-1:1)); + canvas_draw_rect(rect->rect,flags,rect->source,rect->texture,rect->modulate); + + } break; + case CanvasItem::Command::TYPE_STYLE: { + + CanvasItem::CommandStyle* style = static_cast(c); +// if (use_normalmap) +// _canvas_normal_set_flip(Vector2(1,1)); + canvas_draw_style_box(style->rect,style->source,style->texture,style->margin,style->draw_center,style->color); + + } break; + case CanvasItem::Command::TYPE_PRIMITIVE: { + +// if (use_normalmap) +// _canvas_normal_set_flip(Vector2(1,1)); + CanvasItem::CommandPrimitive* primitive = static_cast(c); + canvas_draw_primitive(primitive->points,primitive->colors,primitive->uvs,primitive->texture,primitive->width); + } break; + case CanvasItem::Command::TYPE_POLYGON: { + +// if (use_normalmap) +// _canvas_normal_set_flip(Vector2(1,1)); + CanvasItem::CommandPolygon* polygon = static_cast(c); + canvas_draw_polygon(polygon->count,polygon->indices.ptr(),polygon->points.ptr(),polygon->uvs.ptr(),polygon->colors.ptr(),polygon->texture,polygon->colors.size()==1); + + } break; + + case CanvasItem::Command::TYPE_POLYGON_PTR: { + +// if (use_normalmap) +// _canvas_normal_set_flip(Vector2(1,1)); + CanvasItem::CommandPolygonPtr* polygon = static_cast(c); + canvas_draw_polygon(polygon->count,polygon->indices,polygon->points,polygon->uvs,polygon->colors,polygon->texture,false); + } break; + case CanvasItem::Command::TYPE_CIRCLE: { + + CanvasItem::CommandCircle* circle = static_cast(c); + static const int numpoints=32; + Vector2 points[numpoints+1]; + points[numpoints]=circle->pos; + int indices[numpoints*3]; + + for(int i=0;ipos+Vector2( Math::sin(i*Math_PI*2.0/numpoints),Math::cos(i*Math_PI*2.0/numpoints) )*circle->radius; + indices[i*3+0]=i; + indices[i*3+1]=(i+1)%numpoints; + indices[i*3+2]=numpoints; + } + canvas_draw_polygon(numpoints*3,indices,points,NULL,&circle->color,RID(),true); + //canvas_draw_circle(circle->indices.size(),circle->indices.ptr(),circle->points.ptr(),circle->uvs.ptr(),circle->colors.ptr(),circle->texture,circle->colors.size()==1); + } break; + case CanvasItem::Command::TYPE_TRANSFORM: { + CanvasItem::CommandTransform* transform = static_cast(c); + canvas_set_transform(transform->xform); + } break; + case CanvasItem::Command::TYPE_BLEND_MODE: { + + CanvasItem::CommandBlendMode* bm = static_cast(c); + canvas_set_blend_mode(bm->blend_mode); + + } break; + case CanvasItem::Command::TYPE_CLIP_IGNORE: { + + CanvasItem::CommandClipIgnore* ci = static_cast(c); + if (current_clip) { + + if (ci->ignore!=reclip) { + if (ci->ignore) { + C3D_SetScissor(GPU_SCISSOR_DISABLE, 0, 0, 0, 0); + reclip = true; + } else { + _set_canvas_scissor(current_clip); + reclip=false; + } + } + } + } break; + } + } } -/* ENVIRONMENT */ +void Rasterizer3DS::canvas_render_items(CanvasItem *p_item_list,int p_z,const Color& p_modulate,CanvasLight *p_light) +{ +// print("canvas_render_items Z:%d\n", p_z); + + canvas_opacity=1.0; +// canvas_use_modulate=p_modulate!=Color(1,1,1,1); +// canvas_modulate=p_modulate; + +// C3D_FixedAttribSet(2, p_modulate.r, p_modulate.g, p_modulate.b, canvas_opacity); +// C3D_FixedAttribSet(2, 1.f, 1.f, 1.f, 1.f); + + CanvasItem *current_clip = NULL; + + while(p_item_list) + { + CanvasItem *ci = p_item_list; + + // Handle clipping (scissor test) + if (current_clip != ci->final_clip_owner) + { + current_clip = ci->final_clip_owner; + if (current_clip) + { +// int x, y, w, h; +// +// if (current_rt) { +// x = current_clip->final_clip_rect.pos.x; +// y = current_clip->final_clip_rect.pos.y; +// w = current_clip->final_clip_rect.size.x; +// h = current_clip->final_clip_rect.size.y; +// } +// else { +// x = current_clip->final_clip_rect.pos.x; +// y = 240 - (current_clip->final_clip_rect.pos.y + current_clip->final_clip_rect.size.y); +// w = current_clip->final_clip_rect.size.x; +// h = current_clip->final_clip_rect.size.y; +// } +// _set_scissor(x, y, w, h); + _set_canvas_scissor(current_clip); + } + else + C3D_SetScissor(GPU_SCISSOR_DISABLE, 0, 0, 0, 0); + } + + // Handle material/shader + CanvasItem *material_owner = ci->material_owner?ci->material_owner:ci; + CanvasItemMaterial *material = material_owner->material; + + _set_uniform(canvas_shader->location_modelview,ci->final_transform); + _set_uniform(canvas_shader->location_extra, Matrix32()); + + bool unshaded = (material && material->shading_mode==VS::CANVAS_ITEM_SHADING_UNSHADED) || ci->blend_mode!=VS::MATERIAL_BLEND_MODE_MIX; + + bool reclip=false; + + if (ci==p_item_list || ci->blend_mode!=canvas_blend_mode) + canvas_set_blend_mode(ci->blend_mode); -RID Rasterizer3DS::environment_create() { + canvas_opacity = ci->final_opacity; + + if (unshaded || (p_modulate.a>0.001 && (!material || material->shading_mode!=VS::CANVAS_ITEM_SHADING_ONLY_LIGHT) && !ci->light_masked )) + _canvas_item_render_commands(ci, current_clip, reclip); + + if (reclip) + { + _set_canvas_scissor(current_clip); + } + + p_item_list = p_item_list->next; + } + + if (current_clip) + C3D_SetScissor(GPU_SCISSOR_DISABLE, 0, 0, 0, 0); +} +#endif +/* ENVIRONMENT */ +RID Rasterizer3DS::environment_create() +{ + print("environment_create\n"); Environment * env = memnew( Environment ); return environment_owner.make_rid(env); } -void Rasterizer3DS::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { - +void Rasterizer3DS::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) +{ ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); Environment * env = environment_owner.get(p_env); ERR_FAIL_COND(!env); @@ -2072,23 +3259,28 @@ bool Rasterizer3DS::is_environment(const RID& p_rid) const { return environment_owner.owns(p_rid); } +bool Rasterizer3DS::is_canvas_light_occluder(const RID& p_rid) const { + + return canvas_occluder_owner.owns(p_rid); +} + bool Rasterizer3DS::is_shader(const RID& p_rid) const { - return false; + return shader_owner.owns(p_rid); } void Rasterizer3DS::free(const RID& p_rid) { if (texture_owner.owns(p_rid)) { - // delete the texture +// print("delete texture\n"); Texture *texture = texture_owner.get(p_rid); texture_owner.free(p_rid); memdelete(texture); } else if (shader_owner.owns(p_rid)) { - // delete the texture + print("delete shader\n"); Shader *shader = shader_owner.get(p_rid); shader_owner.free(p_rid); memdelete(shader); @@ -2104,7 +3296,22 @@ void Rasterizer3DS::free(const RID& p_rid) { Mesh *mesh = mesh_owner.get(p_rid); for (int i=0;isurfaces.size();i++) { - + Surface *surface = mesh->surfaces[i]; + if (surface->array_local) + linearFree(surface->array_local); + if (surface->index_array_local) + linearFree(surface->index_array_local); + + if (mesh->morph_target_count>0) { + + for(int i=0;imorph_target_count;i++) { + + memdelete_arr(surface->morph_targets_local[i].array); + } + memdelete_arr(surface->morph_targets_local); + surface->morph_targets_local=NULL; + } + memdelete( mesh->surfaces[i] ); }; @@ -2153,6 +3360,20 @@ void Rasterizer3DS::free(const RID& p_rid) { light_instance_owner.free(p_rid); memdelete( light_instance ); + } else if (canvas_occluder_owner.owns(p_rid)) { + + CanvasOccluder *co = canvas_occluder_owner.get(p_rid); + + canvas_occluder_owner.free(p_rid); + memdelete(co); + + } else if (canvas_light_shadow_owner.owns(p_rid)) { + + CanvasLightShadow *cls = canvas_light_shadow_owner.get(p_rid); + C3D_RenderTargetDelete(cls->renderTarget); + + canvas_light_shadow_owner.free(p_rid); + memdelete(cls); } else if (environment_owner.owns(p_rid)) { @@ -2200,70 +3421,1455 @@ void Rasterizer3DS::custom_shade_model_get_param_info(int p_model, Listtarget = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); - C3D_RenderTargetSetOutput(top_rt->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); +/* + material_shader.set_conditional(MaterialShaderGLES2::USE_VERTEX_LIGHTING,!shadow && !p_fragment_light); + material_shader.set_conditional(MaterialShaderGLES2::USE_FRAGMENT_LIGHTING,!shadow && p_fragment_light); + material_shader.set_conditional(MaterialShaderGLES2::USE_SKELETON,false); + + if (shadow) { + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_DIRECTIONAL,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_OMNI,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_SPOT,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_SHADOW,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM4,false); + material_shader.set_conditional(MaterialShaderGLES2::SHADELESS,false); + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,false); + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false); +// material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_TEXTURE,false); + + } +*/ + + +// bool stores_glow = !shadow && (current_env && current_env->fx_enabled[VS::ENV_FX_GLOW]) && !p_alpha_pass; + float sampled_light_dp_multiplier=1.0; + + bool prev_blend=false; +// glDisable(GL_BLEND); - simple_2ds = DVLB_ParseFile((u32*)shader_builtin_simple_2d, sizeof(shader_builtin_simple_2d)); - shaderProgramInit(&program); - shaderProgramSetVsh(&program, &simple_2ds->DVLE[0]); - C3D_BindProgram(&program); + for (int i=0;ielement_count;i++) { + + RenderList::Element *e = p_render_list->elements[i]; + const Material *material = e->material; + uint16_t light = e->light; + uint8_t light_type = e->light_type; + uint8_t sort_flags= e->sort_flags; + const Skeleton *skeleton = e->skeleton; + const Geometry *geometry_cmp = e->geometry_cmp; + const BakedLightData *baked_light = e->instance->baked_light; + const float *morph_values = e->instance->morph_values.ptr(); + // int receive_shadows_state = e->instance->receive_shadows == true ? 1 : 0; + + bool rebind=false; + bool bind_baked_light_octree=false; + bool bind_baked_lightmap=false; + bool additive=false; + bool bind_dp_sampler=false; + +/* + if (!shadow) { + + if (texscreen_used && !texscreen_copied && material->shader_cache && material->shader_cache->valid && material->shader_cache->has_texscreen) { + texscreen_copied=true; + _copy_to_texscreen(); + + //force reset state + prev_material=NULL; + prev_light=0x777E; + prev_geometry_cmp=NULL; + prev_light_type=0xEF; + prev_skeleton =NULL; + prev_sort_flags=0xFF; + prev_morph_values=NULL; + prev_receive_shadows_state=-1; + glEnable(GL_BLEND); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + + } + + if (light_type!=prev_light_type || receive_shadows_state!=prev_receive_shadows_state) { + + if (material->flags[VS::MATERIAL_FLAG_UNSHADED] || current_debug==VS::SCENARIO_DEBUG_SHADELESS) { + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_DIRECTIONAL,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_OMNI,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_SPOT,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_SHADOW,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM4,false); + material_shader.set_conditional(MaterialShaderGLES2::SHADELESS,true); + } else { + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_DIRECTIONAL,(light_type&0x3)==VS::LIGHT_DIRECTIONAL); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_OMNI,(light_type&0x3)==VS::LIGHT_OMNI); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_TYPE_SPOT,(light_type&0x3)==VS::LIGHT_SPOT); + if (receive_shadows_state==1) { + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_SHADOW,(light_type&0x8)); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM,(light_type&0x10)); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM4,(light_type&0x20)); + } + else { + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_SHADOW,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM,false); + material_shader.set_conditional(MaterialShaderGLES2::LIGHT_USE_PSSM4,false); + } + material_shader.set_conditional(MaterialShaderGLES2::SHADELESS,false); + } + + rebind=true; + } + + + if (!*e->additive_ptr) { + + additive=false; + *e->additive_ptr=true; + } else { + additive=true; + } + + + if (stores_glow) + material_shader.set_conditional(MaterialShaderGLES2::USE_GLOW,!additive); + + + bool desired_blend=false; + VS::MaterialBlendMode desired_blend_mode=VS::MATERIAL_BLEND_MODE_MIX; + + if (additive) { + desired_blend=true; + desired_blend_mode=VS::MATERIAL_BLEND_MODE_ADD; + } else { + desired_blend=p_alpha_pass; + desired_blend_mode=material->blend_mode; + } + + if (prev_blend!=desired_blend) { + + if (desired_blend) { + glEnable(GL_BLEND); + if (!current_rt || !current_rt_transparent) + glColorMask(1,1,1,0); + } else { + glDisable(GL_BLEND); + glColorMask(1,1,1,1); + + } + + prev_blend=desired_blend; + } + + if (desired_blend && desired_blend_mode!=current_blend_mode) { + + + switch(desired_blend_mode) { + + case VS::MATERIAL_BLEND_MODE_MIX: { + glBlendEquation(GL_FUNC_ADD); + if (current_rt && current_rt_transparent) { +// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } + else { +// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + } break; + case VS::MATERIAL_BLEND_MODE_ADD: { + +// glBlendEquation(GL_FUNC_ADD); +// glBlendFunc(p_alpha_pass?GL_SRC_ALPHA:GL_ONE,GL_ONE); + + } break; + case VS::MATERIAL_BLEND_MODE_SUB: { + +// glBlendEquation(GL_FUNC_REVERSE_SUBTRACT); +// glBlendFunc(GL_SRC_ALPHA,GL_ONE); + } break; + case VS::MATERIAL_BLEND_MODE_MUL: { + glBlendEquation(GL_FUNC_ADD); + if (current_rt && current_rt_transparent) { +// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } + else { +// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + } break; + + } + + current_blend_mode=desired_blend_mode; + } + + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,false); + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false); + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,false); + + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_COLOR, false); + + + if (material->flags[VS::MATERIAL_FLAG_UNSHADED] == false && current_debug != VS::SCENARIO_DEBUG_SHADELESS) { + + if (baked_light != NULL) { + if (baked_light->realtime_color_enabled) { + float realtime_energy = baked_light->realtime_energy; + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_COLOR, true); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_COLOR, Vector3(baked_light->realtime_color.r*realtime_energy, baked_light->realtime_color.g*realtime_energy, baked_light->realtime_color.b*realtime_energy)); + } + } + + if (e->instance->sampled_light.is_valid()) { + + SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light); + if (sl) { + + baked_light = NULL; //can't mix + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER, true); + glActiveTexture(GL_TEXTURE0 + max_texture_units - 3); + glBindTexture(GL_TEXTURE_2D, sl->texture); //bind the texture + sampled_light_dp_multiplier = sl->multiplier; + bind_dp_sampler = true; + } + } + + + if (!additive && baked_light) { + + if (baked_light->mode == VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) { + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE, true); + bind_baked_light_octree = true; + if (prev_baked_light != baked_light) { + Texture *tex = texture_owner.get(baked_light->octree_texture); + if (tex) { + + glActiveTexture(GL_TEXTURE0 + max_texture_units - 3); + glBindTexture(tex->target, tex->tex_id); //bind the texture + } + if (baked_light->light_texture.is_valid()) { + Texture *texl = texture_owner.get(baked_light->light_texture); + if (texl) { + glActiveTexture(GL_TEXTURE0 + max_texture_units - 4); + glBindTexture(texl->target, texl->tex_id); //bind the light texture + } + } + + } + } + else if (baked_light->mode == VS::BAKED_LIGHT_LIGHTMAPS) { + + + int lightmap_idx = e->instance->baked_lightmap_id; + + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP, false); + bind_baked_lightmap = false; + + + if (baked_light->lightmaps.has(lightmap_idx)) { + + + RID texid = baked_light->lightmaps[lightmap_idx]; + + if (prev_baked_light != baked_light || texid != prev_baked_light_texture) { + + + Texture *tex = texture_owner.get(texid); + if (tex) { + + glActiveTexture(GL_TEXTURE0 + max_texture_units - 3); + glBindTexture(tex->target, tex->tex_id); //bind the texture + } + + prev_baked_light_texture = texid; + } + + if (texid.is_valid()) { + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP, true); + bind_baked_lightmap = true; + } + + } + } + } + + if (int(prev_baked_light != NULL) ^ int(baked_light != NULL)) { + rebind = true; + } + } + } // !shadow + + if (sort_flags!=prev_sort_flags) { + + if (sort_flags&RenderList::SORT_FLAG_INSTANCING) { + material_shader.set_conditional(MaterialShaderGLES2::USE_UNIFORM_INSTANCING,!use_texture_instancing && !use_attribute_instancing); + material_shader.set_conditional(MaterialShaderGLES2::USE_ATTRIBUTE_INSTANCING,use_attribute_instancing); + material_shader.set_conditional(MaterialShaderGLES2::USE_TEXTURE_INSTANCING,use_texture_instancing); + } else { + material_shader.set_conditional(MaterialShaderGLES2::USE_UNIFORM_INSTANCING,false); + material_shader.set_conditional(MaterialShaderGLES2::USE_ATTRIBUTE_INSTANCING,false); + material_shader.set_conditional(MaterialShaderGLES2::USE_TEXTURE_INSTANCING,false); + } + rebind=true; + } + + if (use_hw_skeleton_xform && (skeleton!=prev_skeleton||morph_values!=prev_morph_values)) { + if (!prev_skeleton || !skeleton) + rebind=true; //went from skeleton <-> no skeleton, needs rebind + + if (morph_values==NULL) + _setup_skeleton(skeleton); + else + _setup_skeleton(NULL); + } +*/ + if (material!=prev_material || rebind) { + + rebind = _setup_material(e->geometry,material,additive,!p_alpha_pass); + + print("Setup material\n"); + _rinfo.mat_change_count++; + } else { + + if (prev_skeleton!=skeleton) { + //_setup_material_skeleton(material,skeleton); + }; + } + + + if (geometry_cmp!=prev_geometry_cmp || prev_skeleton!=skeleton) { + + _setup_geometry(e->geometry, material,e->skeleton,e->instance->morph_values.ptr()); + _rinfo.surface_count++; +// DEBUG_TEST_ERROR("Setup geometry"); + }; + + if (i==0 || light!=prev_light || rebind) { + if (e->light!=0xFFFF) { + // _setup_light(e->light); + } +// _setup_lights(e->lights,e->light_count); + } +/* + if (bind_baked_light_octree && (baked_light!=prev_baked_light || rebind)) { + + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_INVERSE_TRANSFORM, *e->instance->baked_light_octree_xform); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_LATTICE_SIZE, baked_light->octree_lattice_size); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_LATTICE_DIVIDE, baked_light->octree_lattice_divide); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_STEPS, baked_light->octree_steps); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_TEX,max_texture_units-3); + if (baked_light->light_texture.is_valid()) { + + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_LIGHT_TEX,max_texture_units-4); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_LIGHT_PIX_SIZE,baked_light->light_tex_pixel_size); + } else { + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_LIGHT_TEX,max_texture_units-3); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_LIGHT_PIX_SIZE,baked_light->octree_tex_pixel_size); + } + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_MULTIPLIER,baked_light->texture_multiplier); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_OCTREE_PIX_SIZE,baked_light->octree_tex_pixel_size); + + + } + + if (bind_baked_lightmap && (baked_light!=prev_baked_light || rebind)) { + + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_LIGHTMAP, max_texture_units-3); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_LIGHTMAP_MULTIPLIER, baked_light->lightmap_multiplier); + + } + + if (bind_dp_sampler) { + + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_DP_SAMPLER_MULTIPLIER,sampled_light_dp_multiplier); + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_DP_SAMPLER,max_texture_units-3); + } + + _set_cull(e->mirror,p_reverse_cull); + + + if (i==0 || rebind) { + material_shader.set_uniform(MaterialShaderGLES2::CAMERA_INVERSE_TRANSFORM, p_view_transform_inverse); + material_shader.set_uniform(MaterialShaderGLES2::PROJECTION_TRANSFORM, p_projection); + if (!shadow) { + + if (!additive && current_env && current_env->fx_enabled[VS::ENV_FX_AMBIENT_LIGHT]) { + Color ambcolor = _convert_color(current_env->fx_param[VS::ENV_FX_PARAM_AMBIENT_LIGHT_COLOR]); + float ambnrg = current_env->fx_param[VS::ENV_FX_PARAM_AMBIENT_LIGHT_ENERGY]; + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_LIGHT,Vector3(ambcolor.r*ambnrg,ambcolor.g*ambnrg,ambcolor.b*ambnrg)); + } else { + material_shader.set_uniform(MaterialShaderGLES2::AMBIENT_LIGHT,Vector3()); + } + } + + _rinfo.shader_change_count++; + } + + if (skeleton != prev_skeleton || rebind) { + if (skeleton && morph_values == NULL) { + material_shader.set_uniform(MaterialShaderGLES2::SKELETON_MATRICES, max_texture_units - 2); + material_shader.set_uniform(MaterialShaderGLES2::SKELTEX_PIXEL_SIZE, skeleton->pixel_size); + } + } +*/ +// if (e->instance->billboard || e->instance->billboard_y || e->instance->depth_scale) { + if (false) { + print("billboard\n"); + Transform xf=e->instance->transform; + if (e->instance->depth_scale) { + + if (p_projection.matrix[3][3]) { + //orthogonal matrix, try to do about the same + //with viewport size + //real_t w = Math::abs( 1.0/(2.0*(p_projection.matrix[0][0])) ); + real_t h = Math::abs( 1.0/(2.0*p_projection.matrix[1][1]) ); + float sc = (h*2.0); //consistent with Y-fov + xf.basis.scale( Vector3(sc,sc,sc)); + } else { + //just scale by depth + real_t sc = -camera_plane.distance_to(xf.origin); + xf.basis.scale( Vector3(sc,sc,sc)); + } + } + + if (e->instance->billboard) { + + Vector3 scale = xf.basis.get_scale(); + + if (current_rt && current_rt_vflip) { + xf.set_look_at(xf.origin, xf.origin + p_view_transform.get_basis().get_axis(2), -p_view_transform.get_basis().get_axis(1)); + } else { + xf.set_look_at(xf.origin, xf.origin + p_view_transform.get_basis().get_axis(2), p_view_transform.get_basis().get_axis(1)); + } + + xf.basis.scale(scale); + } + + if (e->instance->billboard_y) { + + Vector3 scale = xf.basis.get_scale(); + Vector3 look_at = p_view_transform.get_origin(); + look_at.y = 0.0; + Vector3 look_at_norm = look_at.normalized(); + + if (current_rt && current_rt_vflip) { + xf.set_look_at(xf.origin,xf.origin + look_at_norm, Vector3(0.0, -1.0, 0.0)); + } else { + xf.set_look_at(xf.origin,xf.origin + look_at_norm, Vector3(0.0, 1.0, 0.0)); + } + xf.basis.scale(scale); + } +// material_shader.set_uniform(MaterialShaderGLES2::WORLD_TRANSFORM, xf); + + } else { +// Transform tr = camera_transform_inverse * e->instance->transform; + _set_uniform(scene_shader->location_modelview, e->instance->transform); +// material_shader.set_uniform(MaterialShaderGLES2::WORLD_TRANSFORM, e->instance->transform); + } + +// material_shader.set_uniform(MaterialShaderGLES2::NORMAL_MULT, e->mirror?-1.0:1.0); +// material_shader.set_uniform(MaterialShaderGLES2::CONST_LIGHT_MULT,additive?0.0:1.0); + + + _render(e->geometry, material, skeleton,e->owner,e->instance->transform); +// DEBUG_TEST_ERROR("Rendering"); + + prev_material=material; + prev_skeleton=skeleton; + prev_geometry_cmp=geometry_cmp; + prev_light=e->light; + prev_light_type=e->light_type; + prev_sort_flags=sort_flags; + prev_baked_light=baked_light; + prev_morph_values=morph_values; + // prev_receive_shadows_state=receive_shadows_state; + } + + //print_line("shaderchanges: "+itos(p_alpha_pass)+": "+itos(_rinfo.shader_change_count)); + + + if (current_rt && current_rt_vflip) { +// glFrontFace(GL_CW); + } + +}; +/* +void Rasterizer3DS::_setup_fixed_material(const Geometry *p_geometry,const Material *p_material) { + + Color diffuse_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; + + _set_uniform(scene_shader->location_material, diffuse_color); +}*/ + +bool Rasterizer3DS::_setup_material(const Geometry *p_geometry,const Material *p_material,bool p_no_const_light,bool p_opaque_pass) +{ + Texture *texture = NULL; + + if (p_material->flags[VS::MATERIAL_FLAG_DOUBLE_SIDED]) { +// glDisable(GL_CULL_FACE); + // C3D_CullFace(GPU_CULL_NONE); + C3D_CullFace(GPU_CULL_FRONT_CCW); + + } else { +// glEnable(GL_CULL_FACE); + C3D_CullFace(GPU_CULL_NONE); + } + +// C3D_TexEnv* env = C3D_GetTexEnv(0); +// C3D_TexEnvSrc(env, C3D_Both, GPU_FRAGMENT_PRIMARY_COLOR, GPU_FRAGMENT_SECONDARY_COLOR, 0); +// C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); +// C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); + + C3D_TexEnv *env = C3D_GetTexEnv(1); + +// if (p_material->line_width) +// glLineWidth(p_material->line_width); +/* + //all goes to false by default + material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PASS,shadow!=NULL); + material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PCF,shadow_filter==SHADOW_FILTER_PCF5 || shadow_filter==SHADOW_FILTER_PCF13); + material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_PCF_HQ,shadow_filter==SHADOW_FILTER_PCF13); + material_shader.set_conditional(MaterialShaderGLES2::USE_SHADOW_ESM,shadow_filter==SHADOW_FILTER_ESM); + material_shader.set_conditional(MaterialShaderGLES2::USE_LIGHTMAP_ON_UV2,p_material->flags[VS::MATERIAL_FLAG_LIGHTMAP_ON_UV2]); + material_shader.set_conditional(MaterialShaderGLES2::USE_COLOR_ATTRIB_SRGB_TO_LINEAR,p_material->flags[VS::MATERIAL_FLAG_COLOR_ARRAY_SRGB] && current_env && current_env->fx_enabled[VS::ENV_FX_SRGB]); + + if (p_opaque_pass && p_material->depth_draw_mode==VS::MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA && p_material->shader_cache && p_material->shader_cache->has_alpha) { + + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_CLIP_ALPHA,true); + } else { + material_shader.set_conditional(MaterialShaderGLES2::ENABLE_CLIP_ALPHA,false); + + } +*/ + +// if (!shadow) { + + bool depth_test=!p_material->flags[VS::MATERIAL_FLAG_ONTOP]; + bool depth_write=p_material->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_NEVER && (p_opaque_pass || p_material->depth_draw_mode==VS::MATERIAL_DEPTH_DRAW_ALWAYS); + //bool depth_write=!p_material->hints[VS::MATERIAL_HINT_NO_DEPTH_DRAW] && (p_opaque_pass || !p_material->hints[VS::MATERIAL_HINT_NO_DEPTH_DRAW_FOR_ALPHA]); + + if (current_depth_mask!=depth_write) + { + current_depth_mask=depth_write; +// glDepthMask( depth_write ); + } + + + if (current_depth_test!=depth_test) + { + current_depth_test=depth_test; +// if(depth_test) +// glEnable(GL_DEPTH_TEST); +// else +// glDisable(GL_DEPTH_TEST); + } + + +// material_shader.set_conditional(MaterialShaderGLES2::USE_FOG,current_env && current_env->fx_enabled[VS::ENV_FX_FOG]); +// } + + +// DEBUG_TEST_ERROR("Pre Shader Bind"); + + bool rebind=false; + +// if (p_material->shader_cache && p_material->shader_cache->valid) { + + // // reduce amount of conditional compilations + // for(int i=0;i<_tex_version_count;i++) + // material_shader.set_conditional((MaterialShaderGLES2::Conditionals)_tex_version[i],false); + + + // material_shader.set_custom_shader(p_material->shader_cache->custom_code_id); + +// if (p_material->shader_version!=p_material->shader_cache->version) { + //shader changed somehow, must update uniforms + +// _update_material_shader_params((Material*)p_material); + +// } +// material_shader.set_custom_shader(p_material->shader_cache->custom_code_id); +// rebind = material_shader.bind(); + +// DEBUG_TEST_ERROR("Shader Bind"); + + //set uniforms! + int texcoord=0; + for (Map::Element *E=p_material->shader_params.front();E;E=E->next()) + { + +// if (E->get().index<0) +// continue; + + if (!texture && E->get().istexture) { + //clearly a texture.. + RID rid = E->get().value; + print("rid:%u\n", rid.get_id()); +// int loc = material_shader.get_custom_uniform_location(E->get().index); //should be automatic.. + + texture=_bind_texture(rid); +// if (rid.is_valid()) { +// texture=texture_owner.get(rid); +// if (!texture) { +// E->get().value=RID(); //nullify, invalid texture +// rid=RID(); +// } +// } + +// glActiveTexture(GL_TEXTURE0+texcoord); +// glUniform1i(loc,texcoord); //TODO - this could happen automatically on compile... + texcoord++; + + } else if (E->get().value.get_type()==Variant::COLOR){ + // Color c = E->get().value; + // _set_uniform(scene_shader->location_material, c); + + // printf("a\n"); +// material_shader.set_custom_uniform(E->get().index,_convert_color(c)); + } else { +// material_shader.set_custom_uniform(E->get().index,E->get().value); + } + + } + + // _setup_fixed_material(p_geometry,p_material); + + print("texture count: %d\n", texcoord); + + if (texture) + { + print("binding material texture\n"); + C3D_TexEnvSrc(env, C3D_Both, GPU_PREVIOUS, GPU_TEXTURE0); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_MODULATE); + } + else + { + print("unbinding material texture\n"); + C3D_TexEnvSrc(env, C3D_Both, GPU_PREVIOUS); + C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); + } + + +// if (p_material->shader_cache->has_texscreen && framebuffer.active) { +// material_shader.set_uniform(MaterialShaderGLES2::TEXSCREEN_SCREEN_MULT,Vector2(float(viewport.width)/framebuffer.width,float(viewport.height)/framebuffer.height)); +// material_shader.set_uniform(MaterialShaderGLES2::TEXSCREEN_SCREEN_CLAMP,Color(0,0,float(viewport.width)/framebuffer.width,float(viewport.height)/framebuffer.height)); +// material_shader.set_uniform(MaterialShaderGLES2::TEXSCREEN_TEX,texcoord); +// glActiveTexture(GL_TEXTURE0+texcoord); +// glBindTexture(GL_TEXTURE_2D,framebuffer.sample_color); +// C3D_TexBind(texcoord, NULL); + +// } +// if (p_material->shader_cache->has_screen_uv) { +// material_shader.set_uniform(MaterialShaderGLES2::SCREEN_UV_MULT,Vector2(1.0/viewport.width,1.0/viewport.height)); +// } +// DEBUG_TEST_ERROR("Material parameters"); + +// if (p_material->shader_cache->uses_time) { +// material_shader.set_uniform(MaterialShaderGLES2::TIME,Math::fmod(last_time,shader_time_rollback)); +// draw_next_frame=true; +// } + //if uses TIME - draw_next_frame=true + + +// } else { + +// material_shader.set_custom_shader(0); +// rebind = material_shader.bind(); + +// DEBUG_TEST_ERROR("Shader bind2"); +// } + + +/* + if (shadow) { + + float zofs = shadow->base->vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]; + float zslope = shadow->base->vars[VS::LIGHT_PARAM_SHADOW_Z_SLOPE_SCALE]; + if (shadow_pass>=1 && shadow->base->type==VS::LIGHT_DIRECTIONAL) { + float m = Math::pow(shadow->base->directional_shadow_param[VS::LIGHT_DIRECTIONAL_SHADOW_PARAM_PSSM_ZOFFSET_SCALE],shadow_pass); + zofs*=m; + zslope*=m; + } + material_shader.set_uniform(MaterialShaderGLES2::SHADOW_Z_OFFSET,zofs); + material_shader.set_uniform(MaterialShaderGLES2::SHADOW_Z_SLOPE_SCALE,zslope); + if (shadow->base->type==VS::LIGHT_OMNI) + material_shader.set_uniform(MaterialShaderGLES2::DUAL_PARABOLOID,shadow->dp); + DEBUG_TEST_ERROR("Shadow uniforms"); + + } + + + if (current_env && current_env->fx_enabled[VS::ENV_FX_FOG]) { + + Color col_begin = current_env->fx_param[VS::ENV_FX_PARAM_FOG_BEGIN_COLOR]; + Color col_end = current_env->fx_param[VS::ENV_FX_PARAM_FOG_END_COLOR]; + col_begin=_convert_color(col_begin); + col_end=_convert_color(col_end); + float from = current_env->fx_param[VS::ENV_FX_PARAM_FOG_BEGIN]; + float zf = camera_z_far; + float curve = current_env->fx_param[VS::ENV_FX_PARAM_FOG_ATTENUATION]; + material_shader.set_uniform(MaterialShaderGLES2::FOG_PARAMS,Vector3(from,zf,curve)); + material_shader.set_uniform(MaterialShaderGLES2::FOG_COLOR_BEGIN,Vector3(col_begin.r,col_begin.g,col_begin.b)); + material_shader.set_uniform(MaterialShaderGLES2::FOG_COLOR_END,Vector3(col_end.r,col_end.g,col_end.b)); + } +*/ + + + //material_shader.set_uniform(MaterialShaderGLES2::TIME,Math::fmod(last_time,300.0)); + //if uses TIME - draw_next_frame=true + + return rebind; +} + +void Rasterizer3DS::_setup_light(uint16_t p_light) +{ + + LightInstance *li=lights[p_light]; + Light *l=li->base; + Color col_diffuse = (l->colors[VS::LIGHT_COLOR_DIFFUSE]); + Color col_specular=(l->colors[VS::LIGHT_COLOR_SPECULAR]); - uLoc_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); - uLoc_modelView = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); - // Configure attributes for use with the vertex shader + + if (l->type!=VS::LIGHT_DIRECTIONAL) { + Vector3 pos = li->transform.get_origin(); + pos = camera_transform_inverse.xform(pos); + + // C3D_FVec lightVec = FVec4_New(pos.x, pos.y, pos.z, 0.0f); + + // C3D_LightPosition(&l->light, &lightVec); + // C3D_LightDiffuse(&l->light, col_diffuse.r, col_diffuse.g, col_diffuse.b); + // C3D_LightSpecular0(&l->light, col_specular.r, col_specular.g, col_specular.b); + + } + + // if(li->near_shadow_buffer) { + // C3D_LightShadowEnable(&l->light, true); + // } +} + +Error Rasterizer3DS::_setup_geometry(const Geometry *p_geometry, const Material* p_material, const Skeleton *p_skeleton,const float *p_morphs) +{ +} + +void Rasterizer3DS::_add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner,int p_material) +{ +Material *m=NULL; + RID m_src=p_instance->material_override.is_valid() ? p_instance->material_override : p_geometry->material; + + if (m_src) + m=material_owner.get( m_src ); + + if (!m) { + m=material_owner.get( default_material ); + } + + ERR_FAIL_COND(!m); + + + if (m->last_pass!=frame) { + + m->last_pass=frame; + } + + + + + + RenderList *render_list=&opaque_render_list; + if (m->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ALPHA] || m->blend_mode!=VS::MATERIAL_BLEND_MODE_MIX) { + render_list = &alpha_render_list; + }; + + if (!m->flags[VS::MATERIAL_FLAG_UNSHADED]) { + + int lis = p_instance->light_instances.size(); + + for(int i=0;i=RenderList::MAX_LIGHTS) + break; + + LightInstance *li=light_instance_owner.get( p_instance->light_instances[i] ); + + if (!li || li->last_pass!=scene_pass) //lit by light not in visible scene + continue; + lights[light_count++]=li; + + } + } + + RenderList::Element *e = render_list->add_element(); + + e->geometry=p_geometry; +// e->geometry_cmp=p_geometry_cmp; + e->material=m; + e->instance=p_instance; + //e->depth=camera_plane.distance_to(p_world->origin); + e->depth=camera_transform.origin.distance_to(p_instance->transform.origin); + e->owner=p_owner; + if (p_instance->skeleton.is_valid()) + e->skeleton=skeleton_owner.get(p_instance->skeleton); + else + e->skeleton=NULL; + e->mirror=p_instance->mirror; + if (m->flags[VS::MATERIAL_FLAG_INVERT_FACES]) + e->mirror=!e->mirror; + + e->light_key=0; + e->light_count=0; + + + if (!shadow) { + + + if (m->flags[VS::MATERIAL_FLAG_UNSHADED]) { + + + e->light_key--; //special key for all the shadeless people + } else if (light_count) { + + for(int i=0;ilights[i]=lights[i]->sort_key; + } + + e->light_count=light_count; + int poslight_count=light_count; + if (poslight_count>1) { + SortArray light_sort; + light_sort.sort(&e->lights[0],poslight_count); //generate an equal sort key + } + } + + } + +} + +static const GPU_Primitive_t gl_primitive[]={ + GPU_TRIANGLES, + GPU_TRIANGLES, + GPU_TRIANGLES, + GPU_TRIANGLES, + GPU_TRIANGLES, + GPU_TRIANGLE_STRIP, + GPU_TRIANGLE_FAN +}; + +void Rasterizer3DS::_render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner,const Transform& p_xform) +{ + _rinfo.object_count++; + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); AttrInfo_Init(attrInfo); - AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position - AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2); // v1=color + + + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + + switch(p_geometry->type) { + + case Geometry::GEOMETRY_SURFACE: { + + Surface *s = (Surface*)p_geometry; + + bool has_tex = (s->stride > 24); +// bool has_tex = s->array[VS::ARRAY_TEX_UV].bind; + + print("stride:%d primitive:%d\n", s->stride, (int)gl_primitive[s->primitive]); + + AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=vertex + AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 3); // v1=normal + if (has_tex) + AttrInfo_AddLoader(attrInfo, 2, GPU_FLOAT, 2); // v2=tex_uv + else + { +// AttrInfo_AddFixed(attrInfo, 2); +// C3D_FixedAttribSet(2, 1.f, 1.f, 1.f, 1.f); + AttrInfo_AddLoader(attrInfo, 3, GPU_FLOAT, 4); + } + + BufInfo_Add(bufInfo, s->array_local, s->stride, has_tex ? 3 : 2, has_tex ? 0x210 : 0x10); + + _rinfo.vertex_count+=s->array_len; + + if (s->index_array_len>0) { + + if (s->index_array_local) + { + print("index len: %u\n", s->array[VS::ARRAY_INDEX].size); + + //print_line("LOCAL F: "+itos(s->format)+" C: "+itos(s->index_array_len)+" VC: "+itos(s->array_len)); +// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); +// glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_INT:GL_UNSIGNED_SHORT, s->index_array_local); + + C3D_DrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array[VS::ARRAY_INDEX].size == 2) ? C3D_UNSIGNED_SHORT : C3D_UNSIGNED_BYTE, s->index_array_local); + + } + + } else { + +// glDrawArrays(gl_primitive[s->primitive],0,s->array_len); + C3D_DrawArrays(gl_primitive[s->primitive], 0, s->array_len); + + }; + + _rinfo.draw_calls++; + } break; + + case Geometry::GEOMETRY_MULTISURFACE: { + +// material_shader.bind_uniforms(); + Surface *s = static_cast(p_geometry)->surface; + const MultiMesh *mm = static_cast(p_owner); + int element_count=mm->elements.size(); + + if (element_count==0) + return; + + if (mm->visible>=0) { + element_count=MIN(element_count,mm->visible); + } + + const MultiMesh::Element *elements=&mm->elements[0]; + + _rinfo.vertex_count+=s->array_len*element_count; + + _rinfo.draw_calls+=element_count; + +/* + if (use_texture_instancing) { + //this is probably the fastest all around way if vertex texture fetch is supported + + float twd=(1.0/mm->tw)*4.0; + float thd=1.0/mm->th; + float parm[3]={0.0,01.0,(1.0f/mm->tw)}; + glActiveTexture(GL_TEXTURE0+max_texture_units-2); + glDisableVertexAttribArray(6); + glBindTexture(GL_TEXTURE_2D,mm->tex_id); + material_shader.set_uniform(MaterialShaderGLES2::INSTANCE_MATRICES,GL_TEXTURE0+max_texture_units-2); + + if (s->index_array_len>0) { + + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); + for(int i=0;itw>>2))*twd; + parm[1]=(i/(mm->tw>>2))*thd; + glVertexAttrib3fv(6,parm); + glDrawElements(gl_primitive[s->primitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_INT:GL_UNSIGNED_SHORT,0); + + } + + + } else { + + for(int i=0;itw>>2))*twd; + //parm[1]=(i/(mm->tw>>2))*thd; + glVertexAttrib3fv(6,parm); + glDrawArrays(gl_primitive[s->primitive],0,s->array_len); + } + }; + + } else if (use_attribute_instancing) { + //if not, using atributes instead of uniforms can be really fast in forward rendering architectures + if (s->index_array_len>0) { + + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); + for(int i=0;iprimitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_INT:GL_UNSIGNED_SHORT,0); + } + + + } else { + + for(int i=0;iprimitive],0,s->array_len); + } + }; + + + } else { + + //nothing to do, slow path (hope no hardware has to use it... but you never know) + + if (s->index_array_len>0) { + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); + for(int i=0;iprimitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_INT:GL_UNSIGNED_SHORT,0); + } + + + } else { + + for(int i=0;iprimitive],0,s->array_len); + } + }; + } +*/ + } break; +/* + case Geometry::GEOMETRY_IMMEDIATE: { + + bool restore_tex=false; + const Immediate *im = static_cast( p_geometry ); + if (im->building) { + return; + } + + glBindBuffer(GL_ARRAY_BUFFER, 0); + + for(const List::Element *E=im->chunks.front();E;E=E->next()) { + + const Immediate::Chunk &c=E->get(); + if (c.vertices.empty()) { + continue; + } + for(int i=0;itarget,t->tex_id); + restore_tex=true; + + + } else if (restore_tex) { + + glActiveTexture(GL_TEXTURE0+tc0_idx); + glBindTexture(GL_TEXTURE_2D,tc0_id_cache); + restore_tex=false; + } + + if (!c.normals.empty()) { + + glEnableVertexAttribArray(VS::ARRAY_NORMAL); + glVertexAttribPointer(VS::ARRAY_NORMAL, 3, GL_FLOAT, false,sizeof(Vector3),c.normals.ptr()); + + } else { + + glDisableVertexAttribArray(VS::ARRAY_NORMAL); + } + + if (!c.tangents.empty()) { + + glEnableVertexAttribArray(VS::ARRAY_TANGENT); + glVertexAttribPointer(VS::ARRAY_TANGENT, 4, GL_FLOAT, false,sizeof(Plane),c.tangents.ptr()); + + } else { + + glDisableVertexAttribArray(VS::ARRAY_TANGENT); + } + + if (!c.colors.empty()) { + + glEnableVertexAttribArray(VS::ARRAY_COLOR); + glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false,sizeof(Color),c.colors.ptr()); + + } else { + + glDisableVertexAttribArray(VS::ARRAY_COLOR); + _set_color_attrib(Color(1, 1, 1,1)); + } + + + if (!c.uvs.empty()) { + + glEnableVertexAttribArray(VS::ARRAY_TEX_UV); + glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false,sizeof(Vector2),c.uvs.ptr()); + + } else { + + glDisableVertexAttribArray(VS::ARRAY_TEX_UV); + } + + if (!c.uvs2.empty()) { + + glEnableVertexAttribArray(VS::ARRAY_TEX_UV2); + glVertexAttribPointer(VS::ARRAY_TEX_UV2, 2, GL_FLOAT, false,sizeof(Vector2),c.uvs2.ptr()); + + } else { + + glDisableVertexAttribArray(VS::ARRAY_TEX_UV2); + } + + + glEnableVertexAttribArray(VS::ARRAY_VERTEX); + glVertexAttribPointer(VS::ARRAY_VERTEX, 3, GL_FLOAT, false,sizeof(Vector3),c.vertices.ptr()); + glDrawArrays(gl_primitive[c.primitive],0,c.vertices.size()); + + + } + + + if (restore_tex) { + + glActiveTexture(GL_TEXTURE0+tc0_idx); + glBindTexture(GL_TEXTURE_2D,tc0_id_cache); + restore_tex=false; + } + + + } break; +`*/ + case Geometry::GEOMETRY_PARTICLES: { + + //print_line("particulinas"); + const Particles *particles = static_cast( p_geometry ); + ERR_FAIL_COND(!p_owner); + ParticlesInstance *particles_instance = (ParticlesInstance*)p_owner; + + ParticleSystemProcessSW &pp = particles_instance->particles_process; + float td = time_delta; //MIN(time_delta,1.0/10.0); + pp.process(&particles->data,particles_instance->transform,td); + ERR_EXPLAIN("A parameter in the particle system is not correct."); + ERR_FAIL_COND(!pp.valid); + + + Transform camera; +// if (shadow) +// camera=shadow->transform; +// else + camera=camera_transform; + + particle_draw_info.prepare(&particles->data,&pp,particles_instance->transform,camera); + _rinfo.draw_calls+=particles->data.amount; + + + _rinfo.vertex_count+=4*particles->data.amount; + + { + static const Vector3 points[4]={ + Vector3(-1.0,1.0,0), + Vector3(1.0,1.0,0), + Vector3(1.0,-1.0,0), + Vector3(-1.0,-1.0,0) + }; + static const Vector3 uvs[4]={ + Vector3(0.0,0.0,0.0), + Vector3(1.0,0.0,0.0), + Vector3(1.0,1.0,0.0), + Vector3(0,1.0,0.0) + }; + static const Vector3 normals[4]={ + Vector3(0,0,1), + Vector3(0,0,1), + Vector3(0,0,1), + Vector3(0,0,1) + }; + + static const Plane tangents[4]={ + Plane(Vector3(1,0,0),0), + Plane(Vector3(1,0,0),0), + Plane(Vector3(1,0,0),0), + Plane(Vector3(1,0,0),0) + }; + + for(int i=0;idata.amount;i++) { + + ParticleSystemDrawInfoSW::ParticleDrawInfo &pinfo=*particle_draw_info.draw_info_order[i]; + if (!pinfo.data->active) + continue; + +// material_shader.set_uniform(MaterialShaderGLES2::WORLD_TRANSFORM, pinfo.transform); +// _set_color_attrib(pinfo.color); +// _draw_primitive(4,points,normals,NULL,uvs,tangents); + } + } + + } break; + default: break; + }; +} + +void Rasterizer3DS::_draw_quad(const Rect2& p_rect) +{ + VertexArray *varray = memnew(VertexArray(4)); + varray->vertices[0].position = Vector3( p_rect.pos.x,p_rect.pos.y, 0.5f ); + varray->vertices[1].position = Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y, 0.5f ); + varray->vertices[2].position = Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y+p_rect.size.height, 0.5f ); + varray->vertices[3].position = Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0.5f ); - // Mtx_PerspTilt(&projection, C3D_AngleFromDegrees(80.0f), C3D_AspectRatioTop, 0.01f, 1000.0f, false); - Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0, true); + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, varray->vertices, sizeof(Vertex), 2, 0x10); - C3D_TexEnv* env = C3D_GetTexEnv(0); - C3D_TexEnvInit(env); - C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, (GPU_TEVSRC)0, (GPU_TEVSRC)0); - C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); + C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); + + vertexArrays.push_back(varray); +// C3D_Flush(); +// _draw_gui_primitive(4,coords,0,0); +// _rinfo.ci_draw_commands++; +} + +void Rasterizer3DS::_draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_h_flip, bool p_v_flip, bool p_transpose ) +{ +// print("_draw_textured_quad\n"); + VertexArray *varray = memnew(VertexArray(4)); + + Vertex v[4] = { + { + Vector3( p_rect.pos.x, p_rect.pos.y, 0.5f), + Vector2( p_src_region.pos.x/p_tex_size.width, p_src_region.pos.y/p_tex_size.height) + },{ + Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0.5f), + Vector2((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, p_src_region.pos.y/p_tex_size.height) + },{ + Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0.5f), + Vector2( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height) + },{ + Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0.5f), + Vector2( p_src_region.pos.x/p_tex_size.width, (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height) + }, + }; + + memcpy(varray->vertices, v, sizeof(v)); + + if (p_transpose) { + SWAP( varray->vertices[1].texcoord, varray->vertices[3].texcoord ); + } + if (p_h_flip) { + SWAP( varray->vertices[0].texcoord, varray->vertices[1].texcoord ); + SWAP( varray->vertices[2].texcoord, varray->vertices[3].texcoord ); + } + if (p_v_flip) { + SWAP( varray->vertices[1].texcoord, varray->vertices[2].texcoord ); + SWAP( varray->vertices[0].texcoord, varray->vertices[3].texcoord ); + } - C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); + C3D_BufInfo* bufInfo = C3D_GetBufInfo(); + BufInfo_Init(bufInfo); + BufInfo_Add(bufInfo, varray->vertices, sizeof(Vertex), 2, 0x10); + + C3D_DrawArrays(GPU_TRIANGLE_FAN, 0, 4); + + vertexArrays.push_back(varray); +// _draw_gui_primitive(4,coords,0,texcoords); +// _rinfo.ci_draw_commands++; } -void Rasterizer3DS::finish() { +static const C3D_Material material = + { + { 0.2f, 0.2f, 0.2f }, //ambient + { 0.4f, 0.4f, 0.4f }, //diffuse + { 0.8f, 0.8f, 0.8f }, //specular0 + { 0.0f, 0.0f, 0.0f }, //specular1 + { 0.0f, 0.0f, 0.0f }, //emission + }; + +int Rasterizer3DS::RenderList::max_elements; + +void Rasterizer3DS::init() +{ + print("citro init "); + C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); + draw_next_frame = false; + + canvas_shader = memnew(Shader); + canvas_shader->set_data(shader_builtin_2d, sizeof(shader_builtin_2d)); + + scene_shader = memnew(Shader); + scene_shader->set_data_3d(shader_builtin_3d, sizeof(shader_builtin_3d)); + + // Setup default render target (screen framebuffer) + base_framebuffer = memnew(RenderTarget); + Texture *texture = memnew(Texture); + + base_framebuffer->target = C3D_RenderTargetCreate(480, 800, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8); + C3D_RenderTargetSetOutput(base_framebuffer->target, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS); + C3D_RenderTargetClear(base_framebuffer->target,C3D_CLEAR_ALL,CLEAR_COLOR,0); + base_framebuffer->texture_ptr = texture; + base_framebuffer->texture = texture_owner.make_rid( texture ); + + // Frag lighting + C3D_LightEnvInit(&lightEnv); + C3D_LightEnvBind(&lightEnv); + C3D_LightEnvMaterial(&lightEnv, &material); + + LightLut_Phong(&lut_Phong, 30); + C3D_LightEnvLut(&lightEnv, GPU_LUT_D0, GPU_LUTINPUT_LN, false, &lut_Phong); + + C3D_FVec lightVec = { { 1.0, -1.5, 0.0, 0.0 } }; + + +// C3D_LightInit(&light, &lightEnv); +// C3D_LightColor(&light, 1.0, 1.0, 1.0); +// C3D_LightPosition(&light, &lightVec); + +// C3D_LightSpotEnable(&light, true); +// C3D_LightSpotDir(&light, 1.0, 1.0, 1.0); + /* + const C3D_Material material = + { + { 0.0f, 0.0f, 0.0f }, //ambient + { 1.0f, 0.0f, 0.4f }, //diffuse + { 0.8f, 0.8f, 0.8f }, //specular0 + { 0.0f, 0.0f, 0.0f }, //specular1 + { 0.0f, 0.0f, 0.0f }, //emission + }; + + C3D_LightEnvInit(&lightEnv); + C3D_LightEnvBind(&lightEnv); + C3D_LightEnvMaterial(&lightEnv, &material); + LightLut_Phong(&lut_Phong, 30); + C3D_LightEnvLut(&lightEnv, GPU_LUT_D0, GPU_LUTINPUT_LN, false, &lut_Phong); + + C3D_LightInit(&light, &lightEnv);*/ + + C3D_DepthTest(false, GPU_GEQUAL, GPU_WRITE_ALL); +// C3D_CullFace(GPU_CULL_FRONT_CCW); + C3D_CullFace(GPU_CULL_NONE); + + RenderList::max_elements=GLOBAL_DEF("rasterizer/max_render_elements",(int)RenderList::DEFAULT_MAX_ELEMENTS); + if (RenderList::max_elements>64000) + RenderList::max_elements=64000; + if (RenderList::max_elements<1024) + RenderList::max_elements=1024; + + opaque_render_list.init(); + alpha_render_list.init(); + C3D_SetFrameBuf(&base_framebuffer->target->frameBuf); + + + // render_target_create(); +} +void Rasterizer3DS::finish() +{ + print("citro finish\n"); + + memdelete(canvas_shader); + memdelete(scene_shader); + memdelete(base_framebuffer->texture_ptr); + memdelete(base_framebuffer); + + C3D_Fini(); } int Rasterizer3DS::get_render_info(VS::RenderInfo p_info) { - return 0; -} + switch(p_info) { -bool Rasterizer3DS::needs_to_draw_next_frame() const { + case VS::INFO_OBJECTS_IN_FRAME: { - return false; -} + return _rinfo.object_count; + } break; + case VS::INFO_VERTICES_IN_FRAME: { + return _rinfo.vertex_count; + } break; + case VS::INFO_MATERIAL_CHANGES_IN_FRAME: { -bool Rasterizer3DS::has_feature(VS::Features p_feature) const { + return _rinfo.mat_change_count; + } break; + case VS::INFO_SHADER_CHANGES_IN_FRAME: { - return false; + return _rinfo.shader_change_count; + } break; + case VS::INFO_DRAW_CALLS_IN_FRAME: { + + return _rinfo.draw_calls; + } break; + case VS::INFO_SURFACE_CHANGES_IN_FRAME: { + + return _rinfo.surface_count; + } break; + case VS::INFO_USAGE_VIDEO_MEM_TOTAL: { + + return 0; + } break; + case VS::INFO_VIDEO_MEM_USED: { + + return get_render_info(VS::INFO_TEXTURE_MEM_USED)+get_render_info(VS::INFO_VERTEX_MEM_USED); + } break; + case VS::INFO_TEXTURE_MEM_USED: { + + return _rinfo.texture_mem; + } break; + case VS::INFO_VERTEX_MEM_USED: { + + return 0; + } break; + } + + return 0; +} +bool Rasterizer3DS::needs_to_draw_next_frame() const +{ + return false; + return draw_next_frame; } -Rasterizer3DS::Rasterizer3DS() { +bool Rasterizer3DS::has_feature(VS::Features p_feature) const +{ + switch (p_feature) { + default: + case VS::FEATURE_MULTITHREADED: return false; + case VS::FEATURE_SHADERS: return true; + case VS::FEATURE_NEEDS_RELOAD_HOOK: return false; + } +} + +void Rasterizer3DS::restore_framebuffer() +{ + print("restore_framebuffer\n"); + current_rt = NULL; + C3D_SetFrameBuf(&base_framebuffer->target->frameBuf); +} +Rasterizer3DS::Rasterizer3DS() +: current_rt (NULL) +{ + }; -Rasterizer3DS::~Rasterizer3DS() { - shaderProgramFree(&program); - DVLB_Free(simple_2ds); - C3D_Fini(); +Rasterizer3DS::~Rasterizer3DS() +{ + }; +// #endif diff --git a/platform/3ds/rasterizer_3ds.h b/platform/3ds/rasterizer_3ds.h index 123edd68..1ef47fea 100644 --- a/platform/3ds/rasterizer_3ds.h +++ b/platform/3ds/rasterizer_3ds.h @@ -1,11 +1,11 @@ /*************************************************************************/ -/* rasterizer_3ds.h */ +/* rasterizer_citro3d.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* http://www.godotengine.org */ /*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ @@ -29,20 +29,6 @@ #ifndef RASTERIZER_3DS_H #define RASTERIZER_3DS_H -#ifdef __3DS__ -extern "C" { -#include <3ds/types.h> -#include <3ds/gpu/gpu.h> -#include <3ds/gfx.h> -#include <3ds/gpu/gx.h> -#include <3ds/gpu/shaderProgram.h> -#include <3ds/allocator/linear.h> -} -#undef __3DS__ -#include -#define __3DS__ -#endif - #include "servers/visual/rasterizer.h" #include "image.h" @@ -53,49 +39,33 @@ extern "C" { #include "camera_matrix.h" #include "sort.h" - #include "servers/visual/particle_system_sw.h" -static uint32_t convert_color(const Color* ic) { - - uint32_t c=(uint8_t)(ic->r*255); - c<<=8; - c|=(uint8_t)(ic->g*255); - c<<=8; - c|=(uint8_t)(ic->b*255); - c<<=8; - c|=(uint8_t)(ic->a*255); - - return c; +#ifdef __3DS__ +extern "C" { +#include <3ds/types.h> +#include <3ds/gpu/gpu.h> +#include <3ds/gfx.h> +#include <3ds/gpu/gx.h> +#include <3ds/gpu/shaderProgram.h> +#include <3ds/allocator/linear.h> } -typedef struct { float position[3]; float texcoord[2]; float normal[3]; } vertex3ds; - -typedef struct { - Vector3 position; - Vector2 texcoord; -} VertexArray; +#undef __3DS__ +#include +#define __3DS__ +#endif class Rasterizer3DS : public Rasterizer { - - - void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h,bool p_flip_v ); - DVLB_s* simple_3ds; - DVLB_s* simple_2ds; - shaderProgram_s program; - - C3D_Mtx projection; - C3D_Mtx modelView; - int uLoc_projection, uLoc_modelView; - + struct Texture { uint32_t flags; int width,height; + C3D_Tex tex; Image::Format format; Image image[6]; - C3D_Tex texture; Texture() { - + tex.data = NULL; flags=width=height=0; format=Image::FORMAT_GRAYSCALE; } @@ -106,13 +76,6 @@ class Rasterizer3DS : public Rasterizer { }; mutable RID_Owner texture_owner; - - struct RenderTarget { - C3D_RenderTarget* target; - }; - - mutable RID_Owner render_target_owner; - uint32_t clear_color_top; struct Shader { @@ -127,15 +90,65 @@ class Rasterizer3DS : public Rasterizer { bool valid; bool has_alpha; bool use_world_transform; - + + DVLB_s* dvlb; + shaderProgram_s program; + + int location_projection; + int location_modelview; + int location_worldTransform; + int location_extra; + int location_material; + int uLoc_lightVec, uLoc_lightHalfVec, uLoc_lightClr; + + void set_data(void* data, u32 size) + { + dvlb = DVLB_ParseFile(reinterpret_cast(data), size); + shaderProgramSetVsh(&program, &dvlb->DVLE[0]); + location_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); + location_modelview = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); + location_worldTransform = shaderInstanceGetUniformLocation(program.vertexShader, "worldTransform"); + location_extra = shaderInstanceGetUniformLocation(program.vertexShader, "extra"); + } + + void set_data_3d(void* data, u32 size) + { + dvlb = DVLB_ParseFile(reinterpret_cast(data), size); + shaderProgramSetVsh(&program, &dvlb->DVLE[0]); + location_projection = shaderInstanceGetUniformLocation(program.vertexShader, "projection"); + location_modelview = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); + location_worldTransform = shaderInstanceGetUniformLocation(program.vertexShader, "worldTransform"); + location_extra = shaderInstanceGetUniformLocation(program.vertexShader, "extra"); + uLoc_lightVec = shaderInstanceGetUniformLocation(program.vertexShader, "lightVec"); + uLoc_lightHalfVec = shaderInstanceGetUniformLocation(program.vertexShader, "lightHalfVec"); + uLoc_lightClr = shaderInstanceGetUniformLocation(program.vertexShader, "lightClr"); + location_material = shaderInstanceGetUniformLocation(program.vertexShader, "material"); + } + + Shader() + { + dvlb = NULL; + shaderProgramInit(&program); + } + ~Shader() + { + shaderProgramFree(&program); + if (dvlb) + DVLB_Free(dvlb); + } }; mutable RID_Owner shader_owner; + + Shader* canvas_shader; + Shader* scene_shader; + struct Material { bool flags[VS::MATERIAL_FLAG_MAX]; + bool fixed_flags[VS::FIXED_MATERIAL_FLAG_MAX]; VS::MaterialDepthDrawMode depth_draw_mode; @@ -145,9 +158,17 @@ class Rasterizer3DS : public Rasterizer { float point_size; RID shader; // shader material - - Map shader_params; - + uint64_t last_pass; + Shader *shader_cache; + + struct UniformData { + bool inuse; + bool istexture; + Variant value; + int index; + }; + + Map shader_params; Material() { @@ -160,6 +181,7 @@ class Rasterizer3DS : public Rasterizer { line_width=1; blend_mode=VS::MATERIAL_BLEND_MODE_MIX; point_size = 1.0; + shader_cache=NULL; } }; @@ -196,32 +218,86 @@ class Rasterizer3DS : public Rasterizer { struct Surface : public Geometry { + struct ArrayData { + + uint32_t ofs,size,count; + bool normalize; + bool bind; + + ArrayData() { ofs=0; size=0; count=0; normalize=0; bind=false;} + }; + + Mesh *mesh; + Array data; Array morph_data; + ArrayData array[VS::ARRAY_MAX]; + // support for vertex array objects + u32 array_object_id; + // Arrays stored in linearMem + u8 *array_local; + u8 *index_array_local; + Vector skeleton_bone_aabb; + Vector skeleton_bone_used; + + //bool packed; + + struct MorphTarget { + uint32_t configured_format; + uint8_t *array; + }; - bool packed; - bool alpha_sort; + MorphTarget* morph_targets_local; int morph_target_count; AABB aabb; + int array_len; + int index_array_len; + int max_bone; + + float vertex_scale; + float uv_scale; + float uv2_scale; + + bool alpha_sort; + VS::PrimitiveType primitive; uint32_t format; + uint32_t configured_format; + + int stride; + int local_stride; uint32_t morph_format; - RID material; - bool material_owned; + bool active; + Point2 uv_min; + Point2 uv_max; - Surface() { + Surface() + { + array_len=0; + local_stride=0; + morph_format=0; + type=GEOMETRY_SURFACE; + primitive=VS::PRIMITIVE_POINTS; + index_array_len=0; + vertex_scale=1.0; + uv_scale=1.0; + uv2_scale=1.0; + + alpha_sort=false; - packed=false; - morph_target_count=0; - material_owned=false; format=0; - morph_format=0; + stride=0; + morph_targets_local=0; + morph_target_count=0; - primitive=VS::PRIMITIVE_POINTS; + array_local = index_array_local = NULL; + + active=false; + //packed=false; } ~Surface() { @@ -301,7 +377,6 @@ class Rasterizer3DS : public Rasterizer { }; mutable RID_Owner particles_owner; - struct ParticlesInstance : public GeometryOwner { @@ -334,7 +409,8 @@ class Rasterizer3DS : public Rasterizer { RID projector; bool volumetric_enabled; Color volumetric_color; - + + C3D_Light light; Light() { @@ -351,6 +427,10 @@ class Rasterizer3DS : public Rasterizer { volumetric_enabled=false; } }; + + // C3D_Light light; + C3D_LightEnv lightEnv; + C3D_LightLut lut_Phong; struct Environment { @@ -431,7 +511,8 @@ class Rasterizer3DS : public Rasterizer { Vector3 light_vector; Vector3 spot_vector; float linear_att; - + uint64_t last_pass; + uint16_t sort_key; LightInstance() { linear_att=1.0; } @@ -439,11 +520,367 @@ class Rasterizer3DS : public Rasterizer { mutable RID_Owner light_owner; mutable RID_Owner light_instance_owner; + + LightInstance *shadow; + uint64_t scene_pass; + /*********/ + /* FRAME */ + /*********/ + + struct _Rinfo { + + int texture_mem; + int vertex_count; + int object_count; + int mat_change_count; + int surface_count; + int shader_change_count; + int ci_draw_commands; + int draw_calls; + + } _rinfo; + + + /*******************/ + /* CANVAS OCCLUDER */ + /*******************/ + struct CanvasOccluder { + + u32 vertex_id; // 0 means, unconfigured + u32 index_id; // 0 means, unconfigured + DVector lines; + int len; + }; + + RID_Owner canvas_occluder_owner; + + /***********************/ + /* CANVAS LIGHT SHADOW */ + /***********************/ + struct CanvasLightShadow { + + int size; + int height; + + C3D_RenderTarget *renderTarget; + C3D_Tex texture; + + u32 fbo; + u32 rbo; + u32 depth; + u32 rgba; //for older devices + + u32 blur; + + }; + + RID_Owner canvas_light_shadow_owner; + RID canvas_shadow_blur; + + + struct RenderTarget + { + Texture *texture_ptr; + RID texture; + C3D_RenderTarget *target; + }; + mutable RID_Owner render_target_owner; + + + struct RenderList { + + enum { + DEFAULT_MAX_ELEMENTS=4096, + MAX_LIGHTS=8, + SORT_FLAG_SKELETON=1, + SORT_FLAG_INSTANCING=2, + }; + + static int max_elements; + + struct Element { + float depth; + const InstanceData *instance; + const Skeleton *skeleton; + const Geometry *geometry; + const Geometry *geometry_cmp; + const Material *material; + const GeometryOwner *owner; + bool *additive_ptr; + bool additive; + uint16_t lights[MAX_LIGHTS]; + bool mirror; + uint16_t light_count; + union { + struct { + uint16_t light; + uint8_t light_type; + uint8_t sort_flags; + }; + + uint64_t light_key; + uint32_t sort_key; + }; + }; + + + Element *_elements; + Element **elements; + int element_count; + + void clear() { + + element_count=0; + } + + struct SortZ { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + + return A->depth > B->depth; + } + }; + + void sort_z() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + + struct SortMatGeom { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + // TODO move to a single uint64 (one comparison) + if (A->material->shader_cache == B->material->shader_cache) { + if (A->material == B->material) { + + return A->geometry_cmp < B->geometry_cmp; + } else { + + return (A->material < B->material); + } + } else { + + return A->material->shader_cache < B->material->shader_cache; + } + } + }; + + void sort_mat_geom() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + struct SortMatLight { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + + if (A->geometry_cmp == B->geometry_cmp) { + + if (A->material == B->material) { + + return A->lightlight; + } else { + + return (A->material < B->material); + } + } else { + + return (A->geometry_cmp < B->geometry_cmp); + } + } + }; + + void sort_mat_light() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + struct SortMatLightType { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + + if (A->light_type == B->light_type) { + if (A->material->shader_cache == B->material->shader_cache) { + if (A->material == B->material) { + + return (A->geometry_cmp < B->geometry_cmp); + } else { + + return (A->material < B->material); + } + } else { + + return (A->material->shader_cache < B->material->shader_cache); + } + } else { + + return A->light_type < B->light_type; + } + } + }; + + void sort_mat_light_type() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + struct SortMatLightTypeFlags { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + + if (A->sort_key == B->sort_key) { + if (A->material->shader_cache == B->material->shader_cache) { + if (A->material == B->material) { + + return (A->geometry_cmp < B->geometry_cmp); + } else { + + return (A->material < B->material); + } + } else { + + return (A->material->shader_cache < B->material->shader_cache); + } + } else { + + return A->sort_key < B->sort_key; //one is null and one is not + } + } + }; + + void sort_mat_light_type_flags() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + _FORCE_INLINE_ Element* add_element() { + + if (element_count>=max_elements) + return NULL; + elements[element_count]=&_elements[element_count]; + return elements[element_count++]; + } + + void init() { + + element_count = 0; + elements=memnew_arr(Element*,max_elements); + _elements=memnew_arr(Element,max_elements); + for (int i=0;i(linearAlloc(sizeof(Vertex) * vertexCount)); + } + ~VertexArray() { + linearFree(vertices); + } + }; + + Vector vertexArrays; + + // LightInstance *light_instances[MAX_SCENE_LIGHTS]; + // LightInstance *directional_lights[4]; + // int light_instance_count; + + Error _surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main); + + bool _setup_material(const Geometry *p_geometry, const Material *p_material, bool p_no_const_light, bool p_opaque_pass); +// void _setup_skeleton(const Skeleton *p_skeleton); + void _setup_light(uint16_t p_light); + + + Error _setup_geometry(const Geometry *p_geometry, const Material* p_material,const Skeleton *p_skeleton, const float *p_morphs); + void _render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner,const Transform& p_xform); + + void _set_uniform(int uniform_location, const Matrix32& p_transform); + void _set_uniform(int uniform_location, const Transform& p_transform); + void _set_uniform(int uniform_location, const CameraMatrix& p_matrix); + void _set_uniform(int uniform_location, const Color& p_color); + + // void _set_canvas_scissor(CanvasItem* p_item); + Texture *_bind_texture(const RID& p_texture); + + void _add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner,int p_material=-1); + + void _render_list_forward(RenderList *p_render_list,const Transform& p_view_transform,const Transform& p_view_transform_inverse, const CameraMatrix& p_projection,bool p_reverse_cull=false,bool p_fragment_light=false,bool p_alpha_pass=false); + + void _draw_quad(const Rect2& p_rect); + void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_h_flip=false, bool p_v_flip=false, bool p_transpose=false); + + // template + // _FORCE_INLINE_ void _canvas_item_render_commands(CanvasItem *p_item,CanvasItem *current_clip,bool &reclip); public: @@ -463,6 +900,12 @@ class Rasterizer3DS : public Rasterizer { virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; + virtual void texture_set_path(RID p_texture,const String& p_path) {} + virtual String texture_get_path(RID p_texture) const { return String(); } + // virtual void texture_debug_usage(List *r_info) {} + + virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable) {} + /* SHADER API */ virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); @@ -477,6 +920,12 @@ class Rasterizer3DS : public Rasterizer { virtual void shader_get_param_list(RID p_shader, List *p_param_list) const; + + virtual void shader_set_default_texture_param(RID p_shader, const StringName& p_name, RID p_texture); + virtual RID shader_get_default_texture_param(RID p_shader, const StringName& p_name) const; + + virtual Variant shader_get_default_param(RID p_shader, const StringName& p_name); + /* COMMON MATERIAL API */ virtual RID material_create(); @@ -713,6 +1162,7 @@ class Rasterizer3DS : public Rasterizer { virtual void begin_frame(); virtual void set_viewport(const VS::ViewportRect& p_viewport); + virtual void set_time_scale(float p_scale); virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false); virtual void clear_viewport(const Color& p_color); virtual void capture_viewport(Image* r_capture); @@ -728,16 +1178,18 @@ class Rasterizer3DS : public Rasterizer { virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); - virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} + virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data); virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); virtual void end_scene(); virtual void end_shadow_map(); virtual void end_frame(); + virtual void flush_frame(); /* CANVAS API */ + virtual void begin_canvas_bg(); virtual void canvas_begin(); virtual void canvas_disable_blending(); virtual void canvas_set_opacity(float p_opacity); @@ -752,6 +1204,16 @@ class Rasterizer3DS : public Rasterizer { virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor); virtual void canvas_set_transform(const Matrix32& p_transform); + // virtual void canvas_render_items(CanvasItem *p_item_list,int p_z,const Color& p_modulate,CanvasLight *p_light); + + virtual RID canvas_light_occluder_create(); + virtual void canvas_light_occluder_set_polylines(RID p_occluder, const DVector& p_lines); + + virtual RID canvas_light_shadow_buffer_create(int p_width); + // virtual void canvas_light_shadow_buffer_update(RID p_buffer, const Matrix32& p_light_xform, int p_light_mask,float p_near, float p_far, CanvasLightOccluderInstance* p_occluders, CameraMatrix *p_xform_cache); + + // virtual void canvas_debug_viewport_shadows(CanvasLight* p_lights_with_shadow); + /* ENVIRONMENT */ virtual RID environment_create(); @@ -787,6 +1249,7 @@ class Rasterizer3DS : public Rasterizer { virtual bool is_particles_instance(const RID& p_rid) const; virtual bool is_skeleton(const RID& p_rid) const; virtual bool is_environment(const RID& p_rid) const; + virtual bool is_canvas_light_occluder(const RID& p_rid) const; virtual bool is_shader(const RID& p_rid) const; @@ -809,10 +1272,11 @@ class Rasterizer3DS : public Rasterizer { virtual bool has_feature(VS::Features p_feature) const; + virtual void restore_framebuffer(); Rasterizer3DS(); virtual ~Rasterizer3DS(); }; -#endif // RASTERIZER_DUMMY_H +#endif // RASTERIZER_CITRO3D_H diff --git a/platform/3ds/shaders/2d.h b/platform/3ds/shaders/2d.h new file mode 100644 index 00000000..447fb012 --- /dev/null +++ b/platform/3ds/shaders/2d.h @@ -0,0 +1,3 @@ +/* Auto-generated from platform/3ds/shaders/2d.shbin */ +static uint8_t shader_builtin_2d[] = +{68,86,76,66,1,0,0,0,176,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,17,0,0,0,108,0,0,0,7,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,136,34,10,3,152,34,10,4,168,34,10,5,184,34,10,130,72,66,10,131,88,66,10,132,104,66,10,133,120,66,10,2,9,2,8,3,25,2,8,4,41,2,8,5,57,2,8,6,16,32,76,6,32,64,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,17,0,0,0,0,0,7,0,0,0,0,0,64,0,0,0,1,0,0,0,84,0,0,0,0,0,0,0,84,0,0,0,3,0,0,0,108,0,0,0,3,0,0,0,132,0,0,0,27,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,0,0,190,0,0,0,0,0,15,0,0,0,3,0,1,0,15,0,0,0,2,0,2,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,21,0,0,0,24,0,27,0,112,114,111,106,101,99,116,105,111,110,0,109,111,100,101,108,86,105,101,119,0,101,120,116,114,97,0,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/2d.pica b/platform/3ds/shaders/2d.pica new file mode 100644 index 00000000..c9d1c60f --- /dev/null +++ b/platform/3ds/shaders/2d.pica @@ -0,0 +1,48 @@ +; Uniforms +.fvec projection[4], modelView[4], extra[4] + +; Constants +.constf myconst(0.0, 1.0, -1.0, -0.5) +;.constf myconst2(0.3, 0.0, 0.0, 0.0) +.alias zeros myconst.xxxx ; Vector full of zeros +.alias ones myconst.yyyy ; Vector full of ones + +; Outputs +.out outpos position +.out outtc0 texcoord0 +.out outclr color + +; Inputs (defined as aliases for convenience) +.alias inpos v0 +.alias intex v1 +.alias incol v2 + +.proc main + ; Force the w component of inpos to be 1.0 + mov r0.xyz, inpos + mov r0.w, ones + + ; r1 = extra * inpos + dp4 r1.x, extra[0], r0 + dp4 r1.y, extra[1], r0 + dp4 r1.z, extra[2], r0 + dp4 r1.w, extra[3], r0 + + ; r2 = modelView * r1 + dp4 r2.x, modelView[0], r1 + dp4 r2.y, modelView[1], r1 + dp4 r2.z, modelView[2], r1 + dp4 r2.w, modelView[3], r1 + + ; outpos = projection * r2 + dp4 outpos.x, projection[0], r2 + dp4 outpos.y, projection[1], r2 + dp4 outpos.z, projection[2], r2 + dp4 outpos.w, projection[3], r2 + + mov outtc0, intex + + mov outclr, incol + + end +.end diff --git a/platform/3ds/shaders/2d.shbin b/platform/3ds/shaders/2d.shbin new file mode 100644 index 0000000000000000000000000000000000000000..48e797c9849a33055ae4c20d65d93b66b39afaab GIT binary patch literal 336 zcmZ<>^KoKiU|`q)#4cez0YHjD1BeBII0uN?fp`fJqX9q05A1$S9ZFoxGnBYkRw!|? z?oi@t@^Ip6j&R~?$#CLot#IOE;$-4rmSo~!(PZLawPfO86HxGBQ*iJBn$?lV3^8#b z7lh6@%m!wpK#Xi7m*epYI7 aNoIZ?LvDUbYED>YYB@t{MM+U20|Nj^6(;ro literal 0 HcmV?d00001 diff --git a/platform/3ds/shaders/3d.h b/platform/3ds/shaders/3d.h new file mode 100644 index 00000000..4f2c586b --- /dev/null +++ b/platform/3ds/shaders/3d.h @@ -0,0 +1,3 @@ +/* Auto-generated from platform/3ds/shaders/3d.shbin */ +static uint8_t shader_builtin_3d[] = +{68,86,76,66,1,0,0,0,28,1,0,0,68,86,76,80,0,0,0,0,40,0,0,0,34,0,0,0,176,0,0,0,12,0,0,0,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,136,34,10,3,152,34,10,4,168,34,10,5,184,34,10,130,72,2,10,131,88,2,10,132,104,2,10,133,120,2,10,6,0,97,76,2,8,2,8,3,24,2,8,4,40,2,8,5,56,2,8,7,32,32,76,130,128,194,7,131,144,194,7,132,160,194,7,2,239,193,6,2,96,193,62,0,235,193,35,8,240,7,78,9,255,135,2,10,250,135,34,1,250,167,189,7,64,129,62,10,255,167,34,0,124,128,179,4,64,1,58,11,90,1,34,7,0,129,76,9,240,71,76,0,0,0,136,110,3,0,0,0,0,0,0,161,0,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,127,3,0,0,0,0,0,0,111,3,0,0,0,0,0,0,15,8,0,0,0,0,0,0,175,138,42,0,0,0,0,0,239,223,6,0,0,0,0,0,108,195,6,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,34,0,0,0,0,0,31,0,0,0,0,0,64,0,0,0,1,0,0,0,84,0,0,0,0,0,0,0,84,0,0,0,5,0,0,0,124,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,0,0,62,0,0,0,0,0,15,0,0,0,3,0,1,0,15,0,0,0,2,0,2,0,15,0,0,0,8,0,3,0,15,0,0,0,1,0,4,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,26,0,0,0,24,0,27,0,36,0,0,0,28,0,31,0,112,114,111,106,101,99,116,105,111,110,0,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,111,100,101,108,86,105,101,119,0,101,120,116,114,97,0,0,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/3d.pica b/platform/3ds/shaders/3d.pica new file mode 100644 index 00000000..fce1ff57 --- /dev/null +++ b/platform/3ds/shaders/3d.pica @@ -0,0 +1,77 @@ +; Uniforms +.fvec projection[4], worldTransform[4], modelView[4], extra[4] + +; Constants +.constf myconst(0.0, 1.0, -1.0, 0.5) +.alias zeros myconst.xxxx ; Vector full of zeros +.alias ones myconst.yyyy ; Vector full of ones +.alias half myconst.wwww + +; Outputs +.out outpos position +.out outtc0 texcoord0 +.out outclr color +.out outview view +.out outnq normalquat + +; Inputs (defined as aliases for convenience) +.alias inpos v0 +.alias innrm v1 +.alias intex v2 + +.proc main + ; Force the w component of inpos to be 1.0 + mov r0.xyz, inpos + mov r0.w, ones + + ; r1 = modelView * inpos + dp4 r1.x, modelView[0], r0 + dp4 r1.y, modelView[1], r0 + dp4 r1.z, modelView[2], r0 + dp4 r1.w, modelView[3], r0 + + ; r0 = worldTransform * r1 + dp4 r0.x, worldTransform[0], r1 + dp4 r0.y, worldTransform[1], r1 + dp4 r0.z, worldTransform[2], r1 + dp4 r0.w, worldTransform[3], r1 + + ; outview = -r0 + mov outview, -r0 + + ; outpos = projection * r0 + dp4 outpos.x, projection[0], r0 + dp4 outpos.y, projection[1], r0 + dp4 outpos.z, projection[2], r0 + dp4 outpos.w, projection[3], r0 + + ; outtex = intex + mov outtc0, intex + + ; Transform the normal vector with the modelView matrix + ; TODO: use a separate normal matrix that is the transpose of the inverse of modelView + dp3 r14.x, modelView[0], innrm + dp3 r14.y, modelView[1], innrm + dp3 r14.z, modelView[2], innrm + dp3 r6.x, r14, r14 + rsq r6.x, r6.x + mul r14.xyz, r14.xyz, r6.x + + mov r0, myconst.yxxx + add r4, ones, r14.z + mul r4, half, r4 + cmp zeros, ge, ge, r4.x + rsq r4, r4.x + mul r5, half, r14 + jmpc cmp.x, degenerate + + rcp r0.z, r4.x + mul r0.xy, r5, r4 + +degenerate: + mov outnq, r0 + mov outclr, ones + + ; We're finished + end +.end diff --git a/platform/3ds/shaders/3d.shbin b/platform/3ds/shaders/3d.shbin new file mode 100644 index 0000000000000000000000000000000000000000..bdc4c4b7bb666c67f1c31a209e14949d050da7d7 GIT binary patch literal 484 zcmY+A&r1SP5XWa{SNHi06bh0Ol2-@mFNh8%Vbo!f4kFQ|w%pKAH#R{JLjDS+Q^yV+ z>SVWqE?pwDKcqjPgPy(EyxqMtkMDfuJ-%-kCX+XI6#$4+%H)khDj`V{q&Lz6DJl*B zBdbjHEDi)$9|YH41P^=&-Z?C!-*qj#BVDT4&TVH18vy^@TDUe(LFViqD4vnyq&&t!#&n6`@1h2u=458fQ>d zy`i4{*^1vmw<`EN^J)6L@%^^X2=hL^-fgWAfmE_!; z#{kt$l16$Y$&Lsolx6IYzDOx~fe1;Z4w6VmlF^H#LLDS!L}3xa#3fjU6=DolVS^Z_ oIj$W0(mJn|>?+i4r(DQ6X7&2Qb}CS@3syN_vg%+pYK}?%KU#}P-~a#s literal 0 HcmV?d00001 diff --git a/platform/3ds/shaders/SCsub b/platform/3ds/shaders/SCsub index 111f1f57..9bdfd1e0 100644 --- a/platform/3ds/shaders/SCsub +++ b/platform/3ds/shaders/SCsub @@ -2,7 +2,9 @@ Import('env') shaders = [ 'simple_3d', - 'simple_2d' + 'simple_2d', + '2d', + '3d' ] if 'PICA' in env['BUILDERS']: diff --git a/platform/3ds/shaders/simple_2d.h b/platform/3ds/shaders/simple_2d.h index 85a82b9b..4622fad0 100644 --- a/platform/3ds/shaders/simple_2d.h +++ b/platform/3ds/shaders/simple_2d.h @@ -1,3 +1,3 @@ /* Auto-generated from platform/3ds/shaders/simple_2d.shbin */ static uint8_t shader_builtin_simple_2d[] = -{68,86,76,66,1,0,0,0,156,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,12,0,0,0,88,0,0,0,7,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,72,66,10,3,88,66,10,4,104,66,10,5,120,66,10,2,9,2,8,3,25,2,8,4,41,2,8,5,57,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,12,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,3,0,0,0,144,0,0,0,26,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,3,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,21,0,0,0,120,0,120,0,112,114,111,106,101,99,116,105,111,110,0,109,111,100,101,108,86,105,101,119,0,116,101,115,116,0,0,0}; \ No newline at end of file +{68,86,76,66,1,0,0,0,140,0,0,0,68,86,76,80,0,0,0,0,40,0,0,0,8,0,0,0,72,0,0,0,7,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,8,2,8,3,24,2,8,4,40,2,8,5,56,2,8,6,16,32,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,111,3,0,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,8,0,0,0,0,0,3,0,0,0,0,0,64,0,0,0,2,0,0,0,104,0,0,0,0,0,0,0,104,0,0,0,2,0,0,0,120,0,0,0,1,0,0,0,128,0,0,0,11,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,153,153,59,0,2,0,94,0,51,51,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,2,0,1,0,15,0,0,0,0,0,0,0,16,0,19,0,112,114,111,106,101,99,116,105,111,110,0,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/simple_2d.pica b/platform/3ds/shaders/simple_2d.pica index 876c1ef3..79077d12 100644 --- a/platform/3ds/shaders/simple_2d.pica +++ b/platform/3ds/shaders/simple_2d.pica @@ -1,7 +1,7 @@ ; Example PICA200 vertex shader ; Uniforms -.fvec projection[4], modelView[4] +.fvec projection[4] ; Constants .constf myconst(0.0, 1.0, -1.0, 0.1) @@ -11,14 +11,11 @@ ; Outputs .out outpos position -; .out outclr color -.out outtc0 texcoord0 +.out outclr color ; Inputs (defined as aliases for convenience) .alias inpos v0 -.alias intex v1 - -.bool test +.alias inclr v1 .proc main ; Force the w component of inpos to be 1.0 @@ -26,24 +23,13 @@ mov r0.w, ones ; outpos = projectionMatrix * inpos - ; dp4 outpos.x, projection[0], r0 - ; dp4 outpos.y, projection[1], r0 - ; dp4 outpos.z, projection[2], r0 - ; dp4 outpos.w, projection[3], r0 - - dp4 r2.x, modelView[0], r0 - dp4 r2.y, modelView[1], r0 - dp4 r2.z, modelView[2], r0 - dp4 r2.w, modelView[3], r0 - - ; outpos = projection * r2 - dp4 outpos.x, projection[0], r2 - dp4 outpos.y, projection[1], r2 - dp4 outpos.z, projection[2], r2 - dp4 outpos.w, projection[3], r2 + dp4 outpos.x, projection[0], r0 + dp4 outpos.y, projection[1], r0 + dp4 outpos.z, projection[2], r0 + dp4 outpos.w, projection[3], r0 ; outclr = inclr - mov outtc0, intex + mov outclr, inclr ; We're finished end diff --git a/platform/3ds/shaders/simple_2d.pica Kopie b/platform/3ds/shaders/simple_2d.pica Kopie new file mode 100644 index 00000000..876c1ef3 --- /dev/null +++ b/platform/3ds/shaders/simple_2d.pica Kopie @@ -0,0 +1,50 @@ +; Example PICA200 vertex shader + +; Uniforms +.fvec projection[4], modelView[4] + +; Constants +.constf myconst(0.0, 1.0, -1.0, 0.1) +.constf myconst2(0.3, 0.0, 0.0, 0.0) +.alias zeros myconst.xxxx ; Vector full of zeros +.alias ones myconst.yyyy ; Vector full of ones + +; Outputs +.out outpos position +; .out outclr color +.out outtc0 texcoord0 + +; Inputs (defined as aliases for convenience) +.alias inpos v0 +.alias intex v1 + +.bool test + +.proc main + ; Force the w component of inpos to be 1.0 + mov r0.xyz, inpos + mov r0.w, ones + + ; outpos = projectionMatrix * inpos + ; dp4 outpos.x, projection[0], r0 + ; dp4 outpos.y, projection[1], r0 + ; dp4 outpos.z, projection[2], r0 + ; dp4 outpos.w, projection[3], r0 + + dp4 r2.x, modelView[0], r0 + dp4 r2.y, modelView[1], r0 + dp4 r2.z, modelView[2], r0 + dp4 r2.w, modelView[3], r0 + + ; outpos = projection * r2 + dp4 outpos.x, projection[0], r2 + dp4 outpos.y, projection[1], r2 + dp4 outpos.z, projection[2], r2 + dp4 outpos.w, projection[3], r2 + + ; outclr = inclr + mov outtc0, intex + + ; We're finished + end +.end diff --git a/platform/3ds/shaders/simple_2d.shbin b/platform/3ds/shaders/simple_2d.shbin index ed0144b1aaa15370742b472d3944978975bbca08..317f837069711d0dfbf97d17ad14f3e67d6db084 100644 GIT binary patch delta 129 zcmX@XG=s^@CCtZ(k%57s2Z({}03gMn0mK|Y>;c5=K->VtXuyy01G^s+2NMUg1QQ2~ z1``LX#l$E-MvjRq)j2`NH2^X9#GA%4Obm<+{7}sT48jZrMfq8&$t9Wjc?=8y|CSLv delta 177 zcmbQibb=|$CCtZ(k%56>4iE#`0YHjD1BiKmI0A^-fp`KCqX9q05A1$S9!^}$5l&nz z8BScR6;51CoJ<_dl1v;dnoJz5mJ_}F7IE4gHSwge4Ko8H13%O-0R~|P rZXjEPL7YJpNLK)1K~a8IYH~?tejY<^eoAUiSY~QDLrH3J2~ZvY16&&a diff --git a/platform/3ds/shaders/simple_3d.pica b/platform/3ds/shaders/simple_3d.pica index 03272ad5..42219f9f 100644 --- a/platform/3ds/shaders/simple_3d.pica +++ b/platform/3ds/shaders/simple_3d.pica @@ -22,6 +22,7 @@ .alias inpos v0 .alias intex v1 .alias innrm v2 +; .alias inclr v3 .proc main ; Force the w component of inpos to be 1.0 @@ -81,6 +82,7 @@ ; outclr = clamp r1 to [0,1] min outclr, ones, r1 + ;mov outclr, r1 ; We're finished end diff --git a/platform/3ds/thread_3ds.cpp b/platform/3ds/thread_3ds.cpp new file mode 100644 index 00000000..d2ebd5a6 --- /dev/null +++ b/platform/3ds/thread_3ds.cpp @@ -0,0 +1,71 @@ +/*************************************************************************/ +/* thread_3ds.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifdef __3DS__ +#include "thread_3ds.h" +#include "platform/3ds/os_3ds.h" +#include "memory.h" + + +Thread* Thread3ds::create_func_3ds(ThreadCreateCallback p_callback,void * p_user,const Thread::Settings& p_settings) { + // Get base thread priority for relative priority setting + int32_t priority; + svcGetThreadPriority(&priority, (Thread::_main_thread_id == 0) ? CUR_THREAD_HANDLE : Thread::_main_thread_id); + + if (p_settings.priority == PRIORITY_LOW) + priority++; + else if (p_settings.priority == PRIORITY_HIGH) + priority--; + + ThreadCtrWrapper* thread_wrapper = memnew(ThreadCtrWrapper(p_callback, p_user, priority)); + return memnew(Thread3ds(thread_wrapper)); +} + +void Thread3ds::make_default() { + create_func = create_func_3ds; + get_thread_ID_func = ThreadCtrWrapper::get_thread_ID_func_3ds; + wait_to_finish_func = wait_to_finish_func_3ds; +} + +Thread::ID Thread3ds::get_ID() const { + return id; +} + +void Thread3ds::wait_to_finish_func_3ds(Thread* p_thread) { + Thread3ds *t = static_cast(p_thread); + t->thread->wait(); +} + +Thread3ds::Thread3ds(ThreadCtrWrapper* p_thread) { + thread = p_thread; +} + +Thread3ds::~Thread3ds() { + memdelete(thread); +} +#endif diff --git a/platform/3ds/thread_3ds.h b/platform/3ds/thread_3ds.h new file mode 100644 index 00000000..b5ccebf5 --- /dev/null +++ b/platform/3ds/thread_3ds.h @@ -0,0 +1,99 @@ +/*************************************************************************/ +/* thread_3ds.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef THREAD_3DS_H +#define THREAD_3DS_H + +#include "core/os/thread.h" +// #include "core/os/mutex.h" +#include "thread_wrap.h" +// #include "thread_ctr_wrapper.h" + +extern "C" { +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/synchronization.h> +} + +/* +t + +extern "C" { +#include +#include <3ds/types.h> + + +} +struct Thread_tag +{ + Handle handle; + ThreadFunc ep; + void* arg; + int rc; + bool detached, finished; + struct _reent reent; + void* stacktop; +}; +Thread threadGetCurrent(void); +Thread threadCreate(ThreadFunc entrypoint, void* arg, size_t stack_size, int prio, int core_id, bool detached); +int threadGetExitCode(Thread thread); +Handle threadGetHandle(Thread thread); +void threadFree(Thread thread); +Result threadJoin(Thread thread, u64 timeout_ns); + + +class ThreadCtrWrapper +{ + Thread_tag* thread; + +public: + ThreadCtrWrapper(ThreadCreateCallback p_callback, void* p_userdata, int32_t p_priority); + + void wait(); + + static uint64_t get_thread_ID_func_3ds(); +};*/ + +class Thread3ds : public Thread { + + static Thread* create_func_3ds(ThreadCreateCallback p_callback,void * p_user,const Settings& p_settings=Settings()); + static void wait_to_finish_func_3ds(Thread* p_thread); + + ThreadCtrWrapper* thread; + ID id; + +public: + Thread3ds(ThreadCtrWrapper* p_thread); + ~Thread3ds(); + + virtual ID get_ID() const; + + static void make_default(); +}; + +#endif diff --git a/platform/3ds/thread_wrap.cpp b/platform/3ds/thread_wrap.cpp new file mode 100644 index 00000000..e248b865 --- /dev/null +++ b/platform/3ds/thread_wrap.cpp @@ -0,0 +1,48 @@ +/*************************************************************************/ +/* thread_ctr_wrapper.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifdef __3DS__ +#include "thread_wrap.h" +#include <3ds.h> + +ThreadCtrWrapper::ThreadCtrWrapper(ThreadCreateCallback p_callback, void* p_userdata, int32_t p_priority) { + thread = threadCreate(p_callback, p_userdata, 64 * 1024, p_priority, -1, false); +} + +uint64_t ThreadCtrWrapper::get_thread_ID_func_3ds() { + if (!threadGetCurrent()) + return CUR_THREAD_HANDLE; + return threadGetHandle(threadGetCurrent()); +} + +void ThreadCtrWrapper::wait() { + threadJoin(thread, U64_MAX); + threadFree(thread); +} + +#endif diff --git a/platform/3ds/thread_wrap.h b/platform/3ds/thread_wrap.h new file mode 100644 index 00000000..555641d5 --- /dev/null +++ b/platform/3ds/thread_wrap.h @@ -0,0 +1,64 @@ +/*************************************************************************/ +/* thread_ctr_wrapper.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef THREAD_CTR_WRAPPER_H +#define THREAD_CTR_WRAPPER_H + +typedef void (*ThreadCreateCallback)(void *p_userdata); + +extern "C" { +#include +#include <3ds/types.h> + +// Needs to be same as definition in 3ds/thread.h +// Which cannot itself be included due to Thread struct naming conflict +struct Thread_tag +{ + Handle handle; + ThreadFunc ep; + void* arg; + int rc; + bool detached, finished; + struct _reent reent; + void* stacktop; +}; +} + +class ThreadCtrWrapper +{ + Thread_tag* thread; + +public: + ThreadCtrWrapper(ThreadCreateCallback p_callback, void* p_userdata, int32_t p_priority); + + void wait(); + + static uint64_t get_thread_ID_func_3ds(); +}; + +#endif diff --git a/platform/wiiu/SCsub b/platform/wiiu/SCsub new file mode 100644 index 00000000..d7fd720e --- /dev/null +++ b/platform/wiiu/SCsub @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +Import('env') + + +common_server = [ + "os_wiiu.cpp", + # "audio_driver_psp.cpp", + "rasterizer_wiiu.cpp", + "mutex_wiiu.cpp", + "thread_wiiu.cpp" +] + +prog = env.Program('#bin/fe_wiiu', ['godot_wiiu.cpp'] + common_server) + +env.Command( + "#FusionEngine.rpx", prog ,"elf2rpl bin/fe_wiiu.wiiu.opt.32 FusionEngine.rpx" +) +# +# env.Command( +# "#bin/strip.elf", "#bin/godot.elf" ,"psp-strip bin/godot.elf -o bin/strip.elf" +# ) +# +# env.Command( +# "#bin/EBOOT.PBP", "#bin/strip.elf" ,"pack-pbp bin/EBOOT.PBP bin/PARAM.SFO NULL NULL NULL NULL NULL bin/strip.elf NULL" +# ) diff --git a/platform/wiiu/audio_driver_3ds.cpp b/platform/wiiu/audio_driver_3ds.cpp new file mode 100644 index 00000000..bbb7fbef --- /dev/null +++ b/platform/wiiu/audio_driver_3ds.cpp @@ -0,0 +1,171 @@ +/*************************************************************************/ +/* audio_driver_psp.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "audio_driver_psp.h" +#include "core/os/thread.h" +#include "globals.h" +#include "os/os.h" +#include + +#define PPSSPP + +static int channel_num = 1; + +int32_t* buffer; + +Error AudioDriverPSP::init() { + thread_exited=false; + exit_thread=false; + pcm_open = false; + samples_in = NULL; + + mix_rate = 44100; + output_format = OUTPUT_STEREO; + channels = 2; + + int latency = GLOBAL_DEF("audio/output_latency",25); + buffer_size = next_power_of_2( latency * mix_rate / 1000 ); + + samples_in = memnew_arr(int32_t, buffer_size*channels); + samples_out = memnew_arr(int16_t, buffer_size*channels); + + // channel_num = sceAudioChReserve(1, PSP_AUDIO_SAMPLE_ALIGN(buffer_size*channels), PSP_AUDIO_FORMAT_MONO); + sceAudioOutput2Reserve(buffer_size); + + mutex = Mutex::create(); + thread = Thread::create(AudioDriverPSP::thread_func, this); + + + return OK; +}; + +void AudioDriverPSP::thread_func(void *p_udata) { + + int buffer_index = 0; + printf("out\n"); + AudioDriverPSP* ad = (AudioDriverPSP*)p_udata; + + int sample_count = ad->buffer_size ; + uint64_t usdelay = (ad->buffer_size / float(ad->mix_rate)) * 1000000; + + while (!ad->exit_thread) { + + + if (ad->exit_thread) + break; +#ifndef PPSSPP + while(sceAudioWaitInputEnd()) { + OS::get_singleton()->delay_usec(usdelay); + } +#endif + if (ad->active) { + ad->lock(); + + ad->audio_server_process(ad->buffer_size, ad->samples_in); + + ad->unlock(); + + for(int i = 0; i < sample_count*2; ++i) { + ad->samples_out[i] = ad->samples_in[i] >> 16; + } + + + } else + { + for (int i = 0; i < sample_count*2; i++) { + + ad->samples_out[i] = 0; + } + } +// #ifdef PPSSPP +// OS::get_singleton()->delay_usec(usdelay); +// #endif + sceAudioOutput2OutputBlocking(0x8000, ad->samples_out); + } + + + ad->thread_exited=true; +}; + +void AudioDriverPSP::start() { + printf("psp audio start\n"); + active = true; +}; + +int AudioDriverPSP::get_mix_rate() const { + + return mix_rate; +}; + +AudioDriverSW::OutputFormat AudioDriverPSP::get_output_format() const { + + return output_format; +}; +void AudioDriverPSP::lock() { + + if (!thread || !mutex) + return; + mutex->lock(); +}; +void AudioDriverPSP::unlock() { + + if (!thread || !mutex) + return; + mutex->unlock(); +}; + +void AudioDriverPSP::finish() { + exit_thread = true; + Thread::wait_to_finish(thread); + + sceAudioOutput2Release(); + + if (samples_in) { + memdelete_arr(samples_in); + }; + if (samples_out) { + memdelete_arr(samples_out); + }; + + + if (mutex) + memdelete(mutex); + +}; + +AudioDriverPSP::AudioDriverPSP() { + + mutex = NULL; + active = false; + id = NULL; +}; + +AudioDriverPSP::~AudioDriverPSP() { + +}; diff --git a/platform/wiiu/audio_driver_3ds.h b/platform/wiiu/audio_driver_3ds.h new file mode 100644 index 00000000..d1387c0d --- /dev/null +++ b/platform/wiiu/audio_driver_3ds.h @@ -0,0 +1,84 @@ +/*************************************************************************/ +/* audio_driver_3ds.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef AUDIO_DRIVER_PSP_H +#define AUDIO_DRIVER_PSP_H + +#include "servers/audio/audio_server_sw.h" + +#include "core/os/thread.h" +#include "core/os/mutex.h" + +#include +#include +#include +#include + +class AudioDriverPSP : public AudioDriverSW { + + Thread *thread; + Mutex *mutex; + int32_t* samples_in; + int16_t* samples_out; + int id; + + static void thread_func(void *p_udata); + + + int buffer_size; + + unsigned int mix_rate; + OutputFormat output_format; + + int channels; + + bool active; + bool thread_exited; + bool exit_thread; + bool pcm_open; + +public: + + const char* get_name() const { + return "PSP Audio"; + }; + + virtual Error init(); + virtual void start(); + virtual int get_mix_rate() const; + virtual OutputFormat get_output_format() const; + + virtual void lock(); + virtual void unlock(); + virtual void finish(); + + AudioDriverPSP(); + ~AudioDriverPSP(); +}; + +#endif diff --git a/platform/wiiu/detect.py b/platform/wiiu/detect.py new file mode 100644 index 00000000..4b10fb22 --- /dev/null +++ b/platform/wiiu/detect.py @@ -0,0 +1,81 @@ + +import os +import sys + + +def is_active(): + return True + + +def get_name(): + return "wiiu" + + +def can_build(): + + if (os.name != "posix"): + return False + + return True # enabled + + +def get_opts(): + return [] + + + +def get_flags(): + + return [ + ('builtin_zlib', 'no'), + ('tools', 'no'), + ('theora','no'), + ('module_pspmath_enabled', 'no'), + ] + +def configure(env): + env.disabled_modules = ['openssl','webp'] + + env["bits"] = "32" + devkitpro_path = os.environ["DEVKITPRO"] + devkitarm_path = devkitpro_path + "/devkitPPC" + wut_path = devkitpro_path + "/wut" + + env.Append(CPPPATH=['#platform/wiiu']) + env["CC"] = devkitarm_path + "/bin/powerpc-eabi-gcc" + env["CXX"] = devkitarm_path + "/bin/powerpc-eabi-g++" + env["LD"] = devkitarm_path + "/bin/powerpc-eabi-g++" + env["AR"] = devkitarm_path + "/bin/powerpc-eabi-ar" + env["RANLIB"] = devkitarm_path + "/bin/powerpc-eabi-ranlib" + env["AS"] = devkitarm_path + "/bin/powerpc-eabi-as" + + arch = ['-isystem', '-mcpu=750' '-meabi', '-mhard-float', '-ffunction-sections', '-fdata-sections'] + env.Append(CCFLAGS=['-g','-Wall', '-std=gnu++11'] + arch) + env.Append(CCFLAGS=[ '-DESPRESSO', '-D__WIIU__', '-D__WUT__','-DNEED_LONG_INT', '-DLIBC_FILEIO_ENABLED','-DNO_SAFE_CAST', '-DPTHREAD_NO_RENAME']) + + env.Append(CPPPATH=[wut_path+"/include", devkitpro_path +"/portlibs/wiiu/include/", devkitpro_path +"/portlibs/ppc/include/"]) + env.Append(LIBPATH=[wut_path+"/lib", devkitpro_path+"/portlibs/wiiu/lib/", devkitpro_path+"/portlibs/ppc/lib/"]) + # env.Append(DEVKITPRO=devkitpro_path) + env.Append(ENV={"DEVKITPRO": devkitpro_path}) + env.Append(LINKFLAGS=["-specs="+wut_path+"/share/wut.specs"]) + # env.Append(LIBPATH=[devkitpro_path+"/portlibs/armv6k/lib", devkitpro_path + + # "/portlibs/3ds/lib", ctrulib_path + "/lib", devkitarm_path + "/arm-none-eabi/lib/armv6k/fpu"]) + + # env.Append(LINKFLAGS=['-specs=3dsx.specs', '-g'] + arch) + env.Append(LIBS=["SDL2","m",'OSMesa32', 'GLU', "wut"]) + env.Append(LIBS=["png", "z"]) + + + + if (env["target"] == "release"): + #if (env["debug_release"] == "yes"): + # env.Append(CCFLAGS=['-g2']) + #else: + env.Append(CCFLAGS=['-Ofast']) + elif (env["target"] == "release_debug"): + env.Append(CCFLAGS=['-O2', '-ffast-math', '-DDEBUG_ENABLED']) + #if (env["debug_release"] == "yes"): + env.Append(CCFLAGS=['-g2']) + elif (env["target"] == "debug"): + env.Append(CCFLAGS=['-O3','-g2','-Wall', + '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED']) diff --git a/platform/wiiu/export/export.cpp b/platform/wiiu/export/export.cpp new file mode 100644 index 00000000..a47f0335 --- /dev/null +++ b/platform/wiiu/export/export.cpp @@ -0,0 +1,51 @@ +/*************************************************************************/ +/* export.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "export.h" +#include "editor/editor_import_export.h" +#include "platform/wiiu/logo.gen.h" +#include "scene/resources/texture.h" + +void register_wiiu_exporter() { + + Image img(_wiiu_logo); + Ref logo = memnew(ImageTexture); + logo->create_from_image(img); + + { + Ref exporter = Ref(memnew(EditorExportPlatformPC)); + exporter->set_binary_extension("rpx"); + exporter->set_release_binary32("FusionEngine.rpx"); + exporter->set_name("Wii U"); + exporter->set_logo(logo); + // exporter->set_chmod_flags(0755); + EditorImportExport::get_singleton()->add_export_platform(exporter); + } +} diff --git a/platform/wiiu/export/export.h b/platform/wiiu/export/export.h new file mode 100644 index 00000000..8323af7a --- /dev/null +++ b/platform/wiiu/export/export.h @@ -0,0 +1,31 @@ +/*************************************************************************/ +/* export.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +void register_wiiu_exporter(); diff --git a/platform/wiiu/godot_wiiu.cpp b/platform/wiiu/godot_wiiu.cpp new file mode 100644 index 00000000..a0a6b988 --- /dev/null +++ b/platform/wiiu/godot_wiiu.cpp @@ -0,0 +1,80 @@ +/*************************************************************************/ +/* godot_server.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include +#include + +#include "main/main.h" + +#include +#include + +#include +#include +#include "os_wiiu.h" +// #include "CafeGLSLCompiler.h" +#include +int main(int argc, char *argv[]) { + WHBProcInit(); + // WHBGfxInit(); + WHBLogConsoleInit(); + WHBMountSdCard(); + AXInit(); + // GLSL_Init(); + // ramfsInit(); + if (SDL_Init(SDL_INIT_VIDEO) < 0) + OSReport("ERROR: cannot initialize SDL video.%s\n", SDL_GetError()); + OSReport("Fusion wiiu\n"); + OS_WIIU os; + + OSReport("Fusion wiiu OS init\n"); + char* args[] = {"-path", WHBGetSdCardMountPath()}; + OSReport("setup\n"); + + Error err = Main::setup("wiiu", 2, args, true); + OSReport("setup\n"); + + + if (err!=OK) + return 0; + + if (Main::start()) { + OSReport("game running\n"); + os.run(); // it is actually the OS that decides how to run + } + Main::cleanup(); + //GLSL_Shutdown(); + + AXQuit(); + WHBLogConsoleFree(); + WHBProcShutdown(); + SYSLaunchMenu(); + return 0; +} diff --git a/platform/wiiu/logo.gen.h b/platform/wiiu/logo.gen.h new file mode 100644 index 00000000..71faf20f --- /dev/null +++ b/platform/wiiu/logo.gen.h @@ -0,0 +1,2 @@ + /* AUTOGENERATED FILE, DO NOT EDIT */ + static const unsigned char _wiiu_logo[]={0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x20,0x8,0x6,0x0,0x0,0x0,0x73,0x7a,0x7a,0xf4,0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0,0x4,0x67,0x41,0x4d,0x41,0x0,0x0,0xb1,0x8f,0xb,0xfc,0x61,0x5,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1,0x0,0x9a,0x9c,0x18,0x0,0x0,0x5,0x69,0x49,0x44,0x41,0x54,0x58,0x47,0xad,0x57,0x5d,0x48,0x55,0x59,0x14,0x5e,0x5e,0xef,0xcd,0xfc,0xcd,0x30,0x8c,0x82,0x4a,0x25,0x25,0x2d,0xed,0x32,0xca,0x48,0xa3,0x10,0xe9,0x43,0x8a,0xca,0x20,0xa2,0x70,0xd,0x54,0x4,0x5f,0x84,0xe9,0xc1,0x1e,0x2,0x71,0x20,0x98,0x97,0x31,0x7a,0x11,0x9,0x1f,0x64,0x34,0xe8,0xa1,0x3f,0x2a,0xd,0x25,0x46,0x99,0x1e,0x14,0x46,0x18,0x68,0xfc,0x21,0x7d,0x68,0xa2,0x84,0x34,0x13,0xcc,0xb4,0xc2,0xb0,0x6b,0x9d,0xf9,0xbe,0xed,0xd9,0xb7,0x73,0x8f,0xe7,0xea,0xa5,0x99,0xf,0xd6,0xdd,0xfb,0xec,0xb5,0xf6,0xfe,0xd6,0x5e,0x7b,0xed,0x9f,0x1b,0x21,0x61,0x22,0x37,0x37,0x77,0x8f,0x61,0x18,0x65,0x2e,0x97,0xab,0x8,0x9f,0x5e,0xd4,0x53,0x22,0x22,0x22,0x12,0xa9,0x43,0x7d,0x5,0xf5,0x59,0x54,0x27,0xbe,0x7c,0xf9,0xf2,0x8,0xf5,0xc1,0xc7,0x8f,0x1f,0xaf,0x52,0xb7,0x13,0x76,0x74,0x20,0x27,0x27,0x27,0x23,0x2a,0x2a,0xea,0x22,0x48,0x7c,0x20,0x8f,0x86,0x8,0x8,0x94,0x58,0x1,0xbd,0x12,0x38,0x40,0xf9,0x8,0xfd,0x8d,0xf5,0xf5,0xf5,0xf6,0xa9,0xa9,0xa9,0xa7,0xa6,0x89,0x23,0x42,0x3a,0x80,0x19,0xc7,0x60,0xc0,0x5f,0x22,0x23,0x23,0x7f,0x2,0xa9,0x87,0xc4,0x9a,0x9c,0x70,0x72,0x40,0x97,0xa6,0x13,0x14,0xff,0xe7,0xcf,0x9f,0x3b,0x61,0xfb,0x33,0x22,0xb2,0xa6,0xc,0x6c,0x70,0x74,0xc0,0xeb,0xf5,0xa6,0xbb,0xdd,0xee,0xfb,0x20,0x3c,0xe,0x7,0x2,0xc4,0x5a,0xb6,0x83,0x8e,0x84,0x76,0x4,0xe,0xb0,0x9c,0xde,0xd8,0xd8,0xa8,0x9c,0x98,0x98,0xf8,0xc7,0x34,0xb,0x60,0xcb,0x68,0xdf,0x1,0x20,0xfc,0x1d,0xb2,0xf,0x4e,0x84,0x4d,0x6c,0x87,0xd5,0x11,0x90,0xd3,0x89,0x25,0xc8,0xd9,0xbf,0x1,0xd3,0x44,0x21,0x68,0x54,0xce,0x1c,0xc4,0x7f,0x82,0x38,0x88,0xfc,0xbf,0xc0,0xea,0x4,0x84,0x4e,0xfc,0x60,0x8d,0x44,0xa4,0x59,0xaa,0x35,0x7,0xd9,0x1f,0x8,0x79,0xa,0xc9,0x75,0xd8,0xed,0x48,0x4a,0x4a,0x92,0xc6,0xc6,0x46,0xd9,0xbd,0x7b,0xb7,0x2c,0x2f,0x2f,0xcb,0xa7,0x4f,0x9f,0x4c,0x8d,0x33,0xf4,0x18,0x66,0x19,0x3,0x29,0x3a,0x78,0xf0,0xe0,0xb5,0x85,0x85,0x5,0x3f,0x1b,0x2,0xe,0xec,0xdf,0xbf,0xff,0x57,0x90,0xfe,0xb8,0x1d,0x39,0x41,0x7,0x2e,0x5d,0xba,0x24,0xc5,0xc5,0xc5,0xe2,0xf3,0xf9,0x24,0x2f,0x2f,0x4f,0x12,0x12,0x12,0x64,0x69,0x69,0x49,0xde,0xbf,0x7f,0x6f,0x5a,0x39,0x83,0x63,0x22,0x2,0xc9,0xc8,0x8b,0xe8,0xd7,0xaf,0x5f,0xf,0xa9,0x36,0xfe,0x70,0xab,0x61,0xe6,0x4f,0x40,0xee,0xd1,0xa1,0xf,0x85,0x43,0x87,0xe,0xc9,0xcd,0x9b,0x37,0xcd,0xaf,0xaf,0x60,0x98,0xc7,0xc7,0xc7,0xa5,0xb7,0xb7,0x57,0x6c,0xcb,0x1c,0x80,0x65,0x29,0xb8,0x3b,0x4e,0x70,0x8b,0xba,0xa8,0x0,0xe1,0x45,0x88,0x47,0x13,0xeb,0x75,0xb,0x25,0x76,0xd0,0xa1,0xb7,0x6f,0xdf,0x32,0x81,0xa5,0xb3,0xb3,0x53,0x9a,0x9b,0x9b,0x43,0xf6,0x23,0x87,0xc9,0x75,0x91,0xdf,0xae,0xb4,0xb4,0xb4,0x3d,0x28,0x7d,0xdf,0x4a,0xfe,0xee,0xdd,0x3b,0xe9,0xe8,0xe8,0x90,0xbb,0x77,0xef,0x9a,0x2d,0x22,0xe7,0xce,0x9d,0x93,0x92,0x92,0x92,0x90,0xfd,0x4d,0x2e,0x1f,0xb9,0x5d,0x48,0xa6,0x32,0x34,0x44,0x87,0xeb,0x0,0xd6,0x50,0xd9,0x69,0xf0,0x9b,0xed,0x1f,0x3e,0x7c,0x30,0x5b,0x36,0x51,0x53,0x53,0xb3,0xa5,0x2f,0x85,0x20,0x17,0x39,0xc9,0x8d,0x7c,0x53,0x67,0xbb,0x2,0xd,0x38,0xe0,0x76,0xa2,0x7,0xb1,0x82,0xed,0x76,0x64,0x64,0x64,0x8,0xf,0xb1,0xed,0xfa,0x93,0xdb,0x85,0x6,0xaf,0xf9,0x1d,0xf0,0x72,0x27,0xb1,0xc3,0xa9,0x9d,0x3b,0x29,0x36,0x36,0x36,0xa8,0x9f,0xdd,0xe,0x75,0x2f,0x93,0x30,0xc5,0xfc,0x8,0x5b,0xec,0x70,0x6a,0x23,0x78,0x46,0xd8,0xfb,0x6a,0x31,0x91,0xc2,0x8,0x24,0xda,0x95,0xdb,0x89,0x13,0x9c,0x74,0xaf,0x5e,0xbd,0x52,0xe7,0x82,0xb5,0xaf,0x83,0x24,0xd2,0x1,0xd5,0x41,0x97,0x3b,0xc1,0x6e,0x17,0xaa,0x5f,0x4f,0x4f,0x8f,0x59,0xdb,0xa,0x2b,0x27,0x97,0x60,0xc5,0xda,0x10,0x4a,0xb2,0xb2,0xb2,0xe4,0xc2,0x85,0xb,0xe2,0xf1,0x78,0x94,0xad,0x15,0xd4,0x3f,0x7c,0xf8,0x50,0xae,0x5c,0xb9,0x22,0xd7,0xaf,0x5f,0x97,0xf3,0xe7,0xcf,0xcb,0xbd,0x7b,0xf7,0xb6,0x8c,0xa1,0x45,0xf7,0x1,0x56,0xdc,0xa8,0xcc,0x42,0x92,0xb4,0xc2,0x8a,0xc3,0x87,0xf,0x4b,0x69,0x69,0xa9,0x92,0x23,0x47,0x8e,0xa8,0xb6,0x7,0xf,0x1e,0xa8,0xd2,0x8e,0xbd,0x7b,0xf7,0x8a,0xdf,0xef,0x57,0x77,0x44,0x55,0x55,0x95,0x3a,0xa6,0xb9,0x35,0x71,0xe6,0xcb,0xcc,0xcc,0x8c,0x8c,0x8d,0x8d,0xa9,0x33,0x43,0x83,0x7c,0xe4,0xa6,0x3,0x13,0x90,0x5c,0x36,0x70,0x7f,0x72,0x80,0x8a,0x8a,0xa,0x25,0xd9,0xd9,0xd9,0xa6,0xf9,0x26,0x38,0x10,0xef,0x77,0x3b,0x4e,0x9d,0x3a,0x25,0x57,0xaf,0x5e,0x35,0xbf,0x36,0x31,0x37,0x37,0xa7,0xf2,0xe0,0xd8,0xb1,0x63,0x52,0x57,0x57,0xa7,0x9c,0x1b,0x1a,0x1a,0x92,0xcb,0x97,0x2f,0xcb,0xea,0xea,0xaa,0x76,0x60,0xc2,0x85,0x1,0x1f,0xe9,0x3d,0x4a,0xe3,0xfe,0xfe,0x7e,0x69,0x6d,0x6d,0xd,0x90,0xcf,0xcf,0xcf,0x4b,0x77,0x77,0xb7,0x54,0x56,0x56,0x4a,0x6d,0x6d,0xad,0xe3,0xed,0xa7,0xf,0x31,0x12,0x72,0xed,0xab,0xab,0xab,0xa5,0xbc,0xbc,0x5c,0x5a,0x5a,0x5a,0xe4,0xce,0x9d,0x3b,0x4a,0xc7,0xa5,0x2b,0x2b,0x2b,0x53,0x7,0x94,0xe6,0x23,0xb7,0x1b,0x95,0x41,0x54,0x3e,0x62,0xdf,0x46,0xf3,0x2c,0x4f,0x4e,0x4e,0x56,0x1d,0x88,0xf6,0xf6,0x76,0x75,0xce,0xef,0xda,0xb5,0x4b,0xa,0xb,0xb,0xd5,0xda,0x76,0x75,0x75,0x99,0xda,0xaf,0x98,0x9d,0x9d,0x95,0x86,0x86,0x6,0x99,0x9c,0x9c,0x14,0x5e,0x66,0x5,0x5,0x5,0xd2,0xd4,0xd4,0x24,0xa7,0x4f,0x9f,0x16,0xbc,0x27,0x4d,0x2b,0x51,0x97,0x55,0x5f,0x5f,0x9f,0x9a,0x3d,0x39,0xc9,0xad,0x14,0xe9,0xe9,0xe9,0xbf,0x21,0xc9,0xc,0x3c,0x48,0xc,0x24,0x92,0xf1,0xec,0xd9,0x33,0xd8,0x18,0x6,0x6e,0x2d,0xe3,0xcd,0x9b,0x37,0x6,0xc2,0xa7,0xbe,0x9,0xcc,0xce,0xac,0x6d,0x2,0x6f,0x2,0xe3,0xe4,0xc9,0x93,0x46,0x7d,0x7d,0xbd,0x71,0xfb,0xf6,0x6d,0x63,0x65,0x85,0x39,0xfd,0x15,0x8,0xb7,0x81,0x28,0x28,0x3d,0x6e,0x5d,0x3,0x91,0x35,0xc8,0x45,0x4e,0x72,0xab,0xd8,0xa5,0xa6,0xa6,0x66,0x60,0x96,0xea,0x3a,0xe6,0x9,0xc6,0x90,0x32,0x12,0x99,0x99,0x99,0x72,0xe0,0xc0,0x1,0x35,0xb,0x86,0x1e,0x77,0xb8,0x9a,0x2d,0x67,0xa1,0xc1,0x5b,0xb0,0xad,0xad,0x2d,0x28,0x7,0x68,0x3b,0x32,0x32,0x22,0x83,0x83,0x83,0x32,0x3a,0x3a,0xaa,0xd6,0x9f,0x80,0x3f,0x2a,0xf4,0xbc,0x8e,0x61,0x73,0xe2,0xc5,0x8b,0x17,0x4f,0xdd,0x54,0xb0,0x72,0xf4,0xe8,0xd1,0x4e,0x90,0xb7,0xe8,0xf5,0x5c,0x5c,0x5c,0x54,0x62,0x47,0x7c,0x7c,0xbc,0xdc,0xba,0x75,0x4b,0xce,0x9c,0x39,0x13,0xb4,0x5c,0x1c,0x9c,0xef,0x80,0x81,0x81,0x1,0x19,0x1e,0x1e,0xe,0xca,0x78,0xd,0xed,0x0,0xc2,0xdf,0x49,0x4e,0xb6,0x6d,0xb2,0x1,0x98,0x69,0x4c,0x5c,0x5c,0xdc,0x5f,0x88,0xc2,0x71,0x1d,0x5,0xed,0x8c,0x13,0xa8,0x63,0xa2,0xe6,0xe7,0xe7,0xab,0x88,0x70,0xed,0xb9,0xe5,0x9c,0x40,0x62,0xcb,0xec,0xa7,0xb1,0x3d,0xbf,0x87,0xad,0x7a,0xa6,0x7,0x31,0xe0,0x7e,0x56,0x8f,0x52,0x64,0xec,0x3e,0xed,0xc4,0xff,0x1,0x4d,0x8e,0xa5,0x50,0x8f,0xd2,0xe7,0xcf,0x9f,0x7,0x1e,0xa5,0xea,0x45,0xa4,0x41,0x5,0x8c,0xcf,0x9a,0x86,0xaa,0x13,0x3b,0x7f,0x2b,0x34,0xb1,0x26,0xe7,0xd8,0x56,0x72,0xc2,0x71,0x8a,0x66,0x24,0xee,0xe3,0x3e,0xf,0x6b,0x39,0x9c,0x40,0x72,0xed,0x0,0xd6,0x7c,0x1a,0x65,0xa5,0x9d,0x9c,0x8,0xbc,0x8a,0xad,0x40,0x66,0x2f,0x23,0xf3,0xaf,0x81,0x3c,0x1a,0x9f,0x79,0x20,0xf,0xb2,0xb,0xe5,0x8c,0x8e,0x96,0x26,0x7,0xb1,0x1f,0x6b,0xde,0xb1,0xb6,0xb6,0x56,0xfb,0xf2,0xe5,0xcb,0xad,0x19,0xd,0xec,0x38,0x2d,0x6e,0x51,0x38,0xc2,0x47,0xab,0xf,0x11,0x9,0x3c,0xdd,0xec,0x4e,0x58,0xc9,0x79,0xc8,0xa0,0xbc,0x81,0x59,0xb7,0xeb,0x6c,0xf,0x85,0xb0,0xe3,0xca,0x7,0x24,0x6,0xe5,0xfb,0xb1,0x8,0xc2,0x57,0x54,0xd0,0xdf,0x73,0x14,0xbc,0xd4,0x78,0xaf,0xa8,0xbf,0xe7,0x8,0x77,0x18,0x7f,0xcf,0x45,0xfe,0x5,0xd3,0xc1,0xab,0x57,0x1d,0x1d,0x1e,0x96,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; diff --git a/platform/wiiu/logo.png b/platform/wiiu/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d11c887a6f5d74fbccab1c063b2de1b15d053fe1 GIT binary patch literal 405 zcmV;G0c!qO!V0eXNIJw@xN7jTi=pk)+D6t*xd zGh4oGKAiL8oO|IOv3XYaiSQ^yd?X-pfEpBVx;2fiDl{#Jy>c@! z;ZDwEdo2yXdDY_R%910H011!)36Ow)4Dj*C2iW~V5-lb|6`jzADLc*|0NPy_fTS5? z-Ux13HaYxa)Gc>>K=s)MKnOvp5dSfDMi(s28eg6Bs5I>H0VlT|?7j!UMj=5lYmAJ` zXo7?FG;uu!z(uV?s~ +#include + +class MutexWiiu : public Mutex { + + // pthread_mutexattr_t attr; + std::recursive_mutex mutex; + + static Mutex *create_func_wiiu(bool p_recursive); + +public: + virtual void lock(); + virtual void unlock(); + virtual Error try_lock(); + + static void make_default(); + + MutexWiiu(bool p_recursive); + + ~MutexWiiu(); +}; + +#endif + +#endif diff --git a/platform/wiiu/os_wiiu.cpp b/platform/wiiu/os_wiiu.cpp new file mode 100644 index 00000000..bf4166a4 --- /dev/null +++ b/platform/wiiu/os_wiiu.cpp @@ -0,0 +1,442 @@ +/*************************************************************************/ +/* OS_WIIU.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "os_wiiu.h" +#include "print_string.h" +#include "servers/physics/physics_server_sw.h" +#include "servers/visual/rasterizer_dummy.h" + +#include "servers/visual/visual_server_raster.h" +#include +#include +// #include "drivers/unix/mutex_posix.h" +// #include "drivers/unix/thread_posix.h" +#include "thread_wiiu.h" +#include "mutex_wiiu.h" +#include "drivers/unix/file_access_unix.h" +#include "drivers/unix/dir_access_unix.h" +#include "core/os/thread_dummy.h" +#include "drivers/unix/memory_pool_static_malloc.h" +#include "os/memory_pool_dynamic_static.h" + +#include "main/main.h" +#include +#include + +#include +#include +#include +int OS_WIIU::get_video_driver_count() const { + + return 1; +} +const char *OS_WIIU::get_video_driver_name(int p_driver) const { + + return "GLES1"; +} +OS::VideoMode OS_WIIU::get_default_video_mode() const { + + return OS::VideoMode(1920, 1080, false); +} + +static MemoryPoolStaticMalloc *mempool_static=NULL; +static MemoryPoolDynamicStatic *mempool_dynamic=NULL; + +void OS_WIIU::initialize_core() { + + printf("init core\n"); + ThreadDummy::make_default(); //TODO: Implement a thread handler for the wiiu + SemaphoreDummy::make_default(); + MutexWiiu::make_default(); + printf("init fs\n"); + + ticks_start = 0; + ticks_start = get_ticks_usec(); + + mempool_static = new MemoryPoolStaticMalloc; + mempool_dynamic = memnew( MemoryPoolDynamicStatic ); + + FileAccess::make_default(FileAccess::ACCESS_RESOURCES); + FileAccess::make_default(FileAccess::ACCESS_USERDATA); + FileAccess::make_default(FileAccess::ACCESS_FILESYSTEM); + //FileAccessBufferedFA::make_default(); + DirAccess::make_default(DirAccess::ACCESS_RESOURCES); + DirAccess::make_default(DirAccess::ACCESS_USERDATA); + DirAccess::make_default(DirAccess::ACCESS_FILESYSTEM); +} + +void OS_WIIU::finalize_core() { + if (mempool_dynamic) + memdelete( mempool_dynamic ); + delete mempool_static; +} + + +void OS_WIIU::alert(const String &p_alert, const String &p_title) { + OSReport(p_alert.utf8().get_data()); +} +String OS_WIIU::get_stdin_string(bool p_block) { + return ""; +} + +Error OS_WIIU::execute(const String& p_path, const List& p_arguments,bool p_blocking,ProcessID *r_child_id,String* r_pipe,int *r_exitcode) { + return FAILED; +} + +Error OS_WIIU::kill(const ProcessID &p_pid) { + return FAILED; +} +bool OS_WIIU::has_environment(const String &p_var) const { + return false; +} +String OS_WIIU::get_environment(const String &p_var) const { + return ""; +} + +OS::Date OS_WIIU::get_date() const { + Date ret; + return ret; +} + +OS::Time OS_WIIU::get_time() const { + Time ret; + return ret; +} + +void OS_WIIU::delay_usec(uint32_t p_usec) const{ +// printf("delay_usec: %lu\n", p_usec); + usleep(p_usec); +} + +uint64_t OS_WIIU::get_ticks_usec() const{ + struct timeval tv_now; + gettimeofday(&tv_now, NULL); + + uint64_t longtime = (uint64_t)tv_now.tv_usec + (uint64_t)tv_now.tv_sec * 1000000L; + longtime -= ticks_start; + + return longtime; +} + +void OS_WIIU::vprint(const char* p_format, va_list p_list,bool p_stder) +{ + if (p_stder) { + vfprintf(stderr,p_format,p_list); + fflush(stderr); + } else { + vprintf(p_format,p_list); + fflush(stdout); + } +} + +void OS_WIIU::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { + + args = OS::get_singleton()->get_cmdline_args(); + current_videomode = p_desired; + main_loop = NULL; + + + + window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1920, 1080, 0); + screen = SDL_CreateRGBSurface(SDL_WINDOW_SHOWN, 1920, 1080, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + + ctx = OSMesaCreateContextExt( OSMESA_RGBA, 16, 0, 0, NULL ); + if (!ctx) + OSReport("OSMesaCreateContext failed!\n"); + + + frameBuffer = calloc(1920 * 1080 * 4, sizeof(GLfloat)); + if (!OSMesaMakeCurrent(ctx, frameBuffer, GL_FLOAT, 1920, 1080)) + OSReport("OSMesaMakeCurrent failed!\n"); + + OSMesaPixelStore(OSMESA_Y_UP, 0); + OSReport("mesa\n"); + mesa = true; + + rasterizer = memnew(RasterizerGLES1); + + + visual_server = memnew(VisualServerRaster(rasterizer)); + + // AudioDriverManagerSW::add_driver(&audio_driver); + // AudioDriverManagerSW::initialize(p_audio_driver); + AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton(); + + if (AudioDriverManagerSW::get_driver(p_audio_driver)->init()!=OK) { + + ERR_PRINT("Initializing audio failed."); + } + + sample_manager = memnew(SampleManagerMallocSW); + audio_server = memnew(AudioServerSW(sample_manager)); + audio_server->init(); + spatial_sound_server = memnew(SpatialSoundServerSW); + spatial_sound_server->init(); + spatial_sound_2d_server = memnew(SpatialSound2DServerSW); + spatial_sound_2d_server->init(); + + ERR_FAIL_COND(!visual_server); + + visual_server->init(); + + // + physics_server = memnew( PhysicsServerSW ); + physics_server->init(); + physics_2d_server = memnew( Physics2DServerSW ); + physics_2d_server->init(); + + input = memnew(InputDefault); + +} +void OS_WIIU::finalize() { + + if (main_loop) + memdelete(main_loop); + main_loop = NULL; + + spatial_sound_server->finish(); + memdelete(spatial_sound_server); + spatial_sound_2d_server->finish(); + memdelete(spatial_sound_2d_server); + + //if (debugger_connection_console) { + // memdelete(debugger_connection_console); + //} + + memdelete(sample_manager); + + audio_server->finish(); + memdelete(audio_server); + + visual_server->finish(); + memdelete(visual_server); + memdelete(rasterizer); + + physics_server->finish(); + memdelete(physics_server); + + physics_2d_server->finish(); + memdelete(physics_2d_server); + + memdelete(input); + + args.clear(); +} + +void OS_WIIU::set_mouse_show(bool p_show) { +} +void OS_WIIU::set_mouse_grab(bool p_grab) { + + grab = p_grab; +} +bool OS_WIIU::is_mouse_grab_enabled() const { + + return grab; +} + +int OS_WIIU::get_mouse_button_state() const { + + return 0; +} + +Point2 OS_WIIU::get_mouse_pos() const { + + return Point2(); +} + +void OS_WIIU::set_window_title(const String &p_title) { +} + +void OS_WIIU::set_video_mode(const VideoMode &p_video_mode, int p_screen) { +} +OS::VideoMode OS_WIIU::get_video_mode(int p_screen) const { + + return current_videomode; +} + +Size2 OS_WIIU::get_window_size() const { + + return Vector2(current_videomode.width, current_videomode.height); +} + +void OS_WIIU::get_fullscreen_mode_list(List *p_list, int p_screen) const { +} + +const char *OS_WIIU::get_audio_driver_name(int p_driver) const{ + return "dummy"; +} +int OS_WIIU::get_audio_driver_count() const{ + return 1; +} + +MainLoop *OS_WIIU::get_main_loop() const { + + return main_loop; +} + +void OS_WIIU::init_keys() { + // sceCtrlSetSamplingCycle(0); + // sceCtrlSetSamplingMode(3DS_CTRL_MODE_ANALOG); +} + +// 3DSCtrlButtons buttons[16] = { +// 3DS_CTRL_CROSS, +// 3DS_CTRL_CIRCLE, +// 3DS_CTRL_SQUARE, +// 3DS_CTRL_TRIANGLE, +// (3DSCtrlButtons)0, +// (3DSCtrlButtons)0, +// 3DS_CTRL_LTRIGGER, +// 3DS_CTRL_RTRIGGER, +// (3DSCtrlButtons)0, +// (3DSCtrlButtons)0, +// 3DS_CTRL_SELECT, +// 3DS_CTRL_START, +// 3DS_CTRL_UP, +// 3DS_CTRL_DOWN, +// 3DS_CTRL_LEFT, +// 3DS_CTRL_RIGHT +// }; +/* +void OS_WIIU::process_keys() { + // sceCtrlReadBufferPositive(&pad, 1); + + last++; + + for(int i = 0; i < 16; i++) { + if (pad.Buttons & buttons[i]) { + last = input->joy_button(last, 0, i, true); + } else { + last = input->joy_button(last, 0, i, false); + } + } + + InputDefault::JoyAxis ly, lx; + + lx.value = (pad.Lx - 128); + ly.value = (pad.Ly - 128); + + // printf("%d %d\n", lx.value, pad.Lx); + // printf("%d\n", ly.value); + + input->joy_axis(0, 0, 0, lx); + input->joy_axis(0, 0, 1, ly); + + // if(pad.Buttons & 3DS_CTRL_HOME) + // sceKernelExitGame(); +}*/ + +void OS_WIIU::delete_main_loop() { + + if (main_loop) + memdelete(main_loop); + main_loop = NULL; +} + +void OS_WIIU::set_main_loop(MainLoop *p_main_loop) { + + main_loop = p_main_loop; + input->set_main_loop(p_main_loop); +} + +bool OS_WIIU::can_draw() const { + + return true; //can draw +}; + +String OS_WIIU::get_name() { + + return "Nintendo WiiU"; +} + +void OS_WIIU::move_window_to_foreground() { +} + +void OS_WIIU::set_cursor_shape(CursorShape p_shape) { +} + +void OS_WIIU::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { +} + +void OS_WIIU::run() { + + force_quit = false; + + if (!main_loop) + return; + + main_loop->init(); + + while (WHBProcIsRunning()) { + + // process_keys(); +// visual_server->draw(); + + if (Main::iteration() == true) + break; + + }; + + main_loop->finish(); +} + +void OS_WIIU::swap_buffers() { + // if(mesa) { + SDL_LockSurface(screen); + + // glReadPixels(0, 0, 1920, 1080, GL_RGBA, GL_UNSIGNED_BYTE, screen->pixels); + + std::transform((RGBA *)frameBuffer, + (RGBA *)frameBuffer + (1920 * 1080), + (RGBA *)screen->pixels, + [](RGBA v) { return RGBA{ v.r * 255, v.g * 255, v.b * 255,v.a * 255}; }); + // memcpy(screen->pixels, frameBuffer, (1920 * 1080)); + if (SDL_MUSTLOCK(screen)) { + SDL_UnlockSurface(screen); + } + SDL_LockSurface(screen); + SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, screen); + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); + SDL_DestroyTexture(texture); + // } +} + +OS_WIIU::OS_WIIU() { + // osSetSpeedupEnable(true); + AudioDriverManagerSW::add_driver(&driver_dummy); + //adriver here + // _render_thread_mode=RENDER_THREAD_UNSAFE;; + grab = false; + + // set_low_processor_usage_mode(true); +}; diff --git a/platform/wiiu/os_wiiu.h b/platform/wiiu/os_wiiu.h new file mode 100644 index 00000000..fee5d2ff --- /dev/null +++ b/platform/wiiu/os_wiiu.h @@ -0,0 +1,169 @@ +/*************************************************************************/ +/* os_server.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef OS_WIIU_H +#define OS_WIIU_H + + + +#include "servers/audio/audio_driver_dummy.h" +#include "os/input.h" +#include "drivers/unix/os_unix.h" +#include "servers/audio/audio_server_sw.h" +// #include "servers/physics_2d/physics_2d_server_wrap_mt.h" +#include "rasterizer_wiiu.h" +#include "servers/audio/sample_manager_sw.h" +#include "servers/physics_2d/physics_2d_server_sw.h" +#include "servers/physics_server.h" +#include "servers/spatial_sound/spatial_sound_server_sw.h" +#include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h" +#include "servers/visual/rasterizer.h" +#include "servers/visual_server.h" +#include +#include + +#include +#include +#include + +class OS_WIIU : public OS { + + Rasterizer *rasterizer; + VisualServer *visual_server; + VideoMode current_videomode; + List args; + MainLoop *main_loop; + + SDL_Window* window; + SDL_Surface* screen; + SDL_Renderer* renderer; + void* frameBuffer; + template + struct RGBA { + T r; + T g; + T b; + T a; + }; + OSMesaContext ctx; + bool grab; + bool mesa = false; + uint64_t ticks_start; + + PhysicsServer *physics_server; + Physics2DServer *physics_2d_server; + + virtual void delete_main_loop(); +// IP_Unix *ip_unix; + + AudioServerSW *audio_server; + SampleManagerMallocSW *sample_manager; + SpatialSoundServerSW *spatial_sound_server; + SpatialSound2DServerSW *spatial_sound_2d_server; + + AudioDriverDummy driver_dummy; + + bool force_quit; + +// JoyPadPSP *joy; + // SceCtrlData pad; + int last; + + InputDefault *input; + +protected: + virtual int get_video_driver_count() const; + virtual const char *get_video_driver_name(int p_driver) const; + virtual VideoMode get_default_video_mode() const; + + virtual void initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver); + virtual void finalize(); + + virtual void finalize_core(); + virtual void initialize_core(); + + virtual void set_main_loop(MainLoop *p_main_loop); + + virtual void init_keys(); + // virtual void process_keys(); + +public: + virtual String get_name(); +// virtual void print(const char *p_format, ...); +// virtual void vprint(const char* p_format, va_list p_list, bool p_stderr=false); + virtual void set_cursor_shape(CursorShape p_shape); + virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot); + + virtual void set_mouse_show(bool p_show); + virtual void set_mouse_grab(bool p_grab); + virtual void vprint(const char *p_format, va_list p_list, bool p_stderr = false); + virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); + virtual String get_stdin_string(bool p_block = true); + virtual Error execute(const String& p_path, const List& p_arguments,bool p_blocking,ProcessID *r_child_id=NULL,String* r_pipe=NULL,int *r_exitcode=NULL); + virtual Error kill(const ProcessID &p_pid); + virtual bool has_environment(const String &p_var) const; + virtual String get_environment(const String &p_var) const; + virtual Date get_date() const; + virtual Time get_time() const; + + virtual void delay_usec(uint32_t p_usec) const; + virtual uint64_t get_ticks_usec() const; + virtual bool is_mouse_grab_enabled() const; + virtual Point2 get_mouse_pos() const; + virtual int get_mouse_button_state() const; + virtual void set_window_title(const String &p_title); + virtual int get_audio_driver_count() const; + virtual const char *get_audio_driver_name(int p_driver) const; + virtual void swap_buffers(); + + virtual MainLoop *get_main_loop() const; + + virtual bool can_draw() const; + + virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0); + virtual VideoMode get_video_mode(int p_screen = 0) const; + virtual void get_fullscreen_mode_list(List *p_list, int p_screen = 0) const; + + virtual Size2 get_window_size() const; + + virtual void move_window_to_foreground(); + + void run(); + + OS_WIIU(); + ~OS_WIIU() { + OSMesaDestroyContext( ctx ); + free(frameBuffer); + SDL_DestroyWindow(window); + SDL_DestroyRenderer(renderer); + } +}; + +#endif diff --git a/platform/wiiu/platform_config.h b/platform/wiiu/platform_config.h new file mode 100644 index 00000000..e2200376 --- /dev/null +++ b/platform/wiiu/platform_config.h @@ -0,0 +1,31 @@ +/*************************************************************************/ +/* platform_config.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include diff --git a/platform/wiiu/rasterizer_wiiu.cpp b/platform/wiiu/rasterizer_wiiu.cpp new file mode 100644 index 00000000..8994c085 --- /dev/null +++ b/platform/wiiu/rasterizer_wiiu.cpp @@ -0,0 +1,6304 @@ +/*************************************************************************/ +/* rasterizer_gles1.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifdef __WIIU__ + +#include "rasterizer_wiiu.h" +#include "os/os.h" +#include "globals.h" +#include +#include "drivers/gl_context/context_gl.h" +#include "servers/visual/shader_language.h" +#include "servers/visual/particle_system_sw.h" +#include "gl_context/context_gl.h" +#include + +_FORCE_INLINE_ static void _gl_load_transform(const Transform& tr) { + + GLfloat matrix[16]={ /* build a 16x16 matrix */ + tr.basis.elements[0][0], + tr.basis.elements[1][0], + tr.basis.elements[2][0], + 0, + tr.basis.elements[0][1], + tr.basis.elements[1][1], + tr.basis.elements[2][1], + 0, + tr.basis.elements[0][2], + tr.basis.elements[1][2], + tr.basis.elements[2][2], + 0, + tr.origin.x, + tr.origin.y, + tr.origin.z, + 1 + }; + + glLoadMatrixf(matrix); +}; + + +_FORCE_INLINE_ static void _gl_mult_transform(const Transform& tr) { + + GLfloat matrix[16]={ /* build a 16x16 matrix */ + tr.basis.elements[0][0], + tr.basis.elements[1][0], + tr.basis.elements[2][0], + 0, + tr.basis.elements[0][1], + tr.basis.elements[1][1], + tr.basis.elements[2][1], + 0, + tr.basis.elements[0][2], + tr.basis.elements[1][2], + tr.basis.elements[2][2], + 0, + tr.origin.x, + tr.origin.y, + tr.origin.z, + 1 + }; + + glMultMatrixf(matrix); +}; + +_FORCE_INLINE_ static void _gl_mult_transform(const Matrix32& tr) { + + GLfloat matrix[16]={ /* build a 16x16 matrix */ + tr.elements[0][0], + tr.elements[0][1], + 0, + 0, + tr.elements[1][0], + tr.elements[1][1], + 0, + 0, + 0, + 0, + 1, + 0, + tr.elements[2][0], + tr.elements[2][1], + 0, + 1 + }; + + glMultMatrixf(matrix); +}; + + +RasterizerGLES1::FX::FX() { + + bgcolor_active=false; + bgcolor=Color(0,1,0,1); + + skybox_active=false; + + glow_active=false; + glow_passes=4; + glow_attenuation=0.7; + glow_bloom=0.0; + + antialias_active=true; + antialias_tolerance=15; + + ssao_active=true; + ssao_attenuation=0.7; + ssao_radius=0.18; + ssao_max_distance=1.0; + ssao_range_min=0.25; + ssao_range_max=0.48; + ssao_only=false; + + + fog_active=false; + fog_near=5; + fog_far=100; + fog_attenuation=1.0; + fog_color_near=Color(1,1,1,1); + fog_color_far=Color(1,1,1,1); + fog_bg=false; + + toon_active=false; + toon_treshold=0.4; + toon_soft=0.001; + + edge_active=false; + edge_color=Color(0,0,0,1); + edge_size=1.0; + +} + +static const GLenum prim_type[]={GL_POINTS,GL_LINES,GL_TRIANGLES,GL_TRIANGLE_FAN}; + +static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { + + ERR_FAIL_COND(!p_vertices); + ERR_FAIL_COND(p_points <1 || p_points>4); + + GLenum type = prim_type[p_points - 1]; + + + //if (!p_colors) { + // glColor4f(1, 1, 1, 1); + //}; + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)p_vertices); + + if (p_normals) { + + glEnableClientState(GL_NORMAL_ARRAY); + glNormalPointer(GL_FLOAT, 0, (GLvoid*)p_normals); + }; + + if (p_colors) { + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4,GL_FLOAT, 0, p_colors); + }; + + if (p_uvs) { + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glTexCoordPointer(3, GL_FLOAT, 0, p_uvs); + }; + + glDrawArrays( type, 0, p_points); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); +}; + +/* TEXTURE API */ +#define _EXT_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define _EXT_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define _EXT_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define _EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#define _EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define _EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define _EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#define _EXT_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define _EXT_COMPRESSED_RED_RGTC1 0x8DBB +#define _EXT_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define _EXT_COMPRESSED_RG_RGTC2 0x8DBD +#define _EXT_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define _EXT_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define _EXT_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define _EXT_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#define _EXT_ETC1_RGB8_OES 0x8D64 + +/* TEXTURE API */ + +Image RasterizerGLES1::_get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed) { + + r_has_alpha_cache=false; + r_compressed=false; + Image image=p_image; + + switch(p_format) { + + case Image::FORMAT_GRAYSCALE: { + r_gl_components=1; + r_gl_format=GL_LUMINANCE; + + } break; + case Image::FORMAT_INTENSITY: { + + if (!image.empty()) + image.convert(Image::FORMAT_RGBA); + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + } break; + case Image::FORMAT_GRAYSCALE_ALPHA: { + + //image.convert(Image::FORMAT_RGBA); + r_gl_components=2; + r_gl_format=GL_LUMINANCE_ALPHA; + r_has_alpha_cache=true; + } break; + + case Image::FORMAT_INDEXED: { + + if (!image.empty()) + image.convert(Image::FORMAT_RGB); + r_gl_components=3; + r_gl_format=GL_RGB; + + } break; + + case Image::FORMAT_INDEXED_ALPHA: { + + if (!image.empty()) + image.convert(Image::FORMAT_RGBA); + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + + } break; + case Image::FORMAT_RGB: { + + r_gl_components=3; + r_gl_format=GL_RGB; + } break; + case Image::FORMAT_RGBA: { + + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + } break; + case Image::FORMAT_BC1: { + + r_gl_components=1; //doesn't matter much + r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT; + r_compressed=true; + + } break; + case Image::FORMAT_BC2: { + r_gl_components=1; //doesn't matter much + r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT; + r_has_alpha_cache=true; + r_compressed=true; + + } break; + case Image::FORMAT_BC3: { + + r_gl_components=1; //doesn't matter much + r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT; + r_has_alpha_cache=true; + r_compressed=true; + + } break; + case Image::FORMAT_BC4: { + + r_gl_format=_EXT_COMPRESSED_RED_RGTC1; + r_gl_components=1; //doesn't matter much + r_compressed=true; + + } break; + case Image::FORMAT_BC5: { + + r_gl_format=_EXT_COMPRESSED_RG_RGTC2; + r_gl_components=1; //doesn't matter much + r_compressed=true; + } break; + case Image::FORMAT_PVRTC2: { + + if (!pvr_supported) { + + if (!image.empty()) + image.decompress(); + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + print_line("Load Compat PVRTC2"); + + } else { + + r_gl_format=_EXT_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + r_gl_components=1; //doesn't matter much + r_compressed=true; + print_line("Load Normal PVRTC2"); + } + + } break; + case Image::FORMAT_PVRTC2_ALPHA: { + + if (!pvr_supported) { + + if (!image.empty()) + image.decompress(); + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + print_line("Load Compat PVRTC2A"); + + } else { + + r_gl_format=_EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + r_gl_components=1; //doesn't matter much + r_compressed=true; + print_line("Load Normal PVRTC2A"); + } + + } break; + case Image::FORMAT_PVRTC4: { + + if (!pvr_supported) { + + if (!image.empty()) + image.decompress(); + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + print_line("Load Compat PVRTC4"); + } else { + + r_gl_format=_EXT_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + r_gl_components=1; //doesn't matter much + r_compressed=true; + print_line("Load Normal PVRTC4"); + } + + } break; + case Image::FORMAT_PVRTC4_ALPHA: { + + if (!pvr_supported) { + + if (!image.empty()) + image.decompress(); + r_gl_components=4; + r_gl_format=GL_RGBA; + r_has_alpha_cache=true; + print_line("Load Compat PVRTC4A"); + + } else { + + r_gl_format=_EXT_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + r_gl_components=1; //doesn't matter much + r_compressed=true; + print_line("Load Normal PVRTC4A"); + } + + } break; + case Image::FORMAT_ETC: { + + if (!pvr_supported) { + + if (!image.empty()) + image.decompress(); + } else { + + r_gl_format=_EXT_ETC1_RGB8_OES; + r_gl_components=1; //doesn't matter much + r_compressed=true; + } + + } break; + case Image::FORMAT_YUV_422: + case Image::FORMAT_YUV_444: { + + if (!image.empty()) + image.convert(Image::FORMAT_RGB); + r_gl_format=GL_RGB; + r_gl_components=3; + + } break; + + default: { + + ERR_FAIL_V(Image()); + } + } + + return image; +} + + +RID RasterizerGLES1::texture_create() { + + Texture *texture = memnew(Texture); + ERR_FAIL_COND_V(!texture,RID()); + glGenTextures(1, &texture->tex_id); + texture->active=false; + texture->total_data_size=0; + + return texture_owner.make_rid( texture ); + +} + +void RasterizerGLES1::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { + + bool has_alpha_cache; + int components; + GLenum format; + bool compressed; + + int po2_width = nearest_power_of_2(p_width); + int po2_height = nearest_power_of_2(p_height); + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + texture->width=p_width; + texture->height=p_height; + texture->format=p_format; + texture->flags=p_flags; + texture->target = /*(p_flags & VS::TEXTURE_FLAG_CUBEMAP) ? GL_TEXTURE_CUBE_MAP :*/ GL_TEXTURE_2D; + + bool scale_textures = (!npo2_textures_available || p_format&VS::TEXTURE_FLAG_MIPMAPS); + + + if (scale_textures) { + texture->alloc_width = po2_width; + texture->alloc_height = po2_height; + } else { + + texture->alloc_width = texture->width; + texture->alloc_height = texture->height; + }; + + _get_gl_image_and_format(Image(),texture->format,texture->flags,format,components,has_alpha_cache,compressed); + + texture->gl_components_cache=components; + texture->gl_format_cache=format; + texture->format_has_alpha=has_alpha_cache; + texture->compressed=compressed; + texture->data_size=0; + + + // glActiveTexture(GL_TEXTURE0); + glBindTexture(texture->target, texture->tex_id); + + + + + if (compressed) { + + glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_FALSE ); + } else { + if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) { + glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_TRUE ); + } else { + glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_FALSE ); + } + + } + + + if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) + glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); + else + glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + + if (texture->flags&VS::TEXTURE_FLAG_FILTER) { + + glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering + + } else { + + glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // raw Filtering + + } + bool force_clamp_to_edge = !(p_flags&VS::TEXTURE_FLAG_MIPMAPS) && (nearest_power_of_2(texture->alloc_height)!=texture->alloc_height || nearest_power_of_2(texture->alloc_width)!=texture->alloc_width); + + if (!force_clamp_to_edge && texture->flags&VS::TEXTURE_FLAG_REPEAT) { + + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); + } else { + + //glTexParameterf( texture->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); + glTexParameterf( texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameterf( texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + } + + texture->active=true; +} + +void RasterizerGLES1::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + ERR_FAIL_COND(!texture->active); + ERR_FAIL_COND(texture->format != p_image.get_format() ); + + int components; + GLenum format; + bool alpha; + bool compressed; + + if (keep_copies && !(texture->flags&VS::TEXTURE_FLAG_VIDEO_SURFACE) && !(use_reload_hooks && texture->reloader)) { + texture->image[p_cube_side]=p_image; + } + + + Image img = _get_gl_image_and_format(p_image, p_image.get_format(),texture->flags,format,components,alpha,compressed); + if (texture->alloc_width != img.get_width() || texture->alloc_height != img.get_height()) { + + img.resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR); + }; + + + GLenum blit_target = /*(texture->target == GL_TEXTURE_CUBE_MAP)?_cube_side_enum[p_cube_side]:*/GL_TEXTURE_2D; + + texture->data_size=img.get_data().size(); + DVector::Read read = img.get_data().read(); + + // glActiveTexture(GL_TEXTURE0); + glBindTexture(texture->target, texture->tex_id); + + int mipmaps=(texture->flags&VS::TEXTURE_FLAG_MIPMAPS && img.get_mipmaps()>0) ? img.get_mipmaps() +1 : 1; + + int w=img.get_width(); + int h=img.get_height(); + + int tsize=0; + for(int i=0;icompressed) { + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + // glCompressedTexImage2D( blit_target, i, format,w,h,0,size,&read[ofs] ); + + } else { + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); +// glTexImage2D(blit_target, i, format==GL_RGB?GL_RGB8:format, w, h, 0, format, GL_UNSIGNED_BYTE,&read[ofs]); + glTexImage2D(blit_target, i, format, w, h, 0, format, GL_UNSIGNED_BYTE,&read[ofs]); + //glTexSubImage2D( blit_target, i, 0,0,w,h,format,GL_UNSIGNED_BYTE,&read[ofs] ); + } + tsize+=size; + + w = MAX(1,w>>1); + h = MAX(1,h>>1); + + } + + _rinfo.texture_mem-=texture->total_data_size; + texture->total_data_size=tsize; + _rinfo.texture_mem+=texture->total_data_size; + + printf("texture: %i x %i - size: %i - total: %i\n",texture->width,texture->height,tsize,_rinfo.texture_mem); + + + if (mipmaps==1 && texture->flags&VS::TEXTURE_FLAG_MIPMAPS) { + glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE ); + + } else { + glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE ); + + } + + if (mipmaps>1) { + + //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmaps-1 ); - assumed to have all, always + } + + //texture_set_flags(p_texture,texture->flags); + + +} + +Image RasterizerGLES1::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image()); + ERR_FAIL_COND_V(!texture->active,Image()); + + return texture->image[p_cube_side]; +#if 0 + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image()); + ERR_FAIL_COND_V(!texture->active,Image()); + ERR_FAIL_COND_V(texture->data_size==0,Image()); + + DVector data; + GLenum format,type=GL_UNSIGNED_BYTE; + Image::Format fmt; + int pixelsize=0; + int pixelshift=0; + int minw=1,minh=1; + bool compressed=false; + + fmt=texture->format; + + switch(texture->format) { + + case Image::FORMAT_GRAYSCALE: { + + format=GL_LUMINANCE; + type=GL_UNSIGNED_BYTE; + data.resize(texture->alloc_width*texture->alloc_height); + pixelsize=1; + + } break; + case Image::FORMAT_INTENSITY: { + return Image(); + } break; + case Image::FORMAT_GRAYSCALE_ALPHA: { + + format=GL_LUMINANCE_ALPHA; + type=GL_UNSIGNED_BYTE; + pixelsize=2; + + } break; + case Image::FORMAT_RGB: { + format=GL_RGB; + type=GL_UNSIGNED_BYTE; + pixelsize=3; + } break; + case Image::FORMAT_RGBA: { + + format=GL_RGBA; + type=GL_UNSIGNED_BYTE; + pixelsize=4; + } break; + case Image::FORMAT_INDEXED: { + + format=GL_RGB; + type=GL_UNSIGNED_BYTE; + fmt=Image::FORMAT_RGB; + pixelsize=3; + } break; + case Image::FORMAT_INDEXED_ALPHA: { + + format=GL_RGBA; + type=GL_UNSIGNED_BYTE; + fmt=Image::FORMAT_RGBA; + pixelsize=4; + + } break; + case Image::FORMAT_BC1: { + + pixelsize=1; //doesn't matter much + format=GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; + compressed=true; + pixelshift=1; + minw=minh=4; + + } break; + case Image::FORMAT_BC2: { + pixelsize=1; //doesn't matter much + format=GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + compressed=true; + minw=minh=4; + + } break; + case Image::FORMAT_BC3: { + + pixelsize=1; //doesn't matter much + format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + compressed=true; + minw=minh=4; + + } break; + case Image::FORMAT_BC4: { + + format=GL_COMPRESSED_RED_RGTC1; + pixelsize=1; //doesn't matter much + compressed=true; + pixelshift=1; + minw=minh=4; + + } break; + case Image::FORMAT_BC5: { + + format=GL_COMPRESSED_RG_RGTC2; + pixelsize=1; //doesn't matter much + compressed=true; + minw=minh=4; + + } break; + + default:{} + } + + data.resize(texture->data_size); + DVector::Write wb = data.write(); + + glActiveTexture(GL_TEXTURE0); + int ofs=0; + glBindTexture(texture->target,texture->tex_id); + + int w=texture->alloc_width; + int h=texture->alloc_height; + for(int i=0;imipmaps+1;i++) { + + if (compressed) { + + glPixelStorei(GL_PACK_ALIGNMENT, 4); + glGetCompressedTexImage(texture->target,i,&wb[ofs]); + + } else { + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glGetTexImage(texture->target,i,format,type,&wb[ofs]); + } + + int size = (w*h*pixelsize)>>pixelshift; + ofs+=size; + + w=MAX(minw,w>>1); + h=MAX(minh,h>>1); + + } + + + wb=DVector::Write(); + + Image img(texture->alloc_width,texture->alloc_height,texture->mipmaps,fmt,data); + + if (texture->formatalloc_width!=texture->width || texture->alloc_height!=texture->height)) + img.resize(texture->width,texture->height); + + return img; +#endif +} + +void RasterizerGLES1::texture_set_flags(RID p_texture,uint32_t p_flags) { + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + + // glActiveTexture(GL_TEXTURE0); + glBindTexture(texture->target, texture->tex_id); + uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; + texture->flags=p_flags|cube; // can't remove a cube from being a cube + + bool force_clamp_to_edge = !(p_flags&VS::TEXTURE_FLAG_MIPMAPS) && (nearest_power_of_2(texture->alloc_height)!=texture->alloc_height || nearest_power_of_2(texture->alloc_width)!=texture->alloc_width); + + if (!force_clamp_to_edge && texture->flags&VS::TEXTURE_FLAG_REPEAT) { + + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); + } else { + //glTexParameterf( texture->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); + glTexParameterf( texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameterf( texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + + } + + + if (texture->flags&VS::TEXTURE_FLAG_FILTER) { + + glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering + if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) + glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); + else + glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering + + } else { + + glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // nearest + } +} +uint32_t RasterizerGLES1::texture_get_flags(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->flags; + +} +Image::Format RasterizerGLES1::texture_get_format(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); + + return texture->format; +} +uint32_t RasterizerGLES1::texture_get_width(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->width; +} +uint32_t RasterizerGLES1::texture_get_height(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return texture->height; +} + +bool RasterizerGLES1::texture_has_alpha(RID p_texture) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND_V(!texture,0); + + return false; + +} + +void RasterizerGLES1::texture_set_size_override(RID p_texture,int p_width, int p_height) { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + + ERR_FAIL_COND(p_width<=0 || p_width>256); + ERR_FAIL_COND(p_height<=0 || p_height>256); + //real texture size is in alloc width and height + texture->width=p_width; + texture->height=p_height; + +} + +void RasterizerGLES1::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { + + Texture * texture = texture_owner.get(p_texture); + + ERR_FAIL_COND(!texture); + + texture->reloader=p_owner; + texture->reloader_func=p_function; + if (use_reload_hooks && p_owner && keep_copies) { + + for(int i=0;i<6;i++) + texture->image[i]=Image(); + } + + +} + +/* SHADER API */ + +/* SHADER API */ + +RID RasterizerGLES1::shader_create(VS::ShaderMode p_mode) { + + Shader *shader = memnew( Shader ); + shader->mode=p_mode; + shader->valid=false; + shader->has_alpha=false; + shader->fragment_line=0; + shader->vertex_line=0; + shader->light_line=0; + RID rid = shader_owner.make_rid(shader); + shader_set_mode(rid,p_mode); +// _shader_make_dirty(shader); + + return rid; + +} + + + +void RasterizerGLES1::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) { + + ERR_FAIL_INDEX(p_mode,3); + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); +// if (shader->custom_code_id && p_mode==shader->mode) +// return; + + shader->mode=p_mode; + +} +VS::ShaderMode RasterizerGLES1::shader_get_mode(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL); + return shader->mode; +} + + + +void RasterizerGLES1::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { + + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); + +#ifdef DEBUG_ENABLED + if (shader->vertex_code==p_vertex && shader->fragment_code==p_fragment && shader->light_code==p_light) + return; +#endif + shader->fragment_code=p_fragment; + shader->vertex_code=p_vertex; + shader->light_code=p_light; + shader->fragment_line=p_fragment_ofs; + shader->vertex_line=p_vertex_ofs; + shader->light_line=p_light_ofs; + +} + +String RasterizerGLES1::shader_get_vertex_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->vertex_code; + +} + +String RasterizerGLES1::shader_get_fragment_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->fragment_code; + +} + +String RasterizerGLES1::shader_get_light_code(RID p_shader) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND_V(!shader,String()); + return shader->light_code; + +} + +void RasterizerGLES1::shader_get_param_list(RID p_shader, List *p_param_list) const { + + Shader *shader=shader_owner.get(p_shader); + ERR_FAIL_COND(!shader); +#if 0 + + if (shader->dirty_list.in_list()) + _update_shader(shader); // ok should be not anymore dirty + + + Map order; + + + for(Map::Element *E=shader->uniforms.front();E;E=E->next()) { + + + order[E->get().order]=E->key(); + } + + + for(Map::Element *E=order.front();E;E=E->next()) { + + PropertyInfo pi; + ShaderLanguage::Uniform &u=shader->uniforms[E->get()]; + pi.name=E->get(); + switch(u.type) { + + case ShaderLanguage::TYPE_VOID: + case ShaderLanguage::TYPE_BOOL: + case ShaderLanguage::TYPE_FLOAT: + case ShaderLanguage::TYPE_VEC2: + case ShaderLanguage::TYPE_VEC3: + case ShaderLanguage::TYPE_MAT3: + case ShaderLanguage::TYPE_MAT4: + case ShaderLanguage::TYPE_VEC4: + pi.type=u.default_value.get_type(); + break; + case ShaderLanguage::TYPE_TEXTURE: + pi.type=Variant::_RID; + pi.hint=PROPERTY_HINT_RESOURCE_TYPE; + pi.hint_string="Texture"; + break; + case ShaderLanguage::TYPE_CUBEMAP: + pi.type=Variant::_RID; + pi.hint=PROPERTY_HINT_RESOURCE_TYPE; + pi.hint_string="Texture"; + break; + }; + + p_param_list->push_back(pi); + + } +#endif + +} + +/* COMMON MATERIAL API */ + + +RID RasterizerGLES1::material_create() { + + return material_owner.make_rid( memnew( Material ) ); +} + +void RasterizerGLES1::material_set_shader(RID p_material, RID p_shader) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->shader=p_shader; + +} + +RID RasterizerGLES1::material_get_shader(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,RID()); + return material->shader; +} + +#if 0 + +void RasterizerGLES1::_material_check_alpha(Material *p_material) { + + p_material->has_alpha=false; + Color diffuse=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; + if (diffuse.a<0.98) { + + p_material->has_alpha=true; + return; + } + + if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { + + Texture *tex = texture_owner.get(p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE]); + if (!tex) + return; + if (tex->has_alpha) { + + p_material->has_alpha=true; + return; + } + } +} + +#endif +void RasterizerGLES1::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + + if (p_value.get_type()==Variant::NIL) + material->shader_params.erase(p_param); + else + material->shader_params[p_param]=p_value; +} +Variant RasterizerGLES1::material_get_param(RID p_material, const StringName& p_param) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,Variant()); + + if (material->shader_params.has(p_param)) + return material->shader_params[p_param]; + else + return Variant(); +} + + +void RasterizerGLES1::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX); + material->flags[p_flag]=p_enabled; + +} +bool RasterizerGLES1::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,false); + ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false); + return material->flags[p_flag]; + + +} + +void RasterizerGLES1::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->depth_draw_mode=p_mode; +} + +VS::MaterialDepthDrawMode RasterizerGLES1::material_get_depth_draw_mode(RID p_material) const{ + + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); + return material->depth_draw_mode; +} + + +void RasterizerGLES1::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->blend_mode=p_mode; + +} +VS::MaterialBlendMode RasterizerGLES1::material_get_blend_mode(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD); + return material->blend_mode; +} + +void RasterizerGLES1::material_set_line_width(RID p_material,float p_line_width) { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND(!material); + material->line_width=p_line_width; + +} +float RasterizerGLES1::material_get_line_width(RID p_material) const { + + Material *material = material_owner.get(p_material); + ERR_FAIL_COND_V(!material,0); + + return material->line_width; +} + +/* FIXED MATERIAL */ + + +RID RasterizerGLES1::fixed_material_create() { + + return material_create(); +} + +void RasterizerGLES1::fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled) { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND(!m); + ERR_FAIL_INDEX(p_flag, 3); + m->fixed_flags[p_flag]=p_enabled; +} + +bool RasterizerGLES1::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND_V(!m,false); + ERR_FAIL_INDEX_V(p_flag,VS::FIXED_MATERIAL_FLAG_MAX, false); + return m->fixed_flags[p_flag]; +} + +void RasterizerGLES1::fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value) { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND(!m); + ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); + + m->parameters[p_parameter] = p_value; + +} + +Variant RasterizerGLES1::fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND_V(!m, Variant()); + ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, Variant()); + + return m->parameters[p_parameter]; +} + +void RasterizerGLES1::fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture) { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND(!m); + ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); + + m->textures[p_parameter] = p_texture; + +} +RID RasterizerGLES1::fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND_V(!m, RID()); + ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, Variant()); + + return m->textures[p_parameter]; +} + + +void RasterizerGLES1::fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode) { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND(!m); + ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); + ERR_FAIL_INDEX(p_mode,4); + + m->texcoord_mode[p_parameter] = p_mode; +} + +VS::FixedMaterialTexCoordMode RasterizerGLES1::fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND_V(!m, VS::FIXED_MATERIAL_TEXCOORD_UV); + ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, VS::FIXED_MATERIAL_TEXCOORD_UV); + + return m->texcoord_mode[p_parameter]; // for now +} + +void RasterizerGLES1::fixed_material_set_uv_transform(RID p_material,const Transform& p_transform) { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND(!m); + + m->uv_transform = p_transform; +} + +Transform RasterizerGLES1::fixed_material_get_uv_transform(RID p_material) const { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND_V(!m, Transform()); + + return m->uv_transform; +} + +void RasterizerGLES1::fixed_material_set_point_size(RID p_material,float p_size) { + + Material *m=material_owner.get( p_material ); + ERR_FAIL_COND(!m); + m->point_size=p_size; + +} +float RasterizerGLES1::fixed_material_get_point_size(RID p_material) const { + + const Material *m=material_owner.get( p_material ); + ERR_FAIL_COND_V(!m, 0); + return m->point_size; +} + + +/* MESH API */ + + +RID RasterizerGLES1::mesh_create() { + + + return mesh_owner.make_rid( memnew( Mesh ) ); +} + + + +void RasterizerGLES1::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); + ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); + + uint32_t format=0; + + // validation + int index_array_len=0; + int array_len=0; + + for(int i=0;imorph_target_count>0) { + + use_VBO=false; + } + + surface->packed=pack_arrays && use_VBO; + + int total_elem_size=0; + + for (int i=0;iarray[i]; + ad.size=0; + ad.ofs=0; + int elem_size=0; + int elem_count=0; + bool valid_local=true; + GLenum datatype; + bool normalize=false; + bool bind=false; + + if (!(format&(1<packed) { + elem_size=3*sizeof(int16_t); // vertex + datatype=GL_SHORT; + normalize=true; + + } else { + elem_size=3*sizeof(GLfloat); // vertex + datatype=GL_FLOAT; + } + bind=true; + elem_count=3; + + } break; + case VS::ARRAY_NORMAL: { + + if (surface->packed) { + elem_size=3*sizeof(int8_t); // vertex + datatype=GL_BYTE; + normalize=true; + } else { + elem_size=3*sizeof(GLfloat); // vertex + datatype=GL_FLOAT; + } + bind=true; + elem_count=3; + } break; + case VS::ARRAY_TANGENT: { + if (surface->packed) { + elem_size=4*sizeof(int8_t); // vertex + datatype=GL_BYTE; + normalize=true; + } else { + elem_size=4*sizeof(GLfloat); // vertex + datatype=GL_FLOAT; + } + bind=true; + elem_count=4; + + } break; + case VS::ARRAY_COLOR: { + + elem_size=4*sizeof(uint8_t); /* RGBA */ + datatype=GL_UNSIGNED_BYTE; + elem_count=4; + bind=true; + normalize=true; + } break; + case VS::ARRAY_TEX_UV: + case VS::ARRAY_TEX_UV2: { + if (surface->packed) { + elem_size=2*sizeof(int16_t); // vertex + datatype=GL_SHORT; + normalize=true; + } else { + elem_size=2*sizeof(GLfloat); // vertex + datatype=GL_FLOAT; + } + bind=true; + elem_count=2; + + } break; + case VS::ARRAY_WEIGHTS: { + + elem_size=VS::ARRAY_WEIGHTS_SIZE*sizeof(GLfloat); + elem_count=VS::ARRAY_WEIGHTS_SIZE; + valid_local=false; + datatype=GL_FLOAT; + + } break; + case VS::ARRAY_BONES: { + + elem_size=VS::ARRAY_WEIGHTS_SIZE*sizeof(GLuint); + elem_count=VS::ARRAY_WEIGHTS_SIZE; + valid_local=false; + datatype=GL_FLOAT; + + + } break; + case VS::ARRAY_INDEX: { + + if (index_array_len<=0) { + ERR_PRINT("index_array_len==NO_INDEX_ARRAY"); + break; + } + /* determine wether using 16 or 32 bits indices */ + elem_size=2; + datatype=GL_UNSIGNED_SHORT; + + + surface->index_array_len=index_array_len; // only way it can exist + ad.ofs=0; + ad.size=elem_size; + + + continue; + } break; + default: { + ERR_FAIL( ); + } + } + + ad.ofs=total_elem_size; + ad.size=elem_size; + ad.datatype=datatype; + ad.normalize=normalize; + ad.bind=bind; + ad.count=elem_count; + total_elem_size+=elem_size; + if (valid_local) { + surface->local_stride+=elem_size; + surface->morph_format|=(1<stride=total_elem_size; + surface->array_len=array_len; + surface->format=format; + surface->primitive=p_primitive; + surface->configured_format=0; + if (keep_copies) { + surface->data=p_arrays; + surface->morph_data=p_blend_shapes; + } + + uint8_t *array_ptr=NULL; + uint8_t *index_array_ptr=NULL; + DVector array_pre_vbo; + DVector::Write vaw; + DVector index_array_pre_vbo; + DVector::Write iaw; + + /* create pointers */ + if (use_VBO) { + + array_pre_vbo.resize(surface->array_len*surface->stride); + vaw = array_pre_vbo.write(); + array_ptr=vaw.ptr(); + + if (surface->index_array_len) { + + index_array_pre_vbo.resize(surface->index_array_len*surface->array[VS::ARRAY_INDEX].size); + iaw = index_array_pre_vbo.write(); + index_array_ptr=iaw.ptr(); + } + } else { + + surface->array_local = (uint8_t*)memalloc(surface->array_len*surface->stride); + array_ptr=(uint8_t*)surface->array_local; + if (surface->index_array_len) { + surface->index_array_local = (uint8_t*)memalloc(index_array_len*surface->array[VS::ARRAY_INDEX].size); + index_array_ptr=(uint8_t*)surface->index_array_local; + } + } + + + + _surface_set_arrays(surface,array_ptr,index_array_ptr,p_arrays,true); + + + mesh->surfaces.push_back(surface); + +} + +Error RasterizerGLES1::_surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main) { + + uint32_t stride = p_main ? p_surface->stride : p_surface->local_stride; + + for(int ai=0;ai=p_arrays.size()) + break; + if (p_arrays[ai].get_type()==Variant::NIL) + continue; + Surface::ArrayData &a=p_surface->array[ai]; + + switch(ai) { + + + case VS::ARRAY_VERTEX: { + + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); + + DVector array = p_arrays[ai]; + ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); + + + DVector::Read read = array.read(); + const Vector3* src=read.ptr(); + + // setting vertices means regenerating the AABB + AABB aabb; + + float scale=1; + float max=0; + + + for (int i=0;iarray_len;i++) { + + + GLfloat vector[3]={ src[i].x, src[i].y, src[i].z }; + + copymem(&p_mem[a.ofs+i*stride], vector, a.size); + + if (i==0) { + + aabb=AABB(src[i],Vector3()); + } else { + + aabb.expand_to( src[i] ); + } + } + + if (p_main) { + p_surface->aabb=aabb; + p_surface->vertex_scale=scale; + } + + + } break; + case VS::ARRAY_NORMAL: { + + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); + + DVector array = p_arrays[ai]; + ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); + + + DVector::Read read = array.read(); + const Vector3* src=read.ptr(); + + // setting vertices means regenerating the AABB + + for (int i=0;iarray_len;i++) { + + + GLfloat vector[3]={ src[i].x, src[i].y, src[i].z }; + copymem(&p_mem[a.ofs+i*stride], vector, a.size); + + } + + + } break; + case VS::ARRAY_TANGENT: { + + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); + + DVector array = p_arrays[ai]; + + ERR_FAIL_COND_V( array.size() != p_surface->array_len*4, ERR_INVALID_PARAMETER ); + + + DVector::Read read = array.read(); + const real_t* src = read.ptr(); + + for (int i=0;iarray_len;i++) { + + GLfloat xyzw[4]={ + src[i*4+0], + src[i*4+1], + src[i*4+2], + src[i*4+3] + }; + + copymem(&p_mem[a.ofs+i*stride], xyzw, a.size); + + } + + } break; + case VS::ARRAY_COLOR: { + + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::COLOR_ARRAY, ERR_INVALID_PARAMETER ); + + + DVector array = p_arrays[ai]; + + ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); + + + DVector::Read read = array.read(); + const Color* src = read.ptr(); + bool alpha=false; + + for (int i=0;iarray_len;i++) { + + if (src[i].a<0.98) // tolerate alpha a bit, for crappy exporters + alpha=true; + + uint8_t colors[4]; + + for(int j=0;j<4;j++) { + + colors[j]=CLAMP( int((src[i][j])*255.0), 0,255 ); + } + + copymem(&p_mem[a.ofs+i*stride], colors, a.size); + + } + + if (p_main) + p_surface->has_alpha=alpha; + + } break; + case VS::ARRAY_TEX_UV: + case VS::ARRAY_TEX_UV2: { + + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY && p_arrays[ai].get_type() != Variant::VECTOR2_ARRAY, ERR_INVALID_PARAMETER ); + + DVector array = p_arrays[ai]; + + ERR_FAIL_COND_V( array.size() != p_surface->array_len , ERR_INVALID_PARAMETER); + + DVector::Read read = array.read(); + + const Vector2 * src=read.ptr(); + float scale=1.0; + + + for (int i=0;iarray_len;i++) { + + GLfloat uv[2]={ src[i].x , src[i].y }; + + copymem(&p_mem[a.ofs+i*stride], uv, a.size); + + } + + if (p_main) { + + if (ai==VS::ARRAY_TEX_UV) { + + p_surface->uv_scale=scale; + } + if (ai==VS::ARRAY_TEX_UV2) { + + p_surface->uv2_scale=scale; + } + } + + } break; + case VS::ARRAY_BONES: + case VS::ARRAY_WEIGHTS: { + + + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); + + DVector array = p_arrays[ai]; + + ERR_FAIL_COND_V( array.size() != p_surface->array_len*VS::ARRAY_WEIGHTS_SIZE, ERR_INVALID_PARAMETER ); + + + DVector::Read read = array.read(); + + const real_t * src = read.ptr(); + + p_surface->max_bone=0; + + for (int i=0;iarray_len;i++) { + + GLfloat data[VS::ARRAY_WEIGHTS_SIZE]; + for (int j=0;jmax_bone=MAX(data[j],p_surface->max_bone); + } + } + + copymem(&p_mem[a.ofs+i*stride], data, a.size); + + + } + + } break; + case VS::ARRAY_INDEX: { + + ERR_FAIL_COND_V( p_surface->index_array_len<=0, ERR_INVALID_DATA ); + ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::INT_ARRAY, ERR_INVALID_PARAMETER ); + + DVector indices = p_arrays[ai]; + ERR_FAIL_COND_V( indices.size() == 0, ERR_INVALID_PARAMETER ); + ERR_FAIL_COND_V( indices.size() != p_surface->index_array_len, ERR_INVALID_PARAMETER ); + + /* determine wether using 16 or 32 bits indices */ + + DVector::Read read = indices.read(); + const int *src=read.ptr(); + + for (int i=0;iindex_array_len;i++) { + + + if (a.size==2) { + uint16_t v=src[i]; + + copymem(&p_index_mem[i*a.size], &v, a.size); + } else { + uint32_t v=src[i]; + + copymem(&p_index_mem[i*a.size], &v, a.size); + } + } + + + } break; + + + default: { ERR_FAIL_V(ERR_INVALID_PARAMETER);} + } + + p_surface->configured_format|=(1<surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->data; + + +} +Array RasterizerGLES1::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,Array()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, Array() ); + + return surface->morph_data; + +} + + +void RasterizerGLES1::mesh_set_morph_target_count(RID p_mesh,int p_amount) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_COND( mesh->surfaces.size()!=0 ); + + mesh->morph_target_count=p_amount; + +} + +int RasterizerGLES1::mesh_get_morph_target_count(RID p_mesh) const{ + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->morph_target_count; + +} + +void RasterizerGLES1::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { + + ERR_FAIL_INDEX(p_mode,2); + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->morph_target_mode=p_mode; + +} + +VS::MorphTargetMode RasterizerGLES1::mesh_get_morph_target_mode(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); + + return mesh->morph_target_mode; + +} + + + +void RasterizerGLES1::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND( !surface); + + if (surface->material_owned && surface->material.is_valid()) + free(surface->material); + + surface->material_owned=p_owned; + + surface->material=p_material; +} + +RID RasterizerGLES1::mesh_surface_get_material(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,RID()); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, RID() ); + + return surface->material; +} + +int RasterizerGLES1::mesh_surface_get_array_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + return surface->array_len; +} +int RasterizerGLES1::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, -1 ); + + return surface->index_array_len; +} +uint32_t RasterizerGLES1::mesh_surface_get_format(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,0); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, 0 ); + + return surface->format; +} +VS::PrimitiveType RasterizerGLES1::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS); + ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS ); + Surface *surface = mesh->surfaces[p_surface]; + ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS ); + + return surface->primitive; +} + +void RasterizerGLES1::mesh_remove_surface(RID p_mesh,int p_index) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + ERR_FAIL_INDEX(p_index, mesh->surfaces.size() ); + Surface *surface = mesh->surfaces[p_index]; + ERR_FAIL_COND( !surface); + + if (mesh->morph_target_count) { + for(int i=0;imorph_target_count;i++) + memfree(surface->morph_targets_local[i].array); + memfree( surface->morph_targets_local ); + } + + memdelete( mesh->surfaces[p_index] ); + mesh->surfaces.remove(p_index); + +} +int RasterizerGLES1::mesh_get_surface_count(RID p_mesh) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,-1); + + return mesh->surfaces.size(); +} + +AABB RasterizerGLES1::mesh_get_aabb(RID p_mesh,RID p_skeleton) const { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + if (mesh->custom_aabb!=AABB()) + return mesh->custom_aabb; + + AABB aabb; + + for (int i=0;isurfaces.size();i++) { + + if (i==0) + aabb=mesh->surfaces[i]->aabb; + else + aabb.merge_with(mesh->surfaces[i]->aabb); + } + + return aabb; +} + +void RasterizerGLES1::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) { + + Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND(!mesh); + + mesh->custom_aabb=p_aabb; + +} + +AABB RasterizerGLES1::mesh_get_custom_aabb(RID p_mesh) const { + + const Mesh *mesh = mesh_owner.get( p_mesh ); + ERR_FAIL_COND_V(!mesh,AABB()); + + return mesh->custom_aabb; +} + + +/* MULTIMESH API */ + +RID RasterizerGLES1::multimesh_create() { + + return multimesh_owner.make_rid( memnew( MultiMesh )); +} + +void RasterizerGLES1::multimesh_set_instance_count(RID p_multimesh,int p_count) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + if (nearest_power_of_2(p_count)!=nearest_power_of_2(multimesh->elements.size())) { + if (multimesh->tex_id) { + glDeleteTextures(1,&multimesh->tex_id); + multimesh->tex_id=0; + } + + if (p_count) { + + uint32_t po2 = nearest_power_of_2(p_count); + if (po2&0xAAAAAAAA) { + //half width + + multimesh->tw=Math::sqrt(po2*2); + multimesh->th=multimesh->tw/2; + } else { + + multimesh->tw=Math::sqrt(po2); + multimesh->th=multimesh->tw; + + } + multimesh->tw*=4; + if (multimesh->th==0) + multimesh->th=1; + + + + glGenTextures(1, &multimesh->tex_id); + // glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D,multimesh->tex_id); + + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, multimesh->tw, multimesh->th, 0, GL_RGBA, GL_FLOAT,NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + //multimesh->pixel_size=1.0/ps; + + glBindTexture(GL_TEXTURE_2D,0); + } + + } + multimesh->elements.resize(p_count); + +} +int RasterizerGLES1::multimesh_get_instance_count(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + + return multimesh->elements.size(); +} + +void RasterizerGLES1::multimesh_set_mesh(RID p_multimesh,RID p_mesh) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + multimesh->mesh=p_mesh; + +} +void RasterizerGLES1::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->aabb=p_aabb; +} +void RasterizerGLES1::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + MultiMesh::Element &e=multimesh->elements[p_index]; + + e.matrix[0]=p_transform.basis.elements[0][0]; + e.matrix[1]=p_transform.basis.elements[1][0]; + e.matrix[2]=p_transform.basis.elements[2][0]; + e.matrix[3]=0; + e.matrix[4]=p_transform.basis.elements[0][1]; + e.matrix[5]=p_transform.basis.elements[1][1]; + e.matrix[6]=p_transform.basis.elements[2][1]; + e.matrix[7]=0; + e.matrix[8]=p_transform.basis.elements[0][2]; + e.matrix[9]=p_transform.basis.elements[1][2]; + e.matrix[10]=p_transform.basis.elements[2][2]; + e.matrix[11]=0; + e.matrix[12]=p_transform.origin.x; + e.matrix[13]=p_transform.origin.y; + e.matrix[14]=p_transform.origin.z; + e.matrix[15]=1; + +} +void RasterizerGLES1::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh) + ERR_FAIL_INDEX(p_index,multimesh->elements.size()); + MultiMesh::Element &e=multimesh->elements[p_index]; + e.color[0]=CLAMP(p_color.r*255,0,255); + e.color[1]=CLAMP(p_color.g*255,0,255); + e.color[2]=CLAMP(p_color.b*255,0,255); + e.color[3]=CLAMP(p_color.a*255,0,255); + + +} + +RID RasterizerGLES1::multimesh_get_mesh(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,RID()); + + return multimesh->mesh; +} +AABB RasterizerGLES1::multimesh_get_aabb(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,AABB()); + + return multimesh->aabb; +} + +Transform RasterizerGLES1::multimesh_instance_get_transform(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Transform()); + + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform()); + MultiMesh::Element &e=multimesh->elements[p_index]; + + Transform tr; + + tr.basis.elements[0][0]=e.matrix[0]; + tr.basis.elements[1][0]=e.matrix[1]; + tr.basis.elements[2][0]=e.matrix[2]; + tr.basis.elements[0][1]=e.matrix[4]; + tr.basis.elements[1][1]=e.matrix[5]; + tr.basis.elements[2][1]=e.matrix[6]; + tr.basis.elements[0][2]=e.matrix[8]; + tr.basis.elements[1][2]=e.matrix[9]; + tr.basis.elements[2][2]=e.matrix[10]; + tr.origin.x=e.matrix[12]; + tr.origin.y=e.matrix[13]; + tr.origin.z=e.matrix[14]; + + return tr; +} +Color RasterizerGLES1::multimesh_instance_get_color(RID p_multimesh,int p_index) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,Color()); + ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color()); + MultiMesh::Element &e=multimesh->elements[p_index]; + Color c; + c.r=e.color[0]/255.0; + c.g=e.color[1]/255.0; + c.b=e.color[2]/255.0; + c.a=e.color[3]/255.0; + + return c; + +} + +void RasterizerGLES1::multimesh_set_visible_instances(RID p_multimesh,int p_visible) { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + multimesh->visible=p_visible; + +} + +int RasterizerGLES1::multimesh_get_visible_instances(RID p_multimesh) const { + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND_V(!multimesh,-1); + return multimesh->visible; + +} + +/* IMMEDIATE API */ + + +RID RasterizerGLES1::immediate_create() { + + Immediate *im = memnew( Immediate ); + return immediate_owner.make_rid(im); + +} + +void RasterizerGLES1::immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture){ + + +} +void RasterizerGLES1::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ + + +} +void RasterizerGLES1::immediate_normal(RID p_immediate,const Vector3& p_normal){ + + +} +void RasterizerGLES1::immediate_tangent(RID p_immediate,const Plane& p_tangent){ + + +} +void RasterizerGLES1::immediate_color(RID p_immediate,const Color& p_color){ + + +} +void RasterizerGLES1::immediate_uv(RID p_immediate,const Vector2& tex_uv){ + + +} +void RasterizerGLES1::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ + + +} + +void RasterizerGLES1::immediate_end(RID p_immediate){ + + +} +void RasterizerGLES1::immediate_clear(RID p_immediate) { + + +} + +AABB RasterizerGLES1::immediate_get_aabb(RID p_immediate) const { + + return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); +} + +void RasterizerGLES1::immediate_set_material(RID p_immediate,RID p_material) { + + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + im->material=p_material; +} + +RID RasterizerGLES1::immediate_get_material(RID p_immediate) const { + + const Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND_V(!im,RID()); + return im->material; + +} + + +/* PARTICLES API */ + +RID RasterizerGLES1::particles_create() { + + Particles *particles = memnew( Particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles_owner.make_rid(particles); +} + +void RasterizerGLES1::particles_set_amount(RID p_particles, int p_amount) { + + ERR_FAIL_COND(p_amount<1); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.amount=p_amount; + +} + +int RasterizerGLES1::particles_get_amount(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.amount; + +} + +void RasterizerGLES1::particles_set_emitting(RID p_particles, bool p_emitting) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.emitting=p_emitting;; + +} +bool RasterizerGLES1::particles_is_emitting(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.emitting; + +} + +void RasterizerGLES1::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.visibility_aabb=p_visibility; + +} + +void RasterizerGLES1::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_half_extents=p_half_extents; +} +Vector3 RasterizerGLES1::particles_get_emission_half_extents(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_half_extents; +} + +void RasterizerGLES1::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_base_velocity=p_base_velocity; +} + +Vector3 RasterizerGLES1::particles_get_emission_base_velocity(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.emission_base_velocity; +} + + +void RasterizerGLES1::particles_set_emission_points(RID p_particles, const DVector& p_points) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.emission_points=p_points; +} + +DVector RasterizerGLES1::particles_get_emission_points(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,DVector()); + + return particles->data.emission_points; + +} + +void RasterizerGLES1::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + + particles->data.gravity_normal=p_normal; + +} +Vector3 RasterizerGLES1::particles_get_gravity_normal(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + + return particles->data.gravity_normal; +} + + +AABB RasterizerGLES1::particles_get_visibility_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; + +} + +void RasterizerGLES1::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) { + + ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX); + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_vars[p_variable]=p_value; + +} +float RasterizerGLES1::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_vars[p_variable]; +} + +void RasterizerGLES1::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.particle_randomness[p_variable]=p_randomness; + +} +float RasterizerGLES1::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.particle_randomness[p_variable]; + +} + +void RasterizerGLES1::particles_set_color_phases(RID p_particles, int p_phases) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES ); + particles->data.color_phase_count=p_phases; + +} +int RasterizerGLES1::particles_get_color_phases(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phase_count; +} + + +void RasterizerGLES1::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + if (p_pos<0.0) + p_pos=0.0; + if (p_pos>1.0) + p_pos=1.0; + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].pos=p_pos; + +} +float RasterizerGLES1::particles_get_color_phase_pos(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.color_phases[p_phase].pos; + +} + +void RasterizerGLES1::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) { + + ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.color_phases[p_phase].color=p_color; + + //update alpha + particles->has_alpha=false; + for(int i=0;idata.color_phases[i].color.a<0.99) + particles->has_alpha=true; + } + +} + +Color RasterizerGLES1::particles_get_color_phase_color(RID p_particles, int p_phase) const { + + ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color()); + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Color()); + return particles->data.color_phases[p_phase].color; + +} + +void RasterizerGLES1::particles_set_attractors(RID p_particles, int p_attractors) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS ); + particles->data.attractor_count=p_attractors; + +} +int RasterizerGLES1::particles_get_attractors(RID p_particles) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,-1); + return particles->data.attractor_count; +} + +void RasterizerGLES1::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].pos=p_pos;; +} +Vector3 RasterizerGLES1::particles_get_attractor_pos(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,Vector3()); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3()); + return particles->data.attractors[p_attractor].pos; +} + +void RasterizerGLES1::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); + particles->data.attractors[p_attractor].force=p_force; +} + +float RasterizerGLES1::particles_get_attractor_strength(RID p_particles,int p_attractor) const { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,0); + ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0); + return particles->data.attractors[p_attractor].force; +} + +void RasterizerGLES1::particles_set_material(RID p_particles, RID p_material,bool p_owned) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + if (particles->material_owned && particles->material.is_valid()) + free(particles->material); + + particles->material_owned=p_owned; + + particles->material=p_material; + +} +RID RasterizerGLES1::particles_get_material(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,RID()); + return particles->material; + +} + +void RasterizerGLES1::particles_set_use_local_coordinates(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.local_coordinates=p_enable; + +} + +bool RasterizerGLES1::particles_is_using_local_coordinates(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.local_coordinates; +} +bool RasterizerGLES1::particles_has_height_from_velocity(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,false); + return particles->data.height_from_velocity; +} + +void RasterizerGLES1::particles_set_height_from_velocity(RID p_particles, bool p_enable) { + + Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND(!particles); + particles->data.height_from_velocity=p_enable; + +} + +AABB RasterizerGLES1::particles_get_aabb(RID p_particles) const { + + const Particles* particles = particles_owner.get( p_particles ); + ERR_FAIL_COND_V(!particles,AABB()); + return particles->data.visibility_aabb; +} + +/* SKELETON API */ + +RID RasterizerGLES1::skeleton_create() { + + Skeleton *skeleton = memnew( Skeleton ); + ERR_FAIL_COND_V(!skeleton,RID()); + return skeleton_owner.make_rid( skeleton ); +} +void RasterizerGLES1::skeleton_resize(RID p_skeleton,int p_bones) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + if (p_bones == skeleton->bones.size()) { + return; + }; + + skeleton->bones.resize(p_bones); + +} +int RasterizerGLES1::skeleton_get_bone_count(RID p_skeleton) const { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, -1); + return skeleton->bones.size(); +} +void RasterizerGLES1::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND(!skeleton); + ERR_FAIL_INDEX( p_bone, skeleton->bones.size() ); + + skeleton->bones[p_bone] = p_transform; +} + +Transform RasterizerGLES1::skeleton_bone_get_transform(RID p_skeleton,int p_bone) { + + Skeleton *skeleton = skeleton_owner.get( p_skeleton ); + ERR_FAIL_COND_V(!skeleton, Transform()); + ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() ); + + // something + return skeleton->bones[p_bone]; +} + + +/* LIGHT API */ + +RID RasterizerGLES1::light_create(VS::LightType p_type) { + + Light *light = memnew( Light ); + light->type=p_type; + return light_owner.make_rid(light); +} + +VS::LightType RasterizerGLES1::light_get_type(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI); + return light->type; +} + +void RasterizerGLES1::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_type, 3 ); + light->colors[p_type]=p_color; +} +Color RasterizerGLES1::light_get_color(RID p_light,VS::LightColor p_type) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light, Color()); + ERR_FAIL_INDEX_V( p_type, 3, Color() ); + return light->colors[p_type]; +} + +void RasterizerGLES1::light_set_shadow(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->shadow_enabled=p_enabled; +} + +bool RasterizerGLES1::light_has_shadow(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->shadow_enabled; +} + +void RasterizerGLES1::light_set_volumetric(RID p_light,bool p_enabled) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->volumetric_enabled=p_enabled; + +} +bool RasterizerGLES1::light_is_volumetric(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,false); + return light->volumetric_enabled; +} + +void RasterizerGLES1::light_set_projector(RID p_light,RID p_texture) { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND(!light); + light->projector=p_texture; +} +RID RasterizerGLES1::light_get_projector(RID p_light) const { + + Light *light = light_owner.get(p_light); + ERR_FAIL_COND_V(!light,RID()); + return light->projector; +} + +void RasterizerGLES1::light_set_var(RID p_light, VS::LightParam p_var, float p_value) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX ); + + light->vars[p_var]=p_value; +} +float RasterizerGLES1::light_get_var(RID p_light, VS::LightParam p_var) const { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,0); + + ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 ); + + return light->vars[p_var]; +} + +void RasterizerGLES1::light_set_operator(RID p_light,VS::LightOp p_op) { + + Light * light = light_owner.get( p_light ); + ERR_FAIL_COND(!light); + + +}; + +VS::LightOp RasterizerGLES1::light_get_operator(RID p_light) const { + + return VS::LightOp(0); +}; + +void RasterizerGLES1::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) { + + +} + +VS::LightOmniShadowMode RasterizerGLES1::light_omni_get_shadow_mode(RID p_light) const{ + + return VS::LightOmniShadowMode(0); +} + +void RasterizerGLES1::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) { + + +} + +VS::LightDirectionalShadowMode RasterizerGLES1::light_directional_get_shadow_mode(RID p_light) const { + + return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL; +} + +void RasterizerGLES1::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) { + + +} + +float RasterizerGLES1::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const { + + return 0; +} + + +AABB RasterizerGLES1::light_get_aabb(RID p_light) const { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light,AABB()); + + switch( light->type ) { + + case VS::LIGHT_SPOT: { + + float len=light->vars[VS::LIGHT_PARAM_RADIUS]; + float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len; + return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) ); + } break; + case VS::LIGHT_OMNI: { + + float r = light->vars[VS::LIGHT_PARAM_RADIUS]; + return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 ); + } break; + case VS::LIGHT_DIRECTIONAL: { + + return AABB(); + } break; + default: {} + } + + ERR_FAIL_V( AABB() ); +} + + +RID RasterizerGLES1::light_instance_create(RID p_light) { + + Light *light = light_owner.get( p_light ); + ERR_FAIL_COND_V(!light, RID()); + + LightInstance *light_instance = memnew( LightInstance ); + + light_instance->light=p_light; + light_instance->base=light; + light_instance->last_pass=0; + + return light_instance_owner.make_rid( light_instance ); +} +void RasterizerGLES1::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + lighti->transform=p_transform; + +} + +bool RasterizerGLES1::light_instance_has_shadow(RID p_light_instance) const { + + return false; + + /* + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND_V(!lighti, false); + + if (!lighti->base->shadow_enabled) + return false; + + if (lighti->base->type==VS::LIGHT_DIRECTIONAL) { + if (lighti->shadow_pass!=scene_pass) + return false; + + } else { + if (lighti->shadow_pass!=frame) + return false; + }*/ + + + + //return !lighti->shadow_buffers.empty(); + +} + + +bool RasterizerGLES1::light_instance_assign_shadow(RID p_light_instance) { + + return false; + +} + + +Rasterizer::ShadowType RasterizerGLES1::light_instance_get_shadow_type(RID p_light_instance) const { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE); + + switch(lighti->base->type) { + + case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break; + case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break; + case VS::LIGHT_SPOT: return SHADOW_SIMPLE; break; + } + + return Rasterizer::SHADOW_NONE; +} + +Rasterizer::ShadowType RasterizerGLES1::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const { + + return SHADOW_NONE; +} +void RasterizerGLES1::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + +} + +int RasterizerGLES1::light_instance_get_shadow_passes(RID p_light_instance) const { + + return 0; +} + +bool RasterizerGLES1::light_instance_get_pssm_shadow_overlap(RID p_light_instance) const { + + return false; +} + +void RasterizerGLES1::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { + + LightInstance *lighti = light_instance_owner.get( p_light_instance ); + ERR_FAIL_COND(!lighti); + + ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL); + ERR_FAIL_INDEX(p_index,1); + + lighti->custom_projection=p_camera; + lighti->custom_transform=p_transform; + +} +void RasterizerGLES1::shadow_clear_near() { + + +} + +bool RasterizerGLES1::shadow_allocate_near(RID p_light) { + + return false; +} + +bool RasterizerGLES1::shadow_allocate_far(RID p_light) { + + return false; +} + +/* PARTICLES INSTANCE */ + +RID RasterizerGLES1::particles_instance_create(RID p_particles) { + + ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID()); + ParticlesInstance *particles_instance = memnew( ParticlesInstance ); + ERR_FAIL_COND_V(!particles_instance, RID() ); + particles_instance->particles=p_particles; + return particles_instance_owner.make_rid(particles_instance); +} + +void RasterizerGLES1::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) { + + ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance); + ERR_FAIL_COND(!particles_instance); + particles_instance->transform=p_transform; +} + + +/* RENDER API */ +/* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + +RID RasterizerGLES1::viewport_data_create() { + + return RID(); +} + +RID RasterizerGLES1::render_target_create(){ + + return RID(); + +} +void RasterizerGLES1::render_target_set_size(RID p_render_target, int p_width, int p_height){ + + +} +RID RasterizerGLES1::render_target_get_texture(RID p_render_target) const{ + + return RID(); + +} +bool RasterizerGLES1::render_target_renedered_in_frame(RID p_render_target){ + + return false; +} + + +void RasterizerGLES1::begin_frame() { + + + window_size = Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height ); + //print_line("begin frame - winsize: "+window_size); + + double time = (OS::get_singleton()->get_ticks_usec()/1000); // get msec + time/=1000.0; // make secs + time_delta=time-last_time; + last_time=time; + frame++; + clear_viewport(Color(1,0,0.5)); + + _rinfo.vertex_count=0; + _rinfo.object_count=0; + _rinfo.mat_change_count=0; + _rinfo.shader_change_count=0; + + +// material_shader.set_uniform_default(MaterialShaderGLES1::SCREENZ_SCALE, Math::fmod(time, 3600.0)); + /* nehe ?*/ + +// glClearColor(0,0,1,1); +// glClear(GL_COLOR_BUFFER_BIT); //should not clear if anything else cleared.. +} + +void RasterizerGLES1::capture_viewport(Image* r_capture) { + + +} + + +void RasterizerGLES1::clear_viewport(const Color& p_color) { + + glScissor( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); + glEnable(GL_SCISSOR_TEST); + glClearColor(p_color.r,p_color.g,p_color.b,p_color.a); + glClear(GL_COLOR_BUFFER_BIT); //should not clear if anything else cleared.. + glDisable(GL_SCISSOR_TEST); + +}; + +void RasterizerGLES1::set_viewport(const VS::ViewportRect& p_viewport) { + + + + viewport=p_viewport; + //print_line("viewport: "+itos(p_viewport.x)+","+itos(p_viewport.y)+","+itos(p_viewport.width)+","+itos(p_viewport.height)); + is_editor = VS::get_singleton()->get_editor(); + glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); +} + +void RasterizerGLES1::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { + + +} + + +void RasterizerGLES1::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { + + + opaque_render_list.clear(); + alpha_render_list.clear(); + light_instance_count=0; + scene_fx = NULL; // p_env.is_valid() ? fx_owner.get(p_env) : NULL; + scene_pass++; + last_light_id=0; + directional_light_count=0; + current_env = environment_owner.get(p_env); + + //set state + + glCullFace(GL_FRONT); + cull_front=true; +}; + +void RasterizerGLES1::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { + +} + +void RasterizerGLES1::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { + + camera_transform=p_world; + camera_transform_inverse=camera_transform.inverse(); + camera_projection=p_projection; + camera_plane = Plane( camera_transform.origin, camera_transform.basis.get_axis(2) ); + camera_z_near=camera_projection.get_z_near(); + camera_z_far=camera_projection.get_z_far(); + camera_projection.get_viewport_size(camera_vp_size.x,camera_vp_size.y); +} + +void RasterizerGLES1::add_light( RID p_light_instance ) { + +#define LIGHT_FADE_TRESHOLD 0.05 + + ERR_FAIL_COND( light_instance_count >= MAX_SCENE_LIGHTS ); + + LightInstance *li = light_instance_owner.get(p_light_instance); + ERR_FAIL_COND(!li); + + + /* make light hash */ + + // actually, not really a hash, but helps to sort the lights + // and avoid recompiling redudant shader versions + + + li->last_pass=scene_pass; + li->sort_key=light_instance_count; + + switch(li->base->type) { + + case VisualServer::LIGHT_DIRECTIONAL: { + + li->light_vector = camera_transform_inverse.basis.xform(li->transform.basis.get_axis(2)).normalized(); + if (directional_light_countbase->vars[VisualServer::LIGHT_PARAM_RADIUS]; + if (radius==0) + radius=0.0001; + li->linear_att=(1/LIGHT_FADE_TRESHOLD)/radius; + li->light_vector = camera_transform_inverse.xform(li->transform.origin); + + } break; + case VisualServer::LIGHT_SPOT: { + + float radius = li->base->vars[VisualServer::LIGHT_PARAM_RADIUS]; + if (radius==0) + radius=0.0001; + li->linear_att=(1/LIGHT_FADE_TRESHOLD)/radius; + li->light_vector = camera_transform_inverse.xform(li->transform.origin); + li->spot_vector = -camera_transform_inverse.basis.xform(li->transform.basis.get_axis(2)).normalized(); + //li->sort_key|=LIGHT_SPOT_BIT; // this way, omnis go first, spots go last and less shader versions are generated + + /* + if (li->base->projector.is_valid()) { + + float far = li->base->vars[ VS::LIGHT_VAR_RADIUS ]; + ERR_FAIL_COND( far<=0 ); + float near= far/200.0; + if (near<0.05) + near=0.05; + + float angle = li->base->vars[ VS::LIGHT_VAR_SPOT_ANGLE ]; + + //CameraMatrix proj; + //proj.set_perspective( angle*2.0, 1.0, near, far ); + + //Transform modelview=Transform(camera_transform_inverse * li->transform).inverse(); + //li->projector_mtx= proj * modelview; + + }*/ + } break; + } + + light_instances[light_instance_count++]=li; + +} + +void RasterizerGLES1::_add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner) { + + Material *m=NULL; + RID m_src=p_instance->material_override.is_valid() ? p_instance->material_override : p_geometry->material; + + if (m_src) + m=material_owner.get( m_src ); + + if (!m) { + m=material_owner.get( default_material ); + } + + ERR_FAIL_COND(!m); + + + if (m->last_pass!=frame) { + + m->last_pass=frame; + } + + + LightInstance *lights[RenderList::MAX_LIGHTS]; + int light_count=0; + + RenderList *render_list=&opaque_render_list; + if (m->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ALPHA] || m->blend_mode!=VS::MATERIAL_BLEND_MODE_MIX) { + render_list = &alpha_render_list; + }; + + if (!m->flags[VS::MATERIAL_FLAG_UNSHADED]) { + + int lis = p_instance->light_instances.size(); + + for(int i=0;i=RenderList::MAX_LIGHTS) + break; + + LightInstance *li=light_instance_owner.get( p_instance->light_instances[i] ); + + if (!li || li->last_pass!=scene_pass) //lit by light not in visible scene + continue; + lights[light_count++]=li; + } + } + + RenderList::Element *e = render_list->add_element(); + + e->geometry=p_geometry; +// e->geometry_cmp=p_geometry_cmp; + e->material=m; + e->instance=p_instance; + //e->depth=camera_plane.distance_to(p_world->origin); + e->depth=camera_transform.origin.distance_to(p_instance->transform.origin); + e->owner=p_owner; + if (p_instance->skeleton.is_valid()) + e->skeleton=skeleton_owner.get(p_instance->skeleton); + else + e->skeleton=NULL; + e->mirror=p_instance->mirror; + if (m->flags[VS::MATERIAL_FLAG_INVERT_FACES]) + e->mirror=!e->mirror; + + e->light_key=0; + e->light_count=0; + + + if (!shadow) { + + + if (m->flags[VS::MATERIAL_FLAG_UNSHADED]) { + + + e->light_key--; //special key for all the shadeless people + } else if (light_count) { + + for(int i=0;ilights[i]=lights[i]->sort_key; + } + + e->light_count=light_count; + int poslight_count=light_count; + if (poslight_count>1) { + SortArray light_sort; + light_sort.sort(&e->lights[0],poslight_count); //generate an equal sort key + } + } + + } + +} + + +void RasterizerGLES1::add_mesh( const RID& p_mesh, const InstanceData *p_data) { + + Mesh *mesh = mesh_owner.get(p_mesh); + ERR_FAIL_COND(!mesh); + + int ssize = mesh->surfaces.size(); + + for (int i=0;isurfaces[i]; + _add_geometry(s,p_data,s,NULL); + } + + mesh->last_pass=frame; + +} + +void RasterizerGLES1::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ + + MultiMesh *multimesh = multimesh_owner.get(p_multimesh); + ERR_FAIL_COND(!multimesh); + + if (!multimesh->mesh.is_valid()) + return; + if (multimesh->elements.empty()) + return; + + Mesh *mesh = mesh_owner.get(multimesh->mesh); + ERR_FAIL_COND(!mesh); + + int surf_count = mesh->surfaces.size(); + if (multimesh->last_pass!=scene_pass) { + + multimesh->cache_surfaces.resize(surf_count); + for(int i=0;icache_surfaces[i].material=mesh->surfaces[i]->material; + multimesh->cache_surfaces[i].has_alpha=mesh->surfaces[i]->has_alpha; + multimesh->cache_surfaces[i].surface=mesh->surfaces[i]; + } + + multimesh->last_pass=scene_pass; + } + + for(int i=0;icache_surfaces[i],p_data,multimesh->cache_surfaces[i].surface,multimesh); + } + + +} + +void RasterizerGLES1::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ + + //print_line("adding particles"); + ParticlesInstance *particles_instance = particles_instance_owner.get(p_particle_instance); + ERR_FAIL_COND(!particles_instance); + Particles *p=particles_owner.get( particles_instance->particles ); + ERR_FAIL_COND(!p); + + _add_geometry(p,p_data,p,particles_instance); + +} + + +void RasterizerGLES1::_set_cull(bool p_front,bool p_reverse_cull) { + + bool front = p_front; + if (p_reverse_cull) + front=!front; + + if (front!=cull_front) { + + glCullFace(front?GL_FRONT:GL_BACK); + cull_front=front; + } +} + + +void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Material *p_material) { + + if (!shadow) { + + ///ambient @TODO offer global ambient group option + + //GLenum side = use_shaders?GL_FRONT:GL_FRONT_AND_BACK; + GLenum side = GL_FRONT_AND_BACK; + + + ///diffuse + Color diffuse_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; + float diffuse_rgba[4]={ + diffuse_color.r, + diffuse_color.g, + diffuse_color.b, + diffuse_color.a + }; + + //color array overrides this + glColor4f( diffuse_rgba[0],diffuse_rgba[1],diffuse_rgba[2],diffuse_rgba[3]); + last_color=diffuse_color; + glMaterialfv(side,GL_AMBIENT,diffuse_rgba); + glMaterialfv(side,GL_DIFFUSE,diffuse_rgba); + //specular + + const Color specular_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR]; + float specular_rgba[4]={ + specular_color.r, + specular_color.g, + specular_color.b, + 1.0 + }; + + glMaterialfv(side,GL_SPECULAR,specular_rgba); + + const Color emission=p_material->parameters[VS::FIXED_MATERIAL_PARAM_EMISSION]; + + + float emission_rgba[4]={ + emission.r, + emission.g, + emission.b, + 1.0 //p_material->parameters[VS::FIXED_MATERIAL_PARAM_DETAIL_MIX] + }; + + glMaterialfv(side,GL_EMISSION,emission_rgba); + + glMaterialf(side,GL_SHININESS,p_material->parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]); + + Plane sparams=p_material->parameters[VS::FIXED_MATERIAL_PARAM_SHADE_PARAM]; + //depth test? + + + } + + + if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { + + Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); + ERR_FAIL_COND(!texture); + glEnable(GL_TEXTURE_2D); + // glActiveTexture(GL_TEXTURE0); + glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + } else { + + glDisable(GL_TEXTURE_2D); + } + +} + +void RasterizerGLES1::_setup_material(const Geometry *p_geometry,const Material *p_material) { + + if (p_material->flags[VS::MATERIAL_FLAG_DOUBLE_SIDED]) + glDisable(GL_CULL_FACE); + else { + glEnable(GL_CULL_FACE); + } + +/* if (p_material->flags[VS::MATERIAL_FLAG_WIREFRAME]) + glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); + else + glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);*/ + + if (p_material->line_width > 0) + glLineWidth(p_material->line_width); + + if (!shadow) { + + + if (blend_mode!=p_material->blend_mode) { + switch(p_material->blend_mode) { + + + case VS::MATERIAL_BLEND_MODE_MIX: { + //glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } break; + case VS::MATERIAL_BLEND_MODE_ADD: { + + //glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + + } break; + case VS::MATERIAL_BLEND_MODE_SUB: { + + //glBlendEquation(GL_FUNC_SUBTRACT); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + } break; + case VS::MATERIAL_BLEND_MODE_MUL: { + //glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } break; + + } + blend_mode=p_material->blend_mode; + } + + if (lighting!=!p_material->flags[VS::MATERIAL_FLAG_UNSHADED]) { + if (p_material->flags[VS::MATERIAL_FLAG_UNSHADED]) { + glDisable(GL_LIGHTING); + } else { + glEnable(GL_LIGHTING); + } + lighting=!p_material->flags[VS::MATERIAL_FLAG_UNSHADED]; + } + + } + + bool current_depth_write=p_material->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_ALWAYS; //broken + bool current_depth_test=!p_material->flags[VS::MATERIAL_FLAG_ONTOP]; + + + _setup_fixed_material(p_geometry,p_material); + + if (current_depth_write!=depth_write) { + + depth_write=current_depth_write; + glDepthMask(depth_write); + } + + if (current_depth_test!=depth_test) { + + depth_test=current_depth_test; + if (depth_test) + glEnable(GL_DEPTH_TEST); + else + glDisable(GL_DEPTH_TEST);; + } +} +/* +static const MaterialShaderGLES1::Conditionals _gl_light_version[4][3]={ + {MaterialShaderGLES1::LIGHT_0_DIRECTIONAL,MaterialShaderGLES1::LIGHT_0_OMNI,MaterialShaderGLES1::LIGHT_0_SPOT}, + {MaterialShaderGLES1::LIGHT_1_DIRECTIONAL,MaterialShaderGLES1::LIGHT_1_OMNI,MaterialShaderGLES1::LIGHT_1_SPOT}, + {MaterialShaderGLES1::LIGHT_2_DIRECTIONAL,MaterialShaderGLES1::LIGHT_2_OMNI,MaterialShaderGLES1::LIGHT_2_SPOT}, + {MaterialShaderGLES1::LIGHT_3_DIRECTIONAL,MaterialShaderGLES1::LIGHT_3_OMNI,MaterialShaderGLES1::LIGHT_3_SPOT} +}; + +static const MaterialShaderGLES1::Conditionals _gl_light_shadow[4]={ + MaterialShaderGLES1::LIGHT_0_SHADOW, + MaterialShaderGLES1::LIGHT_1_SHADOW, + MaterialShaderGLES1::LIGHT_2_SHADOW, + MaterialShaderGLES1::LIGHT_3_SHADOW +}; +*/ + + +void RasterizerGLES1::_setup_light(LightInstance* p_instance, int p_idx) { + + Light* ld = p_instance->base; + +// material_shader.set_conditional(MaterialShaderGLES1::LIGHT_0_DIRECTIONAL, true); + + //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_DIFFUSE, ld->colors[VS::LIGHT_COLOR_DIFFUSE]); + //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_SPECULAR, ld->colors[VS::LIGHT_COLOR_SPECULAR]); + //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_AMBIENT, ld->colors[VS::LIGHT_COLOR_AMBIENT]); + + GLenum glid = GL_LIGHT0+p_idx; + + Color diff_color = ld->colors[VS::LIGHT_COLOR_DIFFUSE]; + float emult = ld->vars[VS::LIGHT_PARAM_ENERGY]; + + if (ld->type!=VS::LIGHT_DIRECTIONAL) + emult*=4.0; + + GLfloat diffuse_sdark[4]={ + diff_color.r*emult, + diff_color.g*emult, + diff_color.b*emult, + 1.0 + }; + + glLightfv(glid , GL_DIFFUSE, diffuse_sdark); + + Color amb_color = Color(0,0,0); + GLfloat amb_stexsize[4]={ + amb_color.r, + amb_color.g, + amb_color.b, + 1.0 + }; + + glLightfv(glid , GL_AMBIENT, amb_stexsize ); + + Color spec_color = ld->colors[VS::LIGHT_COLOR_SPECULAR]; + GLfloat spec_op[4]={ + spec_color.r, + spec_color.g, + spec_color.b, + 1.0 + }; + + glLightfv(glid , GL_SPECULAR, spec_op ); + + switch(ld->type) { + + case VS::LIGHT_DIRECTIONAL: { + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glLightf(glid,GL_CONSTANT_ATTENUATION, 1); + glLightf(glid,GL_LINEAR_ATTENUATION, 0); + glLightf(glid,GL_QUADRATIC_ATTENUATION,0); // energy + + float lightdir[4]={ + p_instance->light_vector.x, + p_instance->light_vector.y, + p_instance->light_vector.z, + 0.0 + }; + + glLightfv(glid,GL_POSITION,lightdir); //at modelview + glLightf(glid,GL_SPOT_CUTOFF,180.0); + glLightf(glid,GL_SPOT_EXPONENT, 0); + + float sdir[4]={ + 0, + 0, + -1, + 0 + }; + + glLightfv(glid,GL_SPOT_DIRECTION,sdir); //at modelview + +// material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_DIRECTION, p_instance->light_vector); + glPopMatrix(); + + } break; + + case VS::LIGHT_OMNI: { + + + glLightf(glid,GL_SPOT_CUTOFF,180.0); + glLightf(glid,GL_SPOT_EXPONENT, 0); + + + glLightf(glid,GL_CONSTANT_ATTENUATION, 0); + glLightf(glid,GL_LINEAR_ATTENUATION, p_instance->linear_att); + glLightf(glid,GL_QUADRATIC_ATTENUATION, 0); // wut? + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + float lightpos[4]={ + p_instance->light_vector.x, + p_instance->light_vector.y, + p_instance->light_vector.z, + 1.0 + }; + + glLightfv(glid,GL_POSITION,lightpos); //at modelview + + glPopMatrix(); + + + } break; + case VS::LIGHT_SPOT: { + + glLightf(glid,GL_SPOT_CUTOFF, ld->vars[VS::LIGHT_PARAM_SPOT_ANGLE]); + glLightf(glid,GL_SPOT_EXPONENT, ld->vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]); + + + glLightf(glid,GL_CONSTANT_ATTENUATION, 0); + glLightf(glid,GL_LINEAR_ATTENUATION, p_instance->linear_att); + glLightf(glid,GL_QUADRATIC_ATTENUATION, 0); // wut? + + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + float lightpos[4]={ + p_instance->light_vector.x, + p_instance->light_vector.y, + p_instance->light_vector.z, + 1.0 + }; + + glLightfv(glid,GL_POSITION,lightpos); //at modelview + + float lightdir[4]={ + p_instance->spot_vector.x, + p_instance->spot_vector.y, + p_instance->spot_vector.z, + 1.0 + }; + + glLightfv(glid,GL_SPOT_DIRECTION,lightdir); //at modelview + + glPopMatrix(); + + + + } break; + + default: break; + } +}; + + + + + +void RasterizerGLES1::_setup_lights(const uint16_t * p_lights,int p_light_count) { + + if (shadow) + return; + + + + for (int i=directional_light_count; itype) { + + case Geometry::GEOMETRY_MULTISURFACE: + case Geometry::GEOMETRY_SURFACE: { + + + + const Surface *surf=NULL; + if (p_geometry->type==Geometry::GEOMETRY_SURFACE) + surf=static_cast(p_geometry); + else if (p_geometry->type==Geometry::GEOMETRY_MULTISURFACE) + surf=static_cast(p_geometry)->surface; + + + if (surf->format != surf->configured_format) { + if (OS::get_singleton()->is_stdout_verbose()) { + + print_line("has format: "+itos(surf->format)); + print_line("configured format: "+itos(surf->configured_format)); + } + ERR_EXPLAIN("Missing arrays (not set) in surface"); + } + ERR_FAIL_COND_V( surf->format != surf->configured_format, ERR_UNCONFIGURED ); + uint8_t *base=0; + int stride=surf->stride; + bool use_VBO = (surf->array_local==0); + _setup_geometry_vinfo=surf->array_len; + + bool skeleton_valid = p_skeleton && (surf->format&VS::ARRAY_FORMAT_BONES) && (surf->format&VS::ARRAY_FORMAT_WEIGHTS) && !p_skeleton->bones.empty() && p_skeleton->bones.size() > surf->max_bone; + + + + if (!use_VBO) { + + base = surf->array_local; + // glBindBuffer(GL_ARRAY_BUFFER, 0); + bool can_copy_to_local=surf->local_stride * surf->array_len <= skinned_buffer_size; + if (!can_copy_to_local) + skeleton_valid=false; + + /* compute morphs */ + + if (p_morphs && surf->morph_target_count && can_copy_to_local) { + + base = skinned_buffer; + stride=surf->local_stride; + + //copy all first + float coef=1.0; + + for(int i=0;imorph_target_count;i++) { + if (surf->mesh->morph_target_mode==VS::MORPH_MODE_NORMALIZED) + coef-=p_morphs[i]; + ERR_FAIL_COND_V( surf->morph_format != surf->morph_targets_local[i].configured_format, ERR_INVALID_DATA ); + + } + + + for(int i=0;iarray[i]; + if (ad.size==0) + continue; + + int ofs = ad.ofs; + int src_stride=surf->stride; + int dst_stride=surf->local_stride; + int count = surf->array_len; + + switch(i) { + + case VS::ARRAY_VERTEX: + case VS::ARRAY_NORMAL: + case VS::ARRAY_TANGENT: + { + + for(int k=0;karray_local[ofs+k*src_stride]; + float *dst = (float*)&base[ofs+k*dst_stride]; + + dst[0]= src[0]*coef; + dst[1]= src[1]*coef; + dst[2]= src[2]*coef; + } break; + + } break; + case VS::ARRAY_TEX_UV: + case VS::ARRAY_TEX_UV2: { + + for(int k=0;karray_local[ofs+k*src_stride]; + float *dst = (float*)&base[ofs+k*dst_stride]; + + dst[0]= src[0]*coef; + dst[1]= src[1]*coef; + } break; + + } break; + } + } + + + for(int j=0;jmorph_target_count;j++) { + + for(int i=0;iarray[i]; + if (ad.size==0) + continue; + + + int ofs = ad.ofs; + int dst_stride=surf->local_stride; + int count = surf->array_len; + const uint8_t *morph=surf->morph_targets_local[j].array; + float w = p_morphs[j]; + + switch(i) { + + case VS::ARRAY_VERTEX: + case VS::ARRAY_NORMAL: + case VS::ARRAY_TANGENT: + { + + for(int k=0;karray_len; + int src_stride = surf->stride; + int dst_stride = surf->stride - ( surf->array[VS::ARRAY_BONES].size + surf->array[VS::ARRAY_WEIGHTS].size ); + + for(int i=0;iarray_local[i*src_stride]; + uint8_t *dst = &base[i*dst_stride]; + memcpy(dst,src,dst_stride); + } + + + stride=dst_stride; + } + + + if (skeleton_valid) { + //transform stuff + + const uint8_t *src_weights=&surf->array_local[surf->array[VS::ARRAY_WEIGHTS].ofs]; + const uint8_t *src_bones=&surf->array_local[surf->array[VS::ARRAY_BONES].ofs]; + int src_stride = surf->stride; + int count = surf->array_len; + const Transform *skeleton = &p_skeleton->bones[0]; + + for(int i=0;iarray[i]; + if (ad.size==0) + continue; + + int ofs = ad.ofs; + + + switch(i) { + + case VS::ARRAY_VERTEX: { + for(int k=0;k(&src_weights[k*src_stride]); + const GLfloat *bones = reinterpret_cast(&src_bones[k*src_stride]); + + Vector3 src( ptr[0], ptr[1], ptr[2] ); + Vector3 dst; + for(int j=0;j(&src_weights[k*src_stride]); + const GLfloat *bones = reinterpret_cast(&src_bones[k*src_stride]); + + Vector3 src( ptr[0], ptr[1], ptr[2] ); + Vector3 dst; + for(int j=0;jvertex_id); + }; + + + for (int i=0;i<(VS::ARRAY_MAX-1);i++) { + + const Surface::ArrayData& ad=surf->array[i]; + +// if (!gl_texcoord_shader[i]) +// continue; + + if (ad.size==0 || i==VS::ARRAY_BONES || i==VS::ARRAY_WEIGHTS || gl_client_states[i]==0 ) { + + if (gl_texcoord_index[i] != -1) { + // glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); + } + + if (gl_client_states[i] != 0) + glDisableClientState(gl_client_states[i]); + + if (i == VS::ARRAY_COLOR) { + glColor4f(last_color.r,last_color.g,last_color.b,last_color.a); + }; + continue; // this one is disabled. + } + + if (gl_texcoord_index[i] != -1) { + // glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); + } + + glEnableClientState(gl_client_states[i]); + + switch (i) { + + case VS::ARRAY_VERTEX: { + + glVertexPointer(3,ad.datatype,stride,&base[ad.ofs]); + + } break; /* fallthrough to normal */ + case VS::ARRAY_NORMAL: { + + glNormalPointer(ad.datatype,stride,&base[ad.ofs]); + } break; + case VS::ARRAY_COLOR: { + glColorPointer(4,ad.datatype,stride,&base[ad.ofs]); + } break; + case VS::ARRAY_TEX_UV: + case VS::ARRAY_TEX_UV2: { + + glTexCoordPointer(2,ad.datatype,stride,&base[ad.ofs]); + } break; + case VS::ARRAY_TANGENT: { + + //glVertexAttribPointer(i, 4, use_VBO?GL_BYTE:GL_FLOAT, use_VBO?GL_TRUE:GL_FALSE, stride, &base[ad.ofs]); + + } break; + case VS::ARRAY_BONES: + case VS::ARRAY_WEIGHTS: { + + //do none + //glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, surf->stride, &base[ad.ofs]); + + } break; + case VS::ARRAY_INDEX: + ERR_PRINT("Bug"); + break; + }; + } + + + } break; + + default: break; + + }; + + return OK; +}; + +static const GLenum gl_primitive[]={ + GL_POINTS, + GL_LINES, + GL_LINE_STRIP, + GL_LINE_LOOP, + GL_TRIANGLES, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN +}; + +static const GLenum gl_poly_primitive[4]={ + GL_POINTS, + GL_LINES, + GL_TRIANGLES, + //GL_QUADS + +}; + + +void RasterizerGLES1::_render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner) { + + + _rinfo.object_count++; + + switch(p_geometry->type) { + + case Geometry::GEOMETRY_SURFACE: { + + Surface *s = (Surface*)p_geometry; + + _rinfo.vertex_count+=s->array_len; + + if (s->packed && s->array_local==0) { + + float sc = (1.0/32767.0)*s->vertex_scale; + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glScalef(sc,sc,sc); + if (s->format&VS::ARRAY_FORMAT_TEX_UV) { + float uvs=(1.0/32767.0)*s->uv_scale; + //glActiveTexture(GL_TEXTURE0); + // glClientActiveTexture(GL_TEXTURE0); + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(uvs,uvs,uvs); + } + + + } + + + if (s->index_array_len>0) { + + if (s->index_array_local) { + + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); + glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT, s->index_array_local); + + } else { + // print_line("indices: "+itos(s->index_array_local) ); + + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); + glDrawElements(gl_primitive[s->primitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT,0); + } + + + } else { + + glDrawArrays(gl_primitive[s->primitive],0,s->array_len); + + }; + + if (s->packed && s->array_local==0) { + if (s->format&VS::ARRAY_FORMAT_TEX_UV) { + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + } + glPopMatrix(); + }; + } break; + + case Geometry::GEOMETRY_MULTISURFACE: { + + Surface *s = static_cast(p_geometry)->surface; + const MultiMesh *mm = static_cast(p_owner); + int element_count=mm->elements.size(); + + if (element_count==0) + return; + + const MultiMesh::Element *elements=&mm->elements[0]; + + _rinfo.vertex_count+=s->array_len*element_count; + + + if (s->index_array_len>0) { + + // glLoadMatrixf(elements[0].matrix); + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); + for(int i=0;iprimitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT,0); + // glLoadIdentity(); + // glPopMatrix(); + } + + + } else { + + for(int i=0;iprimitive],0,s->array_len); + // glLoadIdentity(); + // glPopMatrix(); + } + + + }; + } break; + case Geometry::GEOMETRY_PARTICLES: { + + + //print_line("particulinas"); + const Particles *particles = static_cast( p_geometry ); + ERR_FAIL_COND(!p_owner); + ParticlesInstance *particles_instance = (ParticlesInstance*)p_owner; + + ParticleSystemProcessSW &pp = particles_instance->particles_process; + float td = time_delta; //MIN(time_delta,1.0/10.0); + pp.process(&particles->data,particles_instance->transform,td); + ERR_EXPLAIN("A parameter in the particle system is not correct."); + ERR_FAIL_COND(!pp.valid); + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind + // glBindBuffer(GL_ARRAY_BUFFER,0); + + + Transform camera; + if (shadow) + camera=shadow->transform; + else + camera=camera_transform; + + particle_draw_info.prepare(&particles->data,&pp,particles_instance->transform,camera); + + _rinfo.vertex_count+=4*particles->data.amount; + + { + static const Vector3 points[4]={ + Vector3(-1.0,1.0,0), + Vector3(1.0,1.0,0), + Vector3(1.0,-1.0,0), + Vector3(-1.0,-1.0,0) + }; + static const Vector3 uvs[4]={ + Vector3(0.0,0.0,0.0), + Vector3(1.0,0.0,0.0), + Vector3(1.0,1.0,0.0), + Vector3(0,1.0,0.0) + }; + static const Vector3 normals[4]={ + Vector3(0,0,1), + Vector3(0,0,1), + Vector3(0,0,1), + Vector3(0,0,1) + }; + + static const Plane tangents[4]={ + Plane(Vector3(1,0,0),0), + Plane(Vector3(1,0,0),0), + Plane(Vector3(1,0,0),0), + Plane(Vector3(1,0,0),0) + }; + + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + _gl_load_transform(camera_transform_inverse); + for(int i=0;idata.amount;i++) { + + ParticleSystemDrawInfoSW::ParticleDrawInfo &pinfo=*particle_draw_info.draw_info_order[i]; + if (!pinfo.data->active) + continue; + glPushMatrix(); + _gl_mult_transform(pinfo.transform); + + glColor4f(pinfo.color.r*last_color.r,pinfo.color.g*last_color.g,pinfo.color.b*last_color.b,pinfo.color.a*last_color.a); + _draw_primitive(4,points,normals,NULL,uvs,tangents); + glPopMatrix(); + + } + glPopMatrix(); + + } + + } break; + default: break; + }; + +}; + +void RasterizerGLES1::_setup_shader_params(const Material *p_material) { +#if 0 + int idx=0; + int tex_idx=0; + + for(Map::Element *E=p_material->shader_cache->params.front();E;E=E->next(),idx++) { + + Variant v; // + v = E->get(); + const Map::Element *F=p_material->shader_params.find(E->key()); + if (F) + v=F->get(); + + switch(v.get_type() ) { + case Variant::OBJECT: + case Variant::_RID: { + + RID tex=v; + if (!tex.is_valid()) + break; + + Texture *texture = texture_owner.get(tex); + if (!texture) + break; + glUniform1i( material_shader.get_custom_uniform_location(idx), tex_idx); + glActiveTexture(tex_idx); + glBindTexture(texture->target,texture->tex_id); + + } break; + case Variant::COLOR: { + + Color c=v; + material_shader.set_custom_uniform(idx,Vector3(c.r,c.g,c.b)); + } break; + default: { + + material_shader.set_custom_uniform(idx,v); + } break; + } + + } +#endif + +} +_FORCE_INLINE_ static void _set_glcoloro(const Color& p_color,const float p_opac) { + + glColor4f(p_color.r, p_color.g, p_color.b, p_color.a*p_opac); +} + +void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reverse_cull) { + + const Material *prev_material=NULL; + uint64_t prev_light_key=0; + const Skeleton *prev_skeleton=NULL; + const Geometry *prev_geometry=NULL; + const BakedLightData *prev_baked_light=NULL; + RID prev_baked_light_texture; + + Geometry::Type prev_geometry_type=Geometry::GEOMETRY_INVALID; + + for (int i=0;ielement_count;i++) { + + RenderList::Element *e = p_render_list->elements[i]; + const Material *material = e->material; + uint64_t light_key = e->light_key; + const Skeleton *skeleton = e->skeleton; + const Geometry *geometry = e->geometry; + const BakedLightData *baked_light = e->instance->baked_light; + + bool bind_baked_light_octree=false; + bool bind_baked_lightmap=false; + + if (e->instance->sampled_light.is_valid()) { + + SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light); + if (sl) { + + baked_light=NULL; //can't mix + // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,true); + // glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D,sl->texture); //bind the texture + } + } + if (baked_light) { + + if (baked_light->mode==VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) { + // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,true); + bind_baked_light_octree=true; + if (prev_baked_light!=baked_light) { + Texture *tex=texture_owner.get(baked_light->octree_texture); + if (tex) { + + // glActiveTexture(GL_TEXTURE0); + glBindTexture(tex->target,tex->tex_id); //bind the texture + } + if (baked_light->light_texture.is_valid()) { + Texture *texl=texture_owner.get(baked_light->light_texture); + if (texl) { + // glActiveTexture(GL_TEXTURE0); + glBindTexture(texl->target,texl->tex_id); //bind the light texture + } + } + + } + + } else if (baked_light->mode==VS::BAKED_LIGHT_LIGHTMAPS) { + + + int lightmap_idx = e->instance->baked_lightmap_id; + + // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false); + bind_baked_lightmap=false; + + + if (baked_light->lightmaps.has(lightmap_idx)) { + + + RID texid = baked_light->lightmaps[lightmap_idx]; + + if (prev_baked_light!=baked_light || texid!=prev_baked_light_texture) { + + + Texture *tex = texture_owner.get(texid); + if (tex) { + + // glActiveTexture(GL_TEXTURE0); + glBindTexture(tex->target,tex->tex_id); //bind the texture + } + + prev_baked_light_texture=texid; + } + + if (texid.is_valid()) { + bind_baked_lightmap=true; + } + + } + } + } + + if (material!=prev_material || geometry->type!=prev_geometry_type) { + _setup_material(e->geometry,material); + _rinfo.mat_change_count++; + //_setup_material_overrides(e->material,NULL,material_overrides); + //_setup_material_skeleton(material,skeleton); + } else { + + if (prev_skeleton!=skeleton) { + //_setup_material_skeleton(material,skeleton); + }; + } + + + if (geometry!=prev_geometry || geometry->type!=prev_geometry_type || prev_skeleton!=skeleton) { + + _setup_geometry(geometry, material,e->skeleton,e->instance->morph_values.ptr()); + }; + + if (i==0 || light_key!=prev_light_key) + _setup_lights(e->lights,e->light_count); + + _set_cull(e->mirror,p_reverse_cull); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPushMatrix(); + + + if (e->instance->billboard || e->instance->depth_scale) { + + Transform xf=e->instance->transform; + if (e->instance->depth_scale) { + + if (camera_projection.matrix[3][3]) { + //orthogonal matrix, try to do about the same + //with viewport size + //real_t w = Math::abs( 1.0/(2.0*(p_projection.matrix[0][0])) ); + real_t h = Math::abs( 1.0/(2.0*camera_projection.matrix[1][1]) ); + float sc = (h*2.0); //consistent with Y-fov + xf.basis.scale( Vector3(sc,sc,sc)); + } else { + //just scale by depth + real_t sc = -camera_plane.distance_to(xf.origin); + xf.basis.scale( Vector3(sc,sc,sc)); + } + } + + if (e->instance->billboard) { + + Vector3 scale = xf.basis.get_scale(); + xf.set_look_at(xf.origin,xf.origin+camera_transform.get_basis().get_axis(2),camera_transform.get_basis().get_axis(1)); + xf.basis.scale(scale); + } + _gl_mult_transform(xf); // for fixed pipeline + + } else { + _gl_mult_transform(e->instance->transform); // for fixed pipeline + } + + + + //bool changed_shader = material_shader.bind(); + //if ( changed_shader && material->shader_cache && !material->shader_cache->params.empty()) + // _setup_shader_params(material); + + _render(geometry, material, skeleton,e->owner); + + + + prev_material=material; + prev_skeleton=skeleton; + prev_geometry=geometry; + prev_light_key=e->light_key; + prev_baked_light=baked_light; + prev_geometry_type=geometry->type; + } + + + +}; + +void RasterizerGLES1::_process_blur(int times, float inc) { + + float spost = 0.0f; + float alphainc = 0.9f / times; + float alpha = 0.2f; + int num; + + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + glEnable(GL_BLEND); + + + glBindTexture(GL_TEXTURE_2D, BlurTexture); + + glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, viewport.width, viewport.height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + alphainc = alpha / times; + + glBegin(GL_QUADS); + for (num = 0;num < times;num++) + { + glColor4f(1.0f, 1.0f, 1.0f, alpha); + glTexCoord2f(0+spost,1-spost); + glVertex2f(0,0); + + glTexCoord2f(0+spost,0+spost); + glVertex2f(0, viewport.height); + + glTexCoord2f(1-spost,0+spost); + glVertex2f(viewport.width, viewport.height); + + glTexCoord2f(1-spost,1-spost); + glVertex2f(viewport.width,0); + + + spost += inc; + alpha = alpha - alphainc; + } + glEnd(); + glBindTexture(GL_TEXTURE_2D,0); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + + +void RasterizerGLES1::end_scene() { + + glEnable(GL_BLEND); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + depth_write=true; + depth_test=true; + + if (current_env) { + + switch(current_env->bg_mode) { + + case VS::ENV_BG_KEEP: { + //copy from framebuffer if framebuffer + glClear(GL_DEPTH_BUFFER_BIT); + } break; + case VS::ENV_BG_DEFAULT_COLOR: + case VS::ENV_BG_COLOR: { + //only in the runner + if(is_editor != true) { + Color bgcolor; + if (current_env->bg_mode==VS::ENV_BG_COLOR) + bgcolor = current_env->bg_param[VS::ENV_BG_PARAM_COLOR]; + else + bgcolor = Globals::get_singleton()->get("render/default_clear_color"); + // bgcolor = _convert_color(bgcolor); + float a = 1.0; + glClearColor(bgcolor.r,bgcolor.g,bgcolor.b,a); + // glClearDepthf(1.0); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + } else { + glClear(GL_DEPTH_BUFFER_BIT); + } + } break; + case VS::ENV_BG_TEXTURE: + case VS::ENV_BG_CUBEMAP: + case VS::ENV_BG_TEXTURE_RGBE: + case VS::ENV_BG_CUBEMAP_RGBE: { + //a bit broken for now + + glClear(GL_DEPTH_BUFFER_BIT); + } break; + + } + } else { + + Color c = Color(0.3,0.3,0.3); + glClearColor(c.r,c.g,c.b,0.0); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + } +#ifdef GLES_OVER_GL + //glClearDepth(1.0); +#else + // glClearDepthf(1.0); +#endif + + // glClear(GL_DEPTH_BUFFER_BIT); + + if (scene_fx && scene_fx->fog_active) { + + /* + glEnable(GL_FOG); + glFogf(GL_FOG_MODE,GL_LINEAR); + glFogf(GL_FOG_DENSITY,scene_fx->fog_attenuation); + glFogf(GL_FOG_START,scene_fx->fog_near); + glFogf(GL_FOG_END,scene_fx->fog_far); + glFogfv(GL_FOG_COLOR,scene_fx->fog_color_far.components); + glLightfv(GL_LIGHT5,GL_DIFFUSE,scene_fx->fog_color_near.components); + + material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,true); + */ + } + + + + for(int i=0;ifx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) { + glViewport(0,0,256,256); + + _render_list_forward(&opaque_render_list); + + glBindTexture(GL_TEXTURE_2D, BlurTexture); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 256, 256, 0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); + } + + _render_list_forward(&opaque_render_list); + + alpha_render_list.sort_z(); + glEnable(GL_BLEND); + + _render_list_forward(&alpha_render_list); + + glPopMatrix(); + // canvas_shader.set_conditional(CanvasShaderGLES2::DEBUG_ENCODED_32,false); + /* + canvas_begin(); + glDisable(GL_BLEND); + _set_glcoloro(Color(1,1,1), 1); + // canvas_shader.bind(); + + + List samplers; + sampled_light_owner.get_owned_list(&samplers); + + Size2 debug_size(128,128); + Size2 ofs; + + + for (List::Element *E=samplers.front();E;E=E->next()) { + + SampledLight *sl=sampled_light_owner.get(E->get()); + + _debug_draw_shadow(sl->texture, Rect2( ofs, debug_size )); + + ofs.x+=debug_size.x/2; + if ( (ofs.x+debug_size.x) > viewport.width ) { + + ofs.x=0; + ofs.y+=debug_size.y; + } + }*/ + +// material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,false); + if(current_env->fx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) + _process_blur(current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_TIMES], current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_ALPHA]); + + + + // _debug_shadows(); +} +void RasterizerGLES1::end_shadow_map() { +#if 0 + ERR_FAIL_COND(!shadow); + ERR_FAIL_INDEX(shadow_pass,shadow->shadow_buffers.size()); + + glDisable(GL_BLEND); + glDisable(GL_SCISSOR_TEST); + glEnable(GL_DEPTH_TEST); + glDepthMask(true); + + + ShadowBuffer *sb = shadow->shadow_buffers[shadow_pass]; + + ERR_FAIL_COND(!sb); + + glBindFramebuffer(GL_FRAMEBUFFER, sb->fbo); + glViewport(0, 0, sb->size, sb->size); + + glColorMask(0, 0, 0, 0); + + glEnable(GL_POLYGON_OFFSET_FILL); + //glPolygonOffset(4,8); + glPolygonOffset( 4.0f, 4096.0f); + glPolygonOffset( 8.0f, 16.0f); + + glClearDepth(1.0f); + glClear(GL_DEPTH_BUFFER_BIT); + CameraMatrix cm; + float z_near,z_far; + Transform light_transform; + + float dp_direction=0.0; + bool flip_facing=false; + + switch(shadow->base->type) { + + case VS::LIGHT_DIRECTIONAL: { + + cm = shadow->custom_projection; + light_transform=shadow->custom_transform; + z_near=cm.get_z_near(); + z_far=cm.get_z_far(); + + } break; + case VS::LIGHT_OMNI: { + + material_shader.set_conditional(MaterialShaderGLES1::USE_DUAL_PARABOLOID,true); + dp_direction = shadow_pass?1.0:0.0; + flip_facing = (shadow_pass == 1); + light_transform=shadow->transform; + z_near=0; + z_far=shadow->base->vars[ VS::LIGHT_VAR_RADIUS ]; + } break; + case VS::LIGHT_SPOT: { + + float far = shadow->base->vars[ VS::LIGHT_VAR_RADIUS ]; + ERR_FAIL_COND( far<=0 ); + float near= far/200.0; + if (near<0.05) + near=0.05; + + float angle = shadow->base->vars[ VS::LIGHT_VAR_SPOT_ANGLE ]; + + cm.set_perspective( angle*2.0, 1.0, near, far ); + shadow->projection=cm; // cache + light_transform=shadow->transform; + z_near=cm.get_z_near(); + z_far=cm.get_z_far(); + + } break; + } + + Transform light_transform_inverse = light_transform.inverse(); + + opaque_render_list.sort_mat(); + + glLightf(GL_LIGHT5,GL_LINEAR_ATTENUATION,z_near); + glLightf(GL_LIGHT5,GL_QUADRATIC_ATTENUATION,z_far); + glLightf(GL_LIGHT5,GL_CONSTANT_ATTENUATION,dp_direction); + + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(&cm.matrix[0][0]); + glMatrixMode(GL_MODELVIEW); + _gl_load_transform(light_transform_inverse); + glPushMatrix(); + + for(int i=0;i<4;i++) { + for(int j=0;j<3;j++) { + + material_shader.set_conditional(_gl_light_version[i][j],false); //start false by default + } + material_shader.set_conditional(_gl_light_shadow[i],false); + } + + _render_list_forward(&opaque_render_list,flip_facing); + + material_shader.set_conditional(MaterialShaderGLES1::USE_DUAL_PARABOLOID,false); + glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); + if (framebuffer.active) + glBindFramebufferEXT(GL_FRAMEBUFFER,framebuffer.fbo); + else + glBindFramebufferEXT(GL_FRAMEBUFFER,0); + + glDisable(GL_POLYGON_OFFSET_FILL); + + glColorMask(1, 1, 1, 1); + shadow=NULL; +#endif +} + +void RasterizerGLES1::_debug_draw_shadow(GLuint tex, const Rect2& p_rect) { + + +/* + Transform modelview; + modelview.translate(-(viewport.width / 2.0f), -(viewport.height / 2.0f), 0.0f); + modelview.scale( Vector3( 2.0f / viewport.width, -2.0f / viewport.height, 1.0f ) ); + modelview.translate(p_rect.pos.x, p_rect.pos.y, 0); + // material_shader.set_uniform_default(MaterialShaderGLES1::MODELVIEW_TRANSFORM, *e->transform); + _gl_load_transform(modelview); + glBindTexture(GL_TEXTURE_2D,p_buffer->depth); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); + + Vector3 coords[4]= { + Vector3(p_rect.pos.x, p_rect.pos.y, 0 ), + Vector3(p_rect.pos.x+p_rect.size.width, + p_rect.pos.y, 0 ), + Vector3(p_rect.pos.x+p_rect.size.width, + p_rect.pos.y+p_rect.size.height, 0 ), + Vector3(p_rect.pos.x, + p_rect.pos.y+p_rect.size.height, 0 ) + }; + + Vector3 texcoords[4]={ + Vector3( 0.0f,0.0f, 0), + Vector3( 1.0f,0.0f, 0), + Vector3( 1.0f, 1.0f, 0), + Vector3( 0.0f, 1.0f, 0), + }; + + _draw_primitive(4,coords,0,0,texcoords); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);*/ + Matrix32 modelview; + modelview.translate(p_rect.pos.x, p_rect.pos.y); + // canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, modelview); + _gl_mult_transform(modelview); + glBindTexture(GL_TEXTURE_2D,tex); + + Vector3 coords[4]= { + Vector3(p_rect.pos.x, p_rect.pos.y, 0 ), + Vector3(p_rect.pos.x+p_rect.size.width, + p_rect.pos.y, 0 ), + Vector3(p_rect.pos.x+p_rect.size.width, + p_rect.pos.y+p_rect.size.height, 0 ), + Vector3(p_rect.pos.x, + p_rect.pos.y+p_rect.size.height, 0 ) + }; + + Vector3 texcoords[4]={ + Vector3( 0.0f,0.0f, 0), + Vector3( 1.0f,0.0f, 0), + Vector3( 1.0f, 1.0f, 0), + Vector3( 0.0f, 1.0f, 0), + }; + + _draw_primitive(4,coords,0,0,texcoords); + +} + +void RasterizerGLES1::_debug_draw_shadows_type(Vector& p_shadows,Point2& ofs) { + + +// Size2 debug_size(128,128); + Size2 debug_size(512,512); + + for (int i=0;iowner) + continue; + + if (sb->owner->base->type==VS::LIGHT_DIRECTIONAL) { + + if (sb->owner->shadow_pass!=scene_pass-1) + continue; + } else { + + if (sb->owner->shadow_pass!=frame) + continue; + } + // _debug_draw_shadow(sb, Rect2( ofs, debug_size )); + ofs.x+=debug_size.x; + if ( (ofs.x+debug_size.x) > viewport.width ) { + + ofs.x=0; + ofs.y+=debug_size.y; + } + } + +} + + +void RasterizerGLES1::_debug_shadows() { + + return; +#if 0 + canvas_begin(); + glUseProgram(0); + glDisable(GL_BLEND); + Size2 ofs; + + /* + for(int i=0;i<16;i++) { + glActiveTexture(GL_TEXTURE0+i); + //glDisable(GL_TEXTURE_2D); + } + glActiveTexture(GL_TEXTURE0); + //glEnable(GL_TEXTURE_2D); + */ + + + _debug_draw_shadows_type(near_shadow_buffers,ofs); + _debug_draw_shadows_type(far_shadow_buffers,ofs); +#endif +} + +void RasterizerGLES1::end_frame() { + + /* + if (framebuffer.active) { + + canvas_begin(); //resets stuff and goes back to fixedpipe + glBindFramebuffer(GL_FRAMEBUFFER,0); + + //copy to main bufferz + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D,framebuffer.color); + glBegin(GL_QUADS); + glTexCoord2f(0,0); + glVertex2f(-1,-1); + glTexCoord2f(0,1); + glVertex2f(-1,+1); + glTexCoord2f(1,1); + glVertex2f(+1,+1); + glTexCoord2f(1,0); + glVertex2f(+1,-1); + glEnd(); + + + } + */ + + //print_line("VTX: "+itos(_rinfo.vertex_count)+" OBJ: "+itos(_rinfo.object_count)+" MAT: "+itos(_rinfo.mat_change_count)+" SHD: "+itos(_rinfo.shader_change_count)); + + OS::get_singleton()->swap_buffers(); +} + +/* CANVAS API */ + + +void RasterizerGLES1::reset_state() { + + + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind + // glBindBuffer(GL_ARRAY_BUFFER,0); + + // glActiveTexture(GL_TEXTURE0); + // glClientActiveTexture(GL_TEXTURE0); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glColor4f(1,1,1,1); + + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); +// glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +// glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); + canvas_blend=VS::MATERIAL_BLEND_MODE_MIX; + glLineWidth(1.0); + glDisable(GL_LIGHTING); + +} + + + + +void RasterizerGLES1::canvas_begin() { + + + reset_state(); + canvas_opacity=1.0; + glEnable(GL_BLEND); + + +} + +void RasterizerGLES1::canvas_disable_blending() { + + glDisable(GL_BLEND); +} + +void RasterizerGLES1::canvas_set_opacity(float p_opacity) { + + canvas_opacity = p_opacity; +} + +void RasterizerGLES1::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { + + switch(p_mode) { + + case VS::MATERIAL_BLEND_MODE_MIX: { + //glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } break; + case VS::MATERIAL_BLEND_MODE_ADD: { + + //glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + + } break; + case VS::MATERIAL_BLEND_MODE_SUB: { + + //glBlendEquation(GL_FUNC_SUBTRACT); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + } break; + case VS::MATERIAL_BLEND_MODE_MUL: { + //glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } break; + + } + +} + + +void RasterizerGLES1::canvas_begin_rect(const Matrix32& p_transform) { + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glScalef(2.0 / viewport.width, -2.0 / viewport.height, 0); + glTranslatef((-(viewport.width / 2.0)), (-(viewport.height / 2.0)), 0); + _gl_mult_transform(p_transform); + + glPushMatrix(); + +} + +void RasterizerGLES1::canvas_set_clip(bool p_clip, const Rect2& p_rect) { + + if (p_clip) { + + glEnable(GL_SCISSOR_TEST); + // glScissor(viewport.x+p_rect.pos.x,viewport.y+ (viewport.height-(p_rect.pos.y+p_rect.size.height)), + //p_rect.size.width,p_rect.size.height); + //glScissor(p_rect.pos.x,(viewport.height-(p_rect.pos.y+p_rect.size.height)),p_rect.size.width,p_rect.size.height); + glScissor(viewport.x+p_rect.pos.x,viewport.y+ (window_size.y-(p_rect.pos.y+p_rect.size.height)), + p_rect.size.width,p_rect.size.height); + } else { + + glDisable(GL_SCISSOR_TEST); + } + + +} + +void RasterizerGLES1::canvas_end_rect() { + + glPopMatrix(); +} + +void RasterizerGLES1::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { + + glDisable(GL_TEXTURE_2D); + _set_glcoloro( p_color,canvas_opacity ); + + Vector3 verts[2]={ + Vector3(p_from.x,p_from.y,0), + Vector3(p_to.x,p_to.y,0) + }; + Color colors[2]={ + p_color, + p_color + }; + colors[0].a*=canvas_opacity; + colors[1].a*=canvas_opacity; + glLineWidth(p_width); + _draw_primitive(2,verts,0,colors,0); + +} + +static void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { + + + Vector3 texcoords[4]= { + Vector3( p_src_region.pos.x/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + + Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + p_src_region.pos.y/p_tex_size.height, 0), + + Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), + + Vector3( p_src_region.pos.x/p_tex_size.width, + (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0) + }; + + + if (p_flip_h) { + SWAP( texcoords[0], texcoords[1] ); + SWAP( texcoords[2], texcoords[3] ); + } + if (p_flip_v) { + SWAP( texcoords[1], texcoords[2] ); + SWAP( texcoords[0], texcoords[3] ); + } + + Vector3 coords[4]= { + Vector3( p_rect.pos.x, p_rect.pos.y, 0 ), + Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0 ), + Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0 ), + Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) + }; + + _draw_primitive(4,coords,0,0,texcoords); +} + +static void _draw_quad(const Rect2& p_rect) { + + Vector3 coords[4]= { + Vector3( p_rect.pos.x,p_rect.pos.y, 0 ), + Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y, 0 ), + Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y+p_rect.size.height, 0 ), + Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) + }; + + _draw_primitive(4,coords,0,0,0); + +} + + +void RasterizerGLES1::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { + + _set_glcoloro( p_modulate,canvas_opacity ); + + if ( p_texture.is_valid() ) { + + glEnable(GL_TEXTURE_2D); + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + // // glActiveTexture(GL_TEXTURE0); + glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + + if (!(p_flags&CANVAS_RECT_REGION)) { + + Rect2 region = Rect2(0,0,texture->width,texture->height); + _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); + + } else { + + + _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); + + } + } else { + + glDisable(GL_TEXTURE_2D); + _draw_quad( p_rect ); + + } + + +} +void RasterizerGLES1::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { + + _set_glcoloro( p_modulate,canvas_opacity ); + + + Texture *texture = texture_owner.get( p_texture ); + ERR_FAIL_COND(!texture); + + glEnable(GL_TEXTURE_2D); + // glActiveTexture(GL_TEXTURE0); + glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + + + /* CORNERS */ + + _draw_textured_quad( // top left + Rect2( p_rect.pos, Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), + Rect2( Point2(), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // top right + Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), + Rect2( Point2(texture->width-p_margin[MARGIN_RIGHT],0), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), + Size2( texture->width, texture->height ) ); + + + _draw_textured_quad( // bottom left + Rect2( Point2(p_rect.pos.x,p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), + Rect2( Point2(0,texture->height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // bottom right + Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), + Rect2( Point2(texture->width-p_margin[MARGIN_RIGHT],texture->height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), + Size2( texture->width, texture->height ) ); + + Rect2 rect_center( p_rect.pos+Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( p_rect.size.width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], p_rect.size.height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); + + Rect2 src_center( Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( texture->width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], texture->height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); + + + _draw_textured_quad( // top + Rect2( Point2(rect_center.pos.x,p_rect.pos.y),Size2(rect_center.size.width,p_margin[MARGIN_TOP])), + Rect2( Point2(p_margin[MARGIN_LEFT],0), Size2(src_center.size.width,p_margin[MARGIN_TOP])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // bottom + Rect2( Point2(rect_center.pos.x,rect_center.pos.y+rect_center.size.height),Size2(rect_center.size.width,p_margin[MARGIN_BOTTOM])), + Rect2( Point2(p_margin[MARGIN_LEFT],src_center.pos.y+src_center.size.height), Size2(src_center.size.width,p_margin[MARGIN_BOTTOM])), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // left + Rect2( Point2(p_rect.pos.x,rect_center.pos.y),Size2(p_margin[MARGIN_LEFT],rect_center.size.height)), + Rect2( Point2(0,p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_LEFT],src_center.size.height)), + Size2( texture->width, texture->height ) ); + + _draw_textured_quad( // right + Rect2( Point2(rect_center.pos.x+rect_center.size.width,rect_center.pos.y),Size2(p_margin[MARGIN_RIGHT],rect_center.size.height)), + Rect2( Point2(src_center.pos.x+src_center.size.width,p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_RIGHT],src_center.size.height)), + Size2( texture->width, texture->height ) ); + + if (p_draw_center) { + + _draw_textured_quad( + rect_center, + src_center, + Size2( texture->width, texture->height )); + } + +} +void RasterizerGLES1::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { + + ERR_FAIL_COND(p_points.size()<1); + Vector3 verts[4]; + Vector3 uvs[4]; + + _set_glcoloro( Color(1,1,1),canvas_opacity ); + + for(int i=0;itex_id ); + } + } + + glLineWidth(p_width); + _draw_primitive(p_points.size(),&verts[0],NULL,p_colors.size()?&p_colors[0]:NULL,p_uvs.size()?uvs:NULL); + +} + +static const int _max_draw_poly_indices = 8*1024; +static uint16_t _draw_poly_indices[_max_draw_poly_indices]; +static float _verts3[_max_draw_poly_indices]; + +void RasterizerGLES1::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { + + bool do_colors=false; + + //reset_state(); + if (p_singlecolor) { + Color m = *p_colors; + m.a*=canvas_opacity; + glColor4f(m.r, m.g, m.b, m.a); + } else if (!p_colors) { + glColor4f(1, 1, 1, canvas_opacity); + } else + do_colors=true; + + glColor4f(1, 1, 1, 1); + + Texture* texture = NULL; + if (p_texture.is_valid()) { + glEnable(GL_TEXTURE_2D); + texture = texture_owner.get( p_texture ); + if (texture) { + // glActiveTexture(GL_TEXTURE0); + glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + } + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, (GLvoid*)p_vertices); + if (do_colors) { + + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4,GL_FLOAT, 0, p_colors); + + } else { + glDisableClientState(GL_COLOR_ARRAY); + } + + if (texture && p_uvs) { + + // glClientActiveTexture(GL_TEXTURE0); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, p_uvs); + + } else { + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + + if (p_indices) { + + for (int i=0; i *p_effects) const { + + FX *fx = fx_owner.get(p_fx); + ERR_FAIL_COND(!fx); + + p_effects->clear(); + p_effects->push_back("bgcolor"); + p_effects->push_back("skybox"); + p_effects->push_back("antialias"); + //p_effects->push_back("hdr"); + p_effects->push_back("glow"); // glow has a bloom parameter, too + p_effects->push_back("ssao"); + p_effects->push_back("fog"); + p_effects->push_back("dof_blur"); + p_effects->push_back("toon"); + p_effects->push_back("edge"); + +} +void RasterizerGLES1::fx_set_active(RID p_fx,const String& p_effect, bool p_active) { + + FX *fx = fx_owner.get(p_fx); + ERR_FAIL_COND(!fx); + + if (p_effect=="bgcolor") + fx->bgcolor_active=p_active; + else if (p_effect=="skybox") + fx->skybox_active=p_active; + else if (p_effect=="antialias") + fx->antialias_active=p_active; + else if (p_effect=="glow") + fx->glow_active=p_active; + else if (p_effect=="ssao") + fx->ssao_active=p_active; + else if (p_effect=="fog") + fx->fog_active=p_active; +// else if (p_effect=="dof_blur") +// fx->dof_blur_active=p_active; + else if (p_effect=="toon") + fx->toon_active=p_active; + else if (p_effect=="edge") + fx->edge_active=p_active; +} +bool RasterizerGLES1::fx_is_active(RID p_fx,const String& p_effect) const { + + FX *fx = fx_owner.get(p_fx); + ERR_FAIL_COND_V(!fx,false); + + if (p_effect=="bgcolor") + return fx->bgcolor_active; + else if (p_effect=="skybox") + return fx->skybox_active; + else if (p_effect=="antialias") + return fx->antialias_active; + else if (p_effect=="glow") + return fx->glow_active; + else if (p_effect=="ssao") + return fx->ssao_active; + else if (p_effect=="fog") + return fx->fog_active; + //else if (p_effect=="dof_blur") + // return fx->dof_blur_active; + else if (p_effect=="toon") + return fx->toon_active; + else if (p_effect=="edge") + return fx->edge_active; + + return false; +} +void RasterizerGLES1::fx_get_effect_params(RID p_fx,const String& p_effect,List *p_params) const { + + FX *fx = fx_owner.get(p_fx); + ERR_FAIL_COND(!fx); + + + if (p_effect=="bgcolor") { + + p_params->push_back( PropertyInfo( Variant::COLOR, "color" ) ); + } else if (p_effect=="skybox") { + p_params->push_back( PropertyInfo( Variant::_RID, "cubemap" ) ); + } else if (p_effect=="antialias") { + + p_params->push_back( PropertyInfo( Variant::REAL, "tolerance", PROPERTY_HINT_RANGE,"1,128,1" ) ); + + } else if (p_effect=="glow") { + + p_params->push_back( PropertyInfo( Variant::INT, "passes", PROPERTY_HINT_RANGE,"1,4,1" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.01,8.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "bloom", PROPERTY_HINT_RANGE,"-1.0,1.0,0.01" ) ); + + } else if (p_effect=="ssao") { + + p_params->push_back( PropertyInfo( Variant::REAL, "radius", PROPERTY_HINT_RANGE,"0.0,16.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "max_distance", PROPERTY_HINT_RANGE,"0.0,256.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "range_max", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "range_min", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.0,8.0,0.01" ) ); + + } else if (p_effect=="fog") { + + p_params->push_back( PropertyInfo( Variant::REAL, "begin", PROPERTY_HINT_RANGE,"0.0,8192,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "end", PROPERTY_HINT_RANGE,"0.0,8192,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.0,8.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::COLOR, "color_begin" ) ); + p_params->push_back( PropertyInfo( Variant::COLOR, "color_end" ) ); + p_params->push_back( PropertyInfo( Variant::BOOL, "fog_bg" ) ); + +// } else if (p_effect=="dof_blur") { +// return fx->dof_blur_active; + } else if (p_effect=="toon") { + p_params->push_back( PropertyInfo( Variant::REAL, "treshold", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); + p_params->push_back( PropertyInfo( Variant::REAL, "soft", PROPERTY_HINT_RANGE,"0.001,1.0,0.001" ) ); + } else if (p_effect=="edge") { + + } +} +Variant RasterizerGLES1::fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const { + + FX *fx = fx_owner.get(p_fx); + ERR_FAIL_COND_V(!fx,Variant()); + + if (p_effect=="bgcolor") { + + if (p_param=="color") + return fx->bgcolor; + } else if (p_effect=="skybox") { + if (p_param=="cubemap") + return fx->skybox_cubemap; + } else if (p_effect=="antialias") { + + if (p_param=="tolerance") + return fx->antialias_tolerance; + + } else if (p_effect=="glow") { + + if (p_param=="passes") + return fx->glow_passes; + if (p_param=="attenuation") + return fx->glow_attenuation; + if (p_param=="bloom") + return fx->glow_bloom; + + } else if (p_effect=="ssao") { + + if (p_param=="attenuation") + return fx->ssao_attenuation; + if (p_param=="max_distance") + return fx->ssao_max_distance; + if (p_param=="range_max") + return fx->ssao_range_max; + if (p_param=="range_min") + return fx->ssao_range_min; + if (p_param=="radius") + return fx->ssao_radius; + + } else if (p_effect=="fog") { + + if (p_param=="begin") + return fx->fog_near; + if (p_param=="end") + return fx->fog_far; + if (p_param=="attenuation") + return fx->fog_attenuation; + if (p_param=="color_begin") + return fx->fog_color_near; + if (p_param=="color_end") + return fx->fog_color_far; + if (p_param=="fog_bg") + return fx->fog_bg; +// } else if (p_effect=="dof_blur") { +// return fx->dof_blur_active; + } else if (p_effect=="toon") { + if (p_param=="treshold") + return fx->toon_treshold; + if (p_param=="soft") + return fx->toon_soft; + + } else if (p_effect=="edge") { + + } + return Variant(); +} +void RasterizerGLES1::fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_value) { + + FX *fx = fx_owner.get(p_fx); + ERR_FAIL_COND(!fx); + + if (p_effect=="bgcolor") { + + if (p_param=="color") + fx->bgcolor=p_value; + } else if (p_effect=="skybox") { + if (p_param=="cubemap") + fx->skybox_cubemap=p_value; + + } else if (p_effect=="antialias") { + + if (p_param=="tolerance") + fx->antialias_tolerance=p_value; + + } else if (p_effect=="glow") { + + if (p_param=="passes") + fx->glow_passes=p_value; + if (p_param=="attenuation") + fx->glow_attenuation=p_value; + if (p_param=="bloom") + fx->glow_bloom=p_value; + + } else if (p_effect=="ssao") { + + if (p_param=="attenuation") + fx->ssao_attenuation=p_value; + if (p_param=="radius") + fx->ssao_radius=p_value; + if (p_param=="max_distance") + fx->ssao_max_distance=p_value; + if (p_param=="range_max") + fx->ssao_range_max=p_value; + if (p_param=="range_min") + fx->ssao_range_min=p_value; + + } else if (p_effect=="fog") { + + if (p_param=="begin") + fx->fog_near=p_value; + if (p_param=="end") + fx->fog_far=p_value; + if (p_param=="attenuation") + fx->fog_attenuation=p_value; + if (p_param=="color_begin") + fx->fog_color_near=p_value; + if (p_param=="color_end") + fx->fog_color_far=p_value; + if (p_param=="fog_bg") + fx->fog_bg=p_value; +// } else if (p_effect=="dof_blur") { +// fx->dof_blur_active=p_value; + } else if (p_effect=="toon") { + + if (p_param=="treshold") + fx->toon_treshold=p_value; + if (p_param=="soft") + fx->toon_soft=p_value; + + } else if (p_effect=="edge") { + + } + +} + +/* ENVIRONMENT */ + +RID RasterizerGLES1::environment_create() { + + Environment * env = memnew( Environment ); + return environment_owner.make_rid(env); +} + +void RasterizerGLES1::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { + + ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_mode=p_bg; +} + +VS::EnvironmentBG RasterizerGLES1::environment_get_background(RID p_env) const{ + + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX); + return env->bg_mode; +} + +void RasterizerGLES1::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->bg_param[p_param]=p_value; + +} +Variant RasterizerGLES1::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->bg_param[p_param]; + +} + +void RasterizerGLES1::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ + + ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_enabled[p_effect]=p_enabled; +} +bool RasterizerGLES1::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{ + + ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,false); + return env->fx_enabled[p_effect]; + +} + +void RasterizerGLES1::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->fx_param[p_param]=p_value; +} +Variant RasterizerGLES1::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->fx_param[p_param]; + +} + +/* SAMPLED LIGHT */ + +RID RasterizerGLES1::sampled_light_dp_create(int p_width,int p_height) { + + SampledLight *slight = memnew(SampledLight); + slight->w=p_width; + slight->h=p_height; + slight->multiplier=1.0; + slight->is_float=false; + + // glActiveTexture(GL_TEXTURE0); + glGenTextures(1,&slight->texture); + glBindTexture(GL_TEXTURE_2D, slight->texture); +// for debug, but glitchy +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // Remove artifact on the edges of the shadowmap + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + + if (slight->is_float) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_width, p_height, 0, GL_RGBA, GL_FLOAT,NULL); + } else { + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_width, p_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + } + + return sampled_light_owner.make_rid(slight); +}/* +#include "io/resource_saver.h" +#include "scene/resources/texture.h"*/ +void RasterizerGLES1::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) { + + SampledLight *slight = sampled_light_owner.get(p_sampled_light); + ERR_FAIL_COND(!slight); + + // glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, slight->texture); + + if (slight->is_float) { + + + glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,slight->w, slight->h, GL_RGBA, GL_FLOAT,p_data); + + + } else { + //convert to bytes + uint8_t *tex8 = (uint8_t*)alloca(slight->w*slight->h*4); + // DVector tex; + const float* src=(const float*)p_data; + + for(int i=0;iw*slight->h*4;i++) { + + tex8[i]=Math::fast_ftoi(CLAMP(src[i]*255.0,0.0,255.0)); + // tex.push_back(Math::fast_ftoi(CLAMP(src[i]*255.0,0.0,255.0))); + } + /* + Image img(slight->w,slight->h,0,Image::FORMAT_RGBA,tex); + Ref it = memnew( ImageTexture ); + it->create_from_image(img); + ResourceSaver::save("baked.png",it);*/ + glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,slight->w, slight->h, GL_RGBA, GL_UNSIGNED_BYTE,p_data); + } + + slight->multiplier=p_multiplier; + +} + +/*MISC*/ + +bool RasterizerGLES1::is_texture(const RID& p_rid) const { + + return texture_owner.owns(p_rid); +} +bool RasterizerGLES1::is_material(const RID& p_rid) const { + + return material_owner.owns(p_rid); +} +bool RasterizerGLES1::is_mesh(const RID& p_rid) const { + + return mesh_owner.owns(p_rid); +} + +bool RasterizerGLES1::is_immediate(const RID& p_rid) const { + + return immediate_owner.owns(p_rid); +} + +bool RasterizerGLES1::is_multimesh(const RID& p_rid) const { + + return multimesh_owner.owns(p_rid); +} +bool RasterizerGLES1::is_particles(const RID &p_beam) const { + + return particles_owner.owns(p_beam); +} + +bool RasterizerGLES1::is_light(const RID& p_rid) const { + + return light_owner.owns(p_rid); +} +bool RasterizerGLES1::is_light_instance(const RID& p_rid) const { + + return light_instance_owner.owns(p_rid); +} +bool RasterizerGLES1::is_particles_instance(const RID& p_rid) const { + + return particles_instance_owner.owns(p_rid); +} +bool RasterizerGLES1::is_skeleton(const RID& p_rid) const { + + return skeleton_owner.owns(p_rid); +} +bool RasterizerGLES1::is_environment(const RID& p_rid) const { + + return environment_owner.owns(p_rid); +} +bool RasterizerGLES1::is_fx(const RID& p_rid) const { + + return fx_owner.owns(p_rid); +} +bool RasterizerGLES1::is_shader(const RID& p_rid) const { + + return false; +} + +void RasterizerGLES1::free(const RID& p_rid) { + + if (texture_owner.owns(p_rid)) { + + // delete the texture + Texture *texture = texture_owner.get(p_rid); + + glDeleteTextures( 1,&texture->tex_id ); + _rinfo.texture_mem-=texture->total_data_size; + texture_owner.free(p_rid); + memdelete(texture); + + } else if (shader_owner.owns(p_rid)) { + + // delete the texture + Shader *shader = shader_owner.get(p_rid); + + + + shader_owner.free(p_rid); + memdelete(shader); + + } else if (material_owner.owns(p_rid)) { + + Material *material = material_owner.get( p_rid ); + ERR_FAIL_COND(!material); + + material_owner.free(p_rid); + memdelete(material); + + } else if (mesh_owner.owns(p_rid)) { + + Mesh *mesh = mesh_owner.get(p_rid); + ERR_FAIL_COND(!mesh); + for (int i=0;isurfaces.size();i++) { + + Surface *surface = mesh->surfaces[i]; + if (surface->array_local != 0) { + memfree(surface->array_local); + }; + if (surface->index_array_local != 0) { + memfree(surface->index_array_local); + }; + + if (mesh->morph_target_count>0) { + + for(int i=0;imorph_target_count;i++) { + + memfree(surface->morph_targets_local[i].array); + } + memfree(surface->morph_targets_local); + surface->morph_targets_local=NULL; + } + + memdelete( surface ); + }; + + mesh->surfaces.clear(); + + mesh_owner.free(p_rid); + memdelete(mesh); + + } else if (multimesh_owner.owns(p_rid)) { + + MultiMesh *multimesh = multimesh_owner.get(p_rid); + ERR_FAIL_COND(!multimesh); + + multimesh_owner.free(p_rid); + memdelete(multimesh); + + } else if (particles_owner.owns(p_rid)) { + + Particles *particles = particles_owner.get(p_rid); + ERR_FAIL_COND(!particles); + + particles_owner.free(p_rid); + memdelete(particles); + } else if (immediate_owner.owns(p_rid)) { + + Immediate *immediate = immediate_owner.get(p_rid); + ERR_FAIL_COND(!immediate); + + immediate_owner.free(p_rid); + memdelete(immediate); + } else if (particles_instance_owner.owns(p_rid)) { + + ParticlesInstance *particles_isntance = particles_instance_owner.get(p_rid); + ERR_FAIL_COND(!particles_isntance); + + particles_instance_owner.free(p_rid); + memdelete(particles_isntance); + + } else if (skeleton_owner.owns(p_rid)) { + + Skeleton *skeleton = skeleton_owner.get( p_rid ); + ERR_FAIL_COND(!skeleton) + + skeleton_owner.free(p_rid); + memdelete(skeleton); + + } else if (light_owner.owns(p_rid)) { + + Light *light = light_owner.get( p_rid ); + ERR_FAIL_COND(!light) + + light_owner.free(p_rid); + memdelete(light); + + } else if (light_instance_owner.owns(p_rid)) { + + LightInstance *light_instance = light_instance_owner.get( p_rid ); + ERR_FAIL_COND(!light_instance); + light_instance->clear_shadow_buffers(); + light_instance_owner.free(p_rid); + memdelete( light_instance ); + + } else if (fx_owner.owns(p_rid)) { + + FX *fx = fx_owner.get( p_rid ); + ERR_FAIL_COND(!fx); + + fx_owner.free(p_rid); + memdelete( fx ); + + } else if (environment_owner.owns(p_rid)) { + + Environment *env = environment_owner.get( p_rid ); + ERR_FAIL_COND(!env); + + environment_owner.free(p_rid); + memdelete( env ); + } else if (sampled_light_owner.owns(p_rid)) { + + SampledLight *sampled_light = sampled_light_owner.get( p_rid ); + ERR_FAIL_COND(!sampled_light); + + sampled_light_owner.free(p_rid); + memdelete( sampled_light ); + }; +} + + +void RasterizerGLES1::custom_shade_model_set_shader(int p_model, RID p_shader) { + + +}; + +RID RasterizerGLES1::custom_shade_model_get_shader(int p_model) const { + + return RID(); +}; + +void RasterizerGLES1::custom_shade_model_set_name(int p_model, const String& p_name) { + +}; + +String RasterizerGLES1::custom_shade_model_get_name(int p_model) const { + + return String(); +}; + +void RasterizerGLES1::custom_shade_model_set_param_info(int p_model, const List& p_info) { + +}; + +void RasterizerGLES1::custom_shade_model_get_param_info(int p_model, List* p_info) const { + +}; + + +void RasterizerGLES1::ShadowBuffer::init(int p_size) { + + +#if 0 + size=p_size; + + glActiveTexture(GL_TEXTURE0); + glGenTextures(1, &depth); + ERR_FAIL_COND(depth==0); + + /* Setup Depth Texture */ + glBindTexture(GL_TEXTURE_2D, depth); + glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, p_size, p_size, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + float border_color[]={1.0f, 1.0f, 1.0f, 1.0f}; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); + + /* Create FBO */ + glGenFramebuffers(1, &fbo); + + ERR_FAIL_COND( fbo==0 ); + + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0); + glDrawBuffer(GL_FALSE); + glReadBuffer(GL_FALSE); + + /* Check FBO creation */ + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); + + ERR_FAIL_COND( status==GL_FRAMEBUFFER_UNSUPPORTED ); + + glBindFramebufferEXT(GL_FRAMEBUFFER, 0); +#endif + +} + +void RasterizerGLES1::_init_shadow_buffers() { + + int near_shadow_size=GLOBAL_DEF("rasterizer/near_shadow_size",512); + int far_shadow_size=GLOBAL_DEF("rasterizer/far_shadow_size",64); + + near_shadow_buffers.resize( GLOBAL_DEF("rasterizer/near_shadow_count",4) ); + far_shadow_buffers.resize( GLOBAL_DEF("rasterizer/far_shadow_count",16) ); + + shadow_near_far_split_size_ratio = GLOBAL_DEF("rasterizer/shadow_near_far_split_size_ratio",0.3); + + for (int i=0;i +void RasterizerGLES1::init() { + + + + + + scene_pass=1; + // if (ContextGL::get_singleton()) + // ContextGL::get_singleton()->make_current(); + + + OSReport("gl\n"); + Set extensions; + Vector strings = String((const char*)glGetString( GL_EXTENSIONS )).split(" ",false); + for(int i=0;i textures; + texture_owner.get_owned_list(&textures); + keep_copies=false; + for(List::Element *E=textures.front();E;E=E->next()) { + + RID tid = E->get(); + Texture *t=texture_owner.get(tid); + ERR_CONTINUE(!t); + t->tex_id=0; + t->data_size=0; + glGenTextures(1, &t->tex_id); + t->active=false; + texture_allocate(tid,t->width,t->height,t->format,t->flags); + bool had_image=false; + for(int i=0;i<6;i++) { + if (!t->image[i].empty()) { + texture_set_data(tid,t->image[i],VS::CubeMapSide(i)); + had_image=true; + } + } + + if (!had_image && t->reloader) { + Object *rl = ObjectDB::get_instance(t->reloader); + if (rl) + rl->call(t->reloader_func,tid); + } + } + + keep_copies=true; + + +} + +bool RasterizerGLES1::has_feature(VS::Features p_feature) const { + + switch( p_feature) { + case VS::FEATURE_SHADERS: return false; + case VS::FEATURE_NEEDS_RELOAD_HOOK: return use_reload_hooks; + default: return false; + + } + +} + + +RasterizerGLES1::RasterizerGLES1(bool p_keep_copies,bool p_use_reload_hooks) { + keep_copies=p_keep_copies; + pack_arrays=false; + use_reload_hooks=p_use_reload_hooks; + + frame = 0; +}; + +RasterizerGLES1::~RasterizerGLES1() { + +}; + + +#endif diff --git a/platform/wiiu/rasterizer_wiiu.h b/platform/wiiu/rasterizer_wiiu.h new file mode 100644 index 00000000..deedd3e0 --- /dev/null +++ b/platform/wiiu/rasterizer_wiiu.h @@ -0,0 +1,1292 @@ +/*************************************************************************/ +/* rasterizer_gles1.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* http://www.godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ +#ifndef RASTERIZER_GLES1_H +#define RASTERIZER_GLES1_H + +#include "servers/visual/rasterizer.h" + +#ifdef __WIIU__ + +#include "image.h" +#include "rid.h" +#include "servers/visual_server.h" +#include "list.h" +#include "map.h" +#include "camera_matrix.h" +#include "sort.h" +// #include "tools/editor/scene_tree_editor.h" +#include "platform_config.h" +#ifndef GLES1_INCLUDE_H +#include + +#else +#include GLES1_INCLUDE_H +#endif + + +#include "servers/visual/particle_system_sw.h" + +/** + @author Juan Linietsky +*/ +class RasterizerGLES1 : public Rasterizer { + + enum { + + MAX_SCENE_LIGHTS=2048, + LIGHT_SPOT_BIT=0x80, + DEFAULT_SKINNED_BUFFER_SIZE = 1024 * 1024, // 10k vertices + MAX_HW_LIGHTS = 1, + }; + + GLuint BlurTexture; + + uint8_t *skinned_buffer; + int skinned_buffer_size; + bool pvr_supported; + bool s3tc_supported; + bool etc_supported; + bool npo2_textures_available; + bool pack_arrays; + bool use_reload_hooks; + bool is_editor; + + + Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); + + + struct Texture { + + uint32_t flags; + int width,height; + int alloc_width, alloc_height; + Image::Format format; + + GLenum target; + GLenum gl_format_cache; + int gl_components_cache; + int data_size; //original data size, useful for retrieving back + bool format_has_alpha; + bool compressed; + bool disallow_mipmaps; + int total_data_size; + + Image image[6]; + + bool active; + GLuint tex_id; + + ObjectID reloader; + StringName reloader_func; + + Texture() { + + flags=width=height=0; + tex_id=0; + data_size=0; + format=Image::FORMAT_GRAYSCALE; + gl_components_cache=0; + format_has_alpha=false; + active=false; + disallow_mipmaps=false; +// gen_mipmap=true; + compressed=false; + total_data_size=0; + } + + ~Texture() { + + if (tex_id!=0) { + + glDeleteTextures(1,&tex_id); + } + } + }; + + mutable RID_Owner texture_owner; + + struct Shader { + + String vertex_code; + String fragment_code; + String light_code; + VS::ShaderMode mode; + Map params; + int fragment_line; + int vertex_line; + int light_line; + bool valid; + bool has_alpha; + bool use_world_transform; + + }; + + mutable RID_Owner shader_owner; + + + struct Material { + + bool fixed_flags[VS::FIXED_MATERIAL_FLAG_MAX]; + bool flags[VS::MATERIAL_FLAG_MAX]; + Variant parameters[VisualServer::FIXED_MATERIAL_PARAM_MAX]; + RID textures[VisualServer::FIXED_MATERIAL_PARAM_MAX]; + + VS::MaterialDepthDrawMode depth_draw_mode; + + Transform uv_transform; + VS::FixedMaterialTexCoordMode texcoord_mode[VisualServer::FIXED_MATERIAL_PARAM_MAX]; + + VS::MaterialBlendMode blend_mode; + + float line_width; + float point_size; + bool has_alpha; + + RID shader; // shader material + uint64_t last_pass; + + Map shader_params; + + + Material() { + + + for(int i=0;i material_owner; + + void _material_check_alpha(Material *p_material); + + + struct Geometry { + + enum Type { + GEOMETRY_INVALID, + GEOMETRY_SURFACE, + GEOMETRY_POLY, + GEOMETRY_PARTICLES, + GEOMETRY_MULTISURFACE, + }; + + Type type; + RID material; + bool has_alpha; + bool material_owned; + + Geometry() { has_alpha=false; material_owned = false; } + virtual ~Geometry() {}; + }; + + struct GeometryOwner { + + virtual ~GeometryOwner() {} + }; + + class Mesh; + + struct Surface : public Geometry { + + struct ArrayData { + + uint32_t ofs,size,datatype,count; + bool normalize; + bool bind; + + ArrayData() { ofs=0; size=0; count=0; datatype=0; normalize=0; bind=false;} + }; + + Mesh *mesh; + + Array data; + Array morph_data; + ArrayData array[VS::ARRAY_MAX]; + // support for vertex array objects + GLuint array_object_id; + // support for vertex buffer object + GLuint vertex_id; // 0 means, unconfigured + GLuint index_id; // 0 means, unconfigured + // no support for the above, array in localmem. + uint8_t *array_local; + uint8_t *index_array_local; + + bool packed; + + struct MorphTarget { + uint32_t configured_format; + uint8_t *array; + }; + + MorphTarget* morph_targets_local; + int morph_target_count; + AABB aabb; + + int array_len; + int index_array_len; + int max_bone; + + float vertex_scale; + float uv_scale; + float uv2_scale; + + VS::PrimitiveType primitive; + + uint32_t format; + uint32_t configured_format; + + int stride; + int local_stride; + uint32_t morph_format; + + bool active; + + Point2 uv_min; + Point2 uv_max; + + Surface() { + + + array_len=0; + local_stride=0; + morph_format=0; + type=GEOMETRY_SURFACE; + primitive=VS::PRIMITIVE_POINTS; + index_array_len=0; + vertex_scale=1.0; + uv_scale=1.0; + uv2_scale=1.0; + + format=0; + stride=0; + morph_targets_local=0; + morph_target_count=0; + + array_local = index_array_local = 0; + vertex_id = index_id = 0; + + active=false; + packed=false; + } + + ~Surface() { + + } + }; + + + struct Mesh { + + bool active; + Vector surfaces; + int morph_target_count; + VS::MorphTargetMode morph_target_mode; + AABB custom_aabb; + + mutable uint64_t last_pass; + Mesh() { + morph_target_mode=VS::MORPH_MODE_NORMALIZED; + morph_target_count=0; + last_pass=0; + active=false; + } + }; + mutable RID_Owner mesh_owner; + + Error _surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main); + + struct MultiMesh; + + struct MultiMeshSurface : public Geometry { + + Surface *surface; + MultiMeshSurface() { type=GEOMETRY_MULTISURFACE; } + }; + + struct MultiMesh : public GeometryOwner { + + struct Element { + + float matrix[16]; + uint8_t color[4]; + Element() { + matrix[0]=1; + matrix[1]=0; + matrix[2]=0; + matrix[3]=0; + + matrix[4]=0; + matrix[5]=1; + matrix[6]=0; + matrix[7]=0; + + matrix[8]=0; + matrix[9]=0; + matrix[10]=1; + matrix[11]=0; + + matrix[12]=0; + matrix[13]=0; + matrix[14]=0; + matrix[15]=1; + }; + + + }; + + AABB aabb; + RID mesh; + int visible; + + //IDirect3DVertexBuffer9* instance_buffer; + Vector elements; + Vector cache_surfaces; + mutable uint64_t last_pass; + GLuint tex_id; + int tw; + int th; + + SelfList dirty_list; + + MultiMesh() : dirty_list(this) { + + tw=1; + th=1; + tex_id=0; + last_pass=0; + visible = -1; + } + }; + + mutable RID_Owner multimesh_owner; + mutable SelfList::List _multimesh_dirty_list; + + struct Immediate { + + RID material; + int empty; + }; + + mutable RID_Owner immediate_owner; + + struct Particles : public Geometry { + + ParticleSystemSW data; // software particle system + + Particles() { + type=GEOMETRY_PARTICLES; + + } + }; + + mutable RID_Owner particles_owner; + + struct ParticlesInstance : public GeometryOwner { + + RID particles; + + ParticleSystemProcessSW particles_process; + Transform transform; + + ParticlesInstance() { } + }; + + mutable RID_Owner particles_instance_owner; + ParticleSystemDrawInfoSW particle_draw_info; + + struct Skeleton { + + Vector bones; + + }; + + mutable RID_Owner skeleton_owner; + + + struct Light { + + VS::LightType type; + float vars[VS::LIGHT_PARAM_MAX]; + Color colors[3]; + bool shadow_enabled; + RID projector; + bool volumetric_enabled; + Color volumetric_color; + + + Light() { + + vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1; + vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45; + vars[VS::LIGHT_PARAM_ATTENUATION]=1.0; + vars[VS::LIGHT_PARAM_ENERGY]=1.0; + vars[VS::LIGHT_PARAM_RADIUS]=1.0; + vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.05; + + colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1); + colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1); + shadow_enabled=false; + volumetric_enabled=false; + } + }; + + + struct Environment { + + + VS::EnvironmentBG bg_mode; + Variant bg_param[VS::ENV_BG_PARAM_MAX]; + bool fx_enabled[VS::ENV_FX_MAX]; + Variant fx_param[VS::ENV_FX_PARAM_MAX]; + + Environment() { + + bg_mode=VS::ENV_BG_DEFAULT_COLOR; + bg_param[VS::ENV_BG_PARAM_COLOR]=Color(0,0,0); + bg_param[VS::ENV_BG_PARAM_TEXTURE]=RID(); + bg_param[VS::ENV_BG_PARAM_CUBEMAP]=RID(); + bg_param[VS::ENV_BG_PARAM_ENERGY]=1.0; + + for(int i=0;i environment_owner; + Environment *current_env; + + struct SampledLight { + + int w,h; + GLuint texture; + float multiplier; + bool is_float; + }; + + mutable RID_Owner sampled_light_owner; + + struct ShadowBuffer; + + struct LightInstance { + + struct SplitInfo { + + CameraMatrix camera; + Transform transform; + float near; + float far; + }; + + RID light; + Light *base; + Transform transform; + CameraMatrix projection; + + Transform custom_transform; + CameraMatrix custom_projection; + + Vector3 light_vector; + Vector3 spot_vector; + float linear_att; + + uint64_t shadow_pass; + uint64_t last_pass; + uint16_t sort_key; + + Vector shadow_buffers; + + void clear_shadow_buffers() { + + for (int i=0;iowner != this ); + + sb->owner=NULL; + } + + shadow_buffers.clear(); + } + + LightInstance() { shadow_pass=0; last_pass=0; sort_key=0; } + + }; + mutable RID_Owner light_owner; + mutable RID_Owner light_instance_owner; + + LightInstance *light_instances[MAX_SCENE_LIGHTS]; + LightInstance *directional_lights[4]; +// LightInstance *directional_light_instances[MAX_SCENE_LIGHTS]; + int light_instance_count; + int directional_light_count; + int last_light_id; + + + struct RenderList { + + enum { + MAX_ELEMENTS=4096, + MAX_LIGHTS=4 + }; + + struct Element { + + + float depth; + const InstanceData *instance; + const Skeleton *skeleton; + union { + uint16_t lights[MAX_HW_LIGHTS]; + uint64_t light_key; + }; + + const Geometry *geometry; + const Material *material; + const GeometryOwner *owner; + uint16_t light_count; + bool mirror; + + + }; + + + Element _elements[MAX_ELEMENTS]; + Element *elements[MAX_ELEMENTS]; + int element_count; + + void clear() { + + element_count=0; + } + + struct SortZ { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + + return A->depth > B->depth; + } + }; + + void sort_z() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + + struct SortMat { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + // TODO move to a single uint64 (one comparison) + if (A->material == B->material) { + + return A->light_key < B->light_key; + } else { + + return (A->material < B->material); + } + } + }; + + void sort_mat() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + struct SortMatLight { + + _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { + + if (A->material->flags[VS::MATERIAL_FLAG_UNSHADED] == B->material->flags[VS::MATERIAL_FLAG_UNSHADED]) { + + if (A->material == B->material) { + + if (A->geometry == B->geometry) { + + return A->light_keylight_key; + } else + return (A->geometry < B->geometry); + } else { + + return (A->material < B->material); + } + } else { + + return (int(A->material->flags[VS::MATERIAL_FLAG_UNSHADED]) < int(B->material->flags[VS::MATERIAL_FLAG_UNSHADED])); + } + } + }; + + void sort_mat_light() { + + SortArray sorter; + sorter.sort(elements,element_count); + } + + _FORCE_INLINE_ Element* add_element() { + + if (element_count>MAX_ELEMENTS) + return NULL; + elements[element_count]=&_elements[element_count]; + return elements[element_count++]; + } + + RenderList() { + + element_count = 0; + for (int i=0;i fx_owner; + + + FX *scene_fx; + CameraMatrix camera_projection; + Transform camera_transform; + Transform camera_transform_inverse; + float camera_z_near; + float camera_z_far; + Size2 camera_vp_size; + Color last_color; + + Plane camera_plane; + + bool keep_copies; + + bool depth_write; + bool depth_test; + int blend_mode; + bool lighting; + + _FORCE_INLINE_ void _add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner); + + void _render_list_forward(RenderList *p_render_list,bool p_reverse_cull=false); + + void _setup_light(LightInstance* p_instance, int p_idx); + void _setup_lights(const uint16_t * p_lights,int p_light_count); + + _FORCE_INLINE_ void _setup_shader_params(const Material *p_material); + void _setup_fixed_material(const Geometry *p_geometry,const Material *p_material); + void _setup_material(const Geometry *p_geometry,const Material *p_material); + + Error _setup_geometry(const Geometry *p_geometry, const Material* p_material,const Skeleton *p_skeleton, const float *p_morphs); + void _render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner); + + + /***********/ + /* SHADOWS */ + /***********/ + + struct ShadowBuffer { + + int size; + GLuint fbo; + GLuint depth; + LightInstance *owner; + void init(int p_size); + ShadowBuffer() { size=0; depth=0; owner=NULL; } + }; + + Vector near_shadow_buffers; + Vector far_shadow_buffers; + + LightInstance *shadow; + int shadow_pass; + void _init_shadow_buffers(); + + float shadow_near_far_split_size_ratio; + bool _allocate_shadow_buffers(LightInstance *p_instance, Vector& p_buffers); + void _debug_draw_shadow(GLuint tex, const Rect2& p_rect); + void _debug_draw_shadows_type(Vector& p_shadows,Point2& ofs); + void _debug_shadows(); + void reset_state(); + + /***********/ + /* FBOs */ + /***********/ + + + struct FrameBuffer { + + GLuint fbo; + GLuint color; + GLuint depth; + int width,height; + bool buff16; + bool active; + + struct Blur { + + GLuint fbo; + GLuint color; + } blur[2]; + + } framebuffer; + + void _update_framebuffer(); + void _process_glow_and_bloom(); + + /*********/ + /* FRAME */ + /*********/ + + struct _Rinfo { + + int texture_mem; + int vertex_count; + int object_count; + int mat_change_count; + int shader_change_count; + + } _rinfo; + + GLuint white_tex; + RID canvas_tex; + float canvas_opacity; + VS::MaterialBlendMode canvas_blend; + _FORCE_INLINE_ Texture* _bind_canvas_texture(const RID& p_texture); + + + int _setup_geometry_vinfo; + + bool cull_front; + _FORCE_INLINE_ void _set_cull(bool p_front,bool p_reverse_cull=false); + + Size2 window_size; + VS::ViewportRect viewport; + double last_time; + double time_delta; + uint64_t frame; + uint64_t scene_pass; + + //void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1); + //void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_h_flip=false, bool p_v_flip=false ); + //void _draw_quad(const Rect2& p_rect); + void _process_blur(int times, float inc); + +public: + + /* TEXTURE API */ + + virtual RID texture_create(); + virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT); + virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT); + virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const; + virtual void texture_set_flags(RID p_texture,uint32_t p_flags); + virtual uint32_t texture_get_flags(RID p_texture) const; + virtual Image::Format texture_get_format(RID p_texture) const; + virtual uint32_t texture_get_width(RID p_texture) const; + virtual uint32_t texture_get_height(RID p_texture) const; + virtual bool texture_has_alpha(RID p_texture) const; + virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); + virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; + + /* SHADER API */ + + virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); + + virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode); + virtual VS::ShaderMode shader_get_mode(RID p_shader) const; + + virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0); + virtual String shader_get_fragment_code(RID p_shader) const; + virtual String shader_get_vertex_code(RID p_shader) const; + virtual String shader_get_light_code(RID p_shader) const; + + virtual void shader_get_param_list(RID p_shader, List *p_param_list) const; + + /* COMMON MATERIAL API */ + + virtual RID material_create(); + + virtual void material_set_shader(RID p_shader_material, RID p_shader); + virtual RID material_get_shader(RID p_shader_material) const; + + virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value); + virtual Variant material_get_param(RID p_material, const StringName& p_param) const; + + virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled); + virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const; + + virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode); + virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const; + + virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode); + virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const; + + virtual void material_set_line_width(RID p_material,float p_line_width); + virtual float material_get_line_width(RID p_material) const; + + /* FIXED MATERIAL */ + + virtual RID fixed_material_create(); + + virtual void fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled); + virtual bool fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const; + + virtual void fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value); + virtual Variant fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const; + + virtual void fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture); + virtual RID fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const; + + virtual void fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode); + virtual VS::FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const; + + virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform); + virtual Transform fixed_material_get_uv_transform(RID p_material) const; + + virtual void fixed_material_set_point_size(RID p_material,float p_size); + virtual float fixed_material_get_point_size(RID p_material) const; + + /* MESH API */ + + + virtual RID mesh_create(); + + virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false); + virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const; + virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const; + virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat); + + virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount); + virtual int mesh_get_morph_target_count(RID p_mesh) const; + + virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode); + virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const; + + virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false); + virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const; + + virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const; + virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const; + virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const; + virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const; + + virtual void mesh_remove_surface(RID p_mesh,int p_index); + virtual int mesh_get_surface_count(RID p_mesh) const; + + virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const; + + virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb); + virtual AABB mesh_get_custom_aabb(RID p_mesh) const; + + /* MULTIMESH API */ + + virtual RID multimesh_create(); + + virtual void multimesh_set_instance_count(RID p_multimesh,int p_count); + virtual int multimesh_get_instance_count(RID p_multimesh) const; + + virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh); + virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb); + virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform); + virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color); + + virtual RID multimesh_get_mesh(RID p_multimesh) const; + virtual AABB multimesh_get_aabb(RID p_multimesh) const;; + + virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const; + virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const; + + virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible); + virtual int multimesh_get_visible_instances(RID p_multimesh) const; + + /* IMMEDIATE API */ + + virtual RID immediate_create(); + virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID()); + virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex); + virtual void immediate_normal(RID p_immediate,const Vector3& p_normal); + virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent); + virtual void immediate_color(RID p_immediate,const Color& p_color); + virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv); + virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv); + virtual void immediate_end(RID p_immediate); + virtual void immediate_clear(RID p_immediate); + virtual AABB immediate_get_aabb(RID p_immediate) const; + virtual void immediate_set_material(RID p_immediate,RID p_material); + virtual RID immediate_get_material(RID p_immediate) const; + + + /* PARTICLES API */ + + virtual RID particles_create(); + + virtual void particles_set_amount(RID p_particles, int p_amount); + virtual int particles_get_amount(RID p_particles) const; + + virtual void particles_set_emitting(RID p_particles, bool p_emitting); + virtual bool particles_is_emitting(RID p_particles) const; + + virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility); + virtual AABB particles_get_visibility_aabb(RID p_particles) const; + + virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents); + virtual Vector3 particles_get_emission_half_extents(RID p_particles) const; + + virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity); + virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const; + + virtual void particles_set_emission_points(RID p_particles, const DVector& p_points); + virtual DVector particles_get_emission_points(RID p_particles) const; + + virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal); + virtual Vector3 particles_get_gravity_normal(RID p_particles) const; + + virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value); + virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const; + + virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness); + virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const; + + virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos); + virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const; + + virtual void particles_set_color_phases(RID p_particles, int p_phases); + virtual int particles_get_color_phases(RID p_particles) const; + + virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color); + virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const; + + virtual void particles_set_attractors(RID p_particles, int p_attractors); + virtual int particles_get_attractors(RID p_particles) const; + + virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos); + virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const; + + virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force); + virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const; + + virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false); + virtual RID particles_get_material(RID p_particles) const; + + virtual AABB particles_get_aabb(RID p_particles) const; + + virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable); + virtual bool particles_has_height_from_velocity(RID p_particles) const; + + virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable); + virtual bool particles_is_using_local_coordinates(RID p_particles) const; + + /* SKELETON API */ + + virtual RID skeleton_create(); + virtual void skeleton_resize(RID p_skeleton,int p_bones); + virtual int skeleton_get_bone_count(RID p_skeleton) const; + virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform); + virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone); + + + /* LIGHT API */ + + virtual RID light_create(VS::LightType p_type); + virtual VS::LightType light_get_type(RID p_light) const; + + virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color); + virtual Color light_get_color(RID p_light,VS::LightColor p_type) const; + + virtual void light_set_shadow(RID p_light,bool p_enabled); + virtual bool light_has_shadow(RID p_light) const; + + virtual void light_set_volumetric(RID p_light,bool p_enabled); + virtual bool light_is_volumetric(RID p_light) const; + + virtual void light_set_projector(RID p_light,RID p_texture); + virtual RID light_get_projector(RID p_light) const; + + virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value); + virtual float light_get_var(RID p_light, VS::LightParam p_var) const; + + virtual void light_set_operator(RID p_light,VS::LightOp p_op); + virtual VS::LightOp light_get_operator(RID p_light) const; + + virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode); + virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const; + + + virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode); + virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const; + virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value); + virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const; + + virtual AABB light_get_aabb(RID p_poly) const; + + + virtual RID light_instance_create(RID p_light); + virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform); + + virtual bool light_instance_has_shadow(RID p_light_instance) const; + virtual bool light_instance_assign_shadow(RID p_light_instance); + virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const; + virtual int light_instance_get_shadow_passes(RID p_light_instance) const; + virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const; + virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); + virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const { return 1; } + + virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const; + virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); + + virtual void shadow_clear_near(); + virtual bool shadow_allocate_near(RID p_light); + virtual bool shadow_allocate_far(RID p_light); + + + /* PARTICLES INSTANCE */ + + virtual RID particles_instance_create(RID p_particles); + virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform); + + /* VIEWPORT */ + + virtual RID viewport_data_create(); + + virtual RID render_target_create(); + virtual void render_target_set_size(RID p_render_target, int p_width, int p_height); + virtual RID render_target_get_texture(RID p_render_target) const; + virtual bool render_target_renedered_in_frame(RID p_render_target); + + /* RENDER API */ + /* all calls (inside begin/end shadow) are always warranted to be in the following order: */ + + virtual void begin_frame(); + + virtual void set_viewport(const VS::ViewportRect& p_viewport); + virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false); + virtual void clear_viewport(const Color& p_color); + virtual void capture_viewport(Image* r_capture); + + + virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug); + virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass ); + + virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection); + + virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls + + + virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); + virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); + virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} + virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); + + virtual void end_scene(); + virtual void end_shadow_map(); + + virtual void end_frame(); + + /* CANVAS API */ + + virtual void canvas_begin(); + virtual void canvas_disable_blending(); + virtual void canvas_set_opacity(float p_opacity); + virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode); + virtual void canvas_begin_rect(const Matrix32& p_transform); + virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect); + virtual void canvas_end_rect(); + virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width); + virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate); + virtual void canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1)); + virtual void canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width); + virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor); + virtual void canvas_set_transform(const Matrix32& p_transform); + + /* FX */ + + virtual RID fx_create(); + virtual void fx_get_effects(RID p_fx,List *p_effects) const; + virtual void fx_set_active(RID p_fx,const String& p_effect, bool p_active); + virtual bool fx_is_active(RID p_fx,const String& p_effect) const; + virtual void fx_get_effect_params(RID p_fx,const String& p_effect,List *p_params) const; + virtual Variant fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const; + virtual void fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_pvalue); + + /* ENVIRONMENT */ + + virtual RID environment_create(); + + virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg); + virtual VS::EnvironmentBG environment_get_background(RID p_env) const; + + virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value); + virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const; + + virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled); + virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const; + + virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value); + virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const; + + /* SAMPLED LIGHT */ + virtual RID sampled_light_dp_create(int p_width,int p_height); + virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier); + + + /*MISC*/ + + virtual bool is_texture(const RID& p_rid) const; + virtual bool is_material(const RID& p_rid) const; + virtual bool is_mesh(const RID& p_rid) const; + virtual bool is_multimesh(const RID& p_rid) const; + virtual bool is_immediate(const RID& p_rid) const; + virtual bool is_particles(const RID &p_beam) const; + + virtual bool is_light(const RID& p_rid) const; + virtual bool is_light_instance(const RID& p_rid) const; + virtual bool is_particles_instance(const RID& p_rid) const; + virtual bool is_skeleton(const RID& p_rid) const; + virtual bool is_environment(const RID& p_rid) const; + virtual bool is_fx(const RID& p_rid) const; + virtual bool is_shader(const RID& p_rid) const; + + virtual void free(const RID& p_rid); + + virtual void custom_shade_model_set_shader(int p_model, RID p_shader); + virtual RID custom_shade_model_get_shader(int p_model) const; + virtual void custom_shade_model_set_name(int p_model, const String& p_name); + virtual String custom_shade_model_get_name(int p_model) const; + virtual void custom_shade_model_set_param_info(int p_model, const List& p_info); + virtual void custom_shade_model_get_param_info(int p_model, List* p_info) const; + + + virtual void init(); + virtual void finish(); + + virtual int get_render_info(VS::RenderInfo p_info); + + void reload_vram(); + + virtual bool needs_to_draw_next_frame() const; + + virtual bool has_feature(VS::Features p_feature) const; + + +#ifdef TOOLS_ENABLED + RasterizerGLES1(bool p_keep_copies=true,bool p_use_reload_hooks=false); +#else + RasterizerGLES1(bool p_keep_copies=false,bool p_use_reload_hooks=false); +#endif + virtual ~RasterizerGLES1(); +}; + +#endif +#endif diff --git a/platform/wiiu/thread_wiiu.cpp b/platform/wiiu/thread_wiiu.cpp new file mode 100644 index 00000000..03c47901 --- /dev/null +++ b/platform/wiiu/thread_wiiu.cpp @@ -0,0 +1,137 @@ +/*************************************************************************/ +/* thread_posix.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "thread_wiiu.h" +#include "script_language.h" + +#if !defined(__WIIU__) + +#include + +#include "os/memory.h" + +Thread::ID ThreadWiiu::get_ID() const { + + return id; +} + +Thread *ThreadWiiu::create_thread_posix() { + + return memnew(ThreadWiiu); +} + +void *ThreadWiiu::thread_callback(void *userdata) { + + ThreadWiiu *t = reinterpret_cast(userdata); + t->id = (ID)pthread_self(); + + ScriptServer::thread_enter(); //scripts may need to attach a stack + + t->callback(t->user); + + ScriptServer::thread_exit(); + + return NULL; +} + +Thread *ThreadWiiu::create_func_posix(ThreadCreateCallback p_callback, void *p_user, const Settings &) { + + ThreadWiiu *tr = memnew(ThreadWiiu); + tr->callback = p_callback; + tr->user = p_user; + pthread_attr_init(&tr->pthread_attr); + pthread_attr_setdetachstate(&tr->pthread_attr, PTHREAD_CREATE_JOINABLE); + pthread_attr_setstacksize(&tr->pthread_attr, 256 * 1024); + + pthread_create(&tr->pthread, &tr->pthread_attr, thread_callback, tr); + + return tr; +} +Thread::ID ThreadWiiu::get_thread_ID_func_posix() { + + return (ID)pthread_self(); +} +void ThreadWiiu::wait_to_finish_func_posix(Thread *p_thread) { + + ThreadWiiu *tp = static_cast(p_thread); + ERR_FAIL_COND(!tp); + ERR_FAIL_COND(tp->pthread == 0); + + pthread_join(tp->pthread, NULL); + tp->pthread = 0; +} + +Error ThreadWiiu::set_name_func_posix(const String &p_name) { + + pthread_t running_thread = pthread_self(); + +#ifdef PTHREAD_NO_RENAME + return ERR_UNAVAILABLE; + +#else + +#ifdef PTHREAD_RENAME_SELF + + // check if thread is the same as caller + int err = pthread_setname_np(p_name.utf8().get_data()); + +#else + +#ifdef PTHREAD_BSD_SET_NAME + pthread_set_name_np(running_thread, p_name.utf8().get_data()); + int err = 0; // Open/FreeBSD ignore errors in this function +#else + int err = pthread_setname_np(running_thread, p_name.utf8().get_data()); +#endif // PTHREAD_BSD_SET_NAME + +#endif // PTHREAD_RENAME_SELF + + return err == 0 ? OK : ERR_INVALID_PARAMETER; + +#endif // PTHREAD_NO_RENAME +}; + +void ThreadWiiu::make_default() { + + create_func = create_func_posix; + get_thread_ID_func = get_thread_ID_func_posix; + wait_to_finish_func = wait_to_finish_func_posix; + set_name_func = set_name_func_posix; +} + +ThreadWiiu::ThreadWiiu() { + + pthread = 0; +} + +ThreadWiiu::~ThreadWiiu() { +} + +#endif diff --git a/platform/wiiu/thread_wiiu.h b/platform/wiiu/thread_wiiu.h new file mode 100644 index 00000000..09899fb0 --- /dev/null +++ b/platform/wiiu/thread_wiiu.h @@ -0,0 +1,74 @@ +/*************************************************************************/ +/* thread_posix.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef THREAD_POSIX_H +#define THREAD_WIIU_H + +/** + @author Juan Linietsky +*/ + +#if !defined(__WIIU__) + +#include "os/thread.h" +#include +#include + +class ThreadWiiu : public Thread { + + pthread_t pthread; + pthread_attr_t pthread_attr; + ThreadCreateCallback callback; + void *user; + ID id; + + static Thread *create_thread_posix(); + + static void *thread_callback(void *userdata); + + static Thread *create_func_posix(ThreadCreateCallback p_callback, void *, const Settings &); + static ID get_thread_ID_func_posix(); + static void wait_to_finish_func_posix(Thread *p_thread); + + static Error set_name_func_posix(const String &p_name); + + ThreadWiiu(); + +public: + virtual ID get_ID() const; + + static void make_default(); + + ~ThreadWiiu(); +}; + +#endif + +#endif diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp index 89facb29..7bcbd82c 100644 --- a/servers/visual/visual_server_raster.cpp +++ b/servers/visual/visual_server_raster.cpp @@ -6470,7 +6470,19 @@ void VisualServerRaster::_draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_ } /* Camera should always be BEFORE any other 3D */ +#ifdef __3DS__ + if (!p_viewport->hide_scenario && camera_owner.owns(p_viewport->camera) && scenario_owner.owns(p_viewport->scenario)) { + + Camera *camera = camera_owner.get( p_viewport->camera ); + Scenario *scenario = scenario_owner.get( p_viewport->scenario ); + + _update_instances(); // check dirty instances before rendering + _render_camera(p_viewport, camera,scenario ); + + } + rasterizer->clear_viewport(clear_color); +#else if (!p_viewport->hide_scenario && camera_owner.owns(p_viewport->camera) && scenario_owner.owns(p_viewport->scenario)) { Camera *camera = camera_owner.get( p_viewport->camera ); @@ -6485,7 +6497,7 @@ void VisualServerRaster::_draw_viewport(Viewport *p_viewport,int p_ofs_x, int p_ //clear the viewport black because of no camera? i seriously should.. rasterizer->clear_viewport(clear_color); } - +#endif if (!p_viewport->hide_canvas) { int i=0; From 2f243fa7ee88cb0c9ca9b35a9c0a5e838ee8fbd1 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Wed, 18 Sep 2024 19:03:31 +0200 Subject: [PATCH 06/15] Started moving all gl1.x rasterizers to one - rasterizer_vita is gone --- drivers/gles1/rasterizer_gles1.cpp | 14 +- drivers/gles1/rasterizer_gles1.h | 6 +- platform/vita/SCsub | 3 +- platform/vita/os_vita.cpp | 4 +- platform/vita/rasterizer_vita.cpp | 6470 ---------------------------- platform/vita/rasterizer_vita.h | 1300 ------ 6 files changed, 18 insertions(+), 7779 deletions(-) delete mode 100644 platform/vita/rasterizer_vita.cpp delete mode 100644 platform/vita/rasterizer_vita.h diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index d7dc1ffa..dd90b1fa 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -26,7 +26,7 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef GLES1_ENABLED +#if defined(GLES1_ENABLED) || defined(__psp2__) #include "rasterizer_gles1.h" #include "os/os.h" @@ -3386,7 +3386,7 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat } - +#ifndef __psp2__ if(p_material->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ENVMAP] && p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP].is_valid()) { Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP] ); @@ -3407,6 +3407,7 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); +#endif if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); @@ -3418,8 +3419,9 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glDisable(GL_TEXTURE_2D); } +#ifndef __psp2__ } - +#endif } @@ -4511,7 +4513,7 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve }; void RasterizerGLES1::_process_blur(int times, float inc) { - +#ifndef __psp2__ float spost = 0.0f; float alphainc = 0.9f / times; float alpha = 0.2f; @@ -4619,6 +4621,7 @@ void RasterizerGLES1::_process_blur(int times, float inc) { glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); +#endif } @@ -6280,9 +6283,10 @@ void RasterizerGLES1::init() { scene_pass=1; +#ifndef __psp2__ if (ContextGL::get_singleton()) ContextGL::get_singleton()->make_current(); - +#endif Set extensions; diff --git a/drivers/gles1/rasterizer_gles1.h b/drivers/gles1/rasterizer_gles1.h index eb5e9efd..3f374156 100644 --- a/drivers/gles1/rasterizer_gles1.h +++ b/drivers/gles1/rasterizer_gles1.h @@ -31,7 +31,7 @@ #include "servers/visual/rasterizer.h" -#ifdef GLES1_ENABLED +#if defined(GLES1_ENABLED) || defined(__psp2__) #include "image.h" #include "rid.h" @@ -62,7 +62,11 @@ class RasterizerGLES1 : public Rasterizer { MAX_SCENE_LIGHTS=2048, LIGHT_SPOT_BIT=0x80, DEFAULT_SKINNED_BUFFER_SIZE = 1024 * 1024, // 10k vertices +#ifdef __psp2__ + MAX_HW_LIGHTS = 8, //Yay! 8 Lights :blush: +#else MAX_HW_LIGHTS = 4, +#endif }; #ifdef PSP void glActiveTexture(int a1) { }; diff --git a/platform/vita/SCsub b/platform/vita/SCsub index d3e18697..94e76759 100644 --- a/platform/vita/SCsub +++ b/platform/vita/SCsub @@ -6,8 +6,9 @@ Import('env') common_vita=[\ "os_vita.cpp",\ - "rasterizer_vita.cpp",\ "audio_driver_vita.cpp",\ + #"rasterizer_vita.cpp",\ + #"immvertex.c",\ # ] diff --git a/platform/vita/os_vita.cpp b/platform/vita/os_vita.cpp index 49b8a69b..024c70b7 100644 --- a/platform/vita/os_vita.cpp +++ b/platform/vita/os_vita.cpp @@ -31,7 +31,7 @@ #endif #include "servers/visual/visual_server_raster.h" -#include "servers/visual/rasterizer_dummy.h" +// #include "servers/visual/rasterizer_dummy.h" #ifdef PSP2_GLES2 extern "C" { @@ -40,7 +40,7 @@ extern "C" { #include "drivers/gles2/rasterizer_gles2.h" #else -#include "rasterizer_vita.h" +#include "drivers/gles1/rasterizer_gles1.h" #endif #include "os_vita.h" #include diff --git a/platform/vita/rasterizer_vita.cpp b/platform/vita/rasterizer_vita.cpp deleted file mode 100644 index 3b09848f..00000000 --- a/platform/vita/rasterizer_vita.cpp +++ /dev/null @@ -1,6470 +0,0 @@ -/*************************************************************************/ -/* rasterizer_gles1.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifdef __psp2__ - -#include "rasterizer_vita.h" -#include "os/os.h" -#include "globals.h" -#include -#include "drivers/gl_context/context_gl.h" -#include "servers/visual/shader_language.h" -#include "servers/visual/particle_system_sw.h" -#include "gl_context/context_gl.h" -#include - -_FORCE_INLINE_ static void _gl_load_transform(const Transform& tr) { - - GLfloat matrix[16]={ /* build a 16x16 matrix */ - tr.basis.elements[0][0], - tr.basis.elements[1][0], - tr.basis.elements[2][0], - 0, - tr.basis.elements[0][1], - tr.basis.elements[1][1], - tr.basis.elements[2][1], - 0, - tr.basis.elements[0][2], - tr.basis.elements[1][2], - tr.basis.elements[2][2], - 0, - tr.origin.x, - tr.origin.y, - tr.origin.z, - 1 - }; - - glLoadMatrixf(matrix); -}; - - -_FORCE_INLINE_ static void _gl_mult_transform(const Transform& tr) { - - GLfloat matrix[16]={ /* build a 16x16 matrix */ - tr.basis.elements[0][0], - tr.basis.elements[1][0], - tr.basis.elements[2][0], - 0, - tr.basis.elements[0][1], - tr.basis.elements[1][1], - tr.basis.elements[2][1], - 0, - tr.basis.elements[0][2], - tr.basis.elements[1][2], - tr.basis.elements[2][2], - 0, - tr.origin.x, - tr.origin.y, - tr.origin.z, - 1 - }; - - glMultMatrixf(matrix); -}; - -_FORCE_INLINE_ static void _gl_mult_transform(const Matrix32& tr) { - - GLfloat matrix[16]={ /* build a 16x16 matrix */ - tr.elements[0][0], - tr.elements[0][1], - 0, - 0, - tr.elements[1][0], - tr.elements[1][1], - 0, - 0, - 0, - 0, - 1, - 0, - tr.elements[2][0], - tr.elements[2][1], - 0, - 1 - }; - - glMultMatrixf(matrix); -}; - - -RasterizerGLES1::FX::FX() { - - bgcolor_active=false; - bgcolor=Color(0,1,0,1); - - skybox_active=false; - - glow_active=false; - glow_passes=4; - glow_attenuation=0.7; - glow_bloom=0.0; - - antialias_active=true; - antialias_tolerance=15; - - ssao_active=true; - ssao_attenuation=0.7; - ssao_radius=0.18; - ssao_max_distance=1.0; - ssao_range_min=0.25; - ssao_range_max=0.48; - ssao_only=false; - - - fog_active=false; - fog_near=5; - fog_far=100; - fog_attenuation=1.0; - fog_color_near=Color(1,1,1,1); - fog_color_far=Color(1,1,1,1); - fog_bg=false; - - toon_active=false; - toon_treshold=0.4; - toon_soft=0.001; - - edge_active=false; - edge_color=Color(0,0,0,1); - edge_size=1.0; - -} - -static const GLenum prim_type[]={GL_POINTS,GL_LINES,GL_TRIANGLES,GL_TRIANGLE_FAN}; - -static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { - - ERR_FAIL_COND(!p_vertices); - ERR_FAIL_COND(p_points <1 || p_points>4); - - GLenum type = prim_type[p_points - 1]; - - - //if (!p_colors) { - // glColor4f(1, 1, 1, 1); - //}; - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)p_vertices); - - if (p_normals) { - - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, 0, (GLvoid*)p_normals); - }; - - if (p_colors) { - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4,GL_FLOAT, 0, p_colors); - }; - - if (p_uvs) { -#ifndef PSP - glClientActiveTexture(GL_TEXTURE0); -#endif - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(3, GL_FLOAT, 0, p_uvs); - }; - - glDrawArrays( type, 0, p_points); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -}; - -/* TEXTURE API */ -#define _EXT_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define _EXT_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define _EXT_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define _EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#define _EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define _EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define _EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#define _EXT_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define _EXT_COMPRESSED_RED_RGTC1 0x8DBB -#define _EXT_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define _EXT_COMPRESSED_RG_RGTC2 0x8DBD -#define _EXT_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define _EXT_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define _EXT_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define _EXT_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#define _EXT_ETC1_RGB8_OES 0x8D64 - -/* TEXTURE API */ - -Image RasterizerGLES1::_get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed) { - - r_has_alpha_cache=false; - r_compressed=false; - Image image=p_image; - - switch(p_format) { - - case Image::FORMAT_GRAYSCALE: { - r_gl_components=1; - r_gl_format=GL_LUMINANCE; - - } break; - case Image::FORMAT_INTENSITY: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGBA); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - } break; - case Image::FORMAT_GRAYSCALE_ALPHA: { - - //image.convert(Image::FORMAT_RGBA); - r_gl_components=2; - r_gl_format=GL_LUMINANCE_ALPHA; - r_has_alpha_cache=true; - } break; - - case Image::FORMAT_INDEXED: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGB); - r_gl_components=3; - r_gl_format=GL_RGB; - - } break; - - case Image::FORMAT_INDEXED_ALPHA: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGBA); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - - } break; - case Image::FORMAT_RGB: { - - r_gl_components=3; - r_gl_format=GL_RGB; - } break; - case Image::FORMAT_RGBA: { - - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - } break; - case Image::FORMAT_BC1: { - - r_gl_components=1; //doesn't matter much - r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT; - r_compressed=true; - - } break; - case Image::FORMAT_BC2: { - r_gl_components=1; //doesn't matter much - r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT; - r_has_alpha_cache=true; - r_compressed=true; - - } break; - case Image::FORMAT_BC3: { - - r_gl_components=1; //doesn't matter much - r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT; - r_has_alpha_cache=true; - r_compressed=true; - - } break; - case Image::FORMAT_BC4: { - - r_gl_format=_EXT_COMPRESSED_RED_RGTC1; - r_gl_components=1; //doesn't matter much - r_compressed=true; - - } break; - case Image::FORMAT_BC5: { - - r_gl_format=_EXT_COMPRESSED_RG_RGTC2; - r_gl_components=1; //doesn't matter much - r_compressed=true; - } break; - case Image::FORMAT_PVRTC2: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC2"); - - } else { - - r_gl_format=_EXT_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC2"); - } - - } break; - case Image::FORMAT_PVRTC2_ALPHA: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC2A"); - - } else { - - r_gl_format=_EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC2A"); - } - - } break; - case Image::FORMAT_PVRTC4: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC4"); - } else { - - r_gl_format=_EXT_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC4"); - } - - } break; - case Image::FORMAT_PVRTC4_ALPHA: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC4A"); - - } else { - - r_gl_format=_EXT_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC4A"); - } - - } break; - case Image::FORMAT_ETC: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - } else { - - r_gl_format=_EXT_ETC1_RGB8_OES; - r_gl_components=1; //doesn't matter much - r_compressed=true; - } - - } break; - case Image::FORMAT_YUV_422: - case Image::FORMAT_YUV_444: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGB); - r_gl_format=GL_RGB; - r_gl_components=3; - - } break; - - default: { - - ERR_FAIL_V(Image()); - } - } - - return image; -} - - -RID RasterizerGLES1::texture_create() { - - Texture *texture = memnew(Texture); - ERR_FAIL_COND_V(!texture,RID()); - glGenTextures(1, &texture->tex_id); - texture->active=false; - texture->total_data_size=0; - - return texture_owner.make_rid( texture ); - -} - -void RasterizerGLES1::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { - - bool has_alpha_cache; - int components; - GLenum format; - bool compressed; - - int po2_width = nearest_power_of_2(p_width); - int po2_height = nearest_power_of_2(p_height); - - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - texture->width=p_width; - texture->height=p_height; - texture->format=p_format; - texture->flags=p_flags; - texture->target = /*(p_flags & VS::TEXTURE_FLAG_CUBEMAP) ? GL_TEXTURE_CUBE_MAP :*/ GL_TEXTURE_2D; - - bool scale_textures = (!npo2_textures_available || p_format&VS::TEXTURE_FLAG_MIPMAPS); - - - if (scale_textures) { - texture->alloc_width = po2_width; - texture->alloc_height = po2_height; - } else { - - texture->alloc_width = texture->width; - texture->alloc_height = texture->height; - }; - - _get_gl_image_and_format(Image(),texture->format,texture->flags,format,components,has_alpha_cache,compressed); - - texture->gl_components_cache=components; - texture->gl_format_cache=format; - texture->format_has_alpha=has_alpha_cache; - texture->compressed=compressed; - texture->data_size=0; - - - glActiveTexture(GL_TEXTURE0); - glBindTexture(texture->target, texture->tex_id); - - - - - if (compressed) { - - glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_FALSE ); - } else { - if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) { - glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_TRUE ); - } else { - glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_FALSE ); - } - - } - - - if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); - else - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - - if (texture->flags&VS::TEXTURE_FLAG_FILTER) { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering - - } else { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // raw Filtering - - } - bool force_clamp_to_edge = !(p_flags&VS::TEXTURE_FLAG_MIPMAPS) && (nearest_power_of_2(texture->alloc_height)!=texture->alloc_height || nearest_power_of_2(texture->alloc_width)!=texture->alloc_width); - - if (!force_clamp_to_edge && texture->flags&VS::TEXTURE_FLAG_REPEAT) { - - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - } else { - - //glTexParameterf( texture->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - } - - texture->active=true; -} - -void RasterizerGLES1::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND(!texture); - ERR_FAIL_COND(!texture->active); - ERR_FAIL_COND(texture->format != p_image.get_format() ); - - int components; - GLenum format; - bool alpha; - bool compressed; - - if (keep_copies && !(texture->flags&VS::TEXTURE_FLAG_VIDEO_SURFACE) && !(use_reload_hooks && texture->reloader)) { - texture->image[p_cube_side]=p_image; - } - - - Image img = _get_gl_image_and_format(p_image, p_image.get_format(),texture->flags,format,components,alpha,compressed); - if (texture->alloc_width != img.get_width() || texture->alloc_height != img.get_height()) { - - img.resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR); - }; - - - GLenum blit_target = /*(texture->target == GL_TEXTURE_CUBE_MAP)?_cube_side_enum[p_cube_side]:*/GL_TEXTURE_2D; - - texture->data_size=img.get_data().size(); - DVector::Read read = img.get_data().read(); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(texture->target, texture->tex_id); - - int mipmaps=(texture->flags&VS::TEXTURE_FLAG_MIPMAPS && img.get_mipmaps()>0) ? img.get_mipmaps() +1 : 1; - - int w=img.get_width(); - int h=img.get_height(); - - int tsize=0; - for(int i=0;icompressed) { - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - glCompressedTexImage2D( blit_target, i, format,w,h,0,size,&read[ofs] ); - - } else { - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -// glTexImage2D(blit_target, i, format==GL_RGB?GL_RGB8:format, w, h, 0, format, GL_UNSIGNED_BYTE,&read[ofs]); - glTexImage2D(blit_target, i, format, w, h, 0, format, GL_UNSIGNED_BYTE,&read[ofs]); - //glTexSubImage2D( blit_target, i, 0,0,w,h,format,GL_UNSIGNED_BYTE,&read[ofs] ); - } - tsize+=size; - - w = MAX(1,w>>1); - h = MAX(1,h>>1); - - } - - _rinfo.texture_mem-=texture->total_data_size; - texture->total_data_size=tsize; - _rinfo.texture_mem+=texture->total_data_size; - - printf("texture: %i x %i - size: %i - total: %i\n",texture->width,texture->height,tsize,_rinfo.texture_mem); - - - if (mipmaps==1 && texture->flags&VS::TEXTURE_FLAG_MIPMAPS) { - glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE ); - - } else { - glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE ); - - } - - if (mipmaps>1) { - - //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmaps-1 ); - assumed to have all, always - } - - //texture_set_flags(p_texture,texture->flags); - - -} - -Image RasterizerGLES1::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,Image()); - ERR_FAIL_COND_V(!texture->active,Image()); - - return texture->image[p_cube_side]; -#if 0 - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,Image()); - ERR_FAIL_COND_V(!texture->active,Image()); - ERR_FAIL_COND_V(texture->data_size==0,Image()); - - DVector data; - GLenum format,type=GL_UNSIGNED_BYTE; - Image::Format fmt; - int pixelsize=0; - int pixelshift=0; - int minw=1,minh=1; - bool compressed=false; - - fmt=texture->format; - - switch(texture->format) { - - case Image::FORMAT_GRAYSCALE: { - - format=GL_LUMINANCE; - type=GL_UNSIGNED_BYTE; - data.resize(texture->alloc_width*texture->alloc_height); - pixelsize=1; - - } break; - case Image::FORMAT_INTENSITY: { - return Image(); - } break; - case Image::FORMAT_GRAYSCALE_ALPHA: { - - format=GL_LUMINANCE_ALPHA; - type=GL_UNSIGNED_BYTE; - pixelsize=2; - - } break; - case Image::FORMAT_RGB: { - format=GL_RGB; - type=GL_UNSIGNED_BYTE; - pixelsize=3; - } break; - case Image::FORMAT_RGBA: { - - format=GL_RGBA; - type=GL_UNSIGNED_BYTE; - pixelsize=4; - } break; - case Image::FORMAT_INDEXED: { - - format=GL_RGB; - type=GL_UNSIGNED_BYTE; - fmt=Image::FORMAT_RGB; - pixelsize=3; - } break; - case Image::FORMAT_INDEXED_ALPHA: { - - format=GL_RGBA; - type=GL_UNSIGNED_BYTE; - fmt=Image::FORMAT_RGBA; - pixelsize=4; - - } break; - case Image::FORMAT_BC1: { - - pixelsize=1; //doesn't matter much - format=GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - compressed=true; - pixelshift=1; - minw=minh=4; - - } break; - case Image::FORMAT_BC2: { - pixelsize=1; //doesn't matter much - format=GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - compressed=true; - minw=minh=4; - - } break; - case Image::FORMAT_BC3: { - - pixelsize=1; //doesn't matter much - format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - compressed=true; - minw=minh=4; - - } break; - case Image::FORMAT_BC4: { - - format=GL_COMPRESSED_RED_RGTC1; - pixelsize=1; //doesn't matter much - compressed=true; - pixelshift=1; - minw=minh=4; - - } break; - case Image::FORMAT_BC5: { - - format=GL_COMPRESSED_RG_RGTC2; - pixelsize=1; //doesn't matter much - compressed=true; - minw=minh=4; - - } break; - - default:{} - } - - data.resize(texture->data_size); - DVector::Write wb = data.write(); - - glActiveTexture(GL_TEXTURE0); - int ofs=0; - glBindTexture(texture->target,texture->tex_id); - - int w=texture->alloc_width; - int h=texture->alloc_height; - for(int i=0;imipmaps+1;i++) { - - if (compressed) { - - glPixelStorei(GL_PACK_ALIGNMENT, 4); - glGetCompressedTexImage(texture->target,i,&wb[ofs]); - - } else { - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glGetTexImage(texture->target,i,format,type,&wb[ofs]); - } - - int size = (w*h*pixelsize)>>pixelshift; - ofs+=size; - - w=MAX(minw,w>>1); - h=MAX(minh,h>>1); - - } - - - wb=DVector::Write(); - - Image img(texture->alloc_width,texture->alloc_height,texture->mipmaps,fmt,data); - - if (texture->formatalloc_width!=texture->width || texture->alloc_height!=texture->height)) - img.resize(texture->width,texture->height); - - return img; -#endif -} - -void RasterizerGLES1::texture_set_flags(RID p_texture,uint32_t p_flags) { - - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(texture->target, texture->tex_id); - uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; - texture->flags=p_flags|cube; // can't remove a cube from being a cube - - bool force_clamp_to_edge = !(p_flags&VS::TEXTURE_FLAG_MIPMAPS) && (nearest_power_of_2(texture->alloc_height)!=texture->alloc_height || nearest_power_of_2(texture->alloc_width)!=texture->alloc_width); - - if (!force_clamp_to_edge && texture->flags&VS::TEXTURE_FLAG_REPEAT) { - - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - } else { - //glTexParameterf( texture->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - - } - - - if (texture->flags&VS::TEXTURE_FLAG_FILTER) { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering - if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); - else - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering - - } else { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // nearest - } -} -uint32_t RasterizerGLES1::texture_get_flags(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return texture->flags; - -} -Image::Format RasterizerGLES1::texture_get_format(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); - - return texture->format; -} -uint32_t RasterizerGLES1::texture_get_width(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return texture->width; -} -uint32_t RasterizerGLES1::texture_get_height(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return texture->height; -} - -bool RasterizerGLES1::texture_has_alpha(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return false; - -} - -void RasterizerGLES1::texture_set_size_override(RID p_texture,int p_width, int p_height) { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND(!texture); - - ERR_FAIL_COND(p_width<=0 || p_width>4096); - ERR_FAIL_COND(p_height<=0 || p_height>4096); - //real texture size is in alloc width and height - texture->width=p_width; - texture->height=p_height; - -} - -void RasterizerGLES1::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND(!texture); - - texture->reloader=p_owner; - texture->reloader_func=p_function; - if (use_reload_hooks && p_owner && keep_copies) { - - for(int i=0;i<6;i++) - texture->image[i]=Image(); - } - - -} - -/* SHADER API */ - -/* SHADER API */ - -RID RasterizerGLES1::shader_create(VS::ShaderMode p_mode) { - - Shader *shader = memnew( Shader ); - shader->mode=p_mode; - shader->valid=false; - shader->has_alpha=false; - shader->fragment_line=0; - shader->vertex_line=0; - shader->light_line=0; - RID rid = shader_owner.make_rid(shader); - shader_set_mode(rid,p_mode); -// _shader_make_dirty(shader); - - return rid; - -} - - - -void RasterizerGLES1::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) { - - ERR_FAIL_INDEX(p_mode,3); - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND(!shader); -// if (shader->custom_code_id && p_mode==shader->mode) -// return; - - shader->mode=p_mode; - -} -VS::ShaderMode RasterizerGLES1::shader_get_mode(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL); - return shader->mode; -} - - - -void RasterizerGLES1::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { - - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND(!shader); - -#ifdef DEBUG_ENABLED - if (shader->vertex_code==p_vertex && shader->fragment_code==p_fragment && shader->light_code==p_light) - return; -#endif - shader->fragment_code=p_fragment; - shader->vertex_code=p_vertex; - shader->light_code=p_light; - shader->fragment_line=p_fragment_ofs; - shader->vertex_line=p_vertex_ofs; - shader->light_line=p_light_ofs; - -} - -String RasterizerGLES1::shader_get_vertex_code(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,String()); - return shader->vertex_code; - -} - -String RasterizerGLES1::shader_get_fragment_code(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,String()); - return shader->fragment_code; - -} - -String RasterizerGLES1::shader_get_light_code(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,String()); - return shader->light_code; - -} - -void RasterizerGLES1::shader_get_param_list(RID p_shader, List *p_param_list) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND(!shader); -#if 0 - - if (shader->dirty_list.in_list()) - _update_shader(shader); // ok should be not anymore dirty - - - Map order; - - - for(Map::Element *E=shader->uniforms.front();E;E=E->next()) { - - - order[E->get().order]=E->key(); - } - - - for(Map::Element *E=order.front();E;E=E->next()) { - - PropertyInfo pi; - ShaderLanguage::Uniform &u=shader->uniforms[E->get()]; - pi.name=E->get(); - switch(u.type) { - - case ShaderLanguage::TYPE_VOID: - case ShaderLanguage::TYPE_BOOL: - case ShaderLanguage::TYPE_FLOAT: - case ShaderLanguage::TYPE_VEC2: - case ShaderLanguage::TYPE_VEC3: - case ShaderLanguage::TYPE_MAT3: - case ShaderLanguage::TYPE_MAT4: - case ShaderLanguage::TYPE_VEC4: - pi.type=u.default_value.get_type(); - break; - case ShaderLanguage::TYPE_TEXTURE: - pi.type=Variant::_RID; - pi.hint=PROPERTY_HINT_RESOURCE_TYPE; - pi.hint_string="Texture"; - break; - case ShaderLanguage::TYPE_CUBEMAP: - pi.type=Variant::_RID; - pi.hint=PROPERTY_HINT_RESOURCE_TYPE; - pi.hint_string="Texture"; - break; - }; - - p_param_list->push_back(pi); - - } -#endif - -} - -/* COMMON MATERIAL API */ - - -RID RasterizerGLES1::material_create() { - - return material_owner.make_rid( memnew( Material ) ); -} - -void RasterizerGLES1::material_set_shader(RID p_material, RID p_shader) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->shader=p_shader; - -} - -RID RasterizerGLES1::material_get_shader(RID p_material) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,RID()); - return material->shader; -} - -#if 0 - -void RasterizerGLES1::_material_check_alpha(Material *p_material) { - - p_material->has_alpha=false; - Color diffuse=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; - if (diffuse.a<0.98) { - - p_material->has_alpha=true; - return; - } - - if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { - - Texture *tex = texture_owner.get(p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE]); - if (!tex) - return; - if (tex->has_alpha) { - - p_material->has_alpha=true; - return; - } - } -} - -#endif -void RasterizerGLES1::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - - if (p_value.get_type()==Variant::NIL) - material->shader_params.erase(p_param); - else - material->shader_params[p_param]=p_value; -} -Variant RasterizerGLES1::material_get_param(RID p_material, const StringName& p_param) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,Variant()); - - if (material->shader_params.has(p_param)) - return material->shader_params[p_param]; - else - return Variant(); -} - - -void RasterizerGLES1::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX); - material->flags[p_flag]=p_enabled; - -} -bool RasterizerGLES1::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,false); - ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false); - return material->flags[p_flag]; - - -} - -void RasterizerGLES1::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->depth_draw_mode=p_mode; -} - -VS::MaterialDepthDrawMode RasterizerGLES1::material_get_depth_draw_mode(RID p_material) const{ - - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); - return material->depth_draw_mode; -} - - -void RasterizerGLES1::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->blend_mode=p_mode; - -} -VS::MaterialBlendMode RasterizerGLES1::material_get_blend_mode(RID p_material) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD); - return material->blend_mode; -} - -void RasterizerGLES1::material_set_line_width(RID p_material,float p_line_width) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->line_width=p_line_width; - -} -float RasterizerGLES1::material_get_line_width(RID p_material) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,0); - - return material->line_width; -} - -/* FIXED MATERIAL */ - - -RID RasterizerGLES1::fixed_material_create() { - - return material_create(); -} - -void RasterizerGLES1::fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_flag, 3); - m->fixed_flags[p_flag]=p_enabled; -} - -bool RasterizerGLES1::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m,false); - ERR_FAIL_INDEX_V(p_flag,VS::FIXED_MATERIAL_FLAG_MAX, false); - return m->fixed_flags[p_flag]; -} - -void RasterizerGLES1::fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); - - m->parameters[p_parameter] = p_value; - -} - -Variant RasterizerGLES1::fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, Variant()); - ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, Variant()); - - return m->parameters[p_parameter]; -} - -void RasterizerGLES1::fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); - - m->textures[p_parameter] = p_texture; - -} -RID RasterizerGLES1::fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, RID()); - ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, Variant()); - - return m->textures[p_parameter]; -} - - -void RasterizerGLES1::fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); - ERR_FAIL_INDEX(p_mode,4); - - m->texcoord_mode[p_parameter] = p_mode; -} - -VS::FixedMaterialTexCoordMode RasterizerGLES1::fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, VS::FIXED_MATERIAL_TEXCOORD_UV); - ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, VS::FIXED_MATERIAL_TEXCOORD_UV); - - return m->texcoord_mode[p_parameter]; // for now -} - -void RasterizerGLES1::fixed_material_set_uv_transform(RID p_material,const Transform& p_transform) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - - m->uv_transform = p_transform; -} - -Transform RasterizerGLES1::fixed_material_get_uv_transform(RID p_material) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, Transform()); - - return m->uv_transform; -} - -void RasterizerGLES1::fixed_material_set_point_size(RID p_material,float p_size) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - m->point_size=p_size; - -} -float RasterizerGLES1::fixed_material_get_point_size(RID p_material) const { - - const Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, 0); - return m->point_size; -} - - -/* MESH API */ - - -RID RasterizerGLES1::mesh_create() { - - - return mesh_owner.make_rid( memnew( Mesh ) ); -} - - - -void RasterizerGLES1::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - - ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); - ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); - - uint32_t format=0; - - // validation - int index_array_len=0; - int array_len=0; - - for(int i=0;imorph_target_count>0) { - - use_VBO=false; - } - - surface->packed=pack_arrays && use_VBO; - - int total_elem_size=0; - - for (int i=0;iarray[i]; - ad.size=0; - ad.ofs=0; - int elem_size=0; - int elem_count=0; - bool valid_local=true; - GLenum datatype; - bool normalize=false; - bool bind=false; - - if (!(format&(1<packed) { - elem_size=3*sizeof(int16_t); // vertex - datatype=GL_SHORT; - normalize=true; - - } else { - elem_size=3*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=3; - - } break; - case VS::ARRAY_NORMAL: { - - if (surface->packed) { - elem_size=3*sizeof(int8_t); // vertex - datatype=GL_BYTE; - normalize=true; - } else { - elem_size=3*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=3; - } break; - case VS::ARRAY_TANGENT: { - if (surface->packed) { - elem_size=4*sizeof(int8_t); // vertex - datatype=GL_BYTE; - normalize=true; - } else { - elem_size=4*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=4; - - } break; - case VS::ARRAY_COLOR: { - - elem_size=4*sizeof(uint8_t); /* RGBA */ - datatype=GL_UNSIGNED_BYTE; - elem_count=4; - bind=true; - normalize=true; - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - if (surface->packed) { - elem_size=2*sizeof(int16_t); // vertex - datatype=GL_SHORT; - normalize=true; - } else { - elem_size=2*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=2; - - } break; - case VS::ARRAY_WEIGHTS: { - - elem_size=VS::ARRAY_WEIGHTS_SIZE*sizeof(GLfloat); - elem_count=VS::ARRAY_WEIGHTS_SIZE; - valid_local=false; - datatype=GL_FLOAT; - - } break; - case VS::ARRAY_BONES: { - - elem_size=VS::ARRAY_WEIGHTS_SIZE*sizeof(GLuint); - elem_count=VS::ARRAY_WEIGHTS_SIZE; - valid_local=false; - datatype=GL_FLOAT; - - - } break; - case VS::ARRAY_INDEX: { - - if (index_array_len<=0) { - ERR_PRINT("index_array_len==NO_INDEX_ARRAY"); - break; - } - /* determine wether using 16 or 32 bits indices */ - elem_size=2; - datatype=GL_UNSIGNED_SHORT; - -/* - if (use_VBO) { - - glGenBuffers(1,&surface->index_id); - ERR_FAIL_COND(surface->index_id==0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id); - glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_len*elem_size,NULL,GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - } else { - surface->index_array_local = (uint8_t*)memalloc(index_array_len*elem_size); - }; -*/ - surface->index_array_len=index_array_len; // only way it can exist - ad.ofs=0; - ad.size=elem_size; - - - continue; - } break; - default: { - ERR_FAIL( ); - } - } - - ad.ofs=total_elem_size; - ad.size=elem_size; - ad.datatype=datatype; - ad.normalize=normalize; - ad.bind=bind; - ad.count=elem_count; - total_elem_size+=elem_size; - if (valid_local) { - surface->local_stride+=elem_size; - surface->morph_format|=(1<stride=total_elem_size; - surface->array_len=array_len; - surface->format=format; - surface->primitive=p_primitive; - surface->configured_format=0; - if (keep_copies) { - surface->data=p_arrays; - surface->morph_data=p_blend_shapes; - } - - uint8_t *array_ptr=NULL; - uint8_t *index_array_ptr=NULL; - DVector array_pre_vbo; - DVector::Write vaw; - DVector index_array_pre_vbo; - DVector::Write iaw; - - /* create pointers */ - if (use_VBO) { - - array_pre_vbo.resize(surface->array_len*surface->stride); - vaw = array_pre_vbo.write(); - array_ptr=vaw.ptr(); - - if (surface->index_array_len) { - - index_array_pre_vbo.resize(surface->index_array_len*surface->array[VS::ARRAY_INDEX].size); - iaw = index_array_pre_vbo.write(); - index_array_ptr=iaw.ptr(); - } - } else { - - surface->array_local = (uint8_t*)memalloc(surface->array_len*surface->stride); - array_ptr=(uint8_t*)surface->array_local; - if (surface->index_array_len) { - surface->index_array_local = (uint8_t*)memalloc(index_array_len*surface->array[VS::ARRAY_INDEX].size); - index_array_ptr=(uint8_t*)surface->index_array_local; - } - } - - - - _surface_set_arrays(surface,array_ptr,index_array_ptr,p_arrays,true); - - - /* create buffers!! */ - if (use_VBO) { - glGenBuffers(1,&surface->vertex_id); - ERR_FAIL_COND(surface->vertex_id==0); - glBindBuffer(GL_ARRAY_BUFFER,surface->vertex_id); - glBufferData(GL_ARRAY_BUFFER,surface->array_len*surface->stride,array_ptr,GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER,0); //unbind - if (surface->index_array_len) { - - glGenBuffers(1,&surface->index_id); - ERR_FAIL_COND(surface->index_id==0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id); - glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_len*surface->array[VS::ARRAY_INDEX].size,index_array_ptr,GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - - } - } - - mesh->surfaces.push_back(surface); - -} - -Error RasterizerGLES1::_surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main) { - - uint32_t stride = p_main ? p_surface->stride : p_surface->local_stride; - - for(int ai=0;ai=p_arrays.size()) - break; - if (p_arrays[ai].get_type()==Variant::NIL) - continue; - Surface::ArrayData &a=p_surface->array[ai]; - - switch(ai) { - - - case VS::ARRAY_VERTEX: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const Vector3* src=read.ptr(); - - // setting vertices means regenerating the AABB - AABB aabb; - - float scale=1; - float max=0; - - - for (int i=0;iarray_len;i++) { - - - GLfloat vector[3]={ src[i].x, src[i].y, src[i].z }; - - copymem(&p_mem[a.ofs+i*stride], vector, a.size); - - if (i==0) { - - aabb=AABB(src[i],Vector3()); - } else { - - aabb.expand_to( src[i] ); - } - } - - if (p_main) { - p_surface->aabb=aabb; - p_surface->vertex_scale=scale; - } - - - } break; - case VS::ARRAY_NORMAL: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const Vector3* src=read.ptr(); - - // setting vertices means regenerating the AABB - - for (int i=0;iarray_len;i++) { - - - GLfloat vector[3]={ src[i].x, src[i].y, src[i].z }; - copymem(&p_mem[a.ofs+i*stride], vector, a.size); - - } - - - } break; - case VS::ARRAY_TANGENT: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len*4, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const real_t* src = read.ptr(); - - for (int i=0;iarray_len;i++) { - - GLfloat xyzw[4]={ - src[i*4+0], - src[i*4+1], - src[i*4+2], - src[i*4+3] - }; - - copymem(&p_mem[a.ofs+i*stride], xyzw, a.size); - - } - - } break; - case VS::ARRAY_COLOR: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::COLOR_ARRAY, ERR_INVALID_PARAMETER ); - - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const Color* src = read.ptr(); - bool alpha=false; - - for (int i=0;iarray_len;i++) { - - if (src[i].a<0.98) // tolerate alpha a bit, for crappy exporters - alpha=true; - - uint8_t colors[4]; - - for(int j=0;j<4;j++) { - - colors[j]=CLAMP( int((src[i][j])*255.0), 0,255 ); - } - - copymem(&p_mem[a.ofs+i*stride], colors, a.size); - - } - - if (p_main) - p_surface->has_alpha=alpha; - - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY && p_arrays[ai].get_type() != Variant::VECTOR2_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len , ERR_INVALID_PARAMETER); - - DVector::Read read = array.read(); - - const Vector2 * src=read.ptr(); - float scale=1.0; - - - for (int i=0;iarray_len;i++) { - - GLfloat uv[2]={ src[i].x , src[i].y }; - - copymem(&p_mem[a.ofs+i*stride], uv, a.size); - - } - - if (p_main) { - - if (ai==VS::ARRAY_TEX_UV) { - - p_surface->uv_scale=scale; - } - if (ai==VS::ARRAY_TEX_UV2) { - - p_surface->uv2_scale=scale; - } - } - - } break; - case VS::ARRAY_BONES: - case VS::ARRAY_WEIGHTS: { - - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len*VS::ARRAY_WEIGHTS_SIZE, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - - const real_t * src = read.ptr(); - - p_surface->max_bone=0; - - for (int i=0;iarray_len;i++) { - - GLfloat data[VS::ARRAY_WEIGHTS_SIZE]; - for (int j=0;jmax_bone=MAX(data[j],p_surface->max_bone); - } - } - - copymem(&p_mem[a.ofs+i*stride], data, a.size); - - - } - - } break; - case VS::ARRAY_INDEX: { - - ERR_FAIL_COND_V( p_surface->index_array_len<=0, ERR_INVALID_DATA ); - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::INT_ARRAY, ERR_INVALID_PARAMETER ); - - DVector indices = p_arrays[ai]; - ERR_FAIL_COND_V( indices.size() == 0, ERR_INVALID_PARAMETER ); - ERR_FAIL_COND_V( indices.size() != p_surface->index_array_len, ERR_INVALID_PARAMETER ); - - /* determine wether using 16 or 32 bits indices */ - - DVector::Read read = indices.read(); - const int *src=read.ptr(); - - for (int i=0;iindex_array_len;i++) { - - - if (a.size==2) { - uint16_t v=src[i]; - - copymem(&p_index_mem[i*a.size], &v, a.size); - } else { - uint32_t v=src[i]; - - copymem(&p_index_mem[i*a.size], &v, a.size); - } - } - - - } break; - - - default: { ERR_FAIL_V(ERR_INVALID_PARAMETER);} - } - - p_surface->configured_format|=(1<surfaces.size(), Array() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, Array() ); - - return surface->data; - - -} -Array RasterizerGLES1::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,Array()); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, Array() ); - - return surface->morph_data; - -} - - -void RasterizerGLES1::mesh_set_morph_target_count(RID p_mesh,int p_amount) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_COND( mesh->surfaces.size()!=0 ); - - mesh->morph_target_count=p_amount; - -} - -int RasterizerGLES1::mesh_get_morph_target_count(RID p_mesh) const{ - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - - return mesh->morph_target_count; - -} - -void RasterizerGLES1::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { - - ERR_FAIL_INDEX(p_mode,2); - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - - mesh->morph_target_mode=p_mode; - -} - -VS::MorphTargetMode RasterizerGLES1::mesh_get_morph_target_mode(RID p_mesh) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); - - return mesh->morph_target_mode; - -} - - - -void RasterizerGLES1::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND( !surface); - - if (surface->material_owned && surface->material.is_valid()) - free(surface->material); - - surface->material_owned=p_owned; - - surface->material=p_material; -} - -RID RasterizerGLES1::mesh_surface_get_material(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,RID()); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, RID() ); - - return surface->material; -} - -int RasterizerGLES1::mesh_surface_get_array_len(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, -1 ); - - return surface->array_len; -} -int RasterizerGLES1::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, -1 ); - - return surface->index_array_len; -} -uint32_t RasterizerGLES1::mesh_surface_get_format(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,0); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, 0 ); - - return surface->format; -} -VS::PrimitiveType RasterizerGLES1::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS ); - - return surface->primitive; -} - -void RasterizerGLES1::mesh_remove_surface(RID p_mesh,int p_index) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_INDEX(p_index, mesh->surfaces.size() ); - Surface *surface = mesh->surfaces[p_index]; - ERR_FAIL_COND( !surface); - - if (mesh->morph_target_count) { - for(int i=0;imorph_target_count;i++) - memfree(surface->morph_targets_local[i].array); - memfree( surface->morph_targets_local ); - } - - memdelete( mesh->surfaces[p_index] ); - mesh->surfaces.remove(p_index); - -} -int RasterizerGLES1::mesh_get_surface_count(RID p_mesh) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - - return mesh->surfaces.size(); -} - -AABB RasterizerGLES1::mesh_get_aabb(RID p_mesh,RID p_skeleton) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,AABB()); - - if (mesh->custom_aabb!=AABB()) - return mesh->custom_aabb; - - AABB aabb; - - for (int i=0;isurfaces.size();i++) { - - if (i==0) - aabb=mesh->surfaces[i]->aabb; - else - aabb.merge_with(mesh->surfaces[i]->aabb); - } - - return aabb; -} - -void RasterizerGLES1::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - - mesh->custom_aabb=p_aabb; - -} - -AABB RasterizerGLES1::mesh_get_custom_aabb(RID p_mesh) const { - - const Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,AABB()); - - return mesh->custom_aabb; -} - - -/* MULTIMESH API */ - -RID RasterizerGLES1::multimesh_create() { - - return multimesh_owner.make_rid( memnew( MultiMesh )); -} - -void RasterizerGLES1::multimesh_set_instance_count(RID p_multimesh,int p_count) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - - if (nearest_power_of_2(p_count)!=nearest_power_of_2(multimesh->elements.size())) { - if (multimesh->tex_id) { - glDeleteTextures(1,&multimesh->tex_id); - multimesh->tex_id=0; - } - - if (p_count) { - - uint32_t po2 = nearest_power_of_2(p_count); - if (po2&0xAAAAAAAA) { - //half width - - multimesh->tw=Math::sqrt(po2*2); - multimesh->th=multimesh->tw/2; - } else { - - multimesh->tw=Math::sqrt(po2); - multimesh->th=multimesh->tw; - - } - multimesh->tw*=4; - if (multimesh->th==0) - multimesh->th=1; - - - - glGenTextures(1, &multimesh->tex_id); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D,multimesh->tex_id); - -#ifdef GLEW_ENABLED - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, multimesh->tw, multimesh->th, 0, GL_RGBA, GL_FLOAT,NULL); -#else - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, multimesh->tw, multimesh->th, 0, GL_RGBA, GL_FLOAT,NULL); -#endif - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - //multimesh->pixel_size=1.0/ps; - - glBindTexture(GL_TEXTURE_2D,0); - } - - } - multimesh->elements.resize(p_count); - -} -int RasterizerGLES1::multimesh_get_instance_count(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,-1); - - return multimesh->elements.size(); -} - -void RasterizerGLES1::multimesh_set_mesh(RID p_multimesh,RID p_mesh) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - - multimesh->mesh=p_mesh; - -} -void RasterizerGLES1::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - multimesh->aabb=p_aabb; -} -void RasterizerGLES1::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - ERR_FAIL_INDEX(p_index,multimesh->elements.size()); - MultiMesh::Element &e=multimesh->elements[p_index]; - - e.matrix[0]=p_transform.basis.elements[0][0]; - e.matrix[1]=p_transform.basis.elements[1][0]; - e.matrix[2]=p_transform.basis.elements[2][0]; - e.matrix[3]=0; - e.matrix[4]=p_transform.basis.elements[0][1]; - e.matrix[5]=p_transform.basis.elements[1][1]; - e.matrix[6]=p_transform.basis.elements[2][1]; - e.matrix[7]=0; - e.matrix[8]=p_transform.basis.elements[0][2]; - e.matrix[9]=p_transform.basis.elements[1][2]; - e.matrix[10]=p_transform.basis.elements[2][2]; - e.matrix[11]=0; - e.matrix[12]=p_transform.origin.x; - e.matrix[13]=p_transform.origin.y; - e.matrix[14]=p_transform.origin.z; - e.matrix[15]=1; - -} -void RasterizerGLES1::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh) - ERR_FAIL_INDEX(p_index,multimesh->elements.size()); - MultiMesh::Element &e=multimesh->elements[p_index]; - e.color[0]=CLAMP(p_color.r*255,0,255); - e.color[1]=CLAMP(p_color.g*255,0,255); - e.color[2]=CLAMP(p_color.b*255,0,255); - e.color[3]=CLAMP(p_color.a*255,0,255); - - -} - -RID RasterizerGLES1::multimesh_get_mesh(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,RID()); - - return multimesh->mesh; -} -AABB RasterizerGLES1::multimesh_get_aabb(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,AABB()); - - return multimesh->aabb; -} - -Transform RasterizerGLES1::multimesh_instance_get_transform(RID p_multimesh,int p_index) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,Transform()); - - ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform()); - MultiMesh::Element &e=multimesh->elements[p_index]; - - Transform tr; - - tr.basis.elements[0][0]=e.matrix[0]; - tr.basis.elements[1][0]=e.matrix[1]; - tr.basis.elements[2][0]=e.matrix[2]; - tr.basis.elements[0][1]=e.matrix[4]; - tr.basis.elements[1][1]=e.matrix[5]; - tr.basis.elements[2][1]=e.matrix[6]; - tr.basis.elements[0][2]=e.matrix[8]; - tr.basis.elements[1][2]=e.matrix[9]; - tr.basis.elements[2][2]=e.matrix[10]; - tr.origin.x=e.matrix[12]; - tr.origin.y=e.matrix[13]; - tr.origin.z=e.matrix[14]; - - return tr; -} -Color RasterizerGLES1::multimesh_instance_get_color(RID p_multimesh,int p_index) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,Color()); - ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color()); - MultiMesh::Element &e=multimesh->elements[p_index]; - Color c; - c.r=e.color[0]/255.0; - c.g=e.color[1]/255.0; - c.b=e.color[2]/255.0; - c.a=e.color[3]/255.0; - - return c; - -} - -void RasterizerGLES1::multimesh_set_visible_instances(RID p_multimesh,int p_visible) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - multimesh->visible=p_visible; - -} - -int RasterizerGLES1::multimesh_get_visible_instances(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,-1); - return multimesh->visible; - -} - -/* IMMEDIATE API */ - - -RID RasterizerGLES1::immediate_create() { - - Immediate *im = memnew( Immediate ); - return immediate_owner.make_rid(im); - -} - -void RasterizerGLES1::immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture){ - - -} -void RasterizerGLES1::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ - - -} -void RasterizerGLES1::immediate_normal(RID p_immediate,const Vector3& p_normal){ - - -} -void RasterizerGLES1::immediate_tangent(RID p_immediate,const Plane& p_tangent){ - - -} -void RasterizerGLES1::immediate_color(RID p_immediate,const Color& p_color){ - - -} -void RasterizerGLES1::immediate_uv(RID p_immediate,const Vector2& tex_uv){ - - -} -void RasterizerGLES1::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ - - -} - -void RasterizerGLES1::immediate_end(RID p_immediate){ - - -} -void RasterizerGLES1::immediate_clear(RID p_immediate) { - - -} - -AABB RasterizerGLES1::immediate_get_aabb(RID p_immediate) const { - - return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); -} - -void RasterizerGLES1::immediate_set_material(RID p_immediate,RID p_material) { - - Immediate *im = immediate_owner.get(p_immediate); - ERR_FAIL_COND(!im); - im->material=p_material; -} - -RID RasterizerGLES1::immediate_get_material(RID p_immediate) const { - - const Immediate *im = immediate_owner.get(p_immediate); - ERR_FAIL_COND_V(!im,RID()); - return im->material; - -} - - -/* PARTICLES API */ - -RID RasterizerGLES1::particles_create() { - - Particles *particles = memnew( Particles ); - ERR_FAIL_COND_V(!particles,RID()); - return particles_owner.make_rid(particles); -} - -void RasterizerGLES1::particles_set_amount(RID p_particles, int p_amount) { - - ERR_FAIL_COND(p_amount<1); - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.amount=p_amount; - -} - -int RasterizerGLES1::particles_get_amount(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.amount; - -} - -void RasterizerGLES1::particles_set_emitting(RID p_particles, bool p_emitting) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.emitting=p_emitting;; - -} -bool RasterizerGLES1::particles_is_emitting(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,false); - return particles->data.emitting; - -} - -void RasterizerGLES1::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.visibility_aabb=p_visibility; - -} - -void RasterizerGLES1::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.emission_half_extents=p_half_extents; -} -Vector3 RasterizerGLES1::particles_get_emission_half_extents(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - - return particles->data.emission_half_extents; -} - -void RasterizerGLES1::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.emission_base_velocity=p_base_velocity; -} - -Vector3 RasterizerGLES1::particles_get_emission_base_velocity(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - - return particles->data.emission_base_velocity; -} - - -void RasterizerGLES1::particles_set_emission_points(RID p_particles, const DVector& p_points) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.emission_points=p_points; -} - -DVector RasterizerGLES1::particles_get_emission_points(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,DVector()); - - return particles->data.emission_points; - -} - -void RasterizerGLES1::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.gravity_normal=p_normal; - -} -Vector3 RasterizerGLES1::particles_get_gravity_normal(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - - return particles->data.gravity_normal; -} - - -AABB RasterizerGLES1::particles_get_visibility_aabb(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,AABB()); - return particles->data.visibility_aabb; - -} - -void RasterizerGLES1::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) { - - ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX); - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.particle_vars[p_variable]=p_value; - -} -float RasterizerGLES1::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.particle_vars[p_variable]; -} - -void RasterizerGLES1::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.particle_randomness[p_variable]=p_randomness; - -} -float RasterizerGLES1::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.particle_randomness[p_variable]; - -} - -void RasterizerGLES1::particles_set_color_phases(RID p_particles, int p_phases) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES ); - particles->data.color_phase_count=p_phases; - -} -int RasterizerGLES1::particles_get_color_phases(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.color_phase_count; -} - - -void RasterizerGLES1::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) { - - ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); - if (p_pos<0.0) - p_pos=0.0; - if (p_pos>1.0) - p_pos=1.0; - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.color_phases[p_phase].pos=p_pos; - -} -float RasterizerGLES1::particles_get_color_phase_pos(RID p_particles, int p_phase) const { - - ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0); - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.color_phases[p_phase].pos; - -} - -void RasterizerGLES1::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) { - - ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.color_phases[p_phase].color=p_color; - - //update alpha - particles->has_alpha=false; - for(int i=0;idata.color_phases[i].color.a<0.99) - particles->has_alpha=true; - } - -} - -Color RasterizerGLES1::particles_get_color_phase_color(RID p_particles, int p_phase) const { - - ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color()); - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Color()); - return particles->data.color_phases[p_phase].color; - -} - -void RasterizerGLES1::particles_set_attractors(RID p_particles, int p_attractors) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS ); - particles->data.attractor_count=p_attractors; - -} -int RasterizerGLES1::particles_get_attractors(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.attractor_count; -} - -void RasterizerGLES1::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); - particles->data.attractors[p_attractor].pos=p_pos;; -} -Vector3 RasterizerGLES1::particles_get_attractor_pos(RID p_particles,int p_attractor) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3()); - return particles->data.attractors[p_attractor].pos; -} - -void RasterizerGLES1::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); - particles->data.attractors[p_attractor].force=p_force; -} - -float RasterizerGLES1::particles_get_attractor_strength(RID p_particles,int p_attractor) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,0); - ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0); - return particles->data.attractors[p_attractor].force; -} - -void RasterizerGLES1::particles_set_material(RID p_particles, RID p_material,bool p_owned) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - if (particles->material_owned && particles->material.is_valid()) - free(particles->material); - - particles->material_owned=p_owned; - - particles->material=p_material; - -} -RID RasterizerGLES1::particles_get_material(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,RID()); - return particles->material; - -} - -void RasterizerGLES1::particles_set_use_local_coordinates(RID p_particles, bool p_enable) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.local_coordinates=p_enable; - -} - -bool RasterizerGLES1::particles_is_using_local_coordinates(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,false); - return particles->data.local_coordinates; -} -bool RasterizerGLES1::particles_has_height_from_velocity(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,false); - return particles->data.height_from_velocity; -} - -void RasterizerGLES1::particles_set_height_from_velocity(RID p_particles, bool p_enable) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.height_from_velocity=p_enable; - -} - -AABB RasterizerGLES1::particles_get_aabb(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,AABB()); - return particles->data.visibility_aabb; -} - -/* SKELETON API */ - -RID RasterizerGLES1::skeleton_create() { - - Skeleton *skeleton = memnew( Skeleton ); - ERR_FAIL_COND_V(!skeleton,RID()); - return skeleton_owner.make_rid( skeleton ); -} -void RasterizerGLES1::skeleton_resize(RID p_skeleton,int p_bones) { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND(!skeleton); - if (p_bones == skeleton->bones.size()) { - return; - }; - - skeleton->bones.resize(p_bones); - -} -int RasterizerGLES1::skeleton_get_bone_count(RID p_skeleton) const { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND_V(!skeleton, -1); - return skeleton->bones.size(); -} -void RasterizerGLES1::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND(!skeleton); - ERR_FAIL_INDEX( p_bone, skeleton->bones.size() ); - - skeleton->bones[p_bone] = p_transform; -} - -Transform RasterizerGLES1::skeleton_bone_get_transform(RID p_skeleton,int p_bone) { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND_V(!skeleton, Transform()); - ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() ); - - // something - return skeleton->bones[p_bone]; -} - - -/* LIGHT API */ - -RID RasterizerGLES1::light_create(VS::LightType p_type) { - - Light *light = memnew( Light ); - light->type=p_type; - return light_owner.make_rid(light); -} - -VS::LightType RasterizerGLES1::light_get_type(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI); - return light->type; -} - -void RasterizerGLES1::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - ERR_FAIL_INDEX( p_type, 3 ); - light->colors[p_type]=p_color; -} -Color RasterizerGLES1::light_get_color(RID p_light,VS::LightColor p_type) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light, Color()); - ERR_FAIL_INDEX_V( p_type, 3, Color() ); - return light->colors[p_type]; -} - -void RasterizerGLES1::light_set_shadow(RID p_light,bool p_enabled) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - light->shadow_enabled=p_enabled; -} - -bool RasterizerGLES1::light_has_shadow(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,false); - return light->shadow_enabled; -} - -void RasterizerGLES1::light_set_volumetric(RID p_light,bool p_enabled) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - light->volumetric_enabled=p_enabled; - -} -bool RasterizerGLES1::light_is_volumetric(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,false); - return light->volumetric_enabled; -} - -void RasterizerGLES1::light_set_projector(RID p_light,RID p_texture) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - light->projector=p_texture; -} -RID RasterizerGLES1::light_get_projector(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,RID()); - return light->projector; -} - -void RasterizerGLES1::light_set_var(RID p_light, VS::LightParam p_var, float p_value) { - - Light * light = light_owner.get( p_light ); - ERR_FAIL_COND(!light); - ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX ); - - light->vars[p_var]=p_value; -} -float RasterizerGLES1::light_get_var(RID p_light, VS::LightParam p_var) const { - - Light * light = light_owner.get( p_light ); - ERR_FAIL_COND_V(!light,0); - - ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 ); - - return light->vars[p_var]; -} - -void RasterizerGLES1::light_set_operator(RID p_light,VS::LightOp p_op) { - - Light * light = light_owner.get( p_light ); - ERR_FAIL_COND(!light); - - -}; - -VS::LightOp RasterizerGLES1::light_get_operator(RID p_light) const { - - return VS::LightOp(0); -}; - -void RasterizerGLES1::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) { - - -} - -VS::LightOmniShadowMode RasterizerGLES1::light_omni_get_shadow_mode(RID p_light) const{ - - return VS::LightOmniShadowMode(0); -} - -void RasterizerGLES1::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) { - - -} - -VS::LightDirectionalShadowMode RasterizerGLES1::light_directional_get_shadow_mode(RID p_light) const { - - return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL; -} - -void RasterizerGLES1::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) { - - -} - -float RasterizerGLES1::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const { - - return 0; -} - - -AABB RasterizerGLES1::light_get_aabb(RID p_light) const { - - Light *light = light_owner.get( p_light ); - ERR_FAIL_COND_V(!light,AABB()); - - switch( light->type ) { - - case VS::LIGHT_SPOT: { - - float len=light->vars[VS::LIGHT_PARAM_RADIUS]; - float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len; - return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) ); - } break; - case VS::LIGHT_OMNI: { - - float r = light->vars[VS::LIGHT_PARAM_RADIUS]; - return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 ); - } break; - case VS::LIGHT_DIRECTIONAL: { - - return AABB(); - } break; - default: {} - } - - ERR_FAIL_V( AABB() ); -} - - -RID RasterizerGLES1::light_instance_create(RID p_light) { - - Light *light = light_owner.get( p_light ); - ERR_FAIL_COND_V(!light, RID()); - - LightInstance *light_instance = memnew( LightInstance ); - - light_instance->light=p_light; - light_instance->base=light; - light_instance->last_pass=0; - - return light_instance_owner.make_rid( light_instance ); -} -void RasterizerGLES1::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { - - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND(!lighti); - lighti->transform=p_transform; - -} - -bool RasterizerGLES1::light_instance_has_shadow(RID p_light_instance) const { - - return false; - - /* - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND_V(!lighti, false); - - if (!lighti->base->shadow_enabled) - return false; - - if (lighti->base->type==VS::LIGHT_DIRECTIONAL) { - if (lighti->shadow_pass!=scene_pass) - return false; - - } else { - if (lighti->shadow_pass!=frame) - return false; - }*/ - - - - //return !lighti->shadow_buffers.empty(); - -} - - -bool RasterizerGLES1::light_instance_assign_shadow(RID p_light_instance) { - - return false; - -} - - -Rasterizer::ShadowType RasterizerGLES1::light_instance_get_shadow_type(RID p_light_instance) const { - - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE); - - switch(lighti->base->type) { - - case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break; - case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break; - case VS::LIGHT_SPOT: return SHADOW_SIMPLE; break; - } - - return Rasterizer::SHADOW_NONE; -} - -Rasterizer::ShadowType RasterizerGLES1::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const { - - return SHADOW_NONE; -} -void RasterizerGLES1::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { - - -} - -int RasterizerGLES1::light_instance_get_shadow_passes(RID p_light_instance) const { - - return 0; -} - -bool RasterizerGLES1::light_instance_get_pssm_shadow_overlap(RID p_light_instance) const { - - return false; -} - -void RasterizerGLES1::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { - - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND(!lighti); - - ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL); - ERR_FAIL_INDEX(p_index,1); - - lighti->custom_projection=p_camera; - lighti->custom_transform=p_transform; - -} -void RasterizerGLES1::shadow_clear_near() { - - -} - -bool RasterizerGLES1::shadow_allocate_near(RID p_light) { - - return false; -} - -bool RasterizerGLES1::shadow_allocate_far(RID p_light) { - - return false; -} - -/* PARTICLES INSTANCE */ - -RID RasterizerGLES1::particles_instance_create(RID p_particles) { - - ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID()); - ParticlesInstance *particles_instance = memnew( ParticlesInstance ); - ERR_FAIL_COND_V(!particles_instance, RID() ); - particles_instance->particles=p_particles; - return particles_instance_owner.make_rid(particles_instance); -} - -void RasterizerGLES1::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) { - - ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance); - ERR_FAIL_COND(!particles_instance); - particles_instance->transform=p_transform; -} - - -/* RENDER API */ -/* all calls (inside begin/end shadow) are always warranted to be in the following order: */ - - -RID RasterizerGLES1::viewport_data_create() { - - return RID(); -} - -RID RasterizerGLES1::render_target_create(){ - - return RID(); - -} -void RasterizerGLES1::render_target_set_size(RID p_render_target, int p_width, int p_height){ - - -} -RID RasterizerGLES1::render_target_get_texture(RID p_render_target) const{ - - return RID(); - -} -bool RasterizerGLES1::render_target_renedered_in_frame(RID p_render_target){ - - return false; -} - - -void RasterizerGLES1::begin_frame() { - - - window_size = Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height ); - //print_line("begin frame - winsize: "+window_size); - - double time = (OS::get_singleton()->get_ticks_usec()/1000); // get msec - time/=1000.0; // make secs - time_delta=time-last_time; - last_time=time; - frame++; - clear_viewport(Color(1,0,0.5)); - - _rinfo.vertex_count=0; - _rinfo.object_count=0; - _rinfo.mat_change_count=0; - _rinfo.shader_change_count=0; - - -// material_shader.set_uniform_default(MaterialShaderGLES1::SCREENZ_SCALE, Math::fmod(time, 3600.0)); - /* nehe ?*/ - -// glClearColor(0,0,1,1); -// glClear(GL_COLOR_BUFFER_BIT); //should not clear if anything else cleared.. -} - -void RasterizerGLES1::capture_viewport(Image* r_capture) { - - -} - - -void RasterizerGLES1::clear_viewport(const Color& p_color) { - - glScissor( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - glEnable(GL_SCISSOR_TEST); - glClearColor(p_color.r,p_color.g,p_color.b,p_color.a); - glClear(GL_COLOR_BUFFER_BIT); //should not clear if anything else cleared.. - glDisable(GL_SCISSOR_TEST); - -}; - -void RasterizerGLES1::set_viewport(const VS::ViewportRect& p_viewport) { - - - - viewport=p_viewport; - //print_line("viewport: "+itos(p_viewport.x)+","+itos(p_viewport.y)+","+itos(p_viewport.width)+","+itos(p_viewport.height)); - is_editor = VS::get_singleton()->get_editor(); - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); -} - -void RasterizerGLES1::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { - - -} - - -void RasterizerGLES1::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { - - - opaque_render_list.clear(); - alpha_render_list.clear(); - light_instance_count=0; - scene_fx = NULL; // p_env.is_valid() ? fx_owner.get(p_env) : NULL; - scene_pass++; - last_light_id=0; - directional_light_count=0; - current_env = environment_owner.get(p_env); - - //set state - - glCullFace(GL_FRONT); - cull_front=true; -}; - -void RasterizerGLES1::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { - -} - -void RasterizerGLES1::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { - - camera_transform=p_world; - camera_transform_inverse=camera_transform.inverse(); - camera_projection=p_projection; - camera_plane = Plane( camera_transform.origin, camera_transform.basis.get_axis(2) ); - camera_z_near=camera_projection.get_z_near(); - camera_z_far=camera_projection.get_z_far(); - camera_projection.get_viewport_size(camera_vp_size.x,camera_vp_size.y); -} - -void RasterizerGLES1::add_light( RID p_light_instance ) { - -#define LIGHT_FADE_TRESHOLD 0.05 - - ERR_FAIL_COND( light_instance_count >= MAX_SCENE_LIGHTS ); - - LightInstance *li = light_instance_owner.get(p_light_instance); - ERR_FAIL_COND(!li); - - - /* make light hash */ - - // actually, not really a hash, but helps to sort the lights - // and avoid recompiling redudant shader versions - - - li->last_pass=scene_pass; - li->sort_key=light_instance_count; - - switch(li->base->type) { - - case VisualServer::LIGHT_DIRECTIONAL: { - - li->light_vector = camera_transform_inverse.basis.xform(li->transform.basis.get_axis(2)).normalized(); - if (directional_light_countbase->vars[VisualServer::LIGHT_PARAM_RADIUS]; - if (radius==0) - radius=0.0001; - li->linear_att=(1/LIGHT_FADE_TRESHOLD)/radius; - li->light_vector = camera_transform_inverse.xform(li->transform.origin); - - } break; - case VisualServer::LIGHT_SPOT: { - - float radius = li->base->vars[VisualServer::LIGHT_PARAM_RADIUS]; - if (radius==0) - radius=0.0001; - li->linear_att=(1/LIGHT_FADE_TRESHOLD)/radius; - li->light_vector = camera_transform_inverse.xform(li->transform.origin); - li->spot_vector = -camera_transform_inverse.basis.xform(li->transform.basis.get_axis(2)).normalized(); - //li->sort_key|=LIGHT_SPOT_BIT; // this way, omnis go first, spots go last and less shader versions are generated - - /* - if (li->base->projector.is_valid()) { - - float far = li->base->vars[ VS::LIGHT_VAR_RADIUS ]; - ERR_FAIL_COND( far<=0 ); - float near= far/200.0; - if (near<0.05) - near=0.05; - - float angle = li->base->vars[ VS::LIGHT_VAR_SPOT_ANGLE ]; - - //CameraMatrix proj; - //proj.set_perspective( angle*2.0, 1.0, near, far ); - - //Transform modelview=Transform(camera_transform_inverse * li->transform).inverse(); - //li->projector_mtx= proj * modelview; - - }*/ - } break; - } - - light_instances[light_instance_count++]=li; - -} - -void RasterizerGLES1::_add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner) { - - Material *m=NULL; - RID m_src=p_instance->material_override.is_valid() ? p_instance->material_override : p_geometry->material; - - if (m_src) - m=material_owner.get( m_src ); - - if (!m) { - m=material_owner.get( default_material ); - } - - ERR_FAIL_COND(!m); - - - if (m->last_pass!=frame) { - - m->last_pass=frame; - } - - - LightInstance *lights[RenderList::MAX_LIGHTS]; - int light_count=0; - - RenderList *render_list=&opaque_render_list; - if (m->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ALPHA] || m->blend_mode!=VS::MATERIAL_BLEND_MODE_MIX) { - render_list = &alpha_render_list; - }; - - if (!m->flags[VS::MATERIAL_FLAG_UNSHADED]) { - - int lis = p_instance->light_instances.size(); - - for(int i=0;i=RenderList::MAX_LIGHTS) - break; - - LightInstance *li=light_instance_owner.get( p_instance->light_instances[i] ); - - if (!li || li->last_pass!=scene_pass) //lit by light not in visible scene - continue; - lights[light_count++]=li; - } - } - - RenderList::Element *e = render_list->add_element(); - - e->geometry=p_geometry; -// e->geometry_cmp=p_geometry_cmp; - e->material=m; - e->instance=p_instance; - //e->depth=camera_plane.distance_to(p_world->origin); - e->depth=camera_transform.origin.distance_to(p_instance->transform.origin); - e->owner=p_owner; - if (p_instance->skeleton.is_valid()) - e->skeleton=skeleton_owner.get(p_instance->skeleton); - else - e->skeleton=NULL; - e->mirror=p_instance->mirror; - if (m->flags[VS::MATERIAL_FLAG_INVERT_FACES]) - e->mirror=!e->mirror; - - e->light_key=0; - e->light_count=0; - - - if (!shadow) { - - - if (m->flags[VS::MATERIAL_FLAG_UNSHADED]) { - - - e->light_key--; //special key for all the shadeless people - } else if (light_count) { - - for(int i=0;ilights[i]=lights[i]->sort_key; - } - - e->light_count=light_count; - int poslight_count=light_count; - if (poslight_count>1) { - SortArray light_sort; - light_sort.sort(&e->lights[0],poslight_count); //generate an equal sort key - } - } - - } - -} - - -void RasterizerGLES1::add_mesh( const RID& p_mesh, const InstanceData *p_data) { - - Mesh *mesh = mesh_owner.get(p_mesh); - ERR_FAIL_COND(!mesh); - - int ssize = mesh->surfaces.size(); - - for (int i=0;isurfaces[i]; - _add_geometry(s,p_data,s,NULL); - } - - mesh->last_pass=frame; - -} - -void RasterizerGLES1::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - - if (!multimesh->mesh.is_valid()) - return; - if (multimesh->elements.empty()) - return; - - Mesh *mesh = mesh_owner.get(multimesh->mesh); - ERR_FAIL_COND(!mesh); - - int surf_count = mesh->surfaces.size(); - if (multimesh->last_pass!=scene_pass) { - - multimesh->cache_surfaces.resize(surf_count); - for(int i=0;icache_surfaces[i].material=mesh->surfaces[i]->material; - multimesh->cache_surfaces[i].has_alpha=mesh->surfaces[i]->has_alpha; - multimesh->cache_surfaces[i].surface=mesh->surfaces[i]; - } - - multimesh->last_pass=scene_pass; - } - - for(int i=0;icache_surfaces[i],p_data,multimesh->cache_surfaces[i].surface,multimesh); - } - - -} - -void RasterizerGLES1::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ - - //print_line("adding particles"); - ParticlesInstance *particles_instance = particles_instance_owner.get(p_particle_instance); - ERR_FAIL_COND(!particles_instance); - Particles *p=particles_owner.get( particles_instance->particles ); - ERR_FAIL_COND(!p); - - _add_geometry(p,p_data,p,particles_instance); - -} - - -void RasterizerGLES1::_set_cull(bool p_front,bool p_reverse_cull) { - - bool front = p_front; - if (p_reverse_cull) - front=!front; - - if (front!=cull_front) { - - glCullFace(front?GL_FRONT:GL_BACK); - cull_front=front; - } -} - - -void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Material *p_material) { - - if (!shadow) { - - ///ambient @TODO offer global ambient group option - - //GLenum side = use_shaders?GL_FRONT:GL_FRONT_AND_BACK; - GLenum side = GL_FRONT_AND_BACK; - - - ///diffuse - Color diffuse_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; - float diffuse_rgba[4]={ - diffuse_color.r, - diffuse_color.g, - diffuse_color.b, - diffuse_color.a - }; - - //color array overrides this - glColor4f( diffuse_rgba[0],diffuse_rgba[1],diffuse_rgba[2],diffuse_rgba[3]); - last_color=diffuse_color; - if(current_env) { - switch((int)current_env->group[0]) { - case VS::ENV_GROUP_SAME: { - glMaterialfv(side,GL_AMBIENT, diffuse_rgba); - break; - } - case VS::ENV_GROUP_NONE: { - break; - } - case VS::ENV_GROUP_HALF: { - float ambient_rgba[4]={ - diffuse_color.r / 2, - diffuse_color.g / 2, - diffuse_color.b / 2, - 1.0 - }; - glMaterialfv(side,GL_AMBIENT, ambient_rgba); - break; - } - case VS::ENV_GROUP_COLOR: { - Color c = current_env->group[VS::ENV_GROUP_COLOR]; - float ambient_rgba2[4] = { - c.r, - c.g, - c.b, - c.a - }; - glMaterialfv(side,GL_AMBIENT, ambient_rgba2); - break; - } - case 0: { - glMaterialfv(side,GL_AMBIENT, diffuse_rgba); - break; - } - default: { - break; - } - } - } else { - glMaterialfv(side,GL_AMBIENT, diffuse_rgba); - } - glMaterialfv(side,GL_DIFFUSE,diffuse_rgba); - // | GU_SPECULARspecular - - const Color specular_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR]; - float specular_rgba[4]={ - specular_color.r, - specular_color.g, - specular_color.b, - 1.0 - }; - - glMaterialfv(side,GL_SPECULAR,specular_rgba); - - const Color emission=p_material->parameters[VS::FIXED_MATERIAL_PARAM_EMISSION]; - - - float emission_rgba[4]={ - emission.r, - emission.g, - emission.b, - 1.0 //p_material->parameters[VS::FIXED_MATERIAL_PARAM_DETAIL_MIX] - }; - - glMaterialfv(side,GL_EMISSION,emission_rgba); - - glMaterialf(side,GL_SHININESS,p_material->parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]); - - Plane sparams=p_material->parameters[VS::FIXED_MATERIAL_PARAM_SHADE_PARAM]; - //depth test? - - - } - - - if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { - - Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); - ERR_FAIL_COND(!texture); - glEnable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - } else { - - glDisable(GL_TEXTURE_2D); - } - -} - -void RasterizerGLES1::_setup_material(const Geometry *p_geometry,const Material *p_material) { - - if (p_material->flags[VS::MATERIAL_FLAG_DOUBLE_SIDED]) - glDisable(GL_CULL_FACE); - else { - glEnable(GL_CULL_FACE); - } - -/* if (p_material->flags[VS::MATERIAL_FLAG_WIREFRAME]) - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);*/ - - if (p_material->line_width > 0) - glLineWidth(p_material->line_width); - - if (!shadow) { - - - if (blend_mode!=p_material->blend_mode) { - switch(p_material->blend_mode) { - - - case VS::MATERIAL_BLEND_MODE_MIX: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - case VS::MATERIAL_BLEND_MODE_ADD: { - - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - - } break; - case VS::MATERIAL_BLEND_MODE_SUB: { - - //glBlendEquation(GL_FUNC_SUBTRACT); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - } break; - case VS::MATERIAL_BLEND_MODE_MUL: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - - } - blend_mode=p_material->blend_mode; - } - - if (lighting!=!p_material->flags[VS::MATERIAL_FLAG_UNSHADED]) { - if (p_material->flags[VS::MATERIAL_FLAG_UNSHADED]) { - glDisable(GL_LIGHTING); - } else { - glEnable(GL_LIGHTING); - } - lighting=!p_material->flags[VS::MATERIAL_FLAG_UNSHADED]; - } - - } - - bool current_depth_write=p_material->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_ALWAYS; //broken - bool current_depth_test=!p_material->flags[VS::MATERIAL_FLAG_ONTOP]; - - - _setup_fixed_material(p_geometry,p_material); - - if (current_depth_write!=depth_write) { - - depth_write=current_depth_write; - glDepthMask(depth_write); - } - - if (current_depth_test!=depth_test) { - - depth_test=current_depth_test; - if (depth_test) - glEnable(GL_DEPTH_TEST); - else - glDisable(GL_DEPTH_TEST);; - } -} -/* -static const MaterialShaderGLES1::Conditionals _gl_light_version[4][3]={ - {MaterialShaderGLES1::LIGHT_0_DIRECTIONAL,MaterialShaderGLES1::LIGHT_0_OMNI,MaterialShaderGLES1::LIGHT_0_SPOT}, - {MaterialShaderGLES1::LIGHT_1_DIRECTIONAL,MaterialShaderGLES1::LIGHT_1_OMNI,MaterialShaderGLES1::LIGHT_1_SPOT}, - {MaterialShaderGLES1::LIGHT_2_DIRECTIONAL,MaterialShaderGLES1::LIGHT_2_OMNI,MaterialShaderGLES1::LIGHT_2_SPOT}, - {MaterialShaderGLES1::LIGHT_3_DIRECTIONAL,MaterialShaderGLES1::LIGHT_3_OMNI,MaterialShaderGLES1::LIGHT_3_SPOT} -}; - -static const MaterialShaderGLES1::Conditionals _gl_light_shadow[4]={ - MaterialShaderGLES1::LIGHT_0_SHADOW, - MaterialShaderGLES1::LIGHT_1_SHADOW, - MaterialShaderGLES1::LIGHT_2_SHADOW, - MaterialShaderGLES1::LIGHT_3_SHADOW -}; -*/ - - -void RasterizerGLES1::_setup_light(LightInstance* p_instance, int p_idx) { - - Light* ld = p_instance->base; - -// material_shader.set_conditional(MaterialShaderGLES1::LIGHT_0_DIRECTIONAL, true); - - //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_DIFFUSE, ld->colors[VS::LIGHT_COLOR_DIFFUSE]); - //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_SPECULAR, ld->colors[VS::LIGHT_COLOR_SPECULAR]); - //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_AMBIENT, ld->colors[VS::LIGHT_COLOR_AMBIENT]); - - GLenum glid = GL_LIGHT0+p_idx; - - Color diff_color = ld->colors[VS::LIGHT_COLOR_DIFFUSE]; - float emult = ld->vars[VS::LIGHT_PARAM_ENERGY]; - - if (ld->type!=VS::LIGHT_DIRECTIONAL) - emult*=4.0; - - GLfloat diffuse_sdark[4]={ - diff_color.r*emult, - diff_color.g*emult, - diff_color.b*emult, - 1.0 - }; - - glLightfv(glid , GL_DIFFUSE, diffuse_sdark); - - Color amb_color = Color(0,0,0); - GLfloat amb_stexsize[4]={ - amb_color.r, - amb_color.g, - amb_color.b, - 1.0 - }; - - glLightfv(glid , GL_AMBIENT, amb_stexsize ); - - Color spec_color = ld->colors[VS::LIGHT_COLOR_SPECULAR]; - GLfloat spec_op[4]={ - spec_color.r, - spec_color.g, - spec_color.b, - 1.0 - }; - - glLightfv(glid , GL_SPECULAR, spec_op ); - - switch(ld->type) { - - case VS::LIGHT_DIRECTIONAL: { - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - glLightf(glid,GL_CONSTANT_ATTENUATION, 1); - glLightf(glid,GL_LINEAR_ATTENUATION, 0); - glLightf(glid,GL_QUADRATIC_ATTENUATION,0); // energy - - float lightdir[4]={ - p_instance->light_vector.x, - p_instance->light_vector.y, - p_instance->light_vector.z, - 0.0 - }; - - glLightfv(glid,GL_POSITION,lightdir); //at modelview - glLightf(glid,GL_SPOT_CUTOFF,180.0); - glLightf(glid,GL_SPOT_EXPONENT, 0); - - float sdir[4]={ - 0, - 0, - -1, - 0 - }; - - glLightfv(glid,GL_SPOT_DIRECTION,sdir); //at modelview - -// material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_DIRECTION, p_instance->light_vector); - glPopMatrix(); - - } break; - - case VS::LIGHT_OMNI: { - - - glLightf(glid,GL_SPOT_CUTOFF,180.0); - glLightf(glid,GL_SPOT_EXPONENT, 0); - - - glLightf(glid,GL_CONSTANT_ATTENUATION, 0); - glLightf(glid,GL_LINEAR_ATTENUATION, p_instance->linear_att); - glLightf(glid,GL_QUADRATIC_ATTENUATION, 0); // wut? - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - float lightpos[4]={ - p_instance->light_vector.x, - p_instance->light_vector.y, - p_instance->light_vector.z, - 1.0 - }; - - glLightfv(glid,GL_POSITION,lightpos); //at modelview - - glPopMatrix(); - - - } break; - case VS::LIGHT_SPOT: { - - glLightf(glid,GL_SPOT_CUTOFF, ld->vars[VS::LIGHT_PARAM_SPOT_ANGLE]); - glLightf(glid,GL_SPOT_EXPONENT, ld->vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]); - - - glLightf(glid,GL_CONSTANT_ATTENUATION, 0); - glLightf(glid,GL_LINEAR_ATTENUATION, p_instance->linear_att); - glLightf(glid,GL_QUADRATIC_ATTENUATION, 0); // wut? - - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - float lightpos[4]={ - p_instance->light_vector.x, - p_instance->light_vector.y, - p_instance->light_vector.z, - 1.0 - }; - - glLightfv(glid,GL_POSITION,lightpos); //at modelview - - float lightdir[4]={ - p_instance->spot_vector.x, - p_instance->spot_vector.y, - p_instance->spot_vector.z, - 1.0 - }; - - glLightfv(glid,GL_SPOT_DIRECTION,lightdir); //at modelview - - glPopMatrix(); - - - - } break; - - default: break; - } -}; - - - - - -void RasterizerGLES1::_setup_lights(const uint16_t * p_lights,int p_light_count) { - - if (shadow) - return; - - - - for (int i=directional_light_count; itype) { - - case Geometry::GEOMETRY_MULTISURFACE: - case Geometry::GEOMETRY_SURFACE: { - - - - const Surface *surf=NULL; - if (p_geometry->type==Geometry::GEOMETRY_SURFACE) - surf=static_cast(p_geometry); - else if (p_geometry->type==Geometry::GEOMETRY_MULTISURFACE) - surf=static_cast(p_geometry)->surface; - - - if (surf->format != surf->configured_format) { - if (OS::get_singleton()->is_stdout_verbose()) { - - print_line("has format: "+itos(surf->format)); - print_line("configured format: "+itos(surf->configured_format)); - } - ERR_EXPLAIN("Missing arrays (not set) in surface"); - } - ERR_FAIL_COND_V( surf->format != surf->configured_format, ERR_UNCONFIGURED ); - uint8_t *base=0; - int stride=surf->stride; - bool use_VBO = (surf->array_local==0); - _setup_geometry_vinfo=surf->array_len; - - bool skeleton_valid = p_skeleton && (surf->format&VS::ARRAY_FORMAT_BONES) && (surf->format&VS::ARRAY_FORMAT_WEIGHTS) && !p_skeleton->bones.empty() && p_skeleton->bones.size() > surf->max_bone; - - - - if (!use_VBO) { - - base = surf->array_local; - glBindBuffer(GL_ARRAY_BUFFER, 0); - bool can_copy_to_local=surf->local_stride * surf->array_len <= skinned_buffer_size; - if (!can_copy_to_local) - skeleton_valid=false; - - /* compute morphs */ - - if (p_morphs && surf->morph_target_count && can_copy_to_local) { - - base = skinned_buffer; - stride=surf->local_stride; - - //copy all first - float coef=1.0; - - for(int i=0;imorph_target_count;i++) { - if (surf->mesh->morph_target_mode==VS::MORPH_MODE_NORMALIZED) - coef-=p_morphs[i]; - ERR_FAIL_COND_V( surf->morph_format != surf->morph_targets_local[i].configured_format, ERR_INVALID_DATA ); - - } - - - for(int i=0;iarray[i]; - if (ad.size==0) - continue; - - int ofs = ad.ofs; - int src_stride=surf->stride; - int dst_stride=surf->local_stride; - int count = surf->array_len; - - switch(i) { - - case VS::ARRAY_VERTEX: - case VS::ARRAY_NORMAL: - case VS::ARRAY_TANGENT: - { - - for(int k=0;karray_local[ofs+k*src_stride]; - float *dst = (float*)&base[ofs+k*dst_stride]; - - dst[0]= src[0]*coef; - dst[1]= src[1]*coef; - dst[2]= src[2]*coef; - } break; - - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - - for(int k=0;karray_local[ofs+k*src_stride]; - float *dst = (float*)&base[ofs+k*dst_stride]; - - dst[0]= src[0]*coef; - dst[1]= src[1]*coef; - } break; - - } break; - } - } - - - for(int j=0;jmorph_target_count;j++) { - - for(int i=0;iarray[i]; - if (ad.size==0) - continue; - - - int ofs = ad.ofs; - int dst_stride=surf->local_stride; - int count = surf->array_len; - const uint8_t *morph=surf->morph_targets_local[j].array; - float w = p_morphs[j]; - - switch(i) { - - case VS::ARRAY_VERTEX: - case VS::ARRAY_NORMAL: - case VS::ARRAY_TANGENT: - { - - for(int k=0;karray_len; - int src_stride = surf->stride; - int dst_stride = surf->stride - ( surf->array[VS::ARRAY_BONES].size + surf->array[VS::ARRAY_WEIGHTS].size ); - - for(int i=0;iarray_local[i*src_stride]; - uint8_t *dst = &base[i*dst_stride]; - memcpy(dst,src,dst_stride); - } - - - stride=dst_stride; - } - - - if (skeleton_valid) { - //transform stuff - - const uint8_t *src_weights=&surf->array_local[surf->array[VS::ARRAY_WEIGHTS].ofs]; - const uint8_t *src_bones=&surf->array_local[surf->array[VS::ARRAY_BONES].ofs]; - int src_stride = surf->stride; - int count = surf->array_len; - const Transform *skeleton = &p_skeleton->bones[0]; - - for(int i=0;iarray[i]; - if (ad.size==0) - continue; - - int ofs = ad.ofs; - - - switch(i) { - - case VS::ARRAY_VERTEX: { - for(int k=0;k(&src_weights[k*src_stride]); - const GLfloat *bones = reinterpret_cast(&src_bones[k*src_stride]); - - Vector3 src( ptr[0], ptr[1], ptr[2] ); - Vector3 dst; - for(int j=0;j(&src_weights[k*src_stride]); - const GLfloat *bones = reinterpret_cast(&src_bones[k*src_stride]); - - Vector3 src( ptr[0], ptr[1], ptr[2] ); - Vector3 dst; - for(int j=0;jvertex_id); - }; - - - for (int i=0;i<(VS::ARRAY_MAX-1);i++) { - - const Surface::ArrayData& ad=surf->array[i]; - -// if (!gl_texcoord_shader[i]) -// continue; - - if (ad.size==0 || i==VS::ARRAY_BONES || i==VS::ARRAY_WEIGHTS || gl_client_states[i]==0 ) { - - if (gl_texcoord_index[i] != -1) { - glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); - } - - if (gl_client_states[i] != 0) - glDisableClientState(gl_client_states[i]); - - if (i == VS::ARRAY_COLOR) { - glColor4f(last_color.r,last_color.g,last_color.b,last_color.a); - }; - continue; // this one is disabled. - } - - if (gl_texcoord_index[i] != -1) { - glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); - } - - glEnableClientState(gl_client_states[i]); - - switch (i) { - - case VS::ARRAY_VERTEX: { - - glVertexPointer(3,ad.datatype,stride,&base[ad.ofs]); - - } break; /* fallthrough to normal */ - case VS::ARRAY_NORMAL: { - - glNormalPointer(ad.datatype,stride,&base[ad.ofs]); - } break; - case VS::ARRAY_COLOR: { - glColorPointer(4,ad.datatype,stride,&base[ad.ofs]); - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - - glTexCoordPointer(2,ad.datatype,stride,&base[ad.ofs]); - } break; - case VS::ARRAY_TANGENT: { - - //glVertexAttribPointer(i, 4, use_VBO?GL_BYTE:GL_FLOAT, use_VBO?GL_TRUE:GL_FALSE, stride, &base[ad.ofs]); - - } break; - case VS::ARRAY_BONES: - case VS::ARRAY_WEIGHTS: { - - //do none - //glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, surf->stride, &base[ad.ofs]); - - } break; - case VS::ARRAY_INDEX: - ERR_PRINT("Bug"); - break; - }; - } - - - } break; - - default: break; - - }; - - return OK; -}; - -static const GLenum gl_primitive[]={ - GL_POINTS, - GL_LINES, - GL_LINE_STRIP, - GL_LINE_LOOP, - GL_TRIANGLES, - GL_TRIANGLE_STRIP, - GL_TRIANGLE_FAN -}; - -static const GLenum gl_poly_primitive[4]={ - GL_POINTS, - GL_LINES, - GL_TRIANGLES, - //GL_QUADS - -}; - - -void RasterizerGLES1::_render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner) { - - - _rinfo.object_count++; - - switch(p_geometry->type) { - - case Geometry::GEOMETRY_SURFACE: { - - Surface *s = (Surface*)p_geometry; - - _rinfo.vertex_count+=s->array_len; - - if (s->packed && s->array_local==0) { - - float sc = (1.0/32767.0)*s->vertex_scale; - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glScalef(sc,sc,sc); - if (s->format&VS::ARRAY_FORMAT_TEX_UV) { - float uvs=(1.0/32767.0)*s->uv_scale; - //glActiveTexture(GL_TEXTURE0); - glClientActiveTexture(GL_TEXTURE0); - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glScalef(uvs,uvs,uvs); - } - - - } - - - if (s->index_array_len>0) { - - if (s->index_array_local) { - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); - glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT, s->index_array_local); - - } else { - // print_line("indices: "+itos(s->index_array_local) ); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); - glDrawElements(gl_primitive[s->primitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT,0); - } - - - } else { - - glDrawArrays(gl_primitive[s->primitive],0,s->array_len); - - }; - - if (s->packed && s->array_local==0) { - if (s->format&VS::ARRAY_FORMAT_TEX_UV) { - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - } - glPopMatrix(); - }; - } break; - - case Geometry::GEOMETRY_MULTISURFACE: { - - Surface *s = static_cast(p_geometry)->surface; - const MultiMesh *mm = static_cast(p_owner); - int element_count=mm->elements.size(); - - if (element_count==0) - return; - - const MultiMesh::Element *elements=&mm->elements[0]; - - _rinfo.vertex_count+=s->array_len*element_count; - - - if (s->index_array_len>0) { - - // glLoadMatrixf(elements[0].matrix); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); - for(int i=0;iprimitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT,0); - // glLoadIdentity(); - // glPopMatrix(); - } - - - } else { - - for(int i=0;iprimitive],0,s->array_len); - // glLoadIdentity(); - // glPopMatrix(); - } - - - }; - } break; - case Geometry::GEOMETRY_PARTICLES: { - - - //print_line("particulinas"); - const Particles *particles = static_cast( p_geometry ); - ERR_FAIL_COND(!p_owner); - ParticlesInstance *particles_instance = (ParticlesInstance*)p_owner; - - ParticleSystemProcessSW &pp = particles_instance->particles_process; - float td = time_delta; //MIN(time_delta,1.0/10.0); - pp.process(&particles->data,particles_instance->transform,td); - ERR_EXPLAIN("A parameter in the particle system is not correct."); - ERR_FAIL_COND(!pp.valid); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - glBindBuffer(GL_ARRAY_BUFFER,0); - - - Transform camera; - if (shadow) - camera=shadow->transform; - else - camera=camera_transform; - - particle_draw_info.prepare(&particles->data,&pp,particles_instance->transform,camera); - - _rinfo.vertex_count+=4*particles->data.amount; - - { - static const Vector3 points[4]={ - Vector3(-1.0,1.0,0), - Vector3(1.0,1.0,0), - Vector3(1.0,-1.0,0), - Vector3(-1.0,-1.0,0) - }; - static const Vector3 uvs[4]={ - Vector3(0.0,0.0,0.0), - Vector3(1.0,0.0,0.0), - Vector3(1.0,1.0,0.0), - Vector3(0,1.0,0.0) - }; - static const Vector3 normals[4]={ - Vector3(0,0,1), - Vector3(0,0,1), - Vector3(0,0,1), - Vector3(0,0,1) - }; - - static const Plane tangents[4]={ - Plane(Vector3(1,0,0),0), - Plane(Vector3(1,0,0),0), - Plane(Vector3(1,0,0),0), - Plane(Vector3(1,0,0),0) - }; - - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - _gl_load_transform(camera_transform_inverse); - for(int i=0;idata.amount;i++) { - - ParticleSystemDrawInfoSW::ParticleDrawInfo &pinfo=*particle_draw_info.draw_info_order[i]; - if (!pinfo.data->active) - continue; - glPushMatrix(); - _gl_mult_transform(pinfo.transform); - - glColor4f(pinfo.color.r*last_color.r,pinfo.color.g*last_color.g,pinfo.color.b*last_color.b,pinfo.color.a*last_color.a); - _draw_primitive(4,points,normals,NULL,uvs,tangents); - glPopMatrix(); - - } - glPopMatrix(); - - } - - } break; - default: break; - }; - -}; - -void RasterizerGLES1::_setup_shader_params(const Material *p_material) { -#if 0 - int idx=0; - int tex_idx=0; - - for(Map::Element *E=p_material->shader_cache->params.front();E;E=E->next(),idx++) { - - Variant v; // - v = E->get(); - const Map::Element *F=p_material->shader_params.find(E->key()); - if (F) - v=F->get(); - - switch(v.get_type() ) { - case Variant::OBJECT: - case Variant::_RID: { - - RID tex=v; - if (!tex.is_valid()) - break; - - Texture *texture = texture_owner.get(tex); - if (!texture) - break; - glUniform1i( material_shader.get_custom_uniform_location(idx), tex_idx); - glActiveTexture(tex_idx); - glBindTexture(texture->target,texture->tex_id); - - } break; - case Variant::COLOR: { - - Color c=v; - material_shader.set_custom_uniform(idx,Vector3(c.r,c.g,c.b)); - } break; - default: { - - material_shader.set_custom_uniform(idx,v); - } break; - } - - } -#endif - -} -_FORCE_INLINE_ static void _set_glcoloro(const Color& p_color,const float p_opac) { - - glColor4f(p_color.r, p_color.g, p_color.b, p_color.a*p_opac); -} - -void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reverse_cull) { - - const Material *prev_material=NULL; - uint64_t prev_light_key=0; - const Skeleton *prev_skeleton=NULL; - const Geometry *prev_geometry=NULL; - const BakedLightData *prev_baked_light=NULL; - RID prev_baked_light_texture; - - Geometry::Type prev_geometry_type=Geometry::GEOMETRY_INVALID; - - for (int i=0;ielement_count;i++) { - - RenderList::Element *e = p_render_list->elements[i]; - const Material *material = e->material; - uint64_t light_key = e->light_key; - const Skeleton *skeleton = e->skeleton; - const Geometry *geometry = e->geometry; - const BakedLightData *baked_light = e->instance->baked_light; - - bool bind_baked_light_octree=false; - bool bind_baked_lightmap=false; - - if (e->instance->sampled_light.is_valid()) { - - SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light); - if (sl) { - - baked_light=NULL; //can't mix - // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,true); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D,sl->texture); //bind the texture - } - } - if (baked_light) { - - if (baked_light->mode==VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) { - // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,true); - bind_baked_light_octree=true; - if (prev_baked_light!=baked_light) { - Texture *tex=texture_owner.get(baked_light->octree_texture); - if (tex) { - - glActiveTexture(GL_TEXTURE0); - glBindTexture(tex->target,tex->tex_id); //bind the texture - } - if (baked_light->light_texture.is_valid()) { - Texture *texl=texture_owner.get(baked_light->light_texture); - if (texl) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(texl->target,texl->tex_id); //bind the light texture - } - } - - } - - } else if (baked_light->mode==VS::BAKED_LIGHT_LIGHTMAPS) { - - - int lightmap_idx = e->instance->baked_lightmap_id; - - // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false); - bind_baked_lightmap=false; - - - if (baked_light->lightmaps.has(lightmap_idx)) { - - - RID texid = baked_light->lightmaps[lightmap_idx]; - - if (prev_baked_light!=baked_light || texid!=prev_baked_light_texture) { - - - Texture *tex = texture_owner.get(texid); - if (tex) { - - glActiveTexture(GL_TEXTURE0); - glBindTexture(tex->target,tex->tex_id); //bind the texture - } - - prev_baked_light_texture=texid; - } - - if (texid.is_valid()) { - bind_baked_lightmap=true; - } - - } - } - } - - if (material!=prev_material || geometry->type!=prev_geometry_type) { - _setup_material(e->geometry,material); - _rinfo.mat_change_count++; - //_setup_material_overrides(e->material,NULL,material_overrides); - //_setup_material_skeleton(material,skeleton); - } else { - - if (prev_skeleton!=skeleton) { - //_setup_material_skeleton(material,skeleton); - }; - } - - - if (geometry!=prev_geometry || geometry->type!=prev_geometry_type || prev_skeleton!=skeleton) { - - _setup_geometry(geometry, material,e->skeleton,e->instance->morph_values.ptr()); - }; - - // if (i==0 || light_key!=prev_light_key) - _setup_lights(e->lights,e->light_count); - - _set_cull(e->mirror,p_reverse_cull); - - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glPushMatrix(); - - - if (e->instance->billboard || e->instance->depth_scale) { - - Transform xf=e->instance->transform; - if (e->instance->depth_scale) { - - if (camera_projection.matrix[3][3]) { - //orthogonal matrix, try to do about the same - //with viewport size - //real_t w = Math::abs( 1.0/(2.0*(p_projection.matrix[0][0])) ); - real_t h = Math::abs( 1.0/(2.0*camera_projection.matrix[1][1]) ); - float sc = (h*2.0); //consistent with Y-fov - xf.basis.scale( Vector3(sc,sc,sc)); - } else { - //just scale by depth - real_t sc = -camera_plane.distance_to(xf.origin); - xf.basis.scale( Vector3(sc,sc,sc)); - } - } - - if (e->instance->billboard) { - - Vector3 scale = xf.basis.get_scale(); - xf.set_look_at(xf.origin,xf.origin+camera_transform.get_basis().get_axis(2),camera_transform.get_basis().get_axis(1)); - xf.basis.scale(scale); - } - _gl_mult_transform(xf); // for fixed pipeline - - } else { - _gl_mult_transform(e->instance->transform); // for fixed pipeline - } - - - - //bool changed_shader = material_shader.bind(); - //if ( changed_shader && material->shader_cache && !material->shader_cache->params.empty()) - // _setup_shader_params(material); - - _render(geometry, material, skeleton,e->owner); - - - - prev_material=material; - prev_skeleton=skeleton; - prev_geometry=geometry; - prev_light_key=e->light_key; - prev_baked_light=baked_light; - prev_geometry_type=geometry->type; - } - - - -}; - -void RasterizerGLES1::_process_blur(int times, float inc) { - - float spost = 0.0f; - float alphainc = 0.9f / times; - float alpha = 0.2f; - int num; - - // glDisable(GL_TEXTURE_GEN_S); - // glDisable(GL_TEXTURE_GEN_T); - - glEnable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glEnable(GL_BLEND); - - - glBindTexture(GL_TEXTURE_2D, BlurTexture); - - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glOrthof(0, viewport.width, viewport.height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - alphainc = alpha / times; - /* - glBegin(GL_QUADS); - for (num = 0;num < times;num++) - { - glColor4f(1.0f, 1.0f, 1.0f, alpha); - glTexCoord2f(0+spost,1-spost); - glVertex2f(0,0); - - glTexCoord2f(0+spost,0+spost); - glVertex2f(0, viewport.height); - - glTexCoord2f(1-spost,0+spost); - glVertex2f(viewport.width, viewport.height); - - glTexCoord2f(1-spost,1-spost); - glVertex2f(viewport.width,0); - - - spost += inc; - alpha = alpha - alphainc; - } - glEnd(); - */ - //attempt at porting - - GLfloat vertices[] = { - 0, 0, - 0, (GLfloat)viewport.height, - (GLfloat)viewport.width, (GLfloat)viewport.height, - (GLfloat)viewport.width, 0 - }; - - GLubyte indices[] = {0, 1, 2, 0, 2, 3}; - // GLubyte indices[] = {0, 1, 2, 3}; - - - - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - // glEnableClientState(GL_COLOR_ARRAY); - - for (num = 0; num < times; num++) { - glColor4f(1.0f, 1.0f, 1.0f, alpha); - GLfloat texCoords[] = { - 0+spost, 1-spost, - 0+spost, 0+spost, - 1-spost, 0+spost, - 1-spost, 1-spost - }; -/* - GLfloat colors[] = { - 1.0f, 1.0f, 1.0f, alpha, - 1.0f, 1.0f, 1.0f, alpha, - 1.0f, 1.0f, 1.0f, alpha, - 1.0f, 1.0f, 1.0f, alpha - };*/ - - glVertexPointer(2, GL_FLOAT, 0, vertices); - glTexCoordPointer(2, GL_FLOAT, 0, texCoords); - // glColorPointer(4, GL_FLOAT, 0, colors); - - // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - spost += inc; - alpha = alpha - alphainc; - } - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glBindTexture(GL_TEXTURE_2D,0); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); -} - - -void RasterizerGLES1::end_scene() { - - glEnable(GL_BLEND); - glDepthMask(GL_TRUE); - glEnable(GL_DEPTH_TEST); - glDisable(GL_SCISSOR_TEST); - depth_write=true; - depth_test=true; - - if (current_env) { - - switch(current_env->bg_mode) { - - case VS::ENV_BG_KEEP: { - //copy from framebuffer if framebuffer - glClear(GL_DEPTH_BUFFER_BIT); - } break; - case VS::ENV_BG_DEFAULT_COLOR: - case VS::ENV_BG_COLOR: { - //only in the runner - if(is_editor != true) { - Color bgcolor; - if (current_env->bg_mode==VS::ENV_BG_COLOR) - bgcolor = current_env->bg_param[VS::ENV_BG_PARAM_COLOR]; - else - bgcolor = Globals::get_singleton()->get("render/default_clear_color"); - // bgcolor = _convert_color(bgcolor); - float a = 1.0; - glClearColor(bgcolor.r,bgcolor.g,bgcolor.b,a); - glClearDepthf(1.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - } else { - glClear(GL_DEPTH_BUFFER_BIT); - } - } break; - case VS::ENV_BG_TEXTURE: - case VS::ENV_BG_CUBEMAP: - case VS::ENV_BG_TEXTURE_RGBE: - case VS::ENV_BG_CUBEMAP_RGBE: { - //a bit broken for now - - glClear(GL_DEPTH_BUFFER_BIT); - } break; - - } - } else { - - Color c = Color(0.3,0.3,0.3); - glClearColor(c.r,c.g,c.b,0.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - } -#ifdef GLES_OVER_GL - //glClearDepth(1.0); -#else - // glClearDepthf(1.0); -#endif - - // glClear(GL_DEPTH_BUFFER_BIT); - if(current_env->fx_enabled[VS::ENV_FX_FOG]) { - - Color col_begin = current_env->fx_param[VS::ENV_FX_PARAM_FOG_BEGIN_COLOR]; - Color col_end = current_env->fx_param[VS::ENV_FX_PARAM_FOG_END_COLOR]; - - GLfloat begin[4]={ - col_begin.r, - col_begin.g, - col_begin.b, - 1.0 - }; - GLfloat end[4]={ - col_end.r, - col_end.g, - col_end.b, - 1.0 - }; - glEnable(GL_FOG); - glFogf(GL_FOG_MODE,GL_LINEAR); - glFogf(GL_FOG_DENSITY, current_env->fx_param[VS::ENV_FX_PARAM_FOG_ATTENUATION]); - glFogf(GL_FOG_START,current_env->fx_param[VS::ENV_FX_PARAM_FOG_BEGIN]); - glFogf(GL_FOG_END, camera_z_far); - glFogfv(GL_FOG_COLOR, end); - glLightfv(GL_LIGHT5,GL_DIFFUSE, begin); - - // material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,true); - } - - - - for(int i=0;ifx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) { - glViewport(0,0,256,256); - - _render_list_forward(&opaque_render_list); - - glBindTexture(GL_TEXTURE_2D, BlurTexture); - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 256, 256, 0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - } - - _render_list_forward(&opaque_render_list); - - alpha_render_list.sort_z(); - glEnable(GL_BLEND); - - _render_list_forward(&alpha_render_list); - - glPopMatrix(); - // canvas_shader.set_conditional(CanvasShaderGLES2::DEBUG_ENCODED_32,false); - /* - canvas_begin(); - glDisable(GL_BLEND); - _set_glcoloro(Color(1,1,1), 1); - // canvas_shader.bind(); - - - List samplers; - sampled_light_owner.get_owned_list(&samplers); - - Size2 debug_size(128,128); - Size2 ofs; - - - for (List::Element *E=samplers.front();E;E=E->next()) { - - SampledLight *sl=sampled_light_owner.get(E->get()); - - _debug_draw_shadow(sl->texture, Rect2( ofs, debug_size )); - - ofs.x+=debug_size.x/2; - if ( (ofs.x+debug_size.x) > viewport.width ) { - - ofs.x=0; - ofs.y+=debug_size.y; - } - }*/ - -// material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,false); - if(current_env->fx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) - _process_blur(current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_TIMES], current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_ALPHA]); - - - - // _debug_shadows(); -} -void RasterizerGLES1::end_shadow_map() { -#if 0 - ERR_FAIL_COND(!shadow); - ERR_FAIL_INDEX(shadow_pass,shadow->shadow_buffers.size()); - - glDisable(GL_BLEND); - glDisable(GL_SCISSOR_TEST); - glEnable(GL_DEPTH_TEST); - glDepthMask(true); - - - ShadowBuffer *sb = shadow->shadow_buffers[shadow_pass]; - - ERR_FAIL_COND(!sb); - - glBindFramebuffer(GL_FRAMEBUFFER, sb->fbo); - glViewport(0, 0, sb->size, sb->size); - - glColorMask(0, 0, 0, 0); - - glEnable(GL_POLYGON_OFFSET_FILL); - //glPolygonOffset(4,8); - glPolygonOffset( 4.0f, 4096.0f); - glPolygonOffset( 8.0f, 16.0f); - - glClearDepth(1.0f); - glClear(GL_DEPTH_BUFFER_BIT); - CameraMatrix cm; - float z_near,z_far; - Transform light_transform; - - float dp_direction=0.0; - bool flip_facing=false; - - switch(shadow->base->type) { - - case VS::LIGHT_DIRECTIONAL: { - - cm = shadow->custom_projection; - light_transform=shadow->custom_transform; - z_near=cm.get_z_near(); - z_far=cm.get_z_far(); - - } break; - case VS::LIGHT_OMNI: { - - material_shader.set_conditional(MaterialShaderGLES1::USE_DUAL_PARABOLOID,true); - dp_direction = shadow_pass?1.0:0.0; - flip_facing = (shadow_pass == 1); - light_transform=shadow->transform; - z_near=0; - z_far=shadow->base->vars[ VS::LIGHT_VAR_RADIUS ]; - } break; - case VS::LIGHT_SPOT: { - - float far = shadow->base->vars[ VS::LIGHT_VAR_RADIUS ]; - ERR_FAIL_COND( far<=0 ); - float near= far/200.0; - if (near<0.05) - near=0.05; - - float angle = shadow->base->vars[ VS::LIGHT_VAR_SPOT_ANGLE ]; - - cm.set_perspective( angle*2.0, 1.0, near, far ); - shadow->projection=cm; // cache - light_transform=shadow->transform; - z_near=cm.get_z_near(); - z_far=cm.get_z_far(); - - } break; - } - - Transform light_transform_inverse = light_transform.inverse(); - - opaque_render_list.sort_mat(); - - glLightf(GL_LIGHT5,GL_LINEAR_ATTENUATION,z_near); - glLightf(GL_LIGHT5,GL_QUADRATIC_ATTENUATION,z_far); - glLightf(GL_LIGHT5,GL_CONSTANT_ATTENUATION,dp_direction); - - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(&cm.matrix[0][0]); - glMatrixMode(GL_MODELVIEW); - _gl_load_transform(light_transform_inverse); - glPushMatrix(); - - for(int i=0;i<4;i++) { - for(int j=0;j<3;j++) { - - material_shader.set_conditional(_gl_light_version[i][j],false); //start false by default - } - material_shader.set_conditional(_gl_light_shadow[i],false); - } - - _render_list_forward(&opaque_render_list,flip_facing); - - material_shader.set_conditional(MaterialShaderGLES1::USE_DUAL_PARABOLOID,false); - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - if (framebuffer.active) - glBindFramebufferEXT(GL_FRAMEBUFFER,framebuffer.fbo); - else - glBindFramebufferEXT(GL_FRAMEBUFFER,0); - - glDisable(GL_POLYGON_OFFSET_FILL); - - glColorMask(1, 1, 1, 1); - shadow=NULL; -#endif -} - -void RasterizerGLES1::_debug_draw_shadow(GLuint tex, const Rect2& p_rect) { - - -/* - Transform modelview; - modelview.translate(-(viewport.width / 2.0f), -(viewport.height / 2.0f), 0.0f); - modelview.scale( Vector3( 2.0f / viewport.width, -2.0f / viewport.height, 1.0f ) ); - modelview.translate(p_rect.pos.x, p_rect.pos.y, 0); - // material_shader.set_uniform_default(MaterialShaderGLES1::MODELVIEW_TRANSFORM, *e->transform); - _gl_load_transform(modelview); - glBindTexture(GL_TEXTURE_2D,p_buffer->depth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); - - Vector3 coords[4]= { - Vector3(p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y+p_rect.size.height, 0 ), - Vector3(p_rect.pos.x, - p_rect.pos.y+p_rect.size.height, 0 ) - }; - - Vector3 texcoords[4]={ - Vector3( 0.0f,0.0f, 0), - Vector3( 1.0f,0.0f, 0), - Vector3( 1.0f, 1.0f, 0), - Vector3( 0.0f, 1.0f, 0), - }; - - _draw_primitive(4,coords,0,0,texcoords); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);*/ - Matrix32 modelview; - modelview.translate(p_rect.pos.x, p_rect.pos.y); - // canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, modelview); - _gl_mult_transform(modelview); - glBindTexture(GL_TEXTURE_2D,tex); - - Vector3 coords[4]= { - Vector3(p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y+p_rect.size.height, 0 ), - Vector3(p_rect.pos.x, - p_rect.pos.y+p_rect.size.height, 0 ) - }; - - Vector3 texcoords[4]={ - Vector3( 0.0f,0.0f, 0), - Vector3( 1.0f,0.0f, 0), - Vector3( 1.0f, 1.0f, 0), - Vector3( 0.0f, 1.0f, 0), - }; - - _draw_primitive(4,coords,0,0,texcoords); - -} - -void RasterizerGLES1::_debug_draw_shadows_type(Vector& p_shadows,Point2& ofs) { - - -// Size2 debug_size(128,128); - Size2 debug_size(512,512); - - for (int i=0;iowner) - continue; - - if (sb->owner->base->type==VS::LIGHT_DIRECTIONAL) { - - if (sb->owner->shadow_pass!=scene_pass-1) - continue; - } else { - - if (sb->owner->shadow_pass!=frame) - continue; - } - // _debug_draw_shadow(sb, Rect2( ofs, debug_size )); - ofs.x+=debug_size.x; - if ( (ofs.x+debug_size.x) > viewport.width ) { - - ofs.x=0; - ofs.y+=debug_size.y; - } - } - -} - - -void RasterizerGLES1::_debug_shadows() { - - return; -#if 0 - canvas_begin(); - glUseProgram(0); - glDisable(GL_BLEND); - Size2 ofs; - - /* - for(int i=0;i<16;i++) { - glActiveTexture(GL_TEXTURE0+i); - //glDisable(GL_TEXTURE_2D); - } - glActiveTexture(GL_TEXTURE0); - //glEnable(GL_TEXTURE_2D); - */ - - - _debug_draw_shadows_type(near_shadow_buffers,ofs); - _debug_draw_shadows_type(far_shadow_buffers,ofs); -#endif -} - -void RasterizerGLES1::end_frame() { - - /* - if (framebuffer.active) { - - canvas_begin(); //resets stuff and goes back to fixedpipe - glBindFramebuffer(GL_FRAMEBUFFER,0); - - //copy to main bufferz - glEnable(GL_TEXTURE_2D); - - glBindTexture(GL_TEXTURE_2D,framebuffer.color); - glBegin(GL_QUADS); - glTexCoord2f(0,0); - glVertex2f(-1,-1); - glTexCoord2f(0,1); - glVertex2f(-1,+1); - glTexCoord2f(1,1); - glVertex2f(+1,+1); - glTexCoord2f(1,0); - glVertex2f(+1,-1); - glEnd(); - - - } - */ - - //print_line("VTX: "+itos(_rinfo.vertex_count)+" OBJ: "+itos(_rinfo.object_count)+" MAT: "+itos(_rinfo.mat_change_count)+" SHD: "+itos(_rinfo.shader_change_count)); - - OS::get_singleton()->swap_buffers(); -} - -/* CANVAS API */ - - -void RasterizerGLES1::reset_state() { - - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - glBindBuffer(GL_ARRAY_BUFFER,0); - - glActiveTexture(GL_TEXTURE0); - glClientActiveTexture(GL_TEXTURE0); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glColor4f(1,1,1,1); - - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); -// glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -// glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - canvas_blend=VS::MATERIAL_BLEND_MODE_MIX; - glLineWidth(1.0); - glDisable(GL_LIGHTING); - -} - - - - -void RasterizerGLES1::canvas_begin() { - - - reset_state(); - canvas_opacity=1.0; - glEnable(GL_BLEND); - - -} - -void RasterizerGLES1::canvas_disable_blending() { - - glDisable(GL_BLEND); -} - -void RasterizerGLES1::canvas_set_opacity(float p_opacity) { - - canvas_opacity = p_opacity; -} - -void RasterizerGLES1::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { - - switch(p_mode) { - - case VS::MATERIAL_BLEND_MODE_MIX: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - case VS::MATERIAL_BLEND_MODE_ADD: { - - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - - } break; - case VS::MATERIAL_BLEND_MODE_SUB: { - - //glBlendEquation(GL_FUNC_SUBTRACT); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - } break; - case VS::MATERIAL_BLEND_MODE_MUL: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - - } - -} - - -void RasterizerGLES1::canvas_begin_rect(const Matrix32& p_transform) { - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glScalef(2.0 / viewport.width, -2.0 / viewport.height, 0); - glTranslatef((-(viewport.width / 2.0)), (-(viewport.height / 2.0)), 0); - _gl_mult_transform(p_transform); - - glPushMatrix(); - -} - -void RasterizerGLES1::canvas_set_clip(bool p_clip, const Rect2& p_rect) { - - if (p_clip) { - - glEnable(GL_SCISSOR_TEST); - // glScissor(viewport.x+p_rect.pos.x,viewport.y+ (viewport.height-(p_rect.pos.y+p_rect.size.height)), - //p_rect.size.width,p_rect.size.height); - //glScissor(p_rect.pos.x,(viewport.height-(p_rect.pos.y+p_rect.size.height)),p_rect.size.width,p_rect.size.height); - glScissor(viewport.x+p_rect.pos.x,viewport.y+ (window_size.y-(p_rect.pos.y+p_rect.size.height)), - p_rect.size.width,p_rect.size.height); - } else { - - glDisable(GL_SCISSOR_TEST); - } - - -} - -void RasterizerGLES1::canvas_end_rect() { - - glPopMatrix(); -} - -void RasterizerGLES1::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { - - glDisable(GL_TEXTURE_2D); - _set_glcoloro( p_color,canvas_opacity ); - - Vector3 verts[2]={ - Vector3(p_from.x,p_from.y,0), - Vector3(p_to.x,p_to.y,0) - }; - Color colors[2]={ - p_color, - p_color - }; - colors[0].a*=canvas_opacity; - colors[1].a*=canvas_opacity; - glLineWidth(p_width); - _draw_primitive(2,verts,0,colors,0); - -} - -static void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { - - - Vector3 texcoords[4]= { - Vector3( p_src_region.pos.x/p_tex_size.width, - p_src_region.pos.y/p_tex_size.height, 0), - - Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, - p_src_region.pos.y/p_tex_size.height, 0), - - Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), - - Vector3( p_src_region.pos.x/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0) - }; - - - if (p_flip_h) { - SWAP( texcoords[0], texcoords[1] ); - SWAP( texcoords[2], texcoords[3] ); - } - if (p_flip_v) { - SWAP( texcoords[1], texcoords[2] ); - SWAP( texcoords[0], texcoords[3] ); - } - - Vector3 coords[4]= { - Vector3( p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0 ), - Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) - }; - - _draw_primitive(4,coords,0,0,texcoords); -} - -static void _draw_quad(const Rect2& p_rect) { - - Vector3 coords[4]= { - Vector3( p_rect.pos.x,p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y+p_rect.size.height, 0 ), - Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) - }; - - _draw_primitive(4,coords,0,0,0); - -} - - -void RasterizerGLES1::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { - - _set_glcoloro( p_modulate,canvas_opacity ); - - if ( p_texture.is_valid() ) { - - glEnable(GL_TEXTURE_2D); - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - - if (!(p_flags&CANVAS_RECT_REGION)) { - - Rect2 region = Rect2(0,0,texture->width,texture->height); - _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); - - } else { - - - _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); - - } - } else { - - glDisable(GL_TEXTURE_2D); - _draw_quad( p_rect ); - - } - - -} -void RasterizerGLES1::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { - - _set_glcoloro( p_modulate,canvas_opacity ); - - - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - - glEnable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - - - /* CORNERS */ - - _draw_textured_quad( // top left - Rect2( p_rect.pos, Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), - Rect2( Point2(), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // top right - Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), - Rect2( Point2(texture->width-p_margin[MARGIN_RIGHT],0), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), - Size2( texture->width, texture->height ) ); - - - _draw_textured_quad( // bottom left - Rect2( Point2(p_rect.pos.x,p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), - Rect2( Point2(0,texture->height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // bottom right - Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), - Rect2( Point2(texture->width-p_margin[MARGIN_RIGHT],texture->height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), - Size2( texture->width, texture->height ) ); - - Rect2 rect_center( p_rect.pos+Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( p_rect.size.width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], p_rect.size.height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); - - Rect2 src_center( Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( texture->width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], texture->height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); - - - _draw_textured_quad( // top - Rect2( Point2(rect_center.pos.x,p_rect.pos.y),Size2(rect_center.size.width,p_margin[MARGIN_TOP])), - Rect2( Point2(p_margin[MARGIN_LEFT],0), Size2(src_center.size.width,p_margin[MARGIN_TOP])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // bottom - Rect2( Point2(rect_center.pos.x,rect_center.pos.y+rect_center.size.height),Size2(rect_center.size.width,p_margin[MARGIN_BOTTOM])), - Rect2( Point2(p_margin[MARGIN_LEFT],src_center.pos.y+src_center.size.height), Size2(src_center.size.width,p_margin[MARGIN_BOTTOM])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // left - Rect2( Point2(p_rect.pos.x,rect_center.pos.y),Size2(p_margin[MARGIN_LEFT],rect_center.size.height)), - Rect2( Point2(0,p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_LEFT],src_center.size.height)), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // right - Rect2( Point2(rect_center.pos.x+rect_center.size.width,rect_center.pos.y),Size2(p_margin[MARGIN_RIGHT],rect_center.size.height)), - Rect2( Point2(src_center.pos.x+src_center.size.width,p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_RIGHT],src_center.size.height)), - Size2( texture->width, texture->height ) ); - - if (p_draw_center) { - - _draw_textured_quad( - rect_center, - src_center, - Size2( texture->width, texture->height )); - } - -} -void RasterizerGLES1::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { - - ERR_FAIL_COND(p_points.size()<1); - Vector3 verts[4]; - Vector3 uvs[4]; - - _set_glcoloro( Color(1,1,1),canvas_opacity ); - - for(int i=0;itex_id ); - } - } - - glLineWidth(p_width); - _draw_primitive(p_points.size(),&verts[0],NULL,p_colors.size()?&p_colors[0]:NULL,p_uvs.size()?uvs:NULL); - -} - -static const int _max_draw_poly_indices = 8*1024; -static uint16_t _draw_poly_indices[_max_draw_poly_indices]; -static float _verts3[_max_draw_poly_indices]; - -void RasterizerGLES1::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { - - bool do_colors=false; - - //reset_state(); - if (p_singlecolor) { - Color m = *p_colors; - m.a*=canvas_opacity; - glColor4f(m.r, m.g, m.b, m.a); - } else if (!p_colors) { - glColor4f(1, 1, 1, canvas_opacity); - } else - do_colors=true; - - glColor4f(1, 1, 1, 1); - - Texture* texture = NULL; - if (p_texture.is_valid()) { - glEnable(GL_TEXTURE_2D); - texture = texture_owner.get( p_texture ); - if (texture) { - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(2, GL_FLOAT, 0, (GLvoid*)p_vertices); - if (do_colors) { - - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4,GL_FLOAT, 0, p_colors); - - } else { - glDisableClientState(GL_COLOR_ARRAY); - } - - if (texture && p_uvs) { - - glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, p_uvs); - - } else { - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - - if (p_indices) { - - for (int i=0; i *p_effects) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - p_effects->clear(); - p_effects->push_back("bgcolor"); - p_effects->push_back("skybox"); - p_effects->push_back("antialias"); - //p_effects->push_back("hdr"); - p_effects->push_back("glow"); // glow has a bloom parameter, too - p_effects->push_back("ssao"); - p_effects->push_back("fog"); - p_effects->push_back("dof_blur"); - p_effects->push_back("toon"); - p_effects->push_back("edge"); - -} -void RasterizerGLES1::fx_set_active(RID p_fx,const String& p_effect, bool p_active) { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - if (p_effect=="bgcolor") - fx->bgcolor_active=p_active; - else if (p_effect=="skybox") - fx->skybox_active=p_active; - else if (p_effect=="antialias") - fx->antialias_active=p_active; - else if (p_effect=="glow") - fx->glow_active=p_active; - else if (p_effect=="ssao") - fx->ssao_active=p_active; - else if (p_effect=="fog") - fx->fog_active=p_active; -// else if (p_effect=="dof_blur") -// fx->dof_blur_active=p_active; - else if (p_effect=="toon") - fx->toon_active=p_active; - else if (p_effect=="edge") - fx->edge_active=p_active; -} -bool RasterizerGLES1::fx_is_active(RID p_fx,const String& p_effect) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND_V(!fx,false); - - if (p_effect=="bgcolor") - return fx->bgcolor_active; - else if (p_effect=="skybox") - return fx->skybox_active; - else if (p_effect=="antialias") - return fx->antialias_active; - else if (p_effect=="glow") - return fx->glow_active; - else if (p_effect=="ssao") - return fx->ssao_active; - else if (p_effect=="fog") - return fx->fog_active; - //else if (p_effect=="dof_blur") - // return fx->dof_blur_active; - else if (p_effect=="toon") - return fx->toon_active; - else if (p_effect=="edge") - return fx->edge_active; - - return false; -} -void RasterizerGLES1::fx_get_effect_params(RID p_fx,const String& p_effect,List *p_params) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - - if (p_effect=="bgcolor") { - - p_params->push_back( PropertyInfo( Variant::COLOR, "color" ) ); - } else if (p_effect=="skybox") { - p_params->push_back( PropertyInfo( Variant::_RID, "cubemap" ) ); - } else if (p_effect=="antialias") { - - p_params->push_back( PropertyInfo( Variant::REAL, "tolerance", PROPERTY_HINT_RANGE,"1,128,1" ) ); - - } else if (p_effect=="glow") { - - p_params->push_back( PropertyInfo( Variant::INT, "passes", PROPERTY_HINT_RANGE,"1,4,1" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.01,8.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "bloom", PROPERTY_HINT_RANGE,"-1.0,1.0,0.01" ) ); - - } else if (p_effect=="ssao") { - - p_params->push_back( PropertyInfo( Variant::REAL, "radius", PROPERTY_HINT_RANGE,"0.0,16.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "max_distance", PROPERTY_HINT_RANGE,"0.0,256.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "range_max", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "range_min", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.0,8.0,0.01" ) ); - - } else if (p_effect=="fog") { - - p_params->push_back( PropertyInfo( Variant::REAL, "begin", PROPERTY_HINT_RANGE,"0.0,8192,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "end", PROPERTY_HINT_RANGE,"0.0,8192,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.0,8.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::COLOR, "color_begin" ) ); - p_params->push_back( PropertyInfo( Variant::COLOR, "color_end" ) ); - p_params->push_back( PropertyInfo( Variant::BOOL, "fog_bg" ) ); - -// } else if (p_effect=="dof_blur") { -// return fx->dof_blur_active; - } else if (p_effect=="toon") { - p_params->push_back( PropertyInfo( Variant::REAL, "treshold", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "soft", PROPERTY_HINT_RANGE,"0.001,1.0,0.001" ) ); - } else if (p_effect=="edge") { - - } -} -Variant RasterizerGLES1::fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND_V(!fx,Variant()); - - if (p_effect=="bgcolor") { - - if (p_param=="color") - return fx->bgcolor; - } else if (p_effect=="skybox") { - if (p_param=="cubemap") - return fx->skybox_cubemap; - } else if (p_effect=="antialias") { - - if (p_param=="tolerance") - return fx->antialias_tolerance; - - } else if (p_effect=="glow") { - - if (p_param=="passes") - return fx->glow_passes; - if (p_param=="attenuation") - return fx->glow_attenuation; - if (p_param=="bloom") - return fx->glow_bloom; - - } else if (p_effect=="ssao") { - - if (p_param=="attenuation") - return fx->ssao_attenuation; - if (p_param=="max_distance") - return fx->ssao_max_distance; - if (p_param=="range_max") - return fx->ssao_range_max; - if (p_param=="range_min") - return fx->ssao_range_min; - if (p_param=="radius") - return fx->ssao_radius; - - } else if (p_effect=="fog") { - - if (p_param=="begin") - return fx->fog_near; - if (p_param=="end") - return fx->fog_far; - if (p_param=="attenuation") - return fx->fog_attenuation; - if (p_param=="color_begin") - return fx->fog_color_near; - if (p_param=="color_end") - return fx->fog_color_far; - if (p_param=="fog_bg") - return fx->fog_bg; -// } else if (p_effect=="dof_blur") { -// return fx->dof_blur_active; - } else if (p_effect=="toon") { - if (p_param=="treshold") - return fx->toon_treshold; - if (p_param=="soft") - return fx->toon_soft; - - } else if (p_effect=="edge") { - - } - return Variant(); -} -void RasterizerGLES1::fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_value) { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - if (p_effect=="bgcolor") { - - if (p_param=="color") - fx->bgcolor=p_value; - } else if (p_effect=="skybox") { - if (p_param=="cubemap") - fx->skybox_cubemap=p_value; - - } else if (p_effect=="antialias") { - - if (p_param=="tolerance") - fx->antialias_tolerance=p_value; - - } else if (p_effect=="glow") { - - if (p_param=="passes") - fx->glow_passes=p_value; - if (p_param=="attenuation") - fx->glow_attenuation=p_value; - if (p_param=="bloom") - fx->glow_bloom=p_value; - - } else if (p_effect=="ssao") { - - if (p_param=="attenuation") - fx->ssao_attenuation=p_value; - if (p_param=="radius") - fx->ssao_radius=p_value; - if (p_param=="max_distance") - fx->ssao_max_distance=p_value; - if (p_param=="range_max") - fx->ssao_range_max=p_value; - if (p_param=="range_min") - fx->ssao_range_min=p_value; - - } else if (p_effect=="fog") { - - if (p_param=="begin") - fx->fog_near=p_value; - if (p_param=="end") - fx->fog_far=p_value; - if (p_param=="attenuation") - fx->fog_attenuation=p_value; - if (p_param=="color_begin") - fx->fog_color_near=p_value; - if (p_param=="color_end") - fx->fog_color_far=p_value; - if (p_param=="fog_bg") - fx->fog_bg=p_value; -// } else if (p_effect=="dof_blur") { -// fx->dof_blur_active=p_value; - } else if (p_effect=="toon") { - - if (p_param=="treshold") - fx->toon_treshold=p_value; - if (p_param=="soft") - fx->toon_soft=p_value; - - } else if (p_effect=="edge") { - - } - -} - -/* ENVIRONMENT */ - -RID RasterizerGLES1::environment_create() { - - Environment * env = memnew( Environment ); - return environment_owner.make_rid(env); -} - -void RasterizerGLES1::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { - - ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->bg_mode=p_bg; -} - -VS::EnvironmentBG RasterizerGLES1::environment_get_background(RID p_env) const{ - - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX); - return env->bg_mode; -} - -void RasterizerGLES1::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){ - - ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->bg_param[p_param]=p_value; - -} - -void RasterizerGLES1::environment_set_group(RID p_env,VS::Group p_param, const Variant& p_value){ - - ERR_FAIL_INDEX(p_param,VS::ENV_GROUP_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->group[p_param]=p_value; - -} -Variant RasterizerGLES1::environment_get_group(RID p_env,VS::Group p_param) const{ - - ERR_FAIL_INDEX_V(p_param,VS::ENV_GROUP_MAX,Variant()); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,Variant()); - return env->group[p_param]; - -} - -Variant RasterizerGLES1::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{ - - ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant()); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,Variant()); - return env->bg_param[p_param]; - -} - -void RasterizerGLES1::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ - - ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->fx_enabled[p_effect]=p_enabled; -} -bool RasterizerGLES1::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{ - - ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,false); - return env->fx_enabled[p_effect]; - -} - -void RasterizerGLES1::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){ - - ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->fx_param[p_param]=p_value; -} -Variant RasterizerGLES1::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{ - - ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant()); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,Variant()); - return env->fx_param[p_param]; - -} - -/* SAMPLED LIGHT */ - -RID RasterizerGLES1::sampled_light_dp_create(int p_width,int p_height) { - - SampledLight *slight = memnew(SampledLight); - slight->w=p_width; - slight->h=p_height; - slight->multiplier=1.0; - slight->is_float=false; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1,&slight->texture); - glBindTexture(GL_TEXTURE_2D, slight->texture); -// for debug, but glitchy -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - // Remove artifact on the edges of the shadowmap - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - - if (slight->is_float) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_width, p_height, 0, GL_RGBA, GL_FLOAT,NULL); - } else { - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_width, p_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - - } - - return sampled_light_owner.make_rid(slight); -}/* -#include "io/resource_saver.h" -#include "scene/resources/texture.h"*/ -void RasterizerGLES1::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) { - - SampledLight *slight = sampled_light_owner.get(p_sampled_light); - ERR_FAIL_COND(!slight); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, slight->texture); - - if (slight->is_float) { - - - glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,slight->w, slight->h, GL_RGBA, GL_FLOAT,p_data); - - - } else { - //convert to bytes - uint8_t *tex8 = (uint8_t*)alloca(slight->w*slight->h*4); - // DVector tex; - const float* src=(const float*)p_data; - - for(int i=0;iw*slight->h*4;i++) { - - tex8[i]=Math::fast_ftoi(CLAMP(src[i]*255.0,0.0,255.0)); - // tex.push_back(Math::fast_ftoi(CLAMP(src[i]*255.0,0.0,255.0))); - } - /* - Image img(slight->w,slight->h,0,Image::FORMAT_RGBA,tex); - Ref it = memnew( ImageTexture ); - it->create_from_image(img); - ResourceSaver::save("baked.png",it);*/ - glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,slight->w, slight->h, GL_RGBA, GL_UNSIGNED_BYTE,p_data); - } - - slight->multiplier=p_multiplier; - -} - -/*MISC*/ - -bool RasterizerGLES1::is_texture(const RID& p_rid) const { - - return texture_owner.owns(p_rid); -} -bool RasterizerGLES1::is_material(const RID& p_rid) const { - - return material_owner.owns(p_rid); -} -bool RasterizerGLES1::is_mesh(const RID& p_rid) const { - - return mesh_owner.owns(p_rid); -} - -bool RasterizerGLES1::is_immediate(const RID& p_rid) const { - - return immediate_owner.owns(p_rid); -} - -bool RasterizerGLES1::is_multimesh(const RID& p_rid) const { - - return multimesh_owner.owns(p_rid); -} -bool RasterizerGLES1::is_particles(const RID &p_beam) const { - - return particles_owner.owns(p_beam); -} - -bool RasterizerGLES1::is_light(const RID& p_rid) const { - - return light_owner.owns(p_rid); -} -bool RasterizerGLES1::is_light_instance(const RID& p_rid) const { - - return light_instance_owner.owns(p_rid); -} -bool RasterizerGLES1::is_particles_instance(const RID& p_rid) const { - - return particles_instance_owner.owns(p_rid); -} -bool RasterizerGLES1::is_skeleton(const RID& p_rid) const { - - return skeleton_owner.owns(p_rid); -} -bool RasterizerGLES1::is_environment(const RID& p_rid) const { - - return environment_owner.owns(p_rid); -} -bool RasterizerGLES1::is_fx(const RID& p_rid) const { - - return fx_owner.owns(p_rid); -} -bool RasterizerGLES1::is_shader(const RID& p_rid) const { - - return false; -} - -void RasterizerGLES1::free(const RID& p_rid) { - - if (texture_owner.owns(p_rid)) { - - // delete the texture - Texture *texture = texture_owner.get(p_rid); - - glDeleteTextures( 1,&texture->tex_id ); - _rinfo.texture_mem-=texture->total_data_size; - texture_owner.free(p_rid); - memdelete(texture); - - } else if (shader_owner.owns(p_rid)) { - - // delete the texture - Shader *shader = shader_owner.get(p_rid); - - - - shader_owner.free(p_rid); - memdelete(shader); - - } else if (material_owner.owns(p_rid)) { - - Material *material = material_owner.get( p_rid ); - ERR_FAIL_COND(!material); - - material_owner.free(p_rid); - memdelete(material); - - } else if (mesh_owner.owns(p_rid)) { - - Mesh *mesh = mesh_owner.get(p_rid); - ERR_FAIL_COND(!mesh); - for (int i=0;isurfaces.size();i++) { - - Surface *surface = mesh->surfaces[i]; - if (surface->array_local != 0) { - memfree(surface->array_local); - }; - if (surface->index_array_local != 0) { - memfree(surface->index_array_local); - }; - - if (mesh->morph_target_count>0) { - - for(int i=0;imorph_target_count;i++) { - - memfree(surface->morph_targets_local[i].array); - } - memfree(surface->morph_targets_local); - surface->morph_targets_local=NULL; - } - - if (surface->vertex_id) - glDeleteBuffers(1,&surface->vertex_id); - if (surface->index_id) - glDeleteBuffers(1,&surface->index_id); - - memdelete( surface ); - }; - - mesh->surfaces.clear(); - - mesh_owner.free(p_rid); - memdelete(mesh); - - } else if (multimesh_owner.owns(p_rid)) { - - MultiMesh *multimesh = multimesh_owner.get(p_rid); - ERR_FAIL_COND(!multimesh); - - multimesh_owner.free(p_rid); - memdelete(multimesh); - - } else if (particles_owner.owns(p_rid)) { - - Particles *particles = particles_owner.get(p_rid); - ERR_FAIL_COND(!particles); - - particles_owner.free(p_rid); - memdelete(particles); - } else if (immediate_owner.owns(p_rid)) { - - Immediate *immediate = immediate_owner.get(p_rid); - ERR_FAIL_COND(!immediate); - - immediate_owner.free(p_rid); - memdelete(immediate); - } else if (particles_instance_owner.owns(p_rid)) { - - ParticlesInstance *particles_isntance = particles_instance_owner.get(p_rid); - ERR_FAIL_COND(!particles_isntance); - - particles_instance_owner.free(p_rid); - memdelete(particles_isntance); - - } else if (skeleton_owner.owns(p_rid)) { - - Skeleton *skeleton = skeleton_owner.get( p_rid ); - ERR_FAIL_COND(!skeleton) - - skeleton_owner.free(p_rid); - memdelete(skeleton); - - } else if (light_owner.owns(p_rid)) { - - Light *light = light_owner.get( p_rid ); - ERR_FAIL_COND(!light) - - light_owner.free(p_rid); - memdelete(light); - - } else if (light_instance_owner.owns(p_rid)) { - - LightInstance *light_instance = light_instance_owner.get( p_rid ); - ERR_FAIL_COND(!light_instance); - light_instance->clear_shadow_buffers(); - light_instance_owner.free(p_rid); - memdelete( light_instance ); - - } else if (fx_owner.owns(p_rid)) { - - FX *fx = fx_owner.get( p_rid ); - ERR_FAIL_COND(!fx); - - fx_owner.free(p_rid); - memdelete( fx ); - - } else if (environment_owner.owns(p_rid)) { - - Environment *env = environment_owner.get( p_rid ); - ERR_FAIL_COND(!env); - - environment_owner.free(p_rid); - memdelete( env ); - } else if (sampled_light_owner.owns(p_rid)) { - - SampledLight *sampled_light = sampled_light_owner.get( p_rid ); - ERR_FAIL_COND(!sampled_light); - - sampled_light_owner.free(p_rid); - memdelete( sampled_light ); - }; -} - - -void RasterizerGLES1::custom_shade_model_set_shader(int p_model, RID p_shader) { - - -}; - -RID RasterizerGLES1::custom_shade_model_get_shader(int p_model) const { - - return RID(); -}; - -void RasterizerGLES1::custom_shade_model_set_name(int p_model, const String& p_name) { - -}; - -String RasterizerGLES1::custom_shade_model_get_name(int p_model) const { - - return String(); -}; - -void RasterizerGLES1::custom_shade_model_set_param_info(int p_model, const List& p_info) { - -}; - -void RasterizerGLES1::custom_shade_model_get_param_info(int p_model, List* p_info) const { - -}; - - -void RasterizerGLES1::ShadowBuffer::init(int p_size) { - - -#if 0 - size=p_size; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &depth); - ERR_FAIL_COND(depth==0); - - /* Setup Depth Texture */ - glBindTexture(GL_TEXTURE_2D, depth); - glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, p_size, p_size, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - float border_color[]={1.0f, 1.0f, 1.0f, 1.0f}; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); - - /* Create FBO */ - glGenFramebuffers(1, &fbo); - - ERR_FAIL_COND( fbo==0 ); - - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0); - glDrawBuffer(GL_FALSE); - glReadBuffer(GL_FALSE); - - /* Check FBO creation */ - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); - - ERR_FAIL_COND( status==GL_FRAMEBUFFER_UNSUPPORTED ); - - glBindFramebufferEXT(GL_FRAMEBUFFER, 0); -#endif - -} - -void RasterizerGLES1::_init_shadow_buffers() { - - int near_shadow_size=GLOBAL_DEF("rasterizer/near_shadow_size",512); - int far_shadow_size=GLOBAL_DEF("rasterizer/far_shadow_size",64); - - near_shadow_buffers.resize( GLOBAL_DEF("rasterizer/near_shadow_count",4) ); - far_shadow_buffers.resize( GLOBAL_DEF("rasterizer/far_shadow_count",16) ); - - shadow_near_far_split_size_ratio = GLOBAL_DEF("rasterizer/shadow_near_far_split_size_ratio",0.3); - - for (int i=0;imake_current(); - - - - Set extensions; - Vector strings = String((const char*)glGetString( GL_EXTENSIONS )).split(" ",false); - for(int i=0;i textures; - texture_owner.get_owned_list(&textures); - keep_copies=false; - for(List::Element *E=textures.front();E;E=E->next()) { - - RID tid = E->get(); - Texture *t=texture_owner.get(tid); - ERR_CONTINUE(!t); - t->tex_id=0; - t->data_size=0; - glGenTextures(1, &t->tex_id); - t->active=false; - texture_allocate(tid,t->width,t->height,t->format,t->flags); - bool had_image=false; - for(int i=0;i<6;i++) { - if (!t->image[i].empty()) { - texture_set_data(tid,t->image[i],VS::CubeMapSide(i)); - had_image=true; - } - } - - if (!had_image && t->reloader) { - Object *rl = ObjectDB::get_instance(t->reloader); - if (rl) - rl->call(t->reloader_func,tid); - } - } - - keep_copies=true; - - -} - -bool RasterizerGLES1::has_feature(VS::Features p_feature) const { - - switch( p_feature) { - case VS::FEATURE_SHADERS: return false; - case VS::FEATURE_NEEDS_RELOAD_HOOK: return use_reload_hooks; - default: return false; - - } - -} - - -RasterizerGLES1::RasterizerGLES1(bool p_keep_copies,bool p_use_reload_hooks) { - skinned_buffer = NULL; - - keep_copies=p_keep_copies; - pack_arrays=false; - use_reload_hooks=p_use_reload_hooks; - - frame = 0; -}; - -RasterizerGLES1::~RasterizerGLES1() { - -}; - - -#endif diff --git a/platform/vita/rasterizer_vita.h b/platform/vita/rasterizer_vita.h deleted file mode 100644 index 9fdcae74..00000000 --- a/platform/vita/rasterizer_vita.h +++ /dev/null @@ -1,1300 +0,0 @@ -/*************************************************************************/ -/* rasterizer_gles1.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef RASTERIZER_GLES1_H -#define RASTERIZER_GLES1_H - -#include "servers/visual/rasterizer.h" - -#ifdef __psp2__ - -#include "image.h" -#include "rid.h" -#include "servers/visual_server.h" -#include "list.h" -#include "map.h" -#include "camera_matrix.h" -#include "sort.h" -// #include "tools/editor/scene_tree_editor.h" -#include "platform_config.h" -#ifndef GLES1_INCLUDE_H -#include -// #include "immvertex.h" -#else -#include GLES1_INCLUDE_H -#endif - - -#include "servers/visual/particle_system_sw.h" - -/** - @author Juan Linietsky -*/ -class RasterizerGLES1 : public Rasterizer { - - enum { - - MAX_SCENE_LIGHTS=2048, - LIGHT_SPOT_BIT=0x80, - DEFAULT_SKINNED_BUFFER_SIZE = 1024 * 1024, // 10k vertices - MAX_HW_LIGHTS = 8, //yay! pvrpsp2 supports 8 hw lights - }; - #ifdef PSP - void glActiveTexture(int a1) { }; - void glClientActiveTexture(int a1) { }; - #endif - - GLuint BlurTexture; - - uint8_t *skinned_buffer; - int skinned_buffer_size; - bool pvr_supported; - bool s3tc_supported; - bool etc_supported; - bool npo2_textures_available; - bool pack_arrays; - bool use_reload_hooks; - bool is_editor; - - - Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); - - - struct Texture { - - uint32_t flags; - int width,height; - int alloc_width, alloc_height; - Image::Format format; - - GLenum target; - GLenum gl_format_cache; - int gl_components_cache; - int data_size; //original data size, useful for retrieving back - bool format_has_alpha; - bool compressed; - bool disallow_mipmaps; - int total_data_size; - - Image image[6]; - - bool active; - GLuint tex_id; - - ObjectID reloader; - StringName reloader_func; - - Texture() { - - flags=width=height=0; - tex_id=0; - data_size=0; - format=Image::FORMAT_GRAYSCALE; - gl_components_cache=0; - format_has_alpha=false; - active=false; - disallow_mipmaps=false; -// gen_mipmap=true; - compressed=false; - total_data_size=0; - } - - ~Texture() { - - if (tex_id!=0) { - - glDeleteTextures(1,&tex_id); - } - } - }; - - mutable RID_Owner texture_owner; - - struct Shader { - - String vertex_code; - String fragment_code; - String light_code; - VS::ShaderMode mode; - Map params; - int fragment_line; - int vertex_line; - int light_line; - bool valid; - bool has_alpha; - bool use_world_transform; - - }; - - mutable RID_Owner shader_owner; - - - struct Material { - - bool fixed_flags[VS::FIXED_MATERIAL_FLAG_MAX]; - bool flags[VS::MATERIAL_FLAG_MAX]; - Variant parameters[VisualServer::FIXED_MATERIAL_PARAM_MAX]; - RID textures[VisualServer::FIXED_MATERIAL_PARAM_MAX]; - - VS::MaterialDepthDrawMode depth_draw_mode; - - Transform uv_transform; - VS::FixedMaterialTexCoordMode texcoord_mode[VisualServer::FIXED_MATERIAL_PARAM_MAX]; - - VS::MaterialBlendMode blend_mode; - - float line_width; - float point_size; - bool has_alpha; - - RID shader; // shader material - uint64_t last_pass; - - Map shader_params; - - - Material() { - - - for(int i=0;i material_owner; - - void _material_check_alpha(Material *p_material); - - - struct Geometry { - - enum Type { - GEOMETRY_INVALID, - GEOMETRY_SURFACE, - GEOMETRY_POLY, - GEOMETRY_PARTICLES, - GEOMETRY_MULTISURFACE, - }; - - Type type; - RID material; - bool has_alpha; - bool material_owned; - - Geometry() { has_alpha=false; material_owned = false; } - virtual ~Geometry() {}; - }; - - struct GeometryOwner { - - virtual ~GeometryOwner() {} - }; - - class Mesh; - - struct Surface : public Geometry { - - struct ArrayData { - - uint32_t ofs,size,datatype,count; - bool normalize; - bool bind; - - ArrayData() { ofs=0; size=0; count=0; datatype=0; normalize=0; bind=false;} - }; - - Mesh *mesh; - - Array data; - Array morph_data; - ArrayData array[VS::ARRAY_MAX]; - // support for vertex array objects - GLuint array_object_id; - // support for vertex buffer object - GLuint vertex_id; // 0 means, unconfigured - GLuint index_id; // 0 means, unconfigured - // no support for the above, array in localmem. - uint8_t *array_local; - uint8_t *index_array_local; - - bool packed; - - struct MorphTarget { - uint32_t configured_format; - uint8_t *array; - }; - - MorphTarget* morph_targets_local; - int morph_target_count; - AABB aabb; - - int array_len; - int index_array_len; - int max_bone; - - float vertex_scale; - float uv_scale; - float uv2_scale; - - VS::PrimitiveType primitive; - - uint32_t format; - uint32_t configured_format; - - int stride; - int local_stride; - uint32_t morph_format; - - bool active; - - Point2 uv_min; - Point2 uv_max; - - Surface() { - - - array_len=0; - local_stride=0; - morph_format=0; - type=GEOMETRY_SURFACE; - primitive=VS::PRIMITIVE_POINTS; - index_array_len=0; - vertex_scale=1.0; - uv_scale=1.0; - uv2_scale=1.0; - - format=0; - stride=0; - morph_targets_local=0; - morph_target_count=0; - - array_local = index_array_local = 0; - vertex_id = index_id = 0; - - active=false; - packed=false; - } - - ~Surface() { - - } - }; - - - struct Mesh { - - bool active; - Vector surfaces; - int morph_target_count; - VS::MorphTargetMode morph_target_mode; - AABB custom_aabb; - - mutable uint64_t last_pass; - Mesh() { - morph_target_mode=VS::MORPH_MODE_NORMALIZED; - morph_target_count=0; - last_pass=0; - active=false; - } - }; - mutable RID_Owner mesh_owner; - - Error _surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main); - - struct MultiMesh; - - struct MultiMeshSurface : public Geometry { - - Surface *surface; - MultiMeshSurface() { type=GEOMETRY_MULTISURFACE; } - }; - - struct MultiMesh : public GeometryOwner { - - struct Element { - - float matrix[16]; - uint8_t color[4]; - Element() { - matrix[0]=1; - matrix[1]=0; - matrix[2]=0; - matrix[3]=0; - - matrix[4]=0; - matrix[5]=1; - matrix[6]=0; - matrix[7]=0; - - matrix[8]=0; - matrix[9]=0; - matrix[10]=1; - matrix[11]=0; - - matrix[12]=0; - matrix[13]=0; - matrix[14]=0; - matrix[15]=1; - }; - - - }; - - AABB aabb; - RID mesh; - int visible; - - //IDirect3DVertexBuffer9* instance_buffer; - Vector elements; - Vector cache_surfaces; - mutable uint64_t last_pass; - GLuint tex_id; - int tw; - int th; - - SelfList dirty_list; - - MultiMesh() : dirty_list(this) { - - tw=1; - th=1; - tex_id=0; - last_pass=0; - visible = -1; - } - }; - - mutable RID_Owner multimesh_owner; - mutable SelfList::List _multimesh_dirty_list; - - struct Immediate { - - RID material; - int empty; - }; - - mutable RID_Owner immediate_owner; - - struct Particles : public Geometry { - - ParticleSystemSW data; // software particle system - - Particles() { - type=GEOMETRY_PARTICLES; - - } - }; - - mutable RID_Owner particles_owner; - - struct ParticlesInstance : public GeometryOwner { - - RID particles; - - ParticleSystemProcessSW particles_process; - Transform transform; - - ParticlesInstance() { } - }; - - mutable RID_Owner particles_instance_owner; - ParticleSystemDrawInfoSW particle_draw_info; - - struct Skeleton { - - Vector bones; - - }; - - mutable RID_Owner skeleton_owner; - - - struct Light { - - VS::LightType type; - float vars[VS::LIGHT_PARAM_MAX]; - Color colors[3]; - bool shadow_enabled; - RID projector; - bool volumetric_enabled; - Color volumetric_color; - - - Light() { - - vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1; - vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45; - vars[VS::LIGHT_PARAM_ATTENUATION]=1.0; - vars[VS::LIGHT_PARAM_ENERGY]=1.0; - vars[VS::LIGHT_PARAM_RADIUS]=1.0; - vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.05; - - colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1); - colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1); - shadow_enabled=false; - volumetric_enabled=false; - } - }; - - - struct Environment { - - - VS::EnvironmentBG bg_mode; - Variant bg_param[VS::ENV_BG_PARAM_MAX]; - bool fx_enabled[VS::ENV_FX_MAX]; - Variant fx_param[VS::ENV_FX_PARAM_MAX]; - Variant group[VS::ENV_GROUP_MAX]; - - Environment() { - - bg_mode=VS::ENV_BG_DEFAULT_COLOR; - bg_param[VS::ENV_BG_PARAM_COLOR]=Color(0,0,0); - bg_param[VS::ENV_BG_PARAM_TEXTURE]=RID(); - bg_param[VS::ENV_BG_PARAM_CUBEMAP]=RID(); - bg_param[VS::ENV_BG_PARAM_ENERGY]=1.0; - - for(int i=0;i environment_owner; - Environment *current_env; - - struct SampledLight { - - int w,h; - GLuint texture; - float multiplier; - bool is_float; - }; - - mutable RID_Owner sampled_light_owner; - - struct ShadowBuffer; - - struct LightInstance { - - struct SplitInfo { - - CameraMatrix camera; - Transform transform; - float near; - float far; - }; - - RID light; - Light *base; - Transform transform; - CameraMatrix projection; - - Transform custom_transform; - CameraMatrix custom_projection; - - Vector3 light_vector; - Vector3 spot_vector; - float linear_att; - - uint64_t shadow_pass; - uint64_t last_pass; - uint16_t sort_key; - - Vector shadow_buffers; - - void clear_shadow_buffers() { - - for (int i=0;iowner != this ); - - sb->owner=NULL; - } - - shadow_buffers.clear(); - } - - LightInstance() { shadow_pass=0; last_pass=0; sort_key=0; } - - }; - mutable RID_Owner light_owner; - mutable RID_Owner light_instance_owner; - - LightInstance *light_instances[MAX_SCENE_LIGHTS]; - LightInstance *directional_lights[4]; -// LightInstance *directional_light_instances[MAX_SCENE_LIGHTS]; - int light_instance_count; - int directional_light_count; - int last_light_id; - - - struct RenderList { - - enum { - MAX_ELEMENTS=4096, - MAX_LIGHTS=8192 - }; - - struct Element { - - - float depth; - const InstanceData *instance; - const Skeleton *skeleton; - union { - uint16_t lights[MAX_HW_LIGHTS]; - uint64_t light_key; - }; - - const Geometry *geometry; - const Material *material; - const GeometryOwner *owner; - uint16_t light_count; - bool mirror; - - - }; - - - Element _elements[MAX_ELEMENTS]; - Element *elements[MAX_ELEMENTS]; - int element_count; - - void clear() { - - element_count=0; - } - - struct SortZ { - - _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { - - return A->depth > B->depth; - } - }; - - void sort_z() { - - SortArray sorter; - sorter.sort(elements,element_count); - } - - - struct SortMat { - - _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { - // TODO move to a single uint64 (one comparison) - if (A->material == B->material) { - - return A->light_key < B->light_key; - } else { - - return (A->material < B->material); - } - } - }; - - void sort_mat() { - - SortArray sorter; - sorter.sort(elements,element_count); - } - - struct SortMatLight { - - _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { - - if (A->material->flags[VS::MATERIAL_FLAG_UNSHADED] == B->material->flags[VS::MATERIAL_FLAG_UNSHADED]) { - - if (A->material == B->material) { - - if (A->geometry == B->geometry) { - - return A->light_keylight_key; - } else - return (A->geometry < B->geometry); - } else { - - return (A->material < B->material); - } - } else { - - return (int(A->material->flags[VS::MATERIAL_FLAG_UNSHADED]) < int(B->material->flags[VS::MATERIAL_FLAG_UNSHADED])); - } - } - }; - - void sort_mat_light() { - - SortArray sorter; - sorter.sort(elements,element_count); - } - - _FORCE_INLINE_ Element* add_element() { - - if (element_count>MAX_ELEMENTS) - return NULL; - elements[element_count]=&_elements[element_count]; - return elements[element_count++]; - } - - RenderList() { - - element_count = 0; - for (int i=0;i fx_owner; - - - FX *scene_fx; - CameraMatrix camera_projection; - Transform camera_transform; - Transform camera_transform_inverse; - float camera_z_near; - float camera_z_far; - Size2 camera_vp_size; - Color last_color; - - Plane camera_plane; - - bool keep_copies; - - bool depth_write; - bool depth_test; - int blend_mode; - bool lighting; - - _FORCE_INLINE_ void _add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner); - - void _render_list_forward(RenderList *p_render_list,bool p_reverse_cull=false); - - void _setup_light(LightInstance* p_instance, int p_idx); - void _setup_lights(const uint16_t * p_lights,int p_light_count); - - _FORCE_INLINE_ void _setup_shader_params(const Material *p_material); - void _setup_fixed_material(const Geometry *p_geometry,const Material *p_material); - void _setup_material(const Geometry *p_geometry,const Material *p_material); - - Error _setup_geometry(const Geometry *p_geometry, const Material* p_material,const Skeleton *p_skeleton, const float *p_morphs); - void _render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner); - - - /***********/ - /* SHADOWS */ - /***********/ - - struct ShadowBuffer { - - int size; - GLuint fbo; - GLuint depth; - LightInstance *owner; - void init(int p_size); - ShadowBuffer() { size=0; depth=0; owner=NULL; } - }; - - Vector near_shadow_buffers; - Vector far_shadow_buffers; - - LightInstance *shadow; - int shadow_pass; - void _init_shadow_buffers(); - - float shadow_near_far_split_size_ratio; - bool _allocate_shadow_buffers(LightInstance *p_instance, Vector& p_buffers); - void _debug_draw_shadow(GLuint tex, const Rect2& p_rect); - void _debug_draw_shadows_type(Vector& p_shadows,Point2& ofs); - void _debug_shadows(); - void reset_state(); - - /***********/ - /* FBOs */ - /***********/ - - - struct FrameBuffer { - - GLuint fbo; - GLuint color; - GLuint depth; - int width,height; - bool buff16; - bool active; - - struct Blur { - - GLuint fbo; - GLuint color; - } blur[2]; - - } framebuffer; - - void _update_framebuffer(); - void _process_glow_and_bloom(); - - /*********/ - /* FRAME */ - /*********/ - - struct _Rinfo { - - int texture_mem; - int vertex_count; - int object_count; - int mat_change_count; - int shader_change_count; - - } _rinfo; - - GLuint white_tex; - RID canvas_tex; - float canvas_opacity; - VS::MaterialBlendMode canvas_blend; - _FORCE_INLINE_ Texture* _bind_canvas_texture(const RID& p_texture); - - - int _setup_geometry_vinfo; - - bool cull_front; - _FORCE_INLINE_ void _set_cull(bool p_front,bool p_reverse_cull=false); - - Size2 window_size; - VS::ViewportRect viewport; - double last_time; - double time_delta; - uint64_t frame; - uint64_t scene_pass; - - //void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1); - //void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_h_flip=false, bool p_v_flip=false ); - //void _draw_quad(const Rect2& p_rect); - void _process_blur(int times, float inc); - -public: - - /* TEXTURE API */ - - virtual RID texture_create(); - virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT); - virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT); - virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const; - virtual void texture_set_flags(RID p_texture,uint32_t p_flags); - virtual uint32_t texture_get_flags(RID p_texture) const; - virtual Image::Format texture_get_format(RID p_texture) const; - virtual uint32_t texture_get_width(RID p_texture) const; - virtual uint32_t texture_get_height(RID p_texture) const; - virtual bool texture_has_alpha(RID p_texture) const; - virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); - virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; - - /* SHADER API */ - - virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); - - virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode); - virtual VS::ShaderMode shader_get_mode(RID p_shader) const; - - virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0); - virtual String shader_get_fragment_code(RID p_shader) const; - virtual String shader_get_vertex_code(RID p_shader) const; - virtual String shader_get_light_code(RID p_shader) const; - - virtual void shader_get_param_list(RID p_shader, List *p_param_list) const; - - /* COMMON MATERIAL API */ - - virtual RID material_create(); - - virtual void material_set_shader(RID p_shader_material, RID p_shader); - virtual RID material_get_shader(RID p_shader_material) const; - - virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value); - virtual Variant material_get_param(RID p_material, const StringName& p_param) const; - - virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled); - virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const; - - virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode); - virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const; - - virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode); - virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const; - - virtual void material_set_line_width(RID p_material,float p_line_width); - virtual float material_get_line_width(RID p_material) const; - - /* FIXED MATERIAL */ - - virtual RID fixed_material_create(); - - virtual void fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled); - virtual bool fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const; - - virtual void fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value); - virtual Variant fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const; - - virtual void fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture); - virtual RID fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const; - - virtual void fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode); - virtual VS::FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const; - - virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform); - virtual Transform fixed_material_get_uv_transform(RID p_material) const; - - virtual void fixed_material_set_point_size(RID p_material,float p_size); - virtual float fixed_material_get_point_size(RID p_material) const; - - /* MESH API */ - - - virtual RID mesh_create(); - - virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false); - virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const; - virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const; - virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat); - - virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount); - virtual int mesh_get_morph_target_count(RID p_mesh) const; - - virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode); - virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const; - - virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false); - virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const; - - virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const; - virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const; - virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const; - virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const; - - virtual void mesh_remove_surface(RID p_mesh,int p_index); - virtual int mesh_get_surface_count(RID p_mesh) const; - - virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const; - - virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb); - virtual AABB mesh_get_custom_aabb(RID p_mesh) const; - - /* MULTIMESH API */ - - virtual RID multimesh_create(); - - virtual void multimesh_set_instance_count(RID p_multimesh,int p_count); - virtual int multimesh_get_instance_count(RID p_multimesh) const; - - virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh); - virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb); - virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform); - virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color); - - virtual RID multimesh_get_mesh(RID p_multimesh) const; - virtual AABB multimesh_get_aabb(RID p_multimesh) const;; - - virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const; - virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const; - - virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible); - virtual int multimesh_get_visible_instances(RID p_multimesh) const; - - /* IMMEDIATE API */ - - virtual RID immediate_create(); - virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID()); - virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex); - virtual void immediate_normal(RID p_immediate,const Vector3& p_normal); - virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent); - virtual void immediate_color(RID p_immediate,const Color& p_color); - virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv); - virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv); - virtual void immediate_end(RID p_immediate); - virtual void immediate_clear(RID p_immediate); - virtual AABB immediate_get_aabb(RID p_immediate) const; - virtual void immediate_set_material(RID p_immediate,RID p_material); - virtual RID immediate_get_material(RID p_immediate) const; - - - /* PARTICLES API */ - - virtual RID particles_create(); - - virtual void particles_set_amount(RID p_particles, int p_amount); - virtual int particles_get_amount(RID p_particles) const; - - virtual void particles_set_emitting(RID p_particles, bool p_emitting); - virtual bool particles_is_emitting(RID p_particles) const; - - virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility); - virtual AABB particles_get_visibility_aabb(RID p_particles) const; - - virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents); - virtual Vector3 particles_get_emission_half_extents(RID p_particles) const; - - virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity); - virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const; - - virtual void particles_set_emission_points(RID p_particles, const DVector& p_points); - virtual DVector particles_get_emission_points(RID p_particles) const; - - virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal); - virtual Vector3 particles_get_gravity_normal(RID p_particles) const; - - virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value); - virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const; - - virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness); - virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const; - - virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos); - virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const; - - virtual void particles_set_color_phases(RID p_particles, int p_phases); - virtual int particles_get_color_phases(RID p_particles) const; - - virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color); - virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const; - - virtual void particles_set_attractors(RID p_particles, int p_attractors); - virtual int particles_get_attractors(RID p_particles) const; - - virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos); - virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const; - - virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force); - virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const; - - virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false); - virtual RID particles_get_material(RID p_particles) const; - - virtual AABB particles_get_aabb(RID p_particles) const; - - virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable); - virtual bool particles_has_height_from_velocity(RID p_particles) const; - - virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable); - virtual bool particles_is_using_local_coordinates(RID p_particles) const; - - /* SKELETON API */ - - virtual RID skeleton_create(); - virtual void skeleton_resize(RID p_skeleton,int p_bones); - virtual int skeleton_get_bone_count(RID p_skeleton) const; - virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform); - virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone); - - - /* LIGHT API */ - - virtual RID light_create(VS::LightType p_type); - virtual VS::LightType light_get_type(RID p_light) const; - - virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color); - virtual Color light_get_color(RID p_light,VS::LightColor p_type) const; - - virtual void light_set_shadow(RID p_light,bool p_enabled); - virtual bool light_has_shadow(RID p_light) const; - - virtual void light_set_volumetric(RID p_light,bool p_enabled); - virtual bool light_is_volumetric(RID p_light) const; - - virtual void light_set_projector(RID p_light,RID p_texture); - virtual RID light_get_projector(RID p_light) const; - - virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value); - virtual float light_get_var(RID p_light, VS::LightParam p_var) const; - - virtual void light_set_operator(RID p_light,VS::LightOp p_op); - virtual VS::LightOp light_get_operator(RID p_light) const; - - virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode); - virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const; - - - virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode); - virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const; - virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value); - virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const; - - virtual AABB light_get_aabb(RID p_poly) const; - - - virtual RID light_instance_create(RID p_light); - virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform); - - virtual bool light_instance_has_shadow(RID p_light_instance) const; - virtual bool light_instance_assign_shadow(RID p_light_instance); - virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const; - virtual int light_instance_get_shadow_passes(RID p_light_instance) const; - virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const; - virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); - virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const { return 1; } - - virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const; - virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); - - virtual void shadow_clear_near(); - virtual bool shadow_allocate_near(RID p_light); - virtual bool shadow_allocate_far(RID p_light); - - - /* PARTICLES INSTANCE */ - - virtual RID particles_instance_create(RID p_particles); - virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform); - - /* VIEWPORT */ - - virtual RID viewport_data_create(); - - virtual RID render_target_create(); - virtual void render_target_set_size(RID p_render_target, int p_width, int p_height); - virtual RID render_target_get_texture(RID p_render_target) const; - virtual bool render_target_renedered_in_frame(RID p_render_target); - - /* RENDER API */ - /* all calls (inside begin/end shadow) are always warranted to be in the following order: */ - - virtual void begin_frame(); - - virtual void set_viewport(const VS::ViewportRect& p_viewport); - virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false); - virtual void clear_viewport(const Color& p_color); - virtual void capture_viewport(Image* r_capture); - - - virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug); - virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass ); - - virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection); - - virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls - - - virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); - virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); - virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} - virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); - - virtual void end_scene(); - virtual void end_shadow_map(); - - virtual void end_frame(); - - /* CANVAS API */ - - virtual void canvas_begin(); - virtual void canvas_disable_blending(); - virtual void canvas_set_opacity(float p_opacity); - virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode); - virtual void canvas_begin_rect(const Matrix32& p_transform); - virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect); - virtual void canvas_end_rect(); - virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width); - virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate); - virtual void canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1)); - virtual void canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width); - virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor); - virtual void canvas_set_transform(const Matrix32& p_transform); - - /* FX */ - - virtual RID fx_create(); - virtual void fx_get_effects(RID p_fx,List *p_effects) const; - virtual void fx_set_active(RID p_fx,const String& p_effect, bool p_active); - virtual bool fx_is_active(RID p_fx,const String& p_effect) const; - virtual void fx_get_effect_params(RID p_fx,const String& p_effect,List *p_params) const; - virtual Variant fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const; - virtual void fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_pvalue); - - /* ENVIRONMENT */ - - virtual RID environment_create(); - - virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg); - virtual VS::EnvironmentBG environment_get_background(RID p_env) const; - - virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value); - virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const; - - virtual void environment_set_group(RID p_env,VS::Group p_group, const Variant& p_param); - virtual Variant environment_get_group(RID p_env, VS::Group p_param) const; - - virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled); - virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const; - - virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value); - virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const; - - /* SAMPLED LIGHT */ - virtual RID sampled_light_dp_create(int p_width,int p_height); - virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier); - - - /*MISC*/ - - virtual bool is_texture(const RID& p_rid) const; - virtual bool is_material(const RID& p_rid) const; - virtual bool is_mesh(const RID& p_rid) const; - virtual bool is_multimesh(const RID& p_rid) const; - virtual bool is_immediate(const RID& p_rid) const; - virtual bool is_particles(const RID &p_beam) const; - - virtual bool is_light(const RID& p_rid) const; - virtual bool is_light_instance(const RID& p_rid) const; - virtual bool is_particles_instance(const RID& p_rid) const; - virtual bool is_skeleton(const RID& p_rid) const; - virtual bool is_environment(const RID& p_rid) const; - virtual bool is_fx(const RID& p_rid) const; - virtual bool is_shader(const RID& p_rid) const; - - virtual void free(const RID& p_rid); - - virtual void custom_shade_model_set_shader(int p_model, RID p_shader); - virtual RID custom_shade_model_get_shader(int p_model) const; - virtual void custom_shade_model_set_name(int p_model, const String& p_name); - virtual String custom_shade_model_get_name(int p_model) const; - virtual void custom_shade_model_set_param_info(int p_model, const List& p_info); - virtual void custom_shade_model_get_param_info(int p_model, List* p_info) const; - - - virtual void init(); - virtual void finish(); - - virtual int get_render_info(VS::RenderInfo p_info); - - void reload_vram(); - - virtual bool needs_to_draw_next_frame() const; - - virtual bool has_feature(VS::Features p_feature) const; - - -#ifdef TOOLS_ENABLED - RasterizerGLES1(bool p_keep_copies=true,bool p_use_reload_hooks=false); -#else - RasterizerGLES1(bool p_keep_copies=false,bool p_use_reload_hooks=false); -#endif - virtual ~RasterizerGLES1(); -}; - -#endif -#endif From 31537c427958e2965e520855968091fef82343d6 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sun, 1 Dec 2024 19:30:33 +0100 Subject: [PATCH 07/15] Fixed merge and tried to implement 3ds lights --- drivers/unix/dir_access_unix.cpp | 10 ++-- drivers/unix/ip_unix.cpp | 17 +------ drivers/unix/tcp_server_posix.h | 7 +-- platform/3ds/rasterizer_3ds.cpp | 78 +++++++++++++++++++++++++------ platform/3ds/rasterizer_3ds.h | 8 +++- platform/3ds/shaders/3d.h | 2 +- platform/3ds/shaders/3d.pica | 69 ++++++++++++++++++++------- platform/3ds/shaders/3d.shbin | Bin 484 -> 564 bytes 8 files changed, 129 insertions(+), 62 deletions(-) diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 58ecc82a..58173035 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -28,15 +28,11 @@ /*************************************************************************/ #include "dir_access_unix.h" -<<<<<<< HEAD -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) || defined(__3DS__) -#if !defined(PSP) || !defined(__3DS__) -======= -#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) || defined(__psp2__) +#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED) || defined(PSP) || defined(__psp2__) || defined(__3DS__) + +#if !defined(PSP) && !defined(__psp2__) && !defined(DREAMCAST) && !defined(__3DS__) -#if !defined(PSP) && !defined(__psp2__) && !defined(DREAMCAST) ->>>>>>> fbdd36df3a8b2e204567fa7fd666453ee94e0c0c #include #endif diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp index 640665d3..d8a3f9f3 100644 --- a/drivers/unix/ip_unix.cpp +++ b/drivers/unix/ip_unix.cpp @@ -76,29 +76,16 @@ IP_Address IP_Unix::_resolve_hostname(const String& p_hostname) { } -<<<<<<< HEAD -#ifdef __3DS__ -/*unsigned short ntohs(unsigned short netshort) { - return ((netshort & 0xFF) << 8) | ((netshort >> 8) & 0xFF); -} -unsigned short htons(unsigned short hostshort) { - return ((hostshort & 0xFF) << 8) | ((hostshort >> 8) & 0xFF); -}*/ -======= -#if defined(PSP) ->>>>>>> fbdd36df3a8b2e204567fa7fd666453ee94e0c0c +#if defined(PSP) || defined(__3DS__) + void IP_Unix::get_local_addresses(List *r_addresses) const { }; -<<<<<<< HEAD #else -======= -#else ->>>>>>> fbdd36df3a8b2e204567fa7fd666453ee94e0c0c #if defined(WINDOWS_ENABLED) #if defined(WINRT_ENABLED) || defined(WIN98_ENABLED) diff --git a/drivers/unix/tcp_server_posix.h b/drivers/unix/tcp_server_posix.h index 47fd606e..732fa690 100644 --- a/drivers/unix/tcp_server_posix.h +++ b/drivers/unix/tcp_server_posix.h @@ -29,11 +29,8 @@ #ifndef TCP_SERVER_POSIX_H #define TCP_SERVER_POSIX_H -<<<<<<< HEAD -#if defined(UNIX_ENABLED) || defined(__3DS__) -======= -#if defined(UNIX_ENABLED) || defined(PSP) ->>>>>>> fbdd36df3a8b2e204567fa7fd666453ee94e0c0c +#if defined(UNIX_ENABLED) || defined(PSP) || defined(__3DS__) + #include "core/io/tcp_server.h" class TCPServerPosix : public TCP_Server { diff --git a/platform/3ds/rasterizer_3ds.cpp b/platform/3ds/rasterizer_3ds.cpp index 47ecbe2f..8278b360 100644 --- a/platform/3ds/rasterizer_3ds.cpp +++ b/platform/3ds/rasterizer_3ds.cpp @@ -3165,6 +3165,23 @@ Variant Rasterizer3DS::environment_get_background_param(RID p_env,VS::Environmen } +void Rasterizer3DS::environment_set_group(RID p_env,VS::Group p_param, const Variant& p_value){ + + ERR_FAIL_INDEX(p_param,VS::ENV_GROUP_MAX); + Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND(!env); + env->group[p_param]=p_value; + +} +Variant Rasterizer3DS::environment_get_group(RID p_env,VS::Group p_param) const{ + + ERR_FAIL_INDEX_V(p_param,VS::ENV_GROUP_MAX,Variant()); + const Environment * env = environment_owner.get(p_env); + ERR_FAIL_COND_V(!env,Variant()); + return env->group[p_param]; + +} + void Rasterizer3DS::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); @@ -3470,7 +3487,18 @@ void Rasterizer3DS::_render_list_forward(RenderList *p_render_list,const Transfo bool prev_blend=false; // glDisable(GL_BLEND); - + /* + C3D_Mtx material = + { + { + { { 0.0f, 0.2f, 0.2f, 0.2f } }, // Ambient + { { 0.0f, 0.8f, 0.8f, 0.4f } }, // Diffuse + { { 0.0f, 0.8f, 0.8f, 0.8f } }, // Specular + { { 1.0f, 0.0f, 0.0f, 0.0f } }, // Emission + } + }; + + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, scene_shader->location_material, &material);*/ for (int i=0;ielement_count;i++) { RenderList::Element *e = p_render_list->elements[i]; @@ -3766,12 +3794,12 @@ void Rasterizer3DS::_render_list_forward(RenderList *p_render_list,const Transfo // DEBUG_TEST_ERROR("Setup geometry"); }; - if (i==0 || light!=prev_light || rebind) { - if (e->light!=0xFFFF) { - // _setup_light(e->light); - } + // if (i==0 || light!=prev_light || rebind) { + // if (e->light!=0xFFFF) { + _setup_light(e->light); + // } // _setup_lights(e->lights,e->light_count); - } + // } /* if (bind_baked_light_octree && (baked_light!=prev_baked_light || rebind)) { @@ -3944,6 +3972,8 @@ bool Rasterizer3DS::_setup_material(const Geometry *p_geometry,const Material *p C3D_TexEnv *env = C3D_GetTexEnv(1); + + // if (p_material->line_width) // glLineWidth(p_material->line_width); /* @@ -4042,9 +4072,19 @@ bool Rasterizer3DS::_setup_material(const Geometry *p_geometry,const Material *p // glUniform1i(loc,texcoord); //TODO - this could happen automatically on compile... texcoord++; - } else if (E->get().value.get_type()==Variant::COLOR){ - // Color c = E->get().value; + } else if (E->get().value.get_type()==Variant::COLOR) {/* + Color c = E->get().value; + C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); + AttrInfo_Init(attrInfo); + // AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position + AttrInfo_AddFixed(attrInfo, 3); // v1=color + C3D_FixedAttribSet(3, c.r, c.g, c.b, c.a);*/ + // // _set_uniform(scene_shader->location_material, c); + // C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, (GPU_TEVSRC)0, (GPU_TEVSRC)0); + // C3D_TexEnvOpRgb(env, GPU_TEVOP_RGB_SRC_COLOR); + // C3D_TexEnvOpAlpha(env,GPU_TEVOP_A_SRC_ALPHA); + // C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); // printf("a\n"); // material_shader.set_custom_uniform(E->get().index,_convert_color(c)); @@ -4154,10 +4194,10 @@ void Rasterizer3DS::_setup_light(uint16_t p_light) Light *l=li->base; Color col_diffuse = (l->colors[VS::LIGHT_COLOR_DIFFUSE]); Color col_specular=(l->colors[VS::LIGHT_COLOR_SPECULAR]); + // printf("col\n"); - - if (l->type!=VS::LIGHT_DIRECTIONAL) { + // if (l->type!=VS::LIGHT_DIRECTIONAL) { Vector3 pos = li->transform.get_origin(); pos = camera_transform_inverse.xform(pos); @@ -4166,8 +4206,11 @@ void Rasterizer3DS::_setup_light(uint16_t p_light) // C3D_LightPosition(&l->light, &lightVec); // C3D_LightDiffuse(&l->light, col_diffuse.r, col_diffuse.g, col_diffuse.b); // C3D_LightSpecular0(&l->light, col_specular.r, col_specular.g, col_specular.b); - - } + // printf("light\n"); + C3D_FVUnifSet(GPU_VERTEX_SHADER, scene_shader->uLoc_lightVec, pos.x, pos.y, pos.z, 0.0f); + C3D_FVUnifSet(GPU_VERTEX_SHADER, scene_shader->uLoc_lightHalfVec,pos.x, pos.y, pos.z, 0.0f); + C3D_FVUnifSet(GPU_VERTEX_SHADER, scene_shader->uLoc_lightClr, col_diffuse.r, col_diffuse.g, col_diffuse.b, 1.0f); + // } // if(li->near_shadow_buffer) { // C3D_LightShadowEnable(&l->light, true); @@ -4309,9 +4352,12 @@ void Rasterizer3DS::_render(const Geometry *p_geometry,const Material *p_materia AttrInfo_AddLoader(attrInfo, 2, GPU_FLOAT, 2); // v2=tex_uv else { -// AttrInfo_AddFixed(attrInfo, 2); -// C3D_FixedAttribSet(2, 1.f, 1.f, 1.f, 1.f); - AttrInfo_AddLoader(attrInfo, 3, GPU_FLOAT, 4); + /* + AttrInfo_AddFixed(attrInfo, 3); + C3D_FixedAttribSet(3, 1.f, 1.f, 1.f, 1.f);*/ + // AttrInfo_AddLoader(attrInfo, 3, GPU_FLOAT, 4); + // BufInfo_Add(bufInfo, s->array_local, s->stride, has_tex ? 3 : 2, has_tex ? 0x210 : 0x10); + } BufInfo_Add(bufInfo, s->array_local, s->stride, has_tex ? 3 : 2, has_tex ? 0x210 : 0x10); @@ -4723,6 +4769,7 @@ void Rasterizer3DS::init() base_framebuffer->texture = texture_owner.make_rid( texture ); // Frag lighting + C3D_LightEnvInit(&lightEnv); C3D_LightEnvBind(&lightEnv); C3D_LightEnvMaterial(&lightEnv, &material); @@ -4732,6 +4779,7 @@ void Rasterizer3DS::init() C3D_FVec lightVec = { { 1.0, -1.5, 0.0, 0.0 } }; + // C3D_LightInit(&light, &lightEnv); // C3D_LightColor(&light, 1.0, 1.0, 1.0); diff --git a/platform/3ds/rasterizer_3ds.h b/platform/3ds/rasterizer_3ds.h index 1ef47fea..49dfb6e5 100644 --- a/platform/3ds/rasterizer_3ds.h +++ b/platform/3ds/rasterizer_3ds.h @@ -119,6 +119,7 @@ class Rasterizer3DS : public Rasterizer { location_modelview = shaderInstanceGetUniformLocation(program.vertexShader, "modelView"); location_worldTransform = shaderInstanceGetUniformLocation(program.vertexShader, "worldTransform"); location_extra = shaderInstanceGetUniformLocation(program.vertexShader, "extra"); + uLoc_lightVec = shaderInstanceGetUniformLocation(program.vertexShader, "lightVec"); uLoc_lightHalfVec = shaderInstanceGetUniformLocation(program.vertexShader, "lightHalfVec"); uLoc_lightClr = shaderInstanceGetUniformLocation(program.vertexShader, "lightClr"); @@ -435,7 +436,7 @@ class Rasterizer3DS : public Rasterizer { struct Environment { - + Variant group[VS::ENV_GROUP_MAX]; VS::EnvironmentBG bg_mode; Variant bg_param[VS::ENV_BG_PARAM_MAX]; bool fx_enabled[VS::ENV_FX_MAX]; @@ -833,7 +834,7 @@ class Rasterizer3DS : public Rasterizer { struct Vertex { Vector3 position; Vector2 texcoord; -// Color color; + Color color; }; struct VertexArray { @@ -1226,6 +1227,9 @@ class Rasterizer3DS : public Rasterizer { virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled); virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const; + + virtual void environment_set_group(RID p_env,VS::Group p_group, const Variant& p_param); + virtual Variant environment_get_group(RID p_env, VS::Group p_param) const; virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value); virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const; diff --git a/platform/3ds/shaders/3d.h b/platform/3ds/shaders/3d.h index 4f2c586b..af8af16b 100644 --- a/platform/3ds/shaders/3d.h +++ b/platform/3ds/shaders/3d.h @@ -1,3 +1,3 @@ /* Auto-generated from platform/3ds/shaders/3d.shbin */ static uint8_t shader_builtin_3d[] = -{68,86,76,66,1,0,0,0,28,1,0,0,68,86,76,80,0,0,0,0,40,0,0,0,34,0,0,0,176,0,0,0,12,0,0,0,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,136,34,10,3,152,34,10,4,168,34,10,5,184,34,10,130,72,2,10,131,88,2,10,132,104,2,10,133,120,2,10,6,0,97,76,2,8,2,8,3,24,2,8,4,40,2,8,5,56,2,8,7,32,32,76,130,128,194,7,131,144,194,7,132,160,194,7,2,239,193,6,2,96,193,62,0,235,193,35,8,240,7,78,9,255,135,2,10,250,135,34,1,250,167,189,7,64,129,62,10,255,167,34,0,124,128,179,4,64,1,58,11,90,1,34,7,0,129,76,9,240,71,76,0,0,0,136,110,3,0,0,0,0,0,0,161,0,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,127,3,0,0,0,0,0,0,111,3,0,0,0,0,0,0,15,8,0,0,0,0,0,0,175,138,42,0,0,0,0,0,239,223,6,0,0,0,0,0,108,195,6,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,34,0,0,0,0,0,31,0,0,0,0,0,64,0,0,0,1,0,0,0,84,0,0,0,0,0,0,0,84,0,0,0,5,0,0,0,124,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,0,0,62,0,0,0,0,0,15,0,0,0,3,0,1,0,15,0,0,0,2,0,2,0,15,0,0,0,8,0,3,0,15,0,0,0,1,0,4,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,26,0,0,0,24,0,27,0,36,0,0,0,28,0,31,0,112,114,111,106,101,99,116,105,111,110,0,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,111,100,101,108,86,105,101,119,0,101,120,116,114,97,0,0,0}; \ No newline at end of file +{68,86,76,66,1,0,0,0,36,1,0,0,68,86,76,80,0,0,0,0,40,0,0,0,32,0,0,0,168,0,0,0,14,0,0,0,24,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,1,240,7,78,2,136,34,10,3,152,34,10,4,168,34,10,5,184,34,10,130,72,2,10,131,88,2,10,132,104,2,10,133,120,2,10,6,0,97,76,2,8,2,8,3,24,2,8,4,40,2,8,5,56,2,8,7,32,32,76,130,8,3,6,8,248,7,2,137,24,3,6,10,248,7,50,3,8,1,34,7,96,35,78,7,40,67,34,43,214,36,241,12,40,67,34,43,210,36,241,7,32,67,78,43,206,36,241,141,248,71,52,7,0,129,76,13,240,71,76,0,0,0,136,110,3,0,0,0,0,0,0,161,10,0,0,0,0,0,0,104,195,6,0,0,0,0,0,100,195,6,0,0,0,0,0,98,195,6,0,0,0,0,0,97,195,6,0,0,0,0,0,127,3,0,0,0,0,0,0,111,67,21,0,0,0,0,0,8,224,6,0,0,0,0,0,116,195,6,0,0,0,0,0,15,192,6,0,0,0,0,0,111,195,134,13,0,0,0,0,111,3,0,0,0,0,0,0,175,202,6,0,0,0,0,0,68,86,76,69,2,16,0,0,0,0,0,0,32,0,0,0,0,0,31,0,0,0,0,0,64,0,0,0,1,0,0,0,84,0,0,0,0,0,0,0,84,0,0,0,5,0,0,0,124,0,0,0,8,0,0,0,188,0,0,0,82,0,0,0,2,0,95,0,0,0,0,0,0,0,63,0,0,0,191,0,0,0,62,0,0,0,0,0,15,0,0,0,3,0,1,0,15,0,0,0,2,0,2,0,15,0,0,0,8,0,3,0,15,0,0,0,1,0,4,0,15,0,0,0,0,0,0,0,16,0,19,0,11,0,0,0,20,0,23,0,26,0,0,0,24,0,27,0,36,0,0,0,28,0,31,0,42,0,0,0,32,0,32,0,51,0,0,0,33,0,33,0,64,0,0,0,34,0,34,0,73,0,0,0,35,0,38,0,112,114,111,106,101,99,116,105,111,110,0,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,111,100,101,108,86,105,101,119,0,101,120,116,114,97,0,108,105,103,104,116,86,101,99,0,108,105,103,104,116,72,97,108,102,86,101,99,0,108,105,103,104,116,67,108,114,0,109,97,116,101,114,105,97,108,0,0,0}; \ No newline at end of file diff --git a/platform/3ds/shaders/3d.pica b/platform/3ds/shaders/3d.pica index fce1ff57..70122533 100644 --- a/platform/3ds/shaders/3d.pica +++ b/platform/3ds/shaders/3d.pica @@ -1,6 +1,12 @@ ; Uniforms .fvec projection[4], worldTransform[4], modelView[4], extra[4] +.fvec lightVec, lightHalfVec, lightClr, material[4] + +.alias mat_amb material[0] +.alias mat_dif material[1] +.alias mat_spe material[2] +.alias mat_emi material[3] ; Constants .constf myconst(0.0, 1.0, -1.0, 0.5) .alias zeros myconst.xxxx ; Vector full of zeros @@ -18,6 +24,7 @@ .alias inpos v0 .alias innrm v1 .alias intex v2 +;.alias inclr v3 .proc main ; Force the w component of inpos to be 1.0 @@ -47,27 +54,55 @@ ; outtex = intex mov outtc0, intex +; +; ; Transform the normal vector with the modelView matrix +; ; TODO: use a separate normal matrix that is the transpose of the inverse of modelView +; dp3 r14.x, modelView[0], innrm +; dp3 r14.y, modelView[1], innrm +; dp3 r14.z, modelView[2], innrm +; dp3 r6.x, r14, r14 +; rsq r6.x, r6.x +; mul r14.xyz, r14.xyz, r6.x +; +; mov r0, myconst.yxxx +; add r4, ones, r14.z +; mul r4, half, r4 +; cmp zeros, ge, ge, r4.x +; rsq r4, r4.x +; mul r5, half, r14 +; jmpc cmp.x, degenerate +; +; rcp r0.z, r4.x +; mul r0.xy, r5, r4 + + ;mov outclr, mat_dif + + ; Calculate the diffuse level (r0.x) and the shininess level (r0.y) + ; r0.x = max(0, -(lightVec * r1)) + ; r0.y = max(0, (-lightHalfVec[i]) * r1) ^ 2 + dp3 r0.x, lightVec, r1 + add r0.x, zeros, -r0 + dp3 r0.y, -lightHalfVec, r1 + max r0, zeros, r0 + mul r0.y, r0, r0 + + + mov r1, mat_emi - ; Transform the normal vector with the modelView matrix - ; TODO: use a separate normal matrix that is the transpose of the inverse of modelView - dp3 r14.x, modelView[0], innrm - dp3 r14.y, modelView[1], innrm - dp3 r14.z, modelView[2], innrm - dp3 r6.x, r14, r14 - rsq r6.x, r6.x - mul r14.xyz, r14.xyz, r6.x + ; r1 += specularColor * lightClr * shininessLevel + mul r2, lightClr, r0.yyyy + mad r1, r2, mat_spe, r1 - mov r0, myconst.yxxx - add r4, ones, r14.z - mul r4, half, r4 - cmp zeros, ge, ge, r4.x - rsq r4, r4.x - mul r5, half, r14 - jmpc cmp.x, degenerate + ; r1 += diffuseColor * lightClr * diffuseLevel + mul r2, lightClr, r0.xxxx + mad r1, r2, mat_dif, r1 - rcp r0.z, r4.x - mul r0.xy, r5, r4 + ; r1 += ambientColor * lightClr + mov r2, lightClr + mad r1, r2, mat_amb, r1 + ; outclr = clamp r1 to [0,1] + min outclr, ones, r1 degenerate: mov outnq, r0 mov outclr, ones diff --git a/platform/3ds/shaders/3d.shbin b/platform/3ds/shaders/3d.shbin index bdc4c4b7bb666c67f1c31a209e14949d050da7d7..0eee239ef1853e2a2464295f74c642b80b932c3a 100644 GIT binary patch delta 288 zcmaFDyoE*8CCtZ(k%56h1xNtd0YD~$1`sO%@d_a317eAZssWxH%xoM#*qJ&dnAx~~ zup2RRFe|y2vG<3&2|Gih5AO$eAD|H(dCWi( z2o`cpJf`pBEDGjuJYWOUC5It2{{aY{f4GeoB#{r*wEh%C9Oyt-CIPS(28GF*jOv^m zK+YZ@4w@Xv7%#5{WGMilF_2aSLI)tN1caVITA4v@@^(gTt(?sCjFPa_WCk$9BQYlp U&T-BuV#rM_NiE7u%mL~E097M6eEzE{NK*R^{ZWp@z?Ub><*1~T>qCVG1N3{W^rJ&;*MfeVrOXd z;r!t412n25j~Pe;!9s?K`}9qq9DWXn;QB5tFysAwHZYxY7(xRb=E@`hQKK~3kWrnJ W1<08L#9EUR8RI8EVANt_U;qF(ge_zM From dec0f51bbbb9fc1c8789b6140f02f5c2c2a3e0c4 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sun, 1 Dec 2024 21:59:23 +0100 Subject: [PATCH 08/15] use GLES1 renderer by default and fixed atlas texture shrinking, added 3d textures to be atlas'd --- platform/x11/os_x11.cpp | 4 ++-- .../editor_texture_import_plugin.cpp | 24 +++++++++++++------ tools/editor/project_export.cpp | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 3d7dcba0..8a371603 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -155,9 +155,9 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi context_gl->initialize(); if (p_video_driver == 0) { - rasterizer = memnew( RasterizerGLES2 ); - } else { rasterizer = memnew( RasterizerGLES1 ); + } else { + rasterizer = memnew( RasterizerGLES2 ); }; #endif diff --git a/tools/editor/io_plugins/editor_texture_import_plugin.cpp b/tools/editor/io_plugins/editor_texture_import_plugin.cpp index b855b15b..a0c89937 100644 --- a/tools/editor/io_plugins/editor_texture_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_texture_import_plugin.cpp @@ -766,10 +766,18 @@ Error EditorTextureImportPlugin::import2(const String& p_path, const Ref te; + te = ResourceLoader::load(path); + ERR_FAIL_COND_V(te.is_null(), ERR_CANT_OPEN); + src = te->get_data(); + + } else { + Error err = ImageLoader::load_image(path,&src); + if (err) { + EditorNode::add_io_error("Couldn't load image: "+path); + return err; + } } if (src.detect_alpha()) @@ -799,7 +807,9 @@ Error EditorTextureImportPlugin::import2(const String& p_path, const Ref1) { - + int orig_w=image.get_width(); int orig_h=image.get_height(); image.resize(orig_w/shrink,orig_h/shrink); diff --git a/tools/editor/project_export.cpp b/tools/editor/project_export.cpp index 79513225..fb6f43ca 100644 --- a/tools/editor/project_export.cpp +++ b/tools/editor/project_export.cpp @@ -696,7 +696,7 @@ void ProjectExportDialog::_update_group_tree() { extensions.insert(E->get()); } - + extensions.insert("tex"); List grouplist; EditorImportExport::get_singleton()->image_export_get_groups(&grouplist); grouplist.sort_custom(); From 7b8fc7fd21f0d2b98bc1836ada8781ee1f4edb7f Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sat, 25 Jan 2025 22:36:37 +0100 Subject: [PATCH 09/15] Compile psp with latest toolchain, add video (ogv) to vita, add immediate drawing (from kleadron's codebase) and attempt at getting lightmaps to work --- drivers/gles1/rasterizer_gles1.cpp | 341 ++++++++++++++++-- drivers/gles1/rasterizer_gles1.h | 55 ++- drivers/mpc/mpc_reader.c | 1 + platform/psp/detect.py | 2 +- platform/psp/os_psp.cpp | 2 +- platform/psp/rasterizer_psp.cpp | 3 +- platform/vita/detect.py | 4 +- .../editor_texture_import_plugin.cpp | 2 +- .../plugins/baked_light_editor_plugin.cpp | 2 +- 9 files changed, 369 insertions(+), 43 deletions(-) diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index f3e8c201..c7dec5fa 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -2201,45 +2201,126 @@ RID RasterizerGLES1::immediate_create() { void RasterizerGLES1::immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(im->building); + + Immediate::Chunk ic; + ic.texture=p_texture; + ic.primitive=p_rimitive; + im->chunks.push_back(ic); + im->mask=0; + im->building=true; + } void RasterizerGLES1::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + Immediate::Chunk *c = &im->chunks.back()->get(); + + + if (c->vertices.empty() && im->chunks.size()==1) { + + im->aabb.pos=p_vertex; + im->aabb.size=Vector3(); + } else { + im->aabb.expand_to(p_vertex); + } + + if (im->mask&VS::ARRAY_FORMAT_NORMAL) + c->normals.push_back(chunk_normal); + if (im->mask&VS::ARRAY_FORMAT_TANGENT) + c->tangents.push_back(chunk_tangent); + if (im->mask&VS::ARRAY_FORMAT_COLOR) + c->colors.push_back(chunk_color); + if (im->mask&VS::ARRAY_FORMAT_TEX_UV) + c->uvs.push_back(chunk_uv); + if (im->mask&VS::ARRAY_FORMAT_TEX_UV2) + c->uvs2.push_back(chunk_uv2); + im->mask|=VS::ARRAY_FORMAT_VERTEX; + c->vertices.push_back(p_vertex); } + + void RasterizerGLES1::immediate_normal(RID p_immediate,const Vector3& p_normal){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + im->mask|=VS::ARRAY_FORMAT_NORMAL; + chunk_normal=p_normal; } void RasterizerGLES1::immediate_tangent(RID p_immediate,const Plane& p_tangent){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + im->mask|=VS::ARRAY_FORMAT_TANGENT; + chunk_tangent=p_tangent; } void RasterizerGLES1::immediate_color(RID p_immediate,const Color& p_color){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + im->mask|=VS::ARRAY_FORMAT_COLOR; + chunk_color=p_color; } void RasterizerGLES1::immediate_uv(RID p_immediate,const Vector2& tex_uv){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + im->mask|=VS::ARRAY_FORMAT_TEX_UV; + chunk_uv=tex_uv; } void RasterizerGLES1::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + im->mask|=VS::ARRAY_FORMAT_TEX_UV2; + chunk_uv2=tex_uv; } void RasterizerGLES1::immediate_end(RID p_immediate){ + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(!im->building); + + im->building=false; } void RasterizerGLES1::immediate_clear(RID p_immediate) { + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!im); + ERR_FAIL_COND(im->building); + im->chunks.clear(); } AABB RasterizerGLES1::immediate_get_aabb(RID p_immediate) const { - return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); + Immediate *im = immediate_owner.get(p_immediate); + ERR_FAIL_COND_V(!im,AABB()); + return im->aabb; } void RasterizerGLES1::immediate_set_material(RID p_immediate,RID p_material) { @@ -2247,6 +2328,7 @@ void RasterizerGLES1::immediate_set_material(RID p_immediate,RID p_material) { Immediate *im = immediate_owner.get(p_immediate); ERR_FAIL_COND(!im); im->material=p_material; + } RID RasterizerGLES1::immediate_get_material(RID p_immediate) const { @@ -2933,21 +3015,80 @@ RID RasterizerGLES1::viewport_data_create() { RID RasterizerGLES1::render_target_create(){ - return RID(); + RenderTarget *rt = memnew( RenderTarget ); + rt->fbo=0; + rt->width=0; + rt->height=0; + rt->last_pass=0; + rt->color = 0; // Add color texture to rt to use for blitting + Texture *texture = memnew(Texture); + texture->active=false; + texture->total_data_size=0; + texture->render_target=rt; + // texture->ignore_mipmaps=true; + rt->texture_ptr=texture; + rt->texture=texture_owner.make_rid( texture ); + rt->texture_ptr->active=false; + return render_target_owner.make_rid(rt); } -void RasterizerGLES1::render_target_set_size(RID p_render_target, int p_width, int p_height){ + +void RasterizerGLES1::render_target_set_size(RID p_render_target,int p_width,int p_height){ + + RenderTarget *rt = render_target_owner.get(p_render_target); + + if (p_width==rt->width && p_height==rt->height) + return; + + if (rt->width!=0 && rt->height!=0) { + + glDeleteTextures(1,&rt->color); + + rt->width=0; + rt->height=0; + rt->texture_ptr->tex_id=0; + rt->texture_ptr->active=false; + + } + + if (p_width==0 || p_height==0) + return; + + + rt->width=p_width; + rt->height=p_height; + + + //color texture + glGenTextures(1, &rt->color); + glBindTexture(GL_TEXTURE_2D, rt->color); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, rt->width, rt->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + + rt->texture_ptr->tex_id=rt->color; + rt->texture_ptr->active=true; + rt->texture_ptr->width=p_width; + rt->texture_ptr->height=p_height; } -RID RasterizerGLES1::render_target_get_texture(RID p_render_target) const{ - return RID(); +RID RasterizerGLES1::render_target_get_texture(RID p_render_target) const{ + const RenderTarget *rt = render_target_owner.get(p_render_target); + ERR_FAIL_COND_V(!rt,RID()); + return rt->texture; } + bool RasterizerGLES1::render_target_renedered_in_frame(RID p_render_target){ - return false; + RenderTarget *rt = render_target_owner.get(p_render_target); + ERR_FAIL_COND_V(!rt,false); + return rt->last_pass==frame; } @@ -2978,8 +3119,32 @@ void RasterizerGLES1::begin_frame() { } void RasterizerGLES1::capture_viewport(Image* r_capture) { + DVector pixels; + pixels.resize(viewport.width * viewport.height * 4); + DVector::Write w = pixels.write(); + glPixelStorei(GL_PACK_ALIGNMENT, 4); + glReadPixels(viewport.x, window_size.height - (viewport.height + viewport.y), viewport.width, viewport.height, GL_RGBA, GL_UNSIGNED_BYTE, w.ptr()); + + bool flip = true;//current_rt == NULL; + + if (flip) { + uint32_t *imgptr = (uint32_t *)w.ptr(); + for (int y = 0; y < (viewport.height / 2); y++) { + uint32_t *ptr1 = &imgptr[y * viewport.width]; + uint32_t *ptr2 = &imgptr[(viewport.height - y - 1) * viewport.width]; + + for (int x = 0; x < viewport.width; x++) { + + uint32_t tmp = ptr1[x]; + ptr1[x] = ptr2[x]; + ptr2[x] = tmp; + } + } + } + w = DVector::Write(); + r_capture->create(viewport.width, viewport.height, 0, Image::FORMAT_RGBA, pixels); } @@ -3260,6 +3425,13 @@ void RasterizerGLES1::add_multimesh( const RID& p_multimesh, const InstanceData } +void RasterizerGLES1::add_immediate(const RID &p_immediate, const InstanceData *p_data) { + + Immediate *immediate = immediate_owner.get(p_immediate); + ERR_FAIL_COND(!immediate); + + _add_geometry(immediate, p_data, immediate, NULL); +} void RasterizerGLES1::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ @@ -3414,6 +3586,8 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glEnable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + + // tc0_id_cache = texture->tex_id; } else { glDisable(GL_TEXTURE_2D); @@ -3729,6 +3903,23 @@ static const int gl_texcoord_index[VS::ARRAY_MAX-1] = { -1, // ARRAY_WEIGHTS }; +static const GLenum gl_primitive[]={ + GL_POINTS, + GL_LINES, + GL_LINE_STRIP, + GL_LINE_LOOP, + GL_TRIANGLES, + GL_TRIANGLE_STRIP, + GL_TRIANGLE_FAN +}; + +static const GLenum gl_poly_primitive[4]={ + GL_POINTS, + GL_LINES, + GL_TRIANGLES, + //GL_QUADS + +}; Error RasterizerGLES1::_setup_geometry(const Geometry *p_geometry, const Material* p_material, const Skeleton *p_skeleton,const float *p_morphs) { @@ -4058,7 +4249,98 @@ Error RasterizerGLES1::_setup_geometry(const Geometry *p_geometry, const Materia } break; + case Geometry::GEOMETRY_IMMEDIATE: { + bool restore_tex=false; + const Immediate *im = static_cast( p_geometry ); + if (im->building) { + break; + } + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glClientActiveTexture(GL_TEXTURE0); + + for (const List::Element *E = im->chunks.front(); E; E = E->next()) { + + const Immediate::Chunk &c = E->get(); + if (c.vertices.empty()) { + continue; + } + + // what on earth? + //for (int i = 0; i < c.vertices.size(); i++) + + if (c.texture.is_valid() && texture_owner.owns(c.texture)) { + + const Texture *t = texture_owner.get(c.texture); + // Texture2D should always be enabled + glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0 + tc0_idx); + glBindTexture(t->target, t->tex_id); + restore_tex = true; + + } + else if (restore_tex) { + + glActiveTexture(GL_TEXTURE0 + tc0_idx); + glBindTexture(GL_TEXTURE_2D, tc0_id_cache); + restore_tex = false; + } + + if (!c.normals.empty()) { + glEnableClientState(GL_NORMAL_ARRAY); + glNormalPointer(GL_FLOAT, 0, c.normals.ptr()); + } + else { + glDisableClientState(GL_NORMAL_ARRAY); + } + + if (!c.colors.empty()) { + + glEnableClientState(GL_COLOR_ARRAY); + glColorPointer(4, GL_FLOAT, 0, c.colors.ptr()); + } + else { + glDisableClientState(GL_COLOR_ARRAY); + glColor4f(1, 1, 1, 1); + } + + if (!c.uvs.empty()) { + + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, c.uvs.ptr()); + } + else { + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, c.vertices.ptr()); + glDrawArrays(gl_primitive[c.primitive], 0, c.vertices.size()); + } + + if (restore_tex) { + + glActiveTexture(GL_TEXTURE0 + tc0_idx); + glBindTexture(GL_TEXTURE_2D, tc0_id_cache); + restore_tex = false; + } + + // reset the client states just in case cus the driver explodes if I don't + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + // if (restore_tex) { + // + // glActiveTexture(GL_TEXTURE0+tc0_idx); + // glBindTexture(GL_TEXTURE_2D,tc0_id_cache); + // restore_tex=false; + // } + glDisable(GL_TEXTURE_2D); + } break; default: break; }; @@ -4066,23 +4348,7 @@ Error RasterizerGLES1::_setup_geometry(const Geometry *p_geometry, const Materia return OK; }; -static const GLenum gl_primitive[]={ - GL_POINTS, - GL_LINES, - GL_LINE_STRIP, - GL_LINE_LOOP, - GL_TRIANGLES, - GL_TRIANGLE_STRIP, - GL_TRIANGLE_FAN -}; -static const GLenum gl_poly_primitive[4]={ - GL_POINTS, - GL_LINES, - GL_TRIANGLES, - //GL_QUADS - -}; void RasterizerGLES1::_render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner) { @@ -4363,14 +4629,15 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light); if (sl) { - // baked_light=NULL; //can't mix + baked_light=NULL; //can't mix // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,true); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,sl->texture); //bind the texture } } if (baked_light) { - if (baked_light->mode==VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) { + // glEnable(GL_TEXTURE_2D); + /*if (baked_light->mode==VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) { // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,true); bind_baked_light_octree=true; if (prev_baked_light!=baked_light) { @@ -4391,9 +4658,9 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve } - } else if (baked_light->mode==VS::BAKED_LIGHT_LIGHTMAPS) { - + } else*/ if (baked_light->mode==VS::BAKED_LIGHT_LIGHTMAPS) { + int lightmap_idx = e->instance->baked_lightmap_id; // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false); @@ -4410,10 +4677,11 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve Texture *tex = texture_owner.get(texid); if (tex) { - - glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + // glActiveTexture(GL_TEXTURE1); glBindTexture(tex->target,tex->tex_id); //bind the texture - } + // glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + } prev_baked_light_texture=texid; } @@ -4424,10 +4692,23 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve } } + } else { + + glDisable(GL_TEXTURE_2D); } if (material!=prev_material || geometry_cmp!=prev_geometry_cmp) { - _setup_material(e->geometry,material); + _setup_material(e->geometry,material);/* + if(bind_baked_lightmap) { + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); + + glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); + glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); + glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); + + }*/ _rinfo.mat_change_count++; //_setup_material_overrides(e->material,NULL,material_overrides); //_setup_material_skeleton(material,skeleton); diff --git a/drivers/gles1/rasterizer_gles1.h b/drivers/gles1/rasterizer_gles1.h index eb5e9efd..895cf70b 100644 --- a/drivers/gles1/rasterizer_gles1.h +++ b/drivers/gles1/rasterizer_gles1.h @@ -84,6 +84,8 @@ class RasterizerGLES1 : public Rasterizer { Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); + + class RenderTarget; struct Texture { @@ -100,6 +102,7 @@ class RasterizerGLES1 : public Rasterizer { bool compressed; bool disallow_mipmaps; int total_data_size; + RenderTarget *render_target; Image image[6]; @@ -110,7 +113,7 @@ class RasterizerGLES1 : public Rasterizer { StringName reloader_func; Texture() { - + render_target = NULL; flags=width=height=0; tex_id=0; data_size=0; @@ -213,6 +216,7 @@ class RasterizerGLES1 : public Rasterizer { enum Type { GEOMETRY_INVALID, GEOMETRY_SURFACE, + GEOMETRY_IMMEDIATE, GEOMETRY_POLY, GEOMETRY_PARTICLES, GEOMETRY_MULTISURFACE, @@ -409,10 +413,27 @@ class RasterizerGLES1 : public Rasterizer { mutable RID_Owner multimesh_owner; mutable SelfList::List _multimesh_dirty_list; - struct Immediate { + struct Immediate : public Geometry { + + struct Chunk { + + RID texture; + VS::PrimitiveType primitive; + Vector vertices; + Vector normals; + Vector tangents; + Vector colors; + Vector uvs; + Vector uvs2; + }; + + List chunks; + bool building; + int mask; + AABB aabb; + + Immediate() { type=GEOMETRY_IMMEDIATE; building=false;} - RID material; - int empty; }; mutable RID_Owner immediate_owner; @@ -451,6 +472,21 @@ class RasterizerGLES1 : public Rasterizer { mutable RID_Owner skeleton_owner; + + struct RenderTarget { + + Texture *texture_ptr; + RID texture; + GLuint fbo; + GLuint color; + GLuint depth; + int width,height; + uint64_t last_pass; + + }; + + mutable RID_Owner render_target_owner; + struct Light { VS::LightType type; @@ -796,7 +832,14 @@ class RasterizerGLES1 : public Rasterizer { Error _setup_geometry(const Geometry *p_geometry, const Material* p_material,const Skeleton *p_skeleton, const float *p_morphs); void _render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner); - + Vector3 chunk_vertex; + Vector3 chunk_normal; + Plane chunk_tangent; + Color chunk_color; + Vector2 chunk_uv; + Vector2 chunk_uv2; + GLuint tc0_id_cache; + GLuint tc0_idx = 0; /***********/ /* SHADOWS */ @@ -1192,7 +1235,7 @@ class RasterizerGLES1 : public Rasterizer { virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); - virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} + virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data); virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); virtual void end_scene(); diff --git a/drivers/mpc/mpc_reader.c b/drivers/mpc/mpc_reader.c index e1d151fe..05197751 100644 --- a/drivers/mpc/mpc_reader.c +++ b/drivers/mpc/mpc_reader.c @@ -36,6 +36,7 @@ #include #include "internal.h" #include +#include #define STDIO_MAGIC 0xF34B963C ///< Just a random safe-check value... typedef struct mpc_reader_stdio_t { diff --git a/platform/psp/detect.py b/platform/psp/detect.py index e12c7be1..ae3c36c2 100644 --- a/platform/psp/detect.py +++ b/platform/psp/detect.py @@ -55,7 +55,7 @@ def configure(env): env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED']) - env.Append(CPPFLAGS=['-DNEED_LONG_INT', '-DPSP_ENABLED', '-fno-exceptions', '-DNO_SAFE_CAST', '-fno-rtti']) + env.Append(CPPFLAGS=['-DNEED_LONG_INT', '-DPSP_ENABLED', '-fno-exceptions', '-DNO_SAFE_CAST', '-fno-rtti', '-Wno-incompatible-pointer-types']) env.Append(LIBS=['pthread', 'z', 'pspdisplay', 'pspge', 'pspgu', 'pspgum_vfpu', 'pspvfpu', 'pspctrl', 'psppower', 'pspaudio', 'pspnet', 'pspnet_apctl']) diff --git a/platform/psp/os_psp.cpp b/platform/psp/os_psp.cpp index 01ae75d2..e0c9d7fa 100644 --- a/platform/psp/os_psp.cpp +++ b/platform/psp/os_psp.cpp @@ -387,7 +387,7 @@ void OS_PSP::swap_buffers() { OS_PSP::OS_PSP() { - AudioDriverManagerSW::add_driver(&driver_psp); + AudioDriverManagerSW::add_driver(&driver_dummy); //adriver here grab=false; _verbose_stdout=true; diff --git a/platform/psp/rasterizer_psp.cpp b/platform/psp/rasterizer_psp.cpp index fa1801cd..1cb06270 100644 --- a/platform/psp/rasterizer_psp.cpp +++ b/platform/psp/rasterizer_psp.cpp @@ -567,9 +567,10 @@ void RasterizerPSP::texture_set_data(RID p_texture,const Image& p_image,VS::Cube texture->alloc_width = nearest_power_of_2(img.get_width()); texture->alloc_height = nearest_power_of_2(img.get_height()); - if (texture->alloc_width < 16) { + if (texture->alloc_width > 16) { texture->alloc_width = 16; } + if (texture->alloc_width != img.get_width() || texture->alloc_height != img.get_height()) { img.resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR); diff --git a/platform/vita/detect.py b/platform/vita/detect.py index fe4c0087..657ce116 100644 --- a/platform/vita/detect.py +++ b/platform/vita/detect.py @@ -25,7 +25,7 @@ def get_opts(): def get_flags(): return [ ('builtin_zlib', 'no'), - ('theora','no'), + ('theora','yes'), ('module_pspmath_enabled', 'yes'), ] @@ -57,7 +57,7 @@ def configure(env): elif env["target"]=="debug": env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED']) - env.Append(CPPFLAGS=['-DNEED_LONG_INT', '-D__psp2__', '-DVITA_ENABLED', '-fno-exceptions', '-DNO_SAFE_CAST', '-fno-rtti']) #'-DGLES2_ENABLED' + env.Append(CPPFLAGS=['-DNEED_LONG_INT', '-D__psp2__', '-DVITA_ENABLED', '', '-DNO_SAFE_CAST', '-fno-rtti']) #'-DGLES2_ENABLED' env.Append(LIBS=['z', "SceCtrl_stub", "SceAudio_stub","SceMotion_stub","SceCamera_stub","liblibIMGEGL_stub", "liblibgpu_es4_ext_stub","liblibGLESv1_CM_stub"]) # env.Append(LIBS=['z', "SceCtrl_stub", "SceAudio_stub","liblibGLESv2_stub","liblibIMGEGL_stub", "liblibgpu_es4_ext_stub"]) env.Append(LINKFLAGS=["-Wl,-q,-whole-archive", "-lpthread", "-Wl,-q,-no-whole-archive"]) diff --git a/tools/editor/io_plugins/editor_texture_import_plugin.cpp b/tools/editor/io_plugins/editor_texture_import_plugin.cpp index a0c89937..5de647bf 100644 --- a/tools/editor/io_plugins/editor_texture_import_plugin.cpp +++ b/tools/editor/io_plugins/editor_texture_import_plugin.cpp @@ -1048,7 +1048,7 @@ Error EditorTextureImportPlugin::import2(const String& p_path, const Ref1 || (format!=IMAGE_FORMAT_UNCOMPRESSED && (image.get_width()!=orig_w || image.get_height()!=orig_h))) { - texture->set_size_override(Size2(orig_w,orig_h)); + // texture->set_size_override(Size2(orig_w,orig_h)); } uint32_t save_flags=ResourceSaver::FLAG_COMPRESS; diff --git a/tools/editor/plugins/baked_light_editor_plugin.cpp b/tools/editor/plugins/baked_light_editor_plugin.cpp index 9589ad67..ffa2f00b 100644 --- a/tools/editor/plugins/baked_light_editor_plugin.cpp +++ b/tools/editor/plugins/baked_light_editor_plugin.cpp @@ -120,7 +120,7 @@ void BakedLightEditor::_notification(int p_option) { Image img(baker->baked_octree_texture_w,baker->baked_octree_texture_h,0,Image::FORMAT_RGBA,light_texture); Ref it = memnew( ImageTexture ); it->create_from_image(img); - ResourceSaver::save("baked_octree.png",it); + ResourceSaver::save("res://baked_octree.png",it); #endif From e642c38bdc9d0380ee6320e0a0f87968b757c67b Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Fri, 31 Jan 2025 17:25:37 +0100 Subject: [PATCH 10/15] Bump mapping (gles1 only) --- drivers/gles1/rasterizer_gles1.cpp | 53 ++++++++++++++++++++++++------ drivers/gles1/rasterizer_gles1.h | 1 + platform/x11/os_x11.cpp | 8 ++--- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index c7dec5fa..2305f0f5 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -3575,6 +3575,7 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat // glDisable(GL_TEXTURE_GEN_S); // glDisable(GL_TEXTURE_GEN_T); + } else { glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); @@ -3583,13 +3584,14 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); ERR_FAIL_COND(!texture); - glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); glBindTexture( GL_TEXTURE_2D,texture->tex_id ); // tc0_id_cache = texture->tex_id; } else { - + glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_2D); } } @@ -4205,7 +4207,7 @@ Error RasterizerGLES1::_setup_geometry(const Geometry *p_geometry, const Materia } if (gl_texcoord_index[i] != -1) { - glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); + glClientActiveTexture(GL_TEXTURE0+client_tex_index); } glEnableClientState(gl_client_states[i]); @@ -4623,6 +4625,7 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve bool bind_baked_light_octree=false; bool bind_baked_lightmap=false; + bool normal_map = false; if (e->instance->sampled_light.is_valid()) { @@ -4677,9 +4680,9 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve Texture *tex = texture_owner.get(texid); if (tex) { - glEnable(GL_TEXTURE_2D); + // glEnable(GL_TEXTURE_2D); // glActiveTexture(GL_TEXTURE1); - glBindTexture(tex->target,tex->tex_id); //bind the texture + // glBindTexture(tex->target,tex->tex_id); //bind the texture // glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } @@ -4694,11 +4697,25 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve } } else { - glDisable(GL_TEXTURE_2D); + // glDisable(GL_TEXTURE_2D); } - + +// if(!normal_map) { +// +// // glActiveTexture(GL_TEXTURE1); +// // glClientActiveTexture(GL_TEXTURE1); +// glDisable(GL_TEXTURE_2D); +// } if (material!=prev_material || geometry_cmp!=prev_geometry_cmp) { - _setup_material(e->geometry,material);/* + + + // glDisable(GL_TEXTURE_2D); + _setup_material(e->geometry,material); + if(material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL].is_valid() && material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { + normal_map = true; + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + } + /* if(bind_baked_lightmap) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); @@ -4719,12 +4736,28 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve }; } - + client_tex_index = 0; if (geometry_cmp!=prev_geometry_cmp || prev_skeleton!=skeleton) { _setup_geometry(e->geometry, material,e->skeleton,e->instance->morph_values.ptr()); }; + if(normal_map) { + Texture *normal = texture_owner.get( material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL] ); + ERR_FAIL_COND(!normal); + + + + glActiveTexture(GL_TEXTURE1); + + glClientActiveTexture(GL_TEXTURE1); + glEnable(GL_TEXTURE_2D); + // _render(e->geometry, material, skeleton,e->owner); + client_tex_index = 1; + _setup_geometry(e->geometry, material,e->skeleton,e->instance->morph_values.ptr()); + glBindTexture( GL_TEXTURE_2D,normal->tex_id ); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + } // if (i==0 || light_key!=prev_light_key) { // printf("setup\n"); _setup_lights(e->lights,e->light_count); //dunno how inefficent is but it fixes lights @@ -4773,11 +4806,11 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve //bool changed_shader = material_shader.bind(); //if ( changed_shader && material->shader_cache && !material->shader_cache->params.empty()) // _setup_shader_params(material); - _render(e->geometry, material, skeleton,e->owner); + prev_material=material; prev_skeleton=skeleton; // prev_geometry=geometry; diff --git a/drivers/gles1/rasterizer_gles1.h b/drivers/gles1/rasterizer_gles1.h index 895cf70b..7cfee9d7 100644 --- a/drivers/gles1/rasterizer_gles1.h +++ b/drivers/gles1/rasterizer_gles1.h @@ -80,6 +80,7 @@ class RasterizerGLES1 : public Rasterizer { bool pack_arrays; bool use_reload_hooks; bool is_editor; + uint8_t client_tex_index = 0; Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 8a371603..4e44fef3 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -154,11 +154,11 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi context_gl = memnew( ContextGL_X11( x11_display, x11_window,current_videomode, false ) ); context_gl->initialize(); - if (p_video_driver == 0) { + // if (p_video_driver == 0) { rasterizer = memnew( RasterizerGLES1 ); - } else { - rasterizer = memnew( RasterizerGLES2 ); - }; + // } else { + // rasterizer = memnew( RasterizerGLES2 ); + // }; #endif visual_server = memnew( VisualServerRaster(rasterizer) ); From 6bfc512c3abb47474312650fd4998164d5c227bb Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Fri, 31 Jan 2025 22:01:42 +0100 Subject: [PATCH 11/15] GLES1 fixes --- drivers/gles1/rasterizer_gles1.cpp | 6 +---- drivers/gles1/rasterizer_gles1.h | 6 +++-- platform/vita/detect.py | 2 +- platform/vita/os_vita.cpp | 17 +++++++++++++ platform/vita/rasterizer_vita.cpp | 38 +++++++++++++++++++++++------- platform/vita/rasterizer_vita.h | 1 + scene/resources/material.cpp | 4 +++- scene/resources/material.h | 1 + servers/visual_server.h | 2 +- 9 files changed, 59 insertions(+), 18 deletions(-) diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index 2305f0f5..373afabc 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -6656,17 +6656,13 @@ void RasterizerGLES1::init() { s3tc_supported=false; _rinfo.texture_mem=0; - unsigned int* data; - - data = (GLuint *)calloc( 1, ((256 * 256)* 4 * sizeof(GLuint)) ); glGenTextures(1, &BlurTexture); glBindTexture(GL_TEXTURE_2D, BlurTexture); glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, - GL_RGBA, GL_UNSIGNED_BYTE, data); + GL_LUMINANCE, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - // free(data); TODO } void RasterizerGLES1::finish() { diff --git a/drivers/gles1/rasterizer_gles1.h b/drivers/gles1/rasterizer_gles1.h index 7cfee9d7..e61bb841 100644 --- a/drivers/gles1/rasterizer_gles1.h +++ b/drivers/gles1/rasterizer_gles1.h @@ -70,6 +70,7 @@ class RasterizerGLES1 : public Rasterizer { #endif GLuint BlurTexture; + GLuint reflect_texture; uint8_t *skinned_buffer; int skinned_buffer_size; @@ -81,7 +82,7 @@ class RasterizerGLES1 : public Rasterizer { bool use_reload_hooks; bool is_editor; uint8_t client_tex_index = 0; - + bool reflect = false; Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); @@ -753,7 +754,8 @@ class RasterizerGLES1 : public Rasterizer { RenderList opaque_render_list; RenderList alpha_render_list; - + // RenderList reflection_render_list; + RID default_material; struct FX { diff --git a/platform/vita/detect.py b/platform/vita/detect.py index 657ce116..254adf80 100644 --- a/platform/vita/detect.py +++ b/platform/vita/detect.py @@ -58,7 +58,7 @@ def configure(env): env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED']) env.Append(CPPFLAGS=['-DNEED_LONG_INT', '-D__psp2__', '-DVITA_ENABLED', '', '-DNO_SAFE_CAST', '-fno-rtti']) #'-DGLES2_ENABLED' - env.Append(LIBS=['z', "SceCtrl_stub", "SceAudio_stub","SceMotion_stub","SceCamera_stub","liblibIMGEGL_stub", "liblibgpu_es4_ext_stub","liblibGLESv1_CM_stub"]) + env.Append(LIBS=['z', "SceCtrl_stub", "SceAudio_stub","SceMotion_stub","SceCamera_stub","SceAppMgr_stub","taihen_stub","liblibIMGEGL_stub", "liblibgpu_es4_ext_stub","liblibGLESv1_CM_stub"]) # env.Append(LIBS=['z', "SceCtrl_stub", "SceAudio_stub","liblibGLESv2_stub","liblibIMGEGL_stub", "liblibgpu_es4_ext_stub"]) env.Append(LINKFLAGS=["-Wl,-q,-whole-archive", "-lpthread", "-Wl,-q,-no-whole-archive"]) diff --git a/platform/vita/os_vita.cpp b/platform/vita/os_vita.cpp index 49b8a69b..278e0ca7 100644 --- a/platform/vita/os_vita.cpp +++ b/platform/vita/os_vita.cpp @@ -59,6 +59,8 @@ extern "C" { #include #include +#include +#include #include #include @@ -118,6 +120,21 @@ void OS_VITA::initialize_core() { sceKernelLoadStartModule("vs0:sys/external/libfios2.suprx", 0, NULL, 0, NULL, NULL); sceKernelLoadStartModule("vs0:sys/external/libc.suprx", 0, NULL, 0, NULL, NULL); + + char title_id[0xA]; + char app_dir_path[0x100]; + char app_kernel_module_path[0x100]; + SceUID pid = -1; + pid = sceKernelGetProcessId(); + sceAppMgrAppParamGetString(pid, 12, title_id, sizeof(title_id)); + snprintf(app_dir_path, sizeof(app_dir_path), "ux0:app/%s", title_id); + snprintf(app_kernel_module_path, sizeof(app_kernel_module_path), "%s/module/libgpu_es4_kernel_ext.skprx", app_dir_path); + + SceUID res = taiLoadStartKernelModule(app_kernel_module_path, 0, NULL, 0); + if (res < 0) { + printf("Failed to load kernel module: %08x\n", res); + } + sceKernelLoadStartModule("app0:module/libgpu_es4_ext.suprx", 0, NULL, 0, NULL, NULL); sceKernelLoadStartModule("app0:module/libIMGEGL.suprx", 0, NULL, 0, NULL, NULL); diff --git a/platform/vita/rasterizer_vita.cpp b/platform/vita/rasterizer_vita.cpp index 3b09848f..a09084f5 100644 --- a/platform/vita/rasterizer_vita.cpp +++ b/platform/vita/rasterizer_vita.cpp @@ -3389,11 +3389,11 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); ERR_FAIL_COND(!texture); - glEnable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); glBindTexture( GL_TEXTURE_2D,texture->tex_id ); } else { - + glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_2D); } @@ -3988,7 +3988,7 @@ Error RasterizerGLES1::_setup_geometry(const Geometry *p_geometry, const Materia } if (gl_texcoord_index[i] != -1) { - glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); + glClientActiveTexture(GL_TEXTURE0+client_tex_index); } glEnableClientState(gl_client_states[i]); @@ -4331,6 +4331,7 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve bool bind_baked_light_octree=false; bool bind_baked_lightmap=false; + bool normal_map = false; if (e->instance->sampled_light.is_valid()) { @@ -4352,14 +4353,14 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve Texture *tex=texture_owner.get(baked_light->octree_texture); if (tex) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(tex->target,tex->tex_id); //bind the texture + // glActiveTexture(GL_TEXTURE0); + // glBindTexture(tex->target,tex->tex_id); //bind the texture } if (baked_light->light_texture.is_valid()) { Texture *texl=texture_owner.get(baked_light->light_texture); if (texl) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(texl->target,texl->tex_id); //bind the light texture + // glActiveTexture(GL_TEXTURE0); + // glBindTexture(texl->target,texl->tex_id); //bind the light texture } } @@ -4402,6 +4403,10 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve if (material!=prev_material || geometry->type!=prev_geometry_type) { _setup_material(e->geometry,material); + if(material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL].is_valid() && material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { + normal_map = true; + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + } _rinfo.mat_change_count++; //_setup_material_overrides(e->material,NULL,material_overrides); //_setup_material_skeleton(material,skeleton); @@ -4412,11 +4417,28 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve }; } - + client_tex_index = 0; if (geometry!=prev_geometry || geometry->type!=prev_geometry_type || prev_skeleton!=skeleton) { _setup_geometry(geometry, material,e->skeleton,e->instance->morph_values.ptr()); }; + if(normal_map) { + Texture *normal = texture_owner.get( material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL] ); + ERR_FAIL_COND(!normal); + + + + glActiveTexture(GL_TEXTURE1); + + glClientActiveTexture(GL_TEXTURE1); + glEnable(GL_TEXTURE_2D); + + // _render(e->geometry, material, skeleton,e->owner); + client_tex_index = 1; + _setup_geometry(e->geometry, material,e->skeleton,e->instance->morph_values.ptr()); + glBindTexture( GL_TEXTURE_2D,normal->tex_id ); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + } // if (i==0 || light_key!=prev_light_key) _setup_lights(e->lights,e->light_count); diff --git a/platform/vita/rasterizer_vita.h b/platform/vita/rasterizer_vita.h index 9fdcae74..720da7b7 100644 --- a/platform/vita/rasterizer_vita.h +++ b/platform/vita/rasterizer_vita.h @@ -80,6 +80,7 @@ class RasterizerGLES1 : public Rasterizer { bool pack_arrays; bool use_reload_hooks; bool is_editor; + uint8_t client_tex_index = 0; Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index fded780f..e68de284 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -375,7 +375,7 @@ void FixedMaterial::_bind_methods() { ObjectTypeDB::bind_method(_MD("set_point_size","size"),&FixedMaterial::set_point_size); ObjectTypeDB::bind_method(_MD("get_point_size"),&FixedMaterial::get_point_size); - + ADD_PROPERTYI( PropertyInfo( Variant::BOOL, "fixed_flags/use_reflection" ), _SCS("set_fixed_flag"), _SCS("get_fixed_flag"), FLAG_USE_REFLECTION); ADD_PROPERTYI( PropertyInfo( Variant::BOOL, "fixed_flags/use_alpha" ), _SCS("set_fixed_flag"), _SCS("get_fixed_flag"), FLAG_USE_ALPHA); ADD_PROPERTYI( PropertyInfo( Variant::BOOL, "fixed_flags/use_color_array" ), _SCS("set_fixed_flag"), _SCS("get_fixed_flag"), FLAG_USE_COLOR_ARRAY); ADD_PROPERTYI( PropertyInfo( Variant::BOOL, "fixed_flags/use_point_size" ), _SCS("set_fixed_flag"), _SCS("get_fixed_flag"), FLAG_USE_POINT_SIZE); @@ -416,6 +416,7 @@ void FixedMaterial::_bind_methods() { BIND_CONSTANT( TEXCOORD_UV_TRANSFORM ); BIND_CONSTANT( TEXCOORD_UV2 ); + BIND_CONSTANT( FLAG_USE_REFLECTION ); BIND_CONSTANT( FLAG_USE_ALPHA ); BIND_CONSTANT( FLAG_USE_COLOR_ARRAY ); BIND_CONSTANT( FLAG_USE_POINT_SIZE ); @@ -439,6 +440,7 @@ FixedMaterial::FixedMaterial() : Material(VS::get_singleton()->fixed_material_cr set_flag(FLAG_COLOR_ARRAY_SRGB,true); + fixed_flags[FLAG_USE_REFLECTION]=false; fixed_flags[FLAG_USE_ALPHA]=false; fixed_flags[FLAG_USE_COLOR_ARRAY]=false; fixed_flags[FLAG_USE_POINT_SIZE]=false; diff --git a/scene/resources/material.h b/scene/resources/material.h index e5c56d99..aab8b959 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -140,6 +140,7 @@ class FixedMaterial : public Material { }; enum FixedFlag { + FLAG_USE_REFLECTION=VS::FIXED_MATERIAL_FLAG_USE_REFLECTION, FLAG_USE_ALPHA=VS::FIXED_MATERIAL_FLAG_USE_ALPHA, FLAG_USE_COLOR_ARRAY=VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY, FLAG_USE_POINT_SIZE=VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE, diff --git a/servers/visual_server.h b/servers/visual_server.h index 87b139ba..aca7db4d 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -231,7 +231,7 @@ class VisualServer : public Object { }; enum FixedMaterialFlags { - + FIXED_MATERIAL_FLAG_USE_REFLECTION, FIXED_MATERIAL_FLAG_USE_ALPHA, FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY, FIXED_MATERIAL_FLAG_USE_POINT_SIZE, From 052cea789e172bace416aad91f6a28a3abe16d8e Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Wed, 18 Sep 2024 19:03:31 +0200 Subject: [PATCH 12/15] Started moving all gl1.x rasterizers to one - rasterizer_vita is gone --- drivers/gles1/rasterizer_gles1.cpp | 14 +- drivers/gles1/rasterizer_gles1.h | 6 +- platform/vita/SCsub | 3 +- platform/vita/os_vita.cpp | 4 +- platform/vita/rasterizer_vita.cpp | 6492 ---------------------------- platform/vita/rasterizer_vita.h | 1301 ------ 6 files changed, 18 insertions(+), 7802 deletions(-) delete mode 100644 platform/vita/rasterizer_vita.cpp delete mode 100644 platform/vita/rasterizer_vita.h diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index 373afabc..06df6228 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -26,7 +26,7 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifdef GLES1_ENABLED +#if defined(GLES1_ENABLED) || defined(__psp2__) #include "rasterizer_gles1.h" #include "os/os.h" @@ -3558,7 +3558,7 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat } - +#ifndef __psp2__ if(p_material->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ENVMAP] && p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP].is_valid()) { Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP] ); @@ -3580,6 +3580,7 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_2D); +#endif if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); @@ -3594,8 +3595,9 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_2D); } +#ifndef __psp2__ } - +#endif } @@ -4825,7 +4827,7 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve }; void RasterizerGLES1::_process_blur(int times, float inc) { - +#ifndef __psp2__ float spost = 0.0f; float alphainc = 0.9f / times; float alpha = 0.2f; @@ -4933,6 +4935,7 @@ void RasterizerGLES1::_process_blur(int times, float inc) { glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); +#endif } @@ -6594,9 +6597,10 @@ void RasterizerGLES1::init() { scene_pass=1; +#ifndef __psp2__ if (ContextGL::get_singleton()) ContextGL::get_singleton()->make_current(); - +#endif Set extensions; diff --git a/drivers/gles1/rasterizer_gles1.h b/drivers/gles1/rasterizer_gles1.h index e61bb841..64c70fd4 100644 --- a/drivers/gles1/rasterizer_gles1.h +++ b/drivers/gles1/rasterizer_gles1.h @@ -31,7 +31,7 @@ #include "servers/visual/rasterizer.h" -#ifdef GLES1_ENABLED +#if defined(GLES1_ENABLED) || defined(__psp2__) #include "image.h" #include "rid.h" @@ -62,7 +62,11 @@ class RasterizerGLES1 : public Rasterizer { MAX_SCENE_LIGHTS=2048, LIGHT_SPOT_BIT=0x80, DEFAULT_SKINNED_BUFFER_SIZE = 1024 * 1024, // 10k vertices +#ifdef __psp2__ + MAX_HW_LIGHTS = 8, //Yay! 8 Lights :blush: +#else MAX_HW_LIGHTS = 4, +#endif }; #ifdef PSP void glActiveTexture(int a1) { }; diff --git a/platform/vita/SCsub b/platform/vita/SCsub index d3e18697..94e76759 100644 --- a/platform/vita/SCsub +++ b/platform/vita/SCsub @@ -6,8 +6,9 @@ Import('env') common_vita=[\ "os_vita.cpp",\ - "rasterizer_vita.cpp",\ "audio_driver_vita.cpp",\ + #"rasterizer_vita.cpp",\ + #"immvertex.c",\ # ] diff --git a/platform/vita/os_vita.cpp b/platform/vita/os_vita.cpp index 278e0ca7..90613c6f 100644 --- a/platform/vita/os_vita.cpp +++ b/platform/vita/os_vita.cpp @@ -31,7 +31,7 @@ #endif #include "servers/visual/visual_server_raster.h" -#include "servers/visual/rasterizer_dummy.h" +// #include "servers/visual/rasterizer_dummy.h" #ifdef PSP2_GLES2 extern "C" { @@ -40,7 +40,7 @@ extern "C" { #include "drivers/gles2/rasterizer_gles2.h" #else -#include "rasterizer_vita.h" +#include "drivers/gles1/rasterizer_gles1.h" #endif #include "os_vita.h" #include diff --git a/platform/vita/rasterizer_vita.cpp b/platform/vita/rasterizer_vita.cpp deleted file mode 100644 index a09084f5..00000000 --- a/platform/vita/rasterizer_vita.cpp +++ /dev/null @@ -1,6492 +0,0 @@ -/*************************************************************************/ -/* rasterizer_gles1.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifdef __psp2__ - -#include "rasterizer_vita.h" -#include "os/os.h" -#include "globals.h" -#include -#include "drivers/gl_context/context_gl.h" -#include "servers/visual/shader_language.h" -#include "servers/visual/particle_system_sw.h" -#include "gl_context/context_gl.h" -#include - -_FORCE_INLINE_ static void _gl_load_transform(const Transform& tr) { - - GLfloat matrix[16]={ /* build a 16x16 matrix */ - tr.basis.elements[0][0], - tr.basis.elements[1][0], - tr.basis.elements[2][0], - 0, - tr.basis.elements[0][1], - tr.basis.elements[1][1], - tr.basis.elements[2][1], - 0, - tr.basis.elements[0][2], - tr.basis.elements[1][2], - tr.basis.elements[2][2], - 0, - tr.origin.x, - tr.origin.y, - tr.origin.z, - 1 - }; - - glLoadMatrixf(matrix); -}; - - -_FORCE_INLINE_ static void _gl_mult_transform(const Transform& tr) { - - GLfloat matrix[16]={ /* build a 16x16 matrix */ - tr.basis.elements[0][0], - tr.basis.elements[1][0], - tr.basis.elements[2][0], - 0, - tr.basis.elements[0][1], - tr.basis.elements[1][1], - tr.basis.elements[2][1], - 0, - tr.basis.elements[0][2], - tr.basis.elements[1][2], - tr.basis.elements[2][2], - 0, - tr.origin.x, - tr.origin.y, - tr.origin.z, - 1 - }; - - glMultMatrixf(matrix); -}; - -_FORCE_INLINE_ static void _gl_mult_transform(const Matrix32& tr) { - - GLfloat matrix[16]={ /* build a 16x16 matrix */ - tr.elements[0][0], - tr.elements[0][1], - 0, - 0, - tr.elements[1][0], - tr.elements[1][1], - 0, - 0, - 0, - 0, - 1, - 0, - tr.elements[2][0], - tr.elements[2][1], - 0, - 1 - }; - - glMultMatrixf(matrix); -}; - - -RasterizerGLES1::FX::FX() { - - bgcolor_active=false; - bgcolor=Color(0,1,0,1); - - skybox_active=false; - - glow_active=false; - glow_passes=4; - glow_attenuation=0.7; - glow_bloom=0.0; - - antialias_active=true; - antialias_tolerance=15; - - ssao_active=true; - ssao_attenuation=0.7; - ssao_radius=0.18; - ssao_max_distance=1.0; - ssao_range_min=0.25; - ssao_range_max=0.48; - ssao_only=false; - - - fog_active=false; - fog_near=5; - fog_far=100; - fog_attenuation=1.0; - fog_color_near=Color(1,1,1,1); - fog_color_far=Color(1,1,1,1); - fog_bg=false; - - toon_active=false; - toon_treshold=0.4; - toon_soft=0.001; - - edge_active=false; - edge_color=Color(0,0,0,1); - edge_size=1.0; - -} - -static const GLenum prim_type[]={GL_POINTS,GL_LINES,GL_TRIANGLES,GL_TRIANGLE_FAN}; - -static void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1) { - - ERR_FAIL_COND(!p_vertices); - ERR_FAIL_COND(p_points <1 || p_points>4); - - GLenum type = prim_type[p_points - 1]; - - - //if (!p_colors) { - // glColor4f(1, 1, 1, 1); - //}; - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(3, GL_FLOAT, 0, (GLvoid*)p_vertices); - - if (p_normals) { - - glEnableClientState(GL_NORMAL_ARRAY); - glNormalPointer(GL_FLOAT, 0, (GLvoid*)p_normals); - }; - - if (p_colors) { - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4,GL_FLOAT, 0, p_colors); - }; - - if (p_uvs) { -#ifndef PSP - glClientActiveTexture(GL_TEXTURE0); -#endif - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(3, GL_FLOAT, 0, p_uvs); - }; - - glDrawArrays( type, 0, p_points); - - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -}; - -/* TEXTURE API */ -#define _EXT_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 -#define _EXT_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 -#define _EXT_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 -#define _EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 -#define _EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define _EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define _EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#define _EXT_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define _EXT_COMPRESSED_RED_RGTC1 0x8DBB -#define _EXT_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC -#define _EXT_COMPRESSED_RG_RGTC2 0x8DBD -#define _EXT_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#define _EXT_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define _EXT_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define _EXT_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#define _EXT_ETC1_RGB8_OES 0x8D64 - -/* TEXTURE API */ - -Image RasterizerGLES1::_get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed) { - - r_has_alpha_cache=false; - r_compressed=false; - Image image=p_image; - - switch(p_format) { - - case Image::FORMAT_GRAYSCALE: { - r_gl_components=1; - r_gl_format=GL_LUMINANCE; - - } break; - case Image::FORMAT_INTENSITY: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGBA); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - } break; - case Image::FORMAT_GRAYSCALE_ALPHA: { - - //image.convert(Image::FORMAT_RGBA); - r_gl_components=2; - r_gl_format=GL_LUMINANCE_ALPHA; - r_has_alpha_cache=true; - } break; - - case Image::FORMAT_INDEXED: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGB); - r_gl_components=3; - r_gl_format=GL_RGB; - - } break; - - case Image::FORMAT_INDEXED_ALPHA: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGBA); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - - } break; - case Image::FORMAT_RGB: { - - r_gl_components=3; - r_gl_format=GL_RGB; - } break; - case Image::FORMAT_RGBA: { - - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - } break; - case Image::FORMAT_BC1: { - - r_gl_components=1; //doesn't matter much - r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT; - r_compressed=true; - - } break; - case Image::FORMAT_BC2: { - r_gl_components=1; //doesn't matter much - r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT3_EXT; - r_has_alpha_cache=true; - r_compressed=true; - - } break; - case Image::FORMAT_BC3: { - - r_gl_components=1; //doesn't matter much - r_gl_format=_EXT_COMPRESSED_RGBA_S3TC_DXT5_EXT; - r_has_alpha_cache=true; - r_compressed=true; - - } break; - case Image::FORMAT_BC4: { - - r_gl_format=_EXT_COMPRESSED_RED_RGTC1; - r_gl_components=1; //doesn't matter much - r_compressed=true; - - } break; - case Image::FORMAT_BC5: { - - r_gl_format=_EXT_COMPRESSED_RG_RGTC2; - r_gl_components=1; //doesn't matter much - r_compressed=true; - } break; - case Image::FORMAT_PVRTC2: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC2"); - - } else { - - r_gl_format=_EXT_COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC2"); - } - - } break; - case Image::FORMAT_PVRTC2_ALPHA: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC2A"); - - } else { - - r_gl_format=_EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC2A"); - } - - } break; - case Image::FORMAT_PVRTC4: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC4"); - } else { - - r_gl_format=_EXT_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC4"); - } - - } break; - case Image::FORMAT_PVRTC4_ALPHA: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - r_gl_components=4; - r_gl_format=GL_RGBA; - r_has_alpha_cache=true; - print_line("Load Compat PVRTC4A"); - - } else { - - r_gl_format=_EXT_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - r_gl_components=1; //doesn't matter much - r_compressed=true; - print_line("Load Normal PVRTC4A"); - } - - } break; - case Image::FORMAT_ETC: { - - if (!pvr_supported) { - - if (!image.empty()) - image.decompress(); - } else { - - r_gl_format=_EXT_ETC1_RGB8_OES; - r_gl_components=1; //doesn't matter much - r_compressed=true; - } - - } break; - case Image::FORMAT_YUV_422: - case Image::FORMAT_YUV_444: { - - if (!image.empty()) - image.convert(Image::FORMAT_RGB); - r_gl_format=GL_RGB; - r_gl_components=3; - - } break; - - default: { - - ERR_FAIL_V(Image()); - } - } - - return image; -} - - -RID RasterizerGLES1::texture_create() { - - Texture *texture = memnew(Texture); - ERR_FAIL_COND_V(!texture,RID()); - glGenTextures(1, &texture->tex_id); - texture->active=false; - texture->total_data_size=0; - - return texture_owner.make_rid( texture ); - -} - -void RasterizerGLES1::texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags) { - - bool has_alpha_cache; - int components; - GLenum format; - bool compressed; - - int po2_width = nearest_power_of_2(p_width); - int po2_height = nearest_power_of_2(p_height); - - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - texture->width=p_width; - texture->height=p_height; - texture->format=p_format; - texture->flags=p_flags; - texture->target = /*(p_flags & VS::TEXTURE_FLAG_CUBEMAP) ? GL_TEXTURE_CUBE_MAP :*/ GL_TEXTURE_2D; - - bool scale_textures = (!npo2_textures_available || p_format&VS::TEXTURE_FLAG_MIPMAPS); - - - if (scale_textures) { - texture->alloc_width = po2_width; - texture->alloc_height = po2_height; - } else { - - texture->alloc_width = texture->width; - texture->alloc_height = texture->height; - }; - - _get_gl_image_and_format(Image(),texture->format,texture->flags,format,components,has_alpha_cache,compressed); - - texture->gl_components_cache=components; - texture->gl_format_cache=format; - texture->format_has_alpha=has_alpha_cache; - texture->compressed=compressed; - texture->data_size=0; - - - glActiveTexture(GL_TEXTURE0); - glBindTexture(texture->target, texture->tex_id); - - - - - if (compressed) { - - glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_FALSE ); - } else { - if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) { - glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_TRUE ); - } else { - glTexParameteri( texture->target, GL_GENERATE_MIPMAP, GL_FALSE ); - } - - } - - - if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); - else - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - - if (texture->flags&VS::TEXTURE_FLAG_FILTER) { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering - - } else { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // raw Filtering - - } - bool force_clamp_to_edge = !(p_flags&VS::TEXTURE_FLAG_MIPMAPS) && (nearest_power_of_2(texture->alloc_height)!=texture->alloc_height || nearest_power_of_2(texture->alloc_width)!=texture->alloc_width); - - if (!force_clamp_to_edge && texture->flags&VS::TEXTURE_FLAG_REPEAT) { - - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - } else { - - //glTexParameterf( texture->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - } - - texture->active=true; -} - -void RasterizerGLES1::texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side) { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND(!texture); - ERR_FAIL_COND(!texture->active); - ERR_FAIL_COND(texture->format != p_image.get_format() ); - - int components; - GLenum format; - bool alpha; - bool compressed; - - if (keep_copies && !(texture->flags&VS::TEXTURE_FLAG_VIDEO_SURFACE) && !(use_reload_hooks && texture->reloader)) { - texture->image[p_cube_side]=p_image; - } - - - Image img = _get_gl_image_and_format(p_image, p_image.get_format(),texture->flags,format,components,alpha,compressed); - if (texture->alloc_width != img.get_width() || texture->alloc_height != img.get_height()) { - - img.resize(texture->alloc_width, texture->alloc_height, Image::INTERPOLATE_BILINEAR); - }; - - - GLenum blit_target = /*(texture->target == GL_TEXTURE_CUBE_MAP)?_cube_side_enum[p_cube_side]:*/GL_TEXTURE_2D; - - texture->data_size=img.get_data().size(); - DVector::Read read = img.get_data().read(); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(texture->target, texture->tex_id); - - int mipmaps=(texture->flags&VS::TEXTURE_FLAG_MIPMAPS && img.get_mipmaps()>0) ? img.get_mipmaps() +1 : 1; - - int w=img.get_width(); - int h=img.get_height(); - - int tsize=0; - for(int i=0;icompressed) { - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - glCompressedTexImage2D( blit_target, i, format,w,h,0,size,&read[ofs] ); - - } else { - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -// glTexImage2D(blit_target, i, format==GL_RGB?GL_RGB8:format, w, h, 0, format, GL_UNSIGNED_BYTE,&read[ofs]); - glTexImage2D(blit_target, i, format, w, h, 0, format, GL_UNSIGNED_BYTE,&read[ofs]); - //glTexSubImage2D( blit_target, i, 0,0,w,h,format,GL_UNSIGNED_BYTE,&read[ofs] ); - } - tsize+=size; - - w = MAX(1,w>>1); - h = MAX(1,h>>1); - - } - - _rinfo.texture_mem-=texture->total_data_size; - texture->total_data_size=tsize; - _rinfo.texture_mem+=texture->total_data_size; - - printf("texture: %i x %i - size: %i - total: %i\n",texture->width,texture->height,tsize,_rinfo.texture_mem); - - - if (mipmaps==1 && texture->flags&VS::TEXTURE_FLAG_MIPMAPS) { - glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE ); - - } else { - glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE ); - - } - - if (mipmaps>1) { - - //glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmaps-1 ); - assumed to have all, always - } - - //texture_set_flags(p_texture,texture->flags); - - -} - -Image RasterizerGLES1::texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,Image()); - ERR_FAIL_COND_V(!texture->active,Image()); - - return texture->image[p_cube_side]; -#if 0 - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,Image()); - ERR_FAIL_COND_V(!texture->active,Image()); - ERR_FAIL_COND_V(texture->data_size==0,Image()); - - DVector data; - GLenum format,type=GL_UNSIGNED_BYTE; - Image::Format fmt; - int pixelsize=0; - int pixelshift=0; - int minw=1,minh=1; - bool compressed=false; - - fmt=texture->format; - - switch(texture->format) { - - case Image::FORMAT_GRAYSCALE: { - - format=GL_LUMINANCE; - type=GL_UNSIGNED_BYTE; - data.resize(texture->alloc_width*texture->alloc_height); - pixelsize=1; - - } break; - case Image::FORMAT_INTENSITY: { - return Image(); - } break; - case Image::FORMAT_GRAYSCALE_ALPHA: { - - format=GL_LUMINANCE_ALPHA; - type=GL_UNSIGNED_BYTE; - pixelsize=2; - - } break; - case Image::FORMAT_RGB: { - format=GL_RGB; - type=GL_UNSIGNED_BYTE; - pixelsize=3; - } break; - case Image::FORMAT_RGBA: { - - format=GL_RGBA; - type=GL_UNSIGNED_BYTE; - pixelsize=4; - } break; - case Image::FORMAT_INDEXED: { - - format=GL_RGB; - type=GL_UNSIGNED_BYTE; - fmt=Image::FORMAT_RGB; - pixelsize=3; - } break; - case Image::FORMAT_INDEXED_ALPHA: { - - format=GL_RGBA; - type=GL_UNSIGNED_BYTE; - fmt=Image::FORMAT_RGBA; - pixelsize=4; - - } break; - case Image::FORMAT_BC1: { - - pixelsize=1; //doesn't matter much - format=GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - compressed=true; - pixelshift=1; - minw=minh=4; - - } break; - case Image::FORMAT_BC2: { - pixelsize=1; //doesn't matter much - format=GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - compressed=true; - minw=minh=4; - - } break; - case Image::FORMAT_BC3: { - - pixelsize=1; //doesn't matter much - format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - compressed=true; - minw=minh=4; - - } break; - case Image::FORMAT_BC4: { - - format=GL_COMPRESSED_RED_RGTC1; - pixelsize=1; //doesn't matter much - compressed=true; - pixelshift=1; - minw=minh=4; - - } break; - case Image::FORMAT_BC5: { - - format=GL_COMPRESSED_RG_RGTC2; - pixelsize=1; //doesn't matter much - compressed=true; - minw=minh=4; - - } break; - - default:{} - } - - data.resize(texture->data_size); - DVector::Write wb = data.write(); - - glActiveTexture(GL_TEXTURE0); - int ofs=0; - glBindTexture(texture->target,texture->tex_id); - - int w=texture->alloc_width; - int h=texture->alloc_height; - for(int i=0;imipmaps+1;i++) { - - if (compressed) { - - glPixelStorei(GL_PACK_ALIGNMENT, 4); - glGetCompressedTexImage(texture->target,i,&wb[ofs]); - - } else { - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glGetTexImage(texture->target,i,format,type,&wb[ofs]); - } - - int size = (w*h*pixelsize)>>pixelshift; - ofs+=size; - - w=MAX(minw,w>>1); - h=MAX(minh,h>>1); - - } - - - wb=DVector::Write(); - - Image img(texture->alloc_width,texture->alloc_height,texture->mipmaps,fmt,data); - - if (texture->formatalloc_width!=texture->width || texture->alloc_height!=texture->height)) - img.resize(texture->width,texture->height); - - return img; -#endif -} - -void RasterizerGLES1::texture_set_flags(RID p_texture,uint32_t p_flags) { - - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(texture->target, texture->tex_id); - uint32_t cube = texture->flags & VS::TEXTURE_FLAG_CUBEMAP; - texture->flags=p_flags|cube; // can't remove a cube from being a cube - - bool force_clamp_to_edge = !(p_flags&VS::TEXTURE_FLAG_MIPMAPS) && (nearest_power_of_2(texture->alloc_height)!=texture->alloc_height || nearest_power_of_2(texture->alloc_width)!=texture->alloc_width); - - if (!force_clamp_to_edge && texture->flags&VS::TEXTURE_FLAG_REPEAT) { - - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); - } else { - //glTexParameterf( texture->target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameterf( texture->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - - } - - - if (texture->flags&VS::TEXTURE_FLAG_FILTER) { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering - if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS) - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); - else - glTexParameteri(texture->target,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering - - } else { - - glTexParameteri(texture->target,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // nearest - } -} -uint32_t RasterizerGLES1::texture_get_flags(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return texture->flags; - -} -Image::Format RasterizerGLES1::texture_get_format(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,Image::FORMAT_GRAYSCALE); - - return texture->format; -} -uint32_t RasterizerGLES1::texture_get_width(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return texture->width; -} -uint32_t RasterizerGLES1::texture_get_height(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return texture->height; -} - -bool RasterizerGLES1::texture_has_alpha(RID p_texture) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND_V(!texture,0); - - return false; - -} - -void RasterizerGLES1::texture_set_size_override(RID p_texture,int p_width, int p_height) { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND(!texture); - - ERR_FAIL_COND(p_width<=0 || p_width>4096); - ERR_FAIL_COND(p_height<=0 || p_height>4096); - //real texture size is in alloc width and height - texture->width=p_width; - texture->height=p_height; - -} - -void RasterizerGLES1::texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const { - - Texture * texture = texture_owner.get(p_texture); - - ERR_FAIL_COND(!texture); - - texture->reloader=p_owner; - texture->reloader_func=p_function; - if (use_reload_hooks && p_owner && keep_copies) { - - for(int i=0;i<6;i++) - texture->image[i]=Image(); - } - - -} - -/* SHADER API */ - -/* SHADER API */ - -RID RasterizerGLES1::shader_create(VS::ShaderMode p_mode) { - - Shader *shader = memnew( Shader ); - shader->mode=p_mode; - shader->valid=false; - shader->has_alpha=false; - shader->fragment_line=0; - shader->vertex_line=0; - shader->light_line=0; - RID rid = shader_owner.make_rid(shader); - shader_set_mode(rid,p_mode); -// _shader_make_dirty(shader); - - return rid; - -} - - - -void RasterizerGLES1::shader_set_mode(RID p_shader,VS::ShaderMode p_mode) { - - ERR_FAIL_INDEX(p_mode,3); - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND(!shader); -// if (shader->custom_code_id && p_mode==shader->mode) -// return; - - shader->mode=p_mode; - -} -VS::ShaderMode RasterizerGLES1::shader_get_mode(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,VS::SHADER_MATERIAL); - return shader->mode; -} - - - -void RasterizerGLES1::shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs,int p_fragment_ofs,int p_light_ofs) { - - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND(!shader); - -#ifdef DEBUG_ENABLED - if (shader->vertex_code==p_vertex && shader->fragment_code==p_fragment && shader->light_code==p_light) - return; -#endif - shader->fragment_code=p_fragment; - shader->vertex_code=p_vertex; - shader->light_code=p_light; - shader->fragment_line=p_fragment_ofs; - shader->vertex_line=p_vertex_ofs; - shader->light_line=p_light_ofs; - -} - -String RasterizerGLES1::shader_get_vertex_code(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,String()); - return shader->vertex_code; - -} - -String RasterizerGLES1::shader_get_fragment_code(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,String()); - return shader->fragment_code; - -} - -String RasterizerGLES1::shader_get_light_code(RID p_shader) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND_V(!shader,String()); - return shader->light_code; - -} - -void RasterizerGLES1::shader_get_param_list(RID p_shader, List *p_param_list) const { - - Shader *shader=shader_owner.get(p_shader); - ERR_FAIL_COND(!shader); -#if 0 - - if (shader->dirty_list.in_list()) - _update_shader(shader); // ok should be not anymore dirty - - - Map order; - - - for(Map::Element *E=shader->uniforms.front();E;E=E->next()) { - - - order[E->get().order]=E->key(); - } - - - for(Map::Element *E=order.front();E;E=E->next()) { - - PropertyInfo pi; - ShaderLanguage::Uniform &u=shader->uniforms[E->get()]; - pi.name=E->get(); - switch(u.type) { - - case ShaderLanguage::TYPE_VOID: - case ShaderLanguage::TYPE_BOOL: - case ShaderLanguage::TYPE_FLOAT: - case ShaderLanguage::TYPE_VEC2: - case ShaderLanguage::TYPE_VEC3: - case ShaderLanguage::TYPE_MAT3: - case ShaderLanguage::TYPE_MAT4: - case ShaderLanguage::TYPE_VEC4: - pi.type=u.default_value.get_type(); - break; - case ShaderLanguage::TYPE_TEXTURE: - pi.type=Variant::_RID; - pi.hint=PROPERTY_HINT_RESOURCE_TYPE; - pi.hint_string="Texture"; - break; - case ShaderLanguage::TYPE_CUBEMAP: - pi.type=Variant::_RID; - pi.hint=PROPERTY_HINT_RESOURCE_TYPE; - pi.hint_string="Texture"; - break; - }; - - p_param_list->push_back(pi); - - } -#endif - -} - -/* COMMON MATERIAL API */ - - -RID RasterizerGLES1::material_create() { - - return material_owner.make_rid( memnew( Material ) ); -} - -void RasterizerGLES1::material_set_shader(RID p_material, RID p_shader) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->shader=p_shader; - -} - -RID RasterizerGLES1::material_get_shader(RID p_material) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,RID()); - return material->shader; -} - -#if 0 - -void RasterizerGLES1::_material_check_alpha(Material *p_material) { - - p_material->has_alpha=false; - Color diffuse=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; - if (diffuse.a<0.98) { - - p_material->has_alpha=true; - return; - } - - if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { - - Texture *tex = texture_owner.get(p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE]); - if (!tex) - return; - if (tex->has_alpha) { - - p_material->has_alpha=true; - return; - } - } -} - -#endif -void RasterizerGLES1::material_set_param(RID p_material, const StringName& p_param, const Variant& p_value) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - - if (p_value.get_type()==Variant::NIL) - material->shader_params.erase(p_param); - else - material->shader_params[p_param]=p_value; -} -Variant RasterizerGLES1::material_get_param(RID p_material, const StringName& p_param) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,Variant()); - - if (material->shader_params.has(p_param)) - return material->shader_params[p_param]; - else - return Variant(); -} - - -void RasterizerGLES1::material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - ERR_FAIL_INDEX(p_flag,VS::MATERIAL_FLAG_MAX); - material->flags[p_flag]=p_enabled; - -} -bool RasterizerGLES1::material_get_flag(RID p_material,VS::MaterialFlag p_flag) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,false); - ERR_FAIL_INDEX_V(p_flag,VS::MATERIAL_FLAG_MAX,false); - return material->flags[p_flag]; - - -} - -void RasterizerGLES1::material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->depth_draw_mode=p_mode; -} - -VS::MaterialDepthDrawMode RasterizerGLES1::material_get_depth_draw_mode(RID p_material) const{ - - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,VS::MATERIAL_DEPTH_DRAW_ALWAYS); - return material->depth_draw_mode; -} - - -void RasterizerGLES1::material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->blend_mode=p_mode; - -} -VS::MaterialBlendMode RasterizerGLES1::material_get_blend_mode(RID p_material) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,VS::MATERIAL_BLEND_MODE_ADD); - return material->blend_mode; -} - -void RasterizerGLES1::material_set_line_width(RID p_material,float p_line_width) { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND(!material); - material->line_width=p_line_width; - -} -float RasterizerGLES1::material_get_line_width(RID p_material) const { - - Material *material = material_owner.get(p_material); - ERR_FAIL_COND_V(!material,0); - - return material->line_width; -} - -/* FIXED MATERIAL */ - - -RID RasterizerGLES1::fixed_material_create() { - - return material_create(); -} - -void RasterizerGLES1::fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_flag, 3); - m->fixed_flags[p_flag]=p_enabled; -} - -bool RasterizerGLES1::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m,false); - ERR_FAIL_INDEX_V(p_flag,VS::FIXED_MATERIAL_FLAG_MAX, false); - return m->fixed_flags[p_flag]; -} - -void RasterizerGLES1::fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); - - m->parameters[p_parameter] = p_value; - -} - -Variant RasterizerGLES1::fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, Variant()); - ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, Variant()); - - return m->parameters[p_parameter]; -} - -void RasterizerGLES1::fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); - - m->textures[p_parameter] = p_texture; - -} -RID RasterizerGLES1::fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, RID()); - ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, Variant()); - - return m->textures[p_parameter]; -} - - -void RasterizerGLES1::fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - ERR_FAIL_INDEX(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX); - ERR_FAIL_INDEX(p_mode,4); - - m->texcoord_mode[p_parameter] = p_mode; -} - -VS::FixedMaterialTexCoordMode RasterizerGLES1::fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, VS::FIXED_MATERIAL_TEXCOORD_UV); - ERR_FAIL_INDEX_V(p_parameter, VisualServer::FIXED_MATERIAL_PARAM_MAX, VS::FIXED_MATERIAL_TEXCOORD_UV); - - return m->texcoord_mode[p_parameter]; // for now -} - -void RasterizerGLES1::fixed_material_set_uv_transform(RID p_material,const Transform& p_transform) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - - m->uv_transform = p_transform; -} - -Transform RasterizerGLES1::fixed_material_get_uv_transform(RID p_material) const { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, Transform()); - - return m->uv_transform; -} - -void RasterizerGLES1::fixed_material_set_point_size(RID p_material,float p_size) { - - Material *m=material_owner.get( p_material ); - ERR_FAIL_COND(!m); - m->point_size=p_size; - -} -float RasterizerGLES1::fixed_material_get_point_size(RID p_material) const { - - const Material *m=material_owner.get( p_material ); - ERR_FAIL_COND_V(!m, 0); - return m->point_size; -} - - -/* MESH API */ - - -RID RasterizerGLES1::mesh_create() { - - - return mesh_owner.make_rid( memnew( Mesh ) ); -} - - - -void RasterizerGLES1::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes,bool p_alpha_sort) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - - ERR_FAIL_INDEX( p_primitive, VS::PRIMITIVE_MAX ); - ERR_FAIL_COND(p_arrays.size()!=VS::ARRAY_MAX); - - uint32_t format=0; - - // validation - int index_array_len=0; - int array_len=0; - - for(int i=0;imorph_target_count>0) { - - use_VBO=false; - } - - surface->packed=pack_arrays && use_VBO; - - int total_elem_size=0; - - for (int i=0;iarray[i]; - ad.size=0; - ad.ofs=0; - int elem_size=0; - int elem_count=0; - bool valid_local=true; - GLenum datatype; - bool normalize=false; - bool bind=false; - - if (!(format&(1<packed) { - elem_size=3*sizeof(int16_t); // vertex - datatype=GL_SHORT; - normalize=true; - - } else { - elem_size=3*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=3; - - } break; - case VS::ARRAY_NORMAL: { - - if (surface->packed) { - elem_size=3*sizeof(int8_t); // vertex - datatype=GL_BYTE; - normalize=true; - } else { - elem_size=3*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=3; - } break; - case VS::ARRAY_TANGENT: { - if (surface->packed) { - elem_size=4*sizeof(int8_t); // vertex - datatype=GL_BYTE; - normalize=true; - } else { - elem_size=4*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=4; - - } break; - case VS::ARRAY_COLOR: { - - elem_size=4*sizeof(uint8_t); /* RGBA */ - datatype=GL_UNSIGNED_BYTE; - elem_count=4; - bind=true; - normalize=true; - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - if (surface->packed) { - elem_size=2*sizeof(int16_t); // vertex - datatype=GL_SHORT; - normalize=true; - } else { - elem_size=2*sizeof(GLfloat); // vertex - datatype=GL_FLOAT; - } - bind=true; - elem_count=2; - - } break; - case VS::ARRAY_WEIGHTS: { - - elem_size=VS::ARRAY_WEIGHTS_SIZE*sizeof(GLfloat); - elem_count=VS::ARRAY_WEIGHTS_SIZE; - valid_local=false; - datatype=GL_FLOAT; - - } break; - case VS::ARRAY_BONES: { - - elem_size=VS::ARRAY_WEIGHTS_SIZE*sizeof(GLuint); - elem_count=VS::ARRAY_WEIGHTS_SIZE; - valid_local=false; - datatype=GL_FLOAT; - - - } break; - case VS::ARRAY_INDEX: { - - if (index_array_len<=0) { - ERR_PRINT("index_array_len==NO_INDEX_ARRAY"); - break; - } - /* determine wether using 16 or 32 bits indices */ - elem_size=2; - datatype=GL_UNSIGNED_SHORT; - -/* - if (use_VBO) { - - glGenBuffers(1,&surface->index_id); - ERR_FAIL_COND(surface->index_id==0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id); - glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_len*elem_size,NULL,GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - } else { - surface->index_array_local = (uint8_t*)memalloc(index_array_len*elem_size); - }; -*/ - surface->index_array_len=index_array_len; // only way it can exist - ad.ofs=0; - ad.size=elem_size; - - - continue; - } break; - default: { - ERR_FAIL( ); - } - } - - ad.ofs=total_elem_size; - ad.size=elem_size; - ad.datatype=datatype; - ad.normalize=normalize; - ad.bind=bind; - ad.count=elem_count; - total_elem_size+=elem_size; - if (valid_local) { - surface->local_stride+=elem_size; - surface->morph_format|=(1<stride=total_elem_size; - surface->array_len=array_len; - surface->format=format; - surface->primitive=p_primitive; - surface->configured_format=0; - if (keep_copies) { - surface->data=p_arrays; - surface->morph_data=p_blend_shapes; - } - - uint8_t *array_ptr=NULL; - uint8_t *index_array_ptr=NULL; - DVector array_pre_vbo; - DVector::Write vaw; - DVector index_array_pre_vbo; - DVector::Write iaw; - - /* create pointers */ - if (use_VBO) { - - array_pre_vbo.resize(surface->array_len*surface->stride); - vaw = array_pre_vbo.write(); - array_ptr=vaw.ptr(); - - if (surface->index_array_len) { - - index_array_pre_vbo.resize(surface->index_array_len*surface->array[VS::ARRAY_INDEX].size); - iaw = index_array_pre_vbo.write(); - index_array_ptr=iaw.ptr(); - } - } else { - - surface->array_local = (uint8_t*)memalloc(surface->array_len*surface->stride); - array_ptr=(uint8_t*)surface->array_local; - if (surface->index_array_len) { - surface->index_array_local = (uint8_t*)memalloc(index_array_len*surface->array[VS::ARRAY_INDEX].size); - index_array_ptr=(uint8_t*)surface->index_array_local; - } - } - - - - _surface_set_arrays(surface,array_ptr,index_array_ptr,p_arrays,true); - - - /* create buffers!! */ - if (use_VBO) { - glGenBuffers(1,&surface->vertex_id); - ERR_FAIL_COND(surface->vertex_id==0); - glBindBuffer(GL_ARRAY_BUFFER,surface->vertex_id); - glBufferData(GL_ARRAY_BUFFER,surface->array_len*surface->stride,array_ptr,GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER,0); //unbind - if (surface->index_array_len) { - - glGenBuffers(1,&surface->index_id); - ERR_FAIL_COND(surface->index_id==0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,surface->index_id); - glBufferData(GL_ELEMENT_ARRAY_BUFFER,index_array_len*surface->array[VS::ARRAY_INDEX].size,index_array_ptr,GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - - } - } - - mesh->surfaces.push_back(surface); - -} - -Error RasterizerGLES1::_surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main) { - - uint32_t stride = p_main ? p_surface->stride : p_surface->local_stride; - - for(int ai=0;ai=p_arrays.size()) - break; - if (p_arrays[ai].get_type()==Variant::NIL) - continue; - Surface::ArrayData &a=p_surface->array[ai]; - - switch(ai) { - - - case VS::ARRAY_VERTEX: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const Vector3* src=read.ptr(); - - // setting vertices means regenerating the AABB - AABB aabb; - - float scale=1; - float max=0; - - - for (int i=0;iarray_len;i++) { - - - GLfloat vector[3]={ src[i].x, src[i].y, src[i].z }; - - copymem(&p_mem[a.ofs+i*stride], vector, a.size); - - if (i==0) { - - aabb=AABB(src[i],Vector3()); - } else { - - aabb.expand_to( src[i] ); - } - } - - if (p_main) { - p_surface->aabb=aabb; - p_surface->vertex_scale=scale; - } - - - } break; - case VS::ARRAY_NORMAL: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const Vector3* src=read.ptr(); - - // setting vertices means regenerating the AABB - - for (int i=0;iarray_len;i++) { - - - GLfloat vector[3]={ src[i].x, src[i].y, src[i].z }; - copymem(&p_mem[a.ofs+i*stride], vector, a.size); - - } - - - } break; - case VS::ARRAY_TANGENT: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len*4, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const real_t* src = read.ptr(); - - for (int i=0;iarray_len;i++) { - - GLfloat xyzw[4]={ - src[i*4+0], - src[i*4+1], - src[i*4+2], - src[i*4+3] - }; - - copymem(&p_mem[a.ofs+i*stride], xyzw, a.size); - - } - - } break; - case VS::ARRAY_COLOR: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::COLOR_ARRAY, ERR_INVALID_PARAMETER ); - - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - const Color* src = read.ptr(); - bool alpha=false; - - for (int i=0;iarray_len;i++) { - - if (src[i].a<0.98) // tolerate alpha a bit, for crappy exporters - alpha=true; - - uint8_t colors[4]; - - for(int j=0;j<4;j++) { - - colors[j]=CLAMP( int((src[i][j])*255.0), 0,255 ); - } - - copymem(&p_mem[a.ofs+i*stride], colors, a.size); - - } - - if (p_main) - p_surface->has_alpha=alpha; - - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::VECTOR3_ARRAY && p_arrays[ai].get_type() != Variant::VECTOR2_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len , ERR_INVALID_PARAMETER); - - DVector::Read read = array.read(); - - const Vector2 * src=read.ptr(); - float scale=1.0; - - - for (int i=0;iarray_len;i++) { - - GLfloat uv[2]={ src[i].x , src[i].y }; - - copymem(&p_mem[a.ofs+i*stride], uv, a.size); - - } - - if (p_main) { - - if (ai==VS::ARRAY_TEX_UV) { - - p_surface->uv_scale=scale; - } - if (ai==VS::ARRAY_TEX_UV2) { - - p_surface->uv2_scale=scale; - } - } - - } break; - case VS::ARRAY_BONES: - case VS::ARRAY_WEIGHTS: { - - - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::REAL_ARRAY, ERR_INVALID_PARAMETER ); - - DVector array = p_arrays[ai]; - - ERR_FAIL_COND_V( array.size() != p_surface->array_len*VS::ARRAY_WEIGHTS_SIZE, ERR_INVALID_PARAMETER ); - - - DVector::Read read = array.read(); - - const real_t * src = read.ptr(); - - p_surface->max_bone=0; - - for (int i=0;iarray_len;i++) { - - GLfloat data[VS::ARRAY_WEIGHTS_SIZE]; - for (int j=0;jmax_bone=MAX(data[j],p_surface->max_bone); - } - } - - copymem(&p_mem[a.ofs+i*stride], data, a.size); - - - } - - } break; - case VS::ARRAY_INDEX: { - - ERR_FAIL_COND_V( p_surface->index_array_len<=0, ERR_INVALID_DATA ); - ERR_FAIL_COND_V( p_arrays[ai].get_type() != Variant::INT_ARRAY, ERR_INVALID_PARAMETER ); - - DVector indices = p_arrays[ai]; - ERR_FAIL_COND_V( indices.size() == 0, ERR_INVALID_PARAMETER ); - ERR_FAIL_COND_V( indices.size() != p_surface->index_array_len, ERR_INVALID_PARAMETER ); - - /* determine wether using 16 or 32 bits indices */ - - DVector::Read read = indices.read(); - const int *src=read.ptr(); - - for (int i=0;iindex_array_len;i++) { - - - if (a.size==2) { - uint16_t v=src[i]; - - copymem(&p_index_mem[i*a.size], &v, a.size); - } else { - uint32_t v=src[i]; - - copymem(&p_index_mem[i*a.size], &v, a.size); - } - } - - - } break; - - - default: { ERR_FAIL_V(ERR_INVALID_PARAMETER);} - } - - p_surface->configured_format|=(1<surfaces.size(), Array() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, Array() ); - - return surface->data; - - -} -Array RasterizerGLES1::mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const{ - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,Array()); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), Array() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, Array() ); - - return surface->morph_data; - -} - - -void RasterizerGLES1::mesh_set_morph_target_count(RID p_mesh,int p_amount) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_COND( mesh->surfaces.size()!=0 ); - - mesh->morph_target_count=p_amount; - -} - -int RasterizerGLES1::mesh_get_morph_target_count(RID p_mesh) const{ - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - - return mesh->morph_target_count; - -} - -void RasterizerGLES1::mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode) { - - ERR_FAIL_INDEX(p_mode,2); - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - - mesh->morph_target_mode=p_mode; - -} - -VS::MorphTargetMode RasterizerGLES1::mesh_get_morph_target_mode(RID p_mesh) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,VS::MORPH_MODE_NORMALIZED); - - return mesh->morph_target_mode; - -} - - - -void RasterizerGLES1::mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_INDEX(p_surface, mesh->surfaces.size() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND( !surface); - - if (surface->material_owned && surface->material.is_valid()) - free(surface->material); - - surface->material_owned=p_owned; - - surface->material=p_material; -} - -RID RasterizerGLES1::mesh_surface_get_material(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,RID()); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), RID() ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, RID() ); - - return surface->material; -} - -int RasterizerGLES1::mesh_surface_get_array_len(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, -1 ); - - return surface->array_len; -} -int RasterizerGLES1::mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), -1 ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, -1 ); - - return surface->index_array_len; -} -uint32_t RasterizerGLES1::mesh_surface_get_format(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,0); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), 0 ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, 0 ); - - return surface->format; -} -VS::PrimitiveType RasterizerGLES1::mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,VS::PRIMITIVE_POINTS); - ERR_FAIL_INDEX_V(p_surface, mesh->surfaces.size(), VS::PRIMITIVE_POINTS ); - Surface *surface = mesh->surfaces[p_surface]; - ERR_FAIL_COND_V( !surface, VS::PRIMITIVE_POINTS ); - - return surface->primitive; -} - -void RasterizerGLES1::mesh_remove_surface(RID p_mesh,int p_index) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - ERR_FAIL_INDEX(p_index, mesh->surfaces.size() ); - Surface *surface = mesh->surfaces[p_index]; - ERR_FAIL_COND( !surface); - - if (mesh->morph_target_count) { - for(int i=0;imorph_target_count;i++) - memfree(surface->morph_targets_local[i].array); - memfree( surface->morph_targets_local ); - } - - memdelete( mesh->surfaces[p_index] ); - mesh->surfaces.remove(p_index); - -} -int RasterizerGLES1::mesh_get_surface_count(RID p_mesh) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,-1); - - return mesh->surfaces.size(); -} - -AABB RasterizerGLES1::mesh_get_aabb(RID p_mesh,RID p_skeleton) const { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,AABB()); - - if (mesh->custom_aabb!=AABB()) - return mesh->custom_aabb; - - AABB aabb; - - for (int i=0;isurfaces.size();i++) { - - if (i==0) - aabb=mesh->surfaces[i]->aabb; - else - aabb.merge_with(mesh->surfaces[i]->aabb); - } - - return aabb; -} - -void RasterizerGLES1::mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb) { - - Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND(!mesh); - - mesh->custom_aabb=p_aabb; - -} - -AABB RasterizerGLES1::mesh_get_custom_aabb(RID p_mesh) const { - - const Mesh *mesh = mesh_owner.get( p_mesh ); - ERR_FAIL_COND_V(!mesh,AABB()); - - return mesh->custom_aabb; -} - - -/* MULTIMESH API */ - -RID RasterizerGLES1::multimesh_create() { - - return multimesh_owner.make_rid( memnew( MultiMesh )); -} - -void RasterizerGLES1::multimesh_set_instance_count(RID p_multimesh,int p_count) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - - if (nearest_power_of_2(p_count)!=nearest_power_of_2(multimesh->elements.size())) { - if (multimesh->tex_id) { - glDeleteTextures(1,&multimesh->tex_id); - multimesh->tex_id=0; - } - - if (p_count) { - - uint32_t po2 = nearest_power_of_2(p_count); - if (po2&0xAAAAAAAA) { - //half width - - multimesh->tw=Math::sqrt(po2*2); - multimesh->th=multimesh->tw/2; - } else { - - multimesh->tw=Math::sqrt(po2); - multimesh->th=multimesh->tw; - - } - multimesh->tw*=4; - if (multimesh->th==0) - multimesh->th=1; - - - - glGenTextures(1, &multimesh->tex_id); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D,multimesh->tex_id); - -#ifdef GLEW_ENABLED - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, multimesh->tw, multimesh->th, 0, GL_RGBA, GL_FLOAT,NULL); -#else - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, multimesh->tw, multimesh->th, 0, GL_RGBA, GL_FLOAT,NULL); -#endif - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - //multimesh->pixel_size=1.0/ps; - - glBindTexture(GL_TEXTURE_2D,0); - } - - } - multimesh->elements.resize(p_count); - -} -int RasterizerGLES1::multimesh_get_instance_count(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,-1); - - return multimesh->elements.size(); -} - -void RasterizerGLES1::multimesh_set_mesh(RID p_multimesh,RID p_mesh) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - - multimesh->mesh=p_mesh; - -} -void RasterizerGLES1::multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - multimesh->aabb=p_aabb; -} -void RasterizerGLES1::multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - ERR_FAIL_INDEX(p_index,multimesh->elements.size()); - MultiMesh::Element &e=multimesh->elements[p_index]; - - e.matrix[0]=p_transform.basis.elements[0][0]; - e.matrix[1]=p_transform.basis.elements[1][0]; - e.matrix[2]=p_transform.basis.elements[2][0]; - e.matrix[3]=0; - e.matrix[4]=p_transform.basis.elements[0][1]; - e.matrix[5]=p_transform.basis.elements[1][1]; - e.matrix[6]=p_transform.basis.elements[2][1]; - e.matrix[7]=0; - e.matrix[8]=p_transform.basis.elements[0][2]; - e.matrix[9]=p_transform.basis.elements[1][2]; - e.matrix[10]=p_transform.basis.elements[2][2]; - e.matrix[11]=0; - e.matrix[12]=p_transform.origin.x; - e.matrix[13]=p_transform.origin.y; - e.matrix[14]=p_transform.origin.z; - e.matrix[15]=1; - -} -void RasterizerGLES1::multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh) - ERR_FAIL_INDEX(p_index,multimesh->elements.size()); - MultiMesh::Element &e=multimesh->elements[p_index]; - e.color[0]=CLAMP(p_color.r*255,0,255); - e.color[1]=CLAMP(p_color.g*255,0,255); - e.color[2]=CLAMP(p_color.b*255,0,255); - e.color[3]=CLAMP(p_color.a*255,0,255); - - -} - -RID RasterizerGLES1::multimesh_get_mesh(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,RID()); - - return multimesh->mesh; -} -AABB RasterizerGLES1::multimesh_get_aabb(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,AABB()); - - return multimesh->aabb; -} - -Transform RasterizerGLES1::multimesh_instance_get_transform(RID p_multimesh,int p_index) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,Transform()); - - ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Transform()); - MultiMesh::Element &e=multimesh->elements[p_index]; - - Transform tr; - - tr.basis.elements[0][0]=e.matrix[0]; - tr.basis.elements[1][0]=e.matrix[1]; - tr.basis.elements[2][0]=e.matrix[2]; - tr.basis.elements[0][1]=e.matrix[4]; - tr.basis.elements[1][1]=e.matrix[5]; - tr.basis.elements[2][1]=e.matrix[6]; - tr.basis.elements[0][2]=e.matrix[8]; - tr.basis.elements[1][2]=e.matrix[9]; - tr.basis.elements[2][2]=e.matrix[10]; - tr.origin.x=e.matrix[12]; - tr.origin.y=e.matrix[13]; - tr.origin.z=e.matrix[14]; - - return tr; -} -Color RasterizerGLES1::multimesh_instance_get_color(RID p_multimesh,int p_index) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,Color()); - ERR_FAIL_INDEX_V(p_index,multimesh->elements.size(),Color()); - MultiMesh::Element &e=multimesh->elements[p_index]; - Color c; - c.r=e.color[0]/255.0; - c.g=e.color[1]/255.0; - c.b=e.color[2]/255.0; - c.a=e.color[3]/255.0; - - return c; - -} - -void RasterizerGLES1::multimesh_set_visible_instances(RID p_multimesh,int p_visible) { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - multimesh->visible=p_visible; - -} - -int RasterizerGLES1::multimesh_get_visible_instances(RID p_multimesh) const { - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND_V(!multimesh,-1); - return multimesh->visible; - -} - -/* IMMEDIATE API */ - - -RID RasterizerGLES1::immediate_create() { - - Immediate *im = memnew( Immediate ); - return immediate_owner.make_rid(im); - -} - -void RasterizerGLES1::immediate_begin(RID p_immediate, VS::PrimitiveType p_rimitive, RID p_texture){ - - -} -void RasterizerGLES1::immediate_vertex(RID p_immediate,const Vector3& p_vertex){ - - -} -void RasterizerGLES1::immediate_normal(RID p_immediate,const Vector3& p_normal){ - - -} -void RasterizerGLES1::immediate_tangent(RID p_immediate,const Plane& p_tangent){ - - -} -void RasterizerGLES1::immediate_color(RID p_immediate,const Color& p_color){ - - -} -void RasterizerGLES1::immediate_uv(RID p_immediate,const Vector2& tex_uv){ - - -} -void RasterizerGLES1::immediate_uv2(RID p_immediate,const Vector2& tex_uv){ - - -} - -void RasterizerGLES1::immediate_end(RID p_immediate){ - - -} -void RasterizerGLES1::immediate_clear(RID p_immediate) { - - -} - -AABB RasterizerGLES1::immediate_get_aabb(RID p_immediate) const { - - return AABB(Vector3(-1,-1,-1),Vector3(2,2,2)); -} - -void RasterizerGLES1::immediate_set_material(RID p_immediate,RID p_material) { - - Immediate *im = immediate_owner.get(p_immediate); - ERR_FAIL_COND(!im); - im->material=p_material; -} - -RID RasterizerGLES1::immediate_get_material(RID p_immediate) const { - - const Immediate *im = immediate_owner.get(p_immediate); - ERR_FAIL_COND_V(!im,RID()); - return im->material; - -} - - -/* PARTICLES API */ - -RID RasterizerGLES1::particles_create() { - - Particles *particles = memnew( Particles ); - ERR_FAIL_COND_V(!particles,RID()); - return particles_owner.make_rid(particles); -} - -void RasterizerGLES1::particles_set_amount(RID p_particles, int p_amount) { - - ERR_FAIL_COND(p_amount<1); - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.amount=p_amount; - -} - -int RasterizerGLES1::particles_get_amount(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.amount; - -} - -void RasterizerGLES1::particles_set_emitting(RID p_particles, bool p_emitting) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.emitting=p_emitting;; - -} -bool RasterizerGLES1::particles_is_emitting(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,false); - return particles->data.emitting; - -} - -void RasterizerGLES1::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.visibility_aabb=p_visibility; - -} - -void RasterizerGLES1::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.emission_half_extents=p_half_extents; -} -Vector3 RasterizerGLES1::particles_get_emission_half_extents(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - - return particles->data.emission_half_extents; -} - -void RasterizerGLES1::particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.emission_base_velocity=p_base_velocity; -} - -Vector3 RasterizerGLES1::particles_get_emission_base_velocity(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - - return particles->data.emission_base_velocity; -} - - -void RasterizerGLES1::particles_set_emission_points(RID p_particles, const DVector& p_points) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.emission_points=p_points; -} - -DVector RasterizerGLES1::particles_get_emission_points(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,DVector()); - - return particles->data.emission_points; - -} - -void RasterizerGLES1::particles_set_gravity_normal(RID p_particles, const Vector3& p_normal) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - - particles->data.gravity_normal=p_normal; - -} -Vector3 RasterizerGLES1::particles_get_gravity_normal(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - - return particles->data.gravity_normal; -} - - -AABB RasterizerGLES1::particles_get_visibility_aabb(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,AABB()); - return particles->data.visibility_aabb; - -} - -void RasterizerGLES1::particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value) { - - ERR_FAIL_INDEX(p_variable,VS::PARTICLE_VAR_MAX); - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.particle_vars[p_variable]=p_value; - -} -float RasterizerGLES1::particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.particle_vars[p_variable]; -} - -void RasterizerGLES1::particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.particle_randomness[p_variable]=p_randomness; - -} -float RasterizerGLES1::particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.particle_randomness[p_variable]; - -} - -void RasterizerGLES1::particles_set_color_phases(RID p_particles, int p_phases) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_COND( p_phases<0 || p_phases>VS::MAX_PARTICLE_COLOR_PHASES ); - particles->data.color_phase_count=p_phases; - -} -int RasterizerGLES1::particles_get_color_phases(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.color_phase_count; -} - - -void RasterizerGLES1::particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos) { - - ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); - if (p_pos<0.0) - p_pos=0.0; - if (p_pos>1.0) - p_pos=1.0; - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.color_phases[p_phase].pos=p_pos; - -} -float RasterizerGLES1::particles_get_color_phase_pos(RID p_particles, int p_phase) const { - - ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, -1.0); - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.color_phases[p_phase].pos; - -} - -void RasterizerGLES1::particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color) { - - ERR_FAIL_INDEX(p_phase, VS::MAX_PARTICLE_COLOR_PHASES); - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.color_phases[p_phase].color=p_color; - - //update alpha - particles->has_alpha=false; - for(int i=0;idata.color_phases[i].color.a<0.99) - particles->has_alpha=true; - } - -} - -Color RasterizerGLES1::particles_get_color_phase_color(RID p_particles, int p_phase) const { - - ERR_FAIL_INDEX_V(p_phase, VS::MAX_PARTICLE_COLOR_PHASES, Color()); - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Color()); - return particles->data.color_phases[p_phase].color; - -} - -void RasterizerGLES1::particles_set_attractors(RID p_particles, int p_attractors) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_COND( p_attractors<0 || p_attractors>VisualServer::MAX_PARTICLE_ATTRACTORS ); - particles->data.attractor_count=p_attractors; - -} -int RasterizerGLES1::particles_get_attractors(RID p_particles) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,-1); - return particles->data.attractor_count; -} - -void RasterizerGLES1::particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); - particles->data.attractors[p_attractor].pos=p_pos;; -} -Vector3 RasterizerGLES1::particles_get_attractor_pos(RID p_particles,int p_attractor) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,Vector3()); - ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,Vector3()); - return particles->data.attractors[p_attractor].pos; -} - -void RasterizerGLES1::particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - ERR_FAIL_INDEX(p_attractor,particles->data.attractor_count); - particles->data.attractors[p_attractor].force=p_force; -} - -float RasterizerGLES1::particles_get_attractor_strength(RID p_particles,int p_attractor) const { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,0); - ERR_FAIL_INDEX_V(p_attractor,particles->data.attractor_count,0); - return particles->data.attractors[p_attractor].force; -} - -void RasterizerGLES1::particles_set_material(RID p_particles, RID p_material,bool p_owned) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - if (particles->material_owned && particles->material.is_valid()) - free(particles->material); - - particles->material_owned=p_owned; - - particles->material=p_material; - -} -RID RasterizerGLES1::particles_get_material(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,RID()); - return particles->material; - -} - -void RasterizerGLES1::particles_set_use_local_coordinates(RID p_particles, bool p_enable) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.local_coordinates=p_enable; - -} - -bool RasterizerGLES1::particles_is_using_local_coordinates(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,false); - return particles->data.local_coordinates; -} -bool RasterizerGLES1::particles_has_height_from_velocity(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,false); - return particles->data.height_from_velocity; -} - -void RasterizerGLES1::particles_set_height_from_velocity(RID p_particles, bool p_enable) { - - Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND(!particles); - particles->data.height_from_velocity=p_enable; - -} - -AABB RasterizerGLES1::particles_get_aabb(RID p_particles) const { - - const Particles* particles = particles_owner.get( p_particles ); - ERR_FAIL_COND_V(!particles,AABB()); - return particles->data.visibility_aabb; -} - -/* SKELETON API */ - -RID RasterizerGLES1::skeleton_create() { - - Skeleton *skeleton = memnew( Skeleton ); - ERR_FAIL_COND_V(!skeleton,RID()); - return skeleton_owner.make_rid( skeleton ); -} -void RasterizerGLES1::skeleton_resize(RID p_skeleton,int p_bones) { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND(!skeleton); - if (p_bones == skeleton->bones.size()) { - return; - }; - - skeleton->bones.resize(p_bones); - -} -int RasterizerGLES1::skeleton_get_bone_count(RID p_skeleton) const { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND_V(!skeleton, -1); - return skeleton->bones.size(); -} -void RasterizerGLES1::skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform) { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND(!skeleton); - ERR_FAIL_INDEX( p_bone, skeleton->bones.size() ); - - skeleton->bones[p_bone] = p_transform; -} - -Transform RasterizerGLES1::skeleton_bone_get_transform(RID p_skeleton,int p_bone) { - - Skeleton *skeleton = skeleton_owner.get( p_skeleton ); - ERR_FAIL_COND_V(!skeleton, Transform()); - ERR_FAIL_INDEX_V( p_bone, skeleton->bones.size(), Transform() ); - - // something - return skeleton->bones[p_bone]; -} - - -/* LIGHT API */ - -RID RasterizerGLES1::light_create(VS::LightType p_type) { - - Light *light = memnew( Light ); - light->type=p_type; - return light_owner.make_rid(light); -} - -VS::LightType RasterizerGLES1::light_get_type(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,VS::LIGHT_OMNI); - return light->type; -} - -void RasterizerGLES1::light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - ERR_FAIL_INDEX( p_type, 3 ); - light->colors[p_type]=p_color; -} -Color RasterizerGLES1::light_get_color(RID p_light,VS::LightColor p_type) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light, Color()); - ERR_FAIL_INDEX_V( p_type, 3, Color() ); - return light->colors[p_type]; -} - -void RasterizerGLES1::light_set_shadow(RID p_light,bool p_enabled) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - light->shadow_enabled=p_enabled; -} - -bool RasterizerGLES1::light_has_shadow(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,false); - return light->shadow_enabled; -} - -void RasterizerGLES1::light_set_volumetric(RID p_light,bool p_enabled) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - light->volumetric_enabled=p_enabled; - -} -bool RasterizerGLES1::light_is_volumetric(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,false); - return light->volumetric_enabled; -} - -void RasterizerGLES1::light_set_projector(RID p_light,RID p_texture) { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND(!light); - light->projector=p_texture; -} -RID RasterizerGLES1::light_get_projector(RID p_light) const { - - Light *light = light_owner.get(p_light); - ERR_FAIL_COND_V(!light,RID()); - return light->projector; -} - -void RasterizerGLES1::light_set_var(RID p_light, VS::LightParam p_var, float p_value) { - - Light * light = light_owner.get( p_light ); - ERR_FAIL_COND(!light); - ERR_FAIL_INDEX( p_var, VS::LIGHT_PARAM_MAX ); - - light->vars[p_var]=p_value; -} -float RasterizerGLES1::light_get_var(RID p_light, VS::LightParam p_var) const { - - Light * light = light_owner.get( p_light ); - ERR_FAIL_COND_V(!light,0); - - ERR_FAIL_INDEX_V( p_var, VS::LIGHT_PARAM_MAX,0 ); - - return light->vars[p_var]; -} - -void RasterizerGLES1::light_set_operator(RID p_light,VS::LightOp p_op) { - - Light * light = light_owner.get( p_light ); - ERR_FAIL_COND(!light); - - -}; - -VS::LightOp RasterizerGLES1::light_get_operator(RID p_light) const { - - return VS::LightOp(0); -}; - -void RasterizerGLES1::light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode) { - - -} - -VS::LightOmniShadowMode RasterizerGLES1::light_omni_get_shadow_mode(RID p_light) const{ - - return VS::LightOmniShadowMode(0); -} - -void RasterizerGLES1::light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode) { - - -} - -VS::LightDirectionalShadowMode RasterizerGLES1::light_directional_get_shadow_mode(RID p_light) const { - - return VS::LIGHT_DIRECTIONAL_SHADOW_ORTHOGONAL; -} - -void RasterizerGLES1::light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value) { - - -} - -float RasterizerGLES1::light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const { - - return 0; -} - - -AABB RasterizerGLES1::light_get_aabb(RID p_light) const { - - Light *light = light_owner.get( p_light ); - ERR_FAIL_COND_V(!light,AABB()); - - switch( light->type ) { - - case VS::LIGHT_SPOT: { - - float len=light->vars[VS::LIGHT_PARAM_RADIUS]; - float size=Math::tan(Math::deg2rad(light->vars[VS::LIGHT_PARAM_SPOT_ANGLE]))*len; - return AABB( Vector3( -size,-size,-len ), Vector3( size*2, size*2, len ) ); - } break; - case VS::LIGHT_OMNI: { - - float r = light->vars[VS::LIGHT_PARAM_RADIUS]; - return AABB( -Vector3(r,r,r), Vector3(r,r,r)*2 ); - } break; - case VS::LIGHT_DIRECTIONAL: { - - return AABB(); - } break; - default: {} - } - - ERR_FAIL_V( AABB() ); -} - - -RID RasterizerGLES1::light_instance_create(RID p_light) { - - Light *light = light_owner.get( p_light ); - ERR_FAIL_COND_V(!light, RID()); - - LightInstance *light_instance = memnew( LightInstance ); - - light_instance->light=p_light; - light_instance->base=light; - light_instance->last_pass=0; - - return light_instance_owner.make_rid( light_instance ); -} -void RasterizerGLES1::light_instance_set_transform(RID p_light_instance,const Transform& p_transform) { - - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND(!lighti); - lighti->transform=p_transform; - -} - -bool RasterizerGLES1::light_instance_has_shadow(RID p_light_instance) const { - - return false; - - /* - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND_V(!lighti, false); - - if (!lighti->base->shadow_enabled) - return false; - - if (lighti->base->type==VS::LIGHT_DIRECTIONAL) { - if (lighti->shadow_pass!=scene_pass) - return false; - - } else { - if (lighti->shadow_pass!=frame) - return false; - }*/ - - - - //return !lighti->shadow_buffers.empty(); - -} - - -bool RasterizerGLES1::light_instance_assign_shadow(RID p_light_instance) { - - return false; - -} - - -Rasterizer::ShadowType RasterizerGLES1::light_instance_get_shadow_type(RID p_light_instance) const { - - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND_V(!lighti,Rasterizer::SHADOW_NONE); - - switch(lighti->base->type) { - - case VS::LIGHT_DIRECTIONAL: return SHADOW_PSM; break; - case VS::LIGHT_OMNI: return SHADOW_DUAL_PARABOLOID; break; - case VS::LIGHT_SPOT: return SHADOW_SIMPLE; break; - } - - return Rasterizer::SHADOW_NONE; -} - -Rasterizer::ShadowType RasterizerGLES1::light_instance_get_shadow_type(RID p_light_instance,bool p_far) const { - - return SHADOW_NONE; -} -void RasterizerGLES1::light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { - - -} - -int RasterizerGLES1::light_instance_get_shadow_passes(RID p_light_instance) const { - - return 0; -} - -bool RasterizerGLES1::light_instance_get_pssm_shadow_overlap(RID p_light_instance) const { - - return false; -} - -void RasterizerGLES1::light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near,float p_split_far) { - - LightInstance *lighti = light_instance_owner.get( p_light_instance ); - ERR_FAIL_COND(!lighti); - - ERR_FAIL_COND(lighti->base->type!=VS::LIGHT_DIRECTIONAL); - ERR_FAIL_INDEX(p_index,1); - - lighti->custom_projection=p_camera; - lighti->custom_transform=p_transform; - -} -void RasterizerGLES1::shadow_clear_near() { - - -} - -bool RasterizerGLES1::shadow_allocate_near(RID p_light) { - - return false; -} - -bool RasterizerGLES1::shadow_allocate_far(RID p_light) { - - return false; -} - -/* PARTICLES INSTANCE */ - -RID RasterizerGLES1::particles_instance_create(RID p_particles) { - - ERR_FAIL_COND_V(!particles_owner.owns(p_particles),RID()); - ParticlesInstance *particles_instance = memnew( ParticlesInstance ); - ERR_FAIL_COND_V(!particles_instance, RID() ); - particles_instance->particles=p_particles; - return particles_instance_owner.make_rid(particles_instance); -} - -void RasterizerGLES1::particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform) { - - ParticlesInstance *particles_instance=particles_instance_owner.get(p_particles_instance); - ERR_FAIL_COND(!particles_instance); - particles_instance->transform=p_transform; -} - - -/* RENDER API */ -/* all calls (inside begin/end shadow) are always warranted to be in the following order: */ - - -RID RasterizerGLES1::viewport_data_create() { - - return RID(); -} - -RID RasterizerGLES1::render_target_create(){ - - return RID(); - -} -void RasterizerGLES1::render_target_set_size(RID p_render_target, int p_width, int p_height){ - - -} -RID RasterizerGLES1::render_target_get_texture(RID p_render_target) const{ - - return RID(); - -} -bool RasterizerGLES1::render_target_renedered_in_frame(RID p_render_target){ - - return false; -} - - -void RasterizerGLES1::begin_frame() { - - - window_size = Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height ); - //print_line("begin frame - winsize: "+window_size); - - double time = (OS::get_singleton()->get_ticks_usec()/1000); // get msec - time/=1000.0; // make secs - time_delta=time-last_time; - last_time=time; - frame++; - clear_viewport(Color(1,0,0.5)); - - _rinfo.vertex_count=0; - _rinfo.object_count=0; - _rinfo.mat_change_count=0; - _rinfo.shader_change_count=0; - - -// material_shader.set_uniform_default(MaterialShaderGLES1::SCREENZ_SCALE, Math::fmod(time, 3600.0)); - /* nehe ?*/ - -// glClearColor(0,0,1,1); -// glClear(GL_COLOR_BUFFER_BIT); //should not clear if anything else cleared.. -} - -void RasterizerGLES1::capture_viewport(Image* r_capture) { - - -} - - -void RasterizerGLES1::clear_viewport(const Color& p_color) { - - glScissor( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - glEnable(GL_SCISSOR_TEST); - glClearColor(p_color.r,p_color.g,p_color.b,p_color.a); - glClear(GL_COLOR_BUFFER_BIT); //should not clear if anything else cleared.. - glDisable(GL_SCISSOR_TEST); - -}; - -void RasterizerGLES1::set_viewport(const VS::ViewportRect& p_viewport) { - - - - viewport=p_viewport; - //print_line("viewport: "+itos(p_viewport.x)+","+itos(p_viewport.y)+","+itos(p_viewport.width)+","+itos(p_viewport.height)); - is_editor = VS::get_singleton()->get_editor(); - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); -} - -void RasterizerGLES1::set_render_target(RID p_render_target, bool p_transparent_bg, bool p_vflip) { - - -} - - -void RasterizerGLES1::begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug) { - - - opaque_render_list.clear(); - alpha_render_list.clear(); - light_instance_count=0; - scene_fx = NULL; // p_env.is_valid() ? fx_owner.get(p_env) : NULL; - scene_pass++; - last_light_id=0; - directional_light_count=0; - current_env = environment_owner.get(p_env); - - //set state - - glCullFace(GL_FRONT); - cull_front=true; -}; - -void RasterizerGLES1::begin_shadow_map( RID p_light_instance, int p_shadow_pass ) { - -} - -void RasterizerGLES1::set_camera(const Transform& p_world,const CameraMatrix& p_projection) { - - camera_transform=p_world; - camera_transform_inverse=camera_transform.inverse(); - camera_projection=p_projection; - camera_plane = Plane( camera_transform.origin, camera_transform.basis.get_axis(2) ); - camera_z_near=camera_projection.get_z_near(); - camera_z_far=camera_projection.get_z_far(); - camera_projection.get_viewport_size(camera_vp_size.x,camera_vp_size.y); -} - -void RasterizerGLES1::add_light( RID p_light_instance ) { - -#define LIGHT_FADE_TRESHOLD 0.05 - - ERR_FAIL_COND( light_instance_count >= MAX_SCENE_LIGHTS ); - - LightInstance *li = light_instance_owner.get(p_light_instance); - ERR_FAIL_COND(!li); - - - /* make light hash */ - - // actually, not really a hash, but helps to sort the lights - // and avoid recompiling redudant shader versions - - - li->last_pass=scene_pass; - li->sort_key=light_instance_count; - - switch(li->base->type) { - - case VisualServer::LIGHT_DIRECTIONAL: { - - li->light_vector = camera_transform_inverse.basis.xform(li->transform.basis.get_axis(2)).normalized(); - if (directional_light_countbase->vars[VisualServer::LIGHT_PARAM_RADIUS]; - if (radius==0) - radius=0.0001; - li->linear_att=(1/LIGHT_FADE_TRESHOLD)/radius; - li->light_vector = camera_transform_inverse.xform(li->transform.origin); - - } break; - case VisualServer::LIGHT_SPOT: { - - float radius = li->base->vars[VisualServer::LIGHT_PARAM_RADIUS]; - if (radius==0) - radius=0.0001; - li->linear_att=(1/LIGHT_FADE_TRESHOLD)/radius; - li->light_vector = camera_transform_inverse.xform(li->transform.origin); - li->spot_vector = -camera_transform_inverse.basis.xform(li->transform.basis.get_axis(2)).normalized(); - //li->sort_key|=LIGHT_SPOT_BIT; // this way, omnis go first, spots go last and less shader versions are generated - - /* - if (li->base->projector.is_valid()) { - - float far = li->base->vars[ VS::LIGHT_VAR_RADIUS ]; - ERR_FAIL_COND( far<=0 ); - float near= far/200.0; - if (near<0.05) - near=0.05; - - float angle = li->base->vars[ VS::LIGHT_VAR_SPOT_ANGLE ]; - - //CameraMatrix proj; - //proj.set_perspective( angle*2.0, 1.0, near, far ); - - //Transform modelview=Transform(camera_transform_inverse * li->transform).inverse(); - //li->projector_mtx= proj * modelview; - - }*/ - } break; - } - - light_instances[light_instance_count++]=li; - -} - -void RasterizerGLES1::_add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner) { - - Material *m=NULL; - RID m_src=p_instance->material_override.is_valid() ? p_instance->material_override : p_geometry->material; - - if (m_src) - m=material_owner.get( m_src ); - - if (!m) { - m=material_owner.get( default_material ); - } - - ERR_FAIL_COND(!m); - - - if (m->last_pass!=frame) { - - m->last_pass=frame; - } - - - LightInstance *lights[RenderList::MAX_LIGHTS]; - int light_count=0; - - RenderList *render_list=&opaque_render_list; - if (m->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ALPHA] || m->blend_mode!=VS::MATERIAL_BLEND_MODE_MIX) { - render_list = &alpha_render_list; - }; - - if (!m->flags[VS::MATERIAL_FLAG_UNSHADED]) { - - int lis = p_instance->light_instances.size(); - - for(int i=0;i=RenderList::MAX_LIGHTS) - break; - - LightInstance *li=light_instance_owner.get( p_instance->light_instances[i] ); - - if (!li || li->last_pass!=scene_pass) //lit by light not in visible scene - continue; - lights[light_count++]=li; - } - } - - RenderList::Element *e = render_list->add_element(); - - e->geometry=p_geometry; -// e->geometry_cmp=p_geometry_cmp; - e->material=m; - e->instance=p_instance; - //e->depth=camera_plane.distance_to(p_world->origin); - e->depth=camera_transform.origin.distance_to(p_instance->transform.origin); - e->owner=p_owner; - if (p_instance->skeleton.is_valid()) - e->skeleton=skeleton_owner.get(p_instance->skeleton); - else - e->skeleton=NULL; - e->mirror=p_instance->mirror; - if (m->flags[VS::MATERIAL_FLAG_INVERT_FACES]) - e->mirror=!e->mirror; - - e->light_key=0; - e->light_count=0; - - - if (!shadow) { - - - if (m->flags[VS::MATERIAL_FLAG_UNSHADED]) { - - - e->light_key--; //special key for all the shadeless people - } else if (light_count) { - - for(int i=0;ilights[i]=lights[i]->sort_key; - } - - e->light_count=light_count; - int poslight_count=light_count; - if (poslight_count>1) { - SortArray light_sort; - light_sort.sort(&e->lights[0],poslight_count); //generate an equal sort key - } - } - - } - -} - - -void RasterizerGLES1::add_mesh( const RID& p_mesh, const InstanceData *p_data) { - - Mesh *mesh = mesh_owner.get(p_mesh); - ERR_FAIL_COND(!mesh); - - int ssize = mesh->surfaces.size(); - - for (int i=0;isurfaces[i]; - _add_geometry(s,p_data,s,NULL); - } - - mesh->last_pass=frame; - -} - -void RasterizerGLES1::add_multimesh( const RID& p_multimesh, const InstanceData *p_data){ - - MultiMesh *multimesh = multimesh_owner.get(p_multimesh); - ERR_FAIL_COND(!multimesh); - - if (!multimesh->mesh.is_valid()) - return; - if (multimesh->elements.empty()) - return; - - Mesh *mesh = mesh_owner.get(multimesh->mesh); - ERR_FAIL_COND(!mesh); - - int surf_count = mesh->surfaces.size(); - if (multimesh->last_pass!=scene_pass) { - - multimesh->cache_surfaces.resize(surf_count); - for(int i=0;icache_surfaces[i].material=mesh->surfaces[i]->material; - multimesh->cache_surfaces[i].has_alpha=mesh->surfaces[i]->has_alpha; - multimesh->cache_surfaces[i].surface=mesh->surfaces[i]; - } - - multimesh->last_pass=scene_pass; - } - - for(int i=0;icache_surfaces[i],p_data,multimesh->cache_surfaces[i].surface,multimesh); - } - - -} - -void RasterizerGLES1::add_particles( const RID& p_particle_instance, const InstanceData *p_data){ - - //print_line("adding particles"); - ParticlesInstance *particles_instance = particles_instance_owner.get(p_particle_instance); - ERR_FAIL_COND(!particles_instance); - Particles *p=particles_owner.get( particles_instance->particles ); - ERR_FAIL_COND(!p); - - _add_geometry(p,p_data,p,particles_instance); - -} - - -void RasterizerGLES1::_set_cull(bool p_front,bool p_reverse_cull) { - - bool front = p_front; - if (p_reverse_cull) - front=!front; - - if (front!=cull_front) { - - glCullFace(front?GL_FRONT:GL_BACK); - cull_front=front; - } -} - - -void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Material *p_material) { - - if (!shadow) { - - ///ambient @TODO offer global ambient group option - - //GLenum side = use_shaders?GL_FRONT:GL_FRONT_AND_BACK; - GLenum side = GL_FRONT_AND_BACK; - - - ///diffuse - Color diffuse_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_DIFFUSE]; - float diffuse_rgba[4]={ - diffuse_color.r, - diffuse_color.g, - diffuse_color.b, - diffuse_color.a - }; - - //color array overrides this - glColor4f( diffuse_rgba[0],diffuse_rgba[1],diffuse_rgba[2],diffuse_rgba[3]); - last_color=diffuse_color; - if(current_env) { - switch((int)current_env->group[0]) { - case VS::ENV_GROUP_SAME: { - glMaterialfv(side,GL_AMBIENT, diffuse_rgba); - break; - } - case VS::ENV_GROUP_NONE: { - break; - } - case VS::ENV_GROUP_HALF: { - float ambient_rgba[4]={ - diffuse_color.r / 2, - diffuse_color.g / 2, - diffuse_color.b / 2, - 1.0 - }; - glMaterialfv(side,GL_AMBIENT, ambient_rgba); - break; - } - case VS::ENV_GROUP_COLOR: { - Color c = current_env->group[VS::ENV_GROUP_COLOR]; - float ambient_rgba2[4] = { - c.r, - c.g, - c.b, - c.a - }; - glMaterialfv(side,GL_AMBIENT, ambient_rgba2); - break; - } - case 0: { - glMaterialfv(side,GL_AMBIENT, diffuse_rgba); - break; - } - default: { - break; - } - } - } else { - glMaterialfv(side,GL_AMBIENT, diffuse_rgba); - } - glMaterialfv(side,GL_DIFFUSE,diffuse_rgba); - // | GU_SPECULARspecular - - const Color specular_color=p_material->parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR]; - float specular_rgba[4]={ - specular_color.r, - specular_color.g, - specular_color.b, - 1.0 - }; - - glMaterialfv(side,GL_SPECULAR,specular_rgba); - - const Color emission=p_material->parameters[VS::FIXED_MATERIAL_PARAM_EMISSION]; - - - float emission_rgba[4]={ - emission.r, - emission.g, - emission.b, - 1.0 //p_material->parameters[VS::FIXED_MATERIAL_PARAM_DETAIL_MIX] - }; - - glMaterialfv(side,GL_EMISSION,emission_rgba); - - glMaterialf(side,GL_SHININESS,p_material->parameters[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]); - - Plane sparams=p_material->parameters[VS::FIXED_MATERIAL_PARAM_SHADE_PARAM]; - //depth test? - - - } - - - if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { - - Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE] ); - ERR_FAIL_COND(!texture); - glActiveTexture(GL_TEXTURE0); - glEnable(GL_TEXTURE_2D); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - } else { - glActiveTexture(GL_TEXTURE0); - glDisable(GL_TEXTURE_2D); - } - -} - -void RasterizerGLES1::_setup_material(const Geometry *p_geometry,const Material *p_material) { - - if (p_material->flags[VS::MATERIAL_FLAG_DOUBLE_SIDED]) - glDisable(GL_CULL_FACE); - else { - glEnable(GL_CULL_FACE); - } - -/* if (p_material->flags[VS::MATERIAL_FLAG_WIREFRAME]) - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);*/ - - if (p_material->line_width > 0) - glLineWidth(p_material->line_width); - - if (!shadow) { - - - if (blend_mode!=p_material->blend_mode) { - switch(p_material->blend_mode) { - - - case VS::MATERIAL_BLEND_MODE_MIX: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - case VS::MATERIAL_BLEND_MODE_ADD: { - - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - - } break; - case VS::MATERIAL_BLEND_MODE_SUB: { - - //glBlendEquation(GL_FUNC_SUBTRACT); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - } break; - case VS::MATERIAL_BLEND_MODE_MUL: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - - } - blend_mode=p_material->blend_mode; - } - - if (lighting!=!p_material->flags[VS::MATERIAL_FLAG_UNSHADED]) { - if (p_material->flags[VS::MATERIAL_FLAG_UNSHADED]) { - glDisable(GL_LIGHTING); - } else { - glEnable(GL_LIGHTING); - } - lighting=!p_material->flags[VS::MATERIAL_FLAG_UNSHADED]; - } - - } - - bool current_depth_write=p_material->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_ALWAYS; //broken - bool current_depth_test=!p_material->flags[VS::MATERIAL_FLAG_ONTOP]; - - - _setup_fixed_material(p_geometry,p_material); - - if (current_depth_write!=depth_write) { - - depth_write=current_depth_write; - glDepthMask(depth_write); - } - - if (current_depth_test!=depth_test) { - - depth_test=current_depth_test; - if (depth_test) - glEnable(GL_DEPTH_TEST); - else - glDisable(GL_DEPTH_TEST);; - } -} -/* -static const MaterialShaderGLES1::Conditionals _gl_light_version[4][3]={ - {MaterialShaderGLES1::LIGHT_0_DIRECTIONAL,MaterialShaderGLES1::LIGHT_0_OMNI,MaterialShaderGLES1::LIGHT_0_SPOT}, - {MaterialShaderGLES1::LIGHT_1_DIRECTIONAL,MaterialShaderGLES1::LIGHT_1_OMNI,MaterialShaderGLES1::LIGHT_1_SPOT}, - {MaterialShaderGLES1::LIGHT_2_DIRECTIONAL,MaterialShaderGLES1::LIGHT_2_OMNI,MaterialShaderGLES1::LIGHT_2_SPOT}, - {MaterialShaderGLES1::LIGHT_3_DIRECTIONAL,MaterialShaderGLES1::LIGHT_3_OMNI,MaterialShaderGLES1::LIGHT_3_SPOT} -}; - -static const MaterialShaderGLES1::Conditionals _gl_light_shadow[4]={ - MaterialShaderGLES1::LIGHT_0_SHADOW, - MaterialShaderGLES1::LIGHT_1_SHADOW, - MaterialShaderGLES1::LIGHT_2_SHADOW, - MaterialShaderGLES1::LIGHT_3_SHADOW -}; -*/ - - -void RasterizerGLES1::_setup_light(LightInstance* p_instance, int p_idx) { - - Light* ld = p_instance->base; - -// material_shader.set_conditional(MaterialShaderGLES1::LIGHT_0_DIRECTIONAL, true); - - //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_DIFFUSE, ld->colors[VS::LIGHT_COLOR_DIFFUSE]); - //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_SPECULAR, ld->colors[VS::LIGHT_COLOR_SPECULAR]); - //material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_AMBIENT, ld->colors[VS::LIGHT_COLOR_AMBIENT]); - - GLenum glid = GL_LIGHT0+p_idx; - - Color diff_color = ld->colors[VS::LIGHT_COLOR_DIFFUSE]; - float emult = ld->vars[VS::LIGHT_PARAM_ENERGY]; - - if (ld->type!=VS::LIGHT_DIRECTIONAL) - emult*=4.0; - - GLfloat diffuse_sdark[4]={ - diff_color.r*emult, - diff_color.g*emult, - diff_color.b*emult, - 1.0 - }; - - glLightfv(glid , GL_DIFFUSE, diffuse_sdark); - - Color amb_color = Color(0,0,0); - GLfloat amb_stexsize[4]={ - amb_color.r, - amb_color.g, - amb_color.b, - 1.0 - }; - - glLightfv(glid , GL_AMBIENT, amb_stexsize ); - - Color spec_color = ld->colors[VS::LIGHT_COLOR_SPECULAR]; - GLfloat spec_op[4]={ - spec_color.r, - spec_color.g, - spec_color.b, - 1.0 - }; - - glLightfv(glid , GL_SPECULAR, spec_op ); - - switch(ld->type) { - - case VS::LIGHT_DIRECTIONAL: { - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - glLightf(glid,GL_CONSTANT_ATTENUATION, 1); - glLightf(glid,GL_LINEAR_ATTENUATION, 0); - glLightf(glid,GL_QUADRATIC_ATTENUATION,0); // energy - - float lightdir[4]={ - p_instance->light_vector.x, - p_instance->light_vector.y, - p_instance->light_vector.z, - 0.0 - }; - - glLightfv(glid,GL_POSITION,lightdir); //at modelview - glLightf(glid,GL_SPOT_CUTOFF,180.0); - glLightf(glid,GL_SPOT_EXPONENT, 0); - - float sdir[4]={ - 0, - 0, - -1, - 0 - }; - - glLightfv(glid,GL_SPOT_DIRECTION,sdir); //at modelview - -// material_shader.set_uniform_default(MaterialShaderGLES1::LIGHT_0_DIRECTION, p_instance->light_vector); - glPopMatrix(); - - } break; - - case VS::LIGHT_OMNI: { - - - glLightf(glid,GL_SPOT_CUTOFF,180.0); - glLightf(glid,GL_SPOT_EXPONENT, 0); - - - glLightf(glid,GL_CONSTANT_ATTENUATION, 0); - glLightf(glid,GL_LINEAR_ATTENUATION, p_instance->linear_att); - glLightf(glid,GL_QUADRATIC_ATTENUATION, 0); // wut? - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - float lightpos[4]={ - p_instance->light_vector.x, - p_instance->light_vector.y, - p_instance->light_vector.z, - 1.0 - }; - - glLightfv(glid,GL_POSITION,lightpos); //at modelview - - glPopMatrix(); - - - } break; - case VS::LIGHT_SPOT: { - - glLightf(glid,GL_SPOT_CUTOFF, ld->vars[VS::LIGHT_PARAM_SPOT_ANGLE]); - glLightf(glid,GL_SPOT_EXPONENT, ld->vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]); - - - glLightf(glid,GL_CONSTANT_ATTENUATION, 0); - glLightf(glid,GL_LINEAR_ATTENUATION, p_instance->linear_att); - glLightf(glid,GL_QUADRATIC_ATTENUATION, 0); // wut? - - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - float lightpos[4]={ - p_instance->light_vector.x, - p_instance->light_vector.y, - p_instance->light_vector.z, - 1.0 - }; - - glLightfv(glid,GL_POSITION,lightpos); //at modelview - - float lightdir[4]={ - p_instance->spot_vector.x, - p_instance->spot_vector.y, - p_instance->spot_vector.z, - 1.0 - }; - - glLightfv(glid,GL_SPOT_DIRECTION,lightdir); //at modelview - - glPopMatrix(); - - - - } break; - - default: break; - } -}; - - - - - -void RasterizerGLES1::_setup_lights(const uint16_t * p_lights,int p_light_count) { - - if (shadow) - return; - - - - for (int i=directional_light_count; itype) { - - case Geometry::GEOMETRY_MULTISURFACE: - case Geometry::GEOMETRY_SURFACE: { - - - - const Surface *surf=NULL; - if (p_geometry->type==Geometry::GEOMETRY_SURFACE) - surf=static_cast(p_geometry); - else if (p_geometry->type==Geometry::GEOMETRY_MULTISURFACE) - surf=static_cast(p_geometry)->surface; - - - if (surf->format != surf->configured_format) { - if (OS::get_singleton()->is_stdout_verbose()) { - - print_line("has format: "+itos(surf->format)); - print_line("configured format: "+itos(surf->configured_format)); - } - ERR_EXPLAIN("Missing arrays (not set) in surface"); - } - ERR_FAIL_COND_V( surf->format != surf->configured_format, ERR_UNCONFIGURED ); - uint8_t *base=0; - int stride=surf->stride; - bool use_VBO = (surf->array_local==0); - _setup_geometry_vinfo=surf->array_len; - - bool skeleton_valid = p_skeleton && (surf->format&VS::ARRAY_FORMAT_BONES) && (surf->format&VS::ARRAY_FORMAT_WEIGHTS) && !p_skeleton->bones.empty() && p_skeleton->bones.size() > surf->max_bone; - - - - if (!use_VBO) { - - base = surf->array_local; - glBindBuffer(GL_ARRAY_BUFFER, 0); - bool can_copy_to_local=surf->local_stride * surf->array_len <= skinned_buffer_size; - if (!can_copy_to_local) - skeleton_valid=false; - - /* compute morphs */ - - if (p_morphs && surf->morph_target_count && can_copy_to_local) { - - base = skinned_buffer; - stride=surf->local_stride; - - //copy all first - float coef=1.0; - - for(int i=0;imorph_target_count;i++) { - if (surf->mesh->morph_target_mode==VS::MORPH_MODE_NORMALIZED) - coef-=p_morphs[i]; - ERR_FAIL_COND_V( surf->morph_format != surf->morph_targets_local[i].configured_format, ERR_INVALID_DATA ); - - } - - - for(int i=0;iarray[i]; - if (ad.size==0) - continue; - - int ofs = ad.ofs; - int src_stride=surf->stride; - int dst_stride=surf->local_stride; - int count = surf->array_len; - - switch(i) { - - case VS::ARRAY_VERTEX: - case VS::ARRAY_NORMAL: - case VS::ARRAY_TANGENT: - { - - for(int k=0;karray_local[ofs+k*src_stride]; - float *dst = (float*)&base[ofs+k*dst_stride]; - - dst[0]= src[0]*coef; - dst[1]= src[1]*coef; - dst[2]= src[2]*coef; - } break; - - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - - for(int k=0;karray_local[ofs+k*src_stride]; - float *dst = (float*)&base[ofs+k*dst_stride]; - - dst[0]= src[0]*coef; - dst[1]= src[1]*coef; - } break; - - } break; - } - } - - - for(int j=0;jmorph_target_count;j++) { - - for(int i=0;iarray[i]; - if (ad.size==0) - continue; - - - int ofs = ad.ofs; - int dst_stride=surf->local_stride; - int count = surf->array_len; - const uint8_t *morph=surf->morph_targets_local[j].array; - float w = p_morphs[j]; - - switch(i) { - - case VS::ARRAY_VERTEX: - case VS::ARRAY_NORMAL: - case VS::ARRAY_TANGENT: - { - - for(int k=0;karray_len; - int src_stride = surf->stride; - int dst_stride = surf->stride - ( surf->array[VS::ARRAY_BONES].size + surf->array[VS::ARRAY_WEIGHTS].size ); - - for(int i=0;iarray_local[i*src_stride]; - uint8_t *dst = &base[i*dst_stride]; - memcpy(dst,src,dst_stride); - } - - - stride=dst_stride; - } - - - if (skeleton_valid) { - //transform stuff - - const uint8_t *src_weights=&surf->array_local[surf->array[VS::ARRAY_WEIGHTS].ofs]; - const uint8_t *src_bones=&surf->array_local[surf->array[VS::ARRAY_BONES].ofs]; - int src_stride = surf->stride; - int count = surf->array_len; - const Transform *skeleton = &p_skeleton->bones[0]; - - for(int i=0;iarray[i]; - if (ad.size==0) - continue; - - int ofs = ad.ofs; - - - switch(i) { - - case VS::ARRAY_VERTEX: { - for(int k=0;k(&src_weights[k*src_stride]); - const GLfloat *bones = reinterpret_cast(&src_bones[k*src_stride]); - - Vector3 src( ptr[0], ptr[1], ptr[2] ); - Vector3 dst; - for(int j=0;j(&src_weights[k*src_stride]); - const GLfloat *bones = reinterpret_cast(&src_bones[k*src_stride]); - - Vector3 src( ptr[0], ptr[1], ptr[2] ); - Vector3 dst; - for(int j=0;jvertex_id); - }; - - - for (int i=0;i<(VS::ARRAY_MAX-1);i++) { - - const Surface::ArrayData& ad=surf->array[i]; - -// if (!gl_texcoord_shader[i]) -// continue; - - if (ad.size==0 || i==VS::ARRAY_BONES || i==VS::ARRAY_WEIGHTS || gl_client_states[i]==0 ) { - - if (gl_texcoord_index[i] != -1) { - glClientActiveTexture(GL_TEXTURE0+gl_texcoord_index[i]); - } - - if (gl_client_states[i] != 0) - glDisableClientState(gl_client_states[i]); - - if (i == VS::ARRAY_COLOR) { - glColor4f(last_color.r,last_color.g,last_color.b,last_color.a); - }; - continue; // this one is disabled. - } - - if (gl_texcoord_index[i] != -1) { - glClientActiveTexture(GL_TEXTURE0+client_tex_index); - } - - glEnableClientState(gl_client_states[i]); - - switch (i) { - - case VS::ARRAY_VERTEX: { - - glVertexPointer(3,ad.datatype,stride,&base[ad.ofs]); - - } break; /* fallthrough to normal */ - case VS::ARRAY_NORMAL: { - - glNormalPointer(ad.datatype,stride,&base[ad.ofs]); - } break; - case VS::ARRAY_COLOR: { - glColorPointer(4,ad.datatype,stride,&base[ad.ofs]); - } break; - case VS::ARRAY_TEX_UV: - case VS::ARRAY_TEX_UV2: { - - glTexCoordPointer(2,ad.datatype,stride,&base[ad.ofs]); - } break; - case VS::ARRAY_TANGENT: { - - //glVertexAttribPointer(i, 4, use_VBO?GL_BYTE:GL_FLOAT, use_VBO?GL_TRUE:GL_FALSE, stride, &base[ad.ofs]); - - } break; - case VS::ARRAY_BONES: - case VS::ARRAY_WEIGHTS: { - - //do none - //glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, surf->stride, &base[ad.ofs]); - - } break; - case VS::ARRAY_INDEX: - ERR_PRINT("Bug"); - break; - }; - } - - - } break; - - default: break; - - }; - - return OK; -}; - -static const GLenum gl_primitive[]={ - GL_POINTS, - GL_LINES, - GL_LINE_STRIP, - GL_LINE_LOOP, - GL_TRIANGLES, - GL_TRIANGLE_STRIP, - GL_TRIANGLE_FAN -}; - -static const GLenum gl_poly_primitive[4]={ - GL_POINTS, - GL_LINES, - GL_TRIANGLES, - //GL_QUADS - -}; - - -void RasterizerGLES1::_render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner) { - - - _rinfo.object_count++; - - switch(p_geometry->type) { - - case Geometry::GEOMETRY_SURFACE: { - - Surface *s = (Surface*)p_geometry; - - _rinfo.vertex_count+=s->array_len; - - if (s->packed && s->array_local==0) { - - float sc = (1.0/32767.0)*s->vertex_scale; - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glScalef(sc,sc,sc); - if (s->format&VS::ARRAY_FORMAT_TEX_UV) { - float uvs=(1.0/32767.0)*s->uv_scale; - //glActiveTexture(GL_TEXTURE0); - glClientActiveTexture(GL_TEXTURE0); - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glScalef(uvs,uvs,uvs); - } - - - } - - - if (s->index_array_len>0) { - - if (s->index_array_local) { - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); - glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT, s->index_array_local); - - } else { - // print_line("indices: "+itos(s->index_array_local) ); - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); - glDrawElements(gl_primitive[s->primitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT,0); - } - - - } else { - - glDrawArrays(gl_primitive[s->primitive],0,s->array_len); - - }; - - if (s->packed && s->array_local==0) { - if (s->format&VS::ARRAY_FORMAT_TEX_UV) { - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - } - glPopMatrix(); - }; - } break; - - case Geometry::GEOMETRY_MULTISURFACE: { - - Surface *s = static_cast(p_geometry)->surface; - const MultiMesh *mm = static_cast(p_owner); - int element_count=mm->elements.size(); - - if (element_count==0) - return; - - const MultiMesh::Element *elements=&mm->elements[0]; - - _rinfo.vertex_count+=s->array_len*element_count; - - - if (s->index_array_len>0) { - - // glLoadMatrixf(elements[0].matrix); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,s->index_id); - for(int i=0;iprimitive],s->index_array_len, (s->array_len>(1<<16))?GL_UNSIGNED_SHORT:GL_UNSIGNED_SHORT,0); - // glLoadIdentity(); - // glPopMatrix(); - } - - - } else { - - for(int i=0;iprimitive],0,s->array_len); - // glLoadIdentity(); - // glPopMatrix(); - } - - - }; - } break; - case Geometry::GEOMETRY_PARTICLES: { - - - //print_line("particulinas"); - const Particles *particles = static_cast( p_geometry ); - ERR_FAIL_COND(!p_owner); - ParticlesInstance *particles_instance = (ParticlesInstance*)p_owner; - - ParticleSystemProcessSW &pp = particles_instance->particles_process; - float td = time_delta; //MIN(time_delta,1.0/10.0); - pp.process(&particles->data,particles_instance->transform,td); - ERR_EXPLAIN("A parameter in the particle system is not correct."); - ERR_FAIL_COND(!pp.valid); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - glBindBuffer(GL_ARRAY_BUFFER,0); - - - Transform camera; - if (shadow) - camera=shadow->transform; - else - camera=camera_transform; - - particle_draw_info.prepare(&particles->data,&pp,particles_instance->transform,camera); - - _rinfo.vertex_count+=4*particles->data.amount; - - { - static const Vector3 points[4]={ - Vector3(-1.0,1.0,0), - Vector3(1.0,1.0,0), - Vector3(1.0,-1.0,0), - Vector3(-1.0,-1.0,0) - }; - static const Vector3 uvs[4]={ - Vector3(0.0,0.0,0.0), - Vector3(1.0,0.0,0.0), - Vector3(1.0,1.0,0.0), - Vector3(0,1.0,0.0) - }; - static const Vector3 normals[4]={ - Vector3(0,0,1), - Vector3(0,0,1), - Vector3(0,0,1), - Vector3(0,0,1) - }; - - static const Plane tangents[4]={ - Plane(Vector3(1,0,0),0), - Plane(Vector3(1,0,0),0), - Plane(Vector3(1,0,0),0), - Plane(Vector3(1,0,0),0) - }; - - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - _gl_load_transform(camera_transform_inverse); - for(int i=0;idata.amount;i++) { - - ParticleSystemDrawInfoSW::ParticleDrawInfo &pinfo=*particle_draw_info.draw_info_order[i]; - if (!pinfo.data->active) - continue; - glPushMatrix(); - _gl_mult_transform(pinfo.transform); - - glColor4f(pinfo.color.r*last_color.r,pinfo.color.g*last_color.g,pinfo.color.b*last_color.b,pinfo.color.a*last_color.a); - _draw_primitive(4,points,normals,NULL,uvs,tangents); - glPopMatrix(); - - } - glPopMatrix(); - - } - - } break; - default: break; - }; - -}; - -void RasterizerGLES1::_setup_shader_params(const Material *p_material) { -#if 0 - int idx=0; - int tex_idx=0; - - for(Map::Element *E=p_material->shader_cache->params.front();E;E=E->next(),idx++) { - - Variant v; // - v = E->get(); - const Map::Element *F=p_material->shader_params.find(E->key()); - if (F) - v=F->get(); - - switch(v.get_type() ) { - case Variant::OBJECT: - case Variant::_RID: { - - RID tex=v; - if (!tex.is_valid()) - break; - - Texture *texture = texture_owner.get(tex); - if (!texture) - break; - glUniform1i( material_shader.get_custom_uniform_location(idx), tex_idx); - glActiveTexture(tex_idx); - glBindTexture(texture->target,texture->tex_id); - - } break; - case Variant::COLOR: { - - Color c=v; - material_shader.set_custom_uniform(idx,Vector3(c.r,c.g,c.b)); - } break; - default: { - - material_shader.set_custom_uniform(idx,v); - } break; - } - - } -#endif - -} -_FORCE_INLINE_ static void _set_glcoloro(const Color& p_color,const float p_opac) { - - glColor4f(p_color.r, p_color.g, p_color.b, p_color.a*p_opac); -} - -void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reverse_cull) { - - const Material *prev_material=NULL; - uint64_t prev_light_key=0; - const Skeleton *prev_skeleton=NULL; - const Geometry *prev_geometry=NULL; - const BakedLightData *prev_baked_light=NULL; - RID prev_baked_light_texture; - - Geometry::Type prev_geometry_type=Geometry::GEOMETRY_INVALID; - - for (int i=0;ielement_count;i++) { - - RenderList::Element *e = p_render_list->elements[i]; - const Material *material = e->material; - uint64_t light_key = e->light_key; - const Skeleton *skeleton = e->skeleton; - const Geometry *geometry = e->geometry; - const BakedLightData *baked_light = e->instance->baked_light; - - bool bind_baked_light_octree=false; - bool bind_baked_lightmap=false; - bool normal_map = false; - - if (e->instance->sampled_light.is_valid()) { - - SampledLight *sl = sampled_light_owner.get(e->instance->sampled_light); - if (sl) { - - baked_light=NULL; //can't mix - // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_DP_SAMPLER,true); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D,sl->texture); //bind the texture - } - } - if (baked_light) { - - if (baked_light->mode==VS::BAKED_LIGHT_OCTREE && baked_light->octree_texture.is_valid() && e->instance->baked_light_octree_xform) { - // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_OCTREE,true); - bind_baked_light_octree=true; - if (prev_baked_light!=baked_light) { - Texture *tex=texture_owner.get(baked_light->octree_texture); - if (tex) { - - // glActiveTexture(GL_TEXTURE0); - // glBindTexture(tex->target,tex->tex_id); //bind the texture - } - if (baked_light->light_texture.is_valid()) { - Texture *texl=texture_owner.get(baked_light->light_texture); - if (texl) { - // glActiveTexture(GL_TEXTURE0); - // glBindTexture(texl->target,texl->tex_id); //bind the light texture - } - } - - } - - } else if (baked_light->mode==VS::BAKED_LIGHT_LIGHTMAPS) { - - - int lightmap_idx = e->instance->baked_lightmap_id; - - // material_shader.set_conditional(MaterialShaderGLES2::ENABLE_AMBIENT_LIGHTMAP,false); - bind_baked_lightmap=false; - - - if (baked_light->lightmaps.has(lightmap_idx)) { - - - RID texid = baked_light->lightmaps[lightmap_idx]; - - if (prev_baked_light!=baked_light || texid!=prev_baked_light_texture) { - - - Texture *tex = texture_owner.get(texid); - if (tex) { - - glActiveTexture(GL_TEXTURE0); - glBindTexture(tex->target,tex->tex_id); //bind the texture - } - - prev_baked_light_texture=texid; - } - - if (texid.is_valid()) { - bind_baked_lightmap=true; - } - - } - } - } - - if (material!=prev_material || geometry->type!=prev_geometry_type) { - _setup_material(e->geometry,material); - if(material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL].is_valid() && material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { - normal_map = true; - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - } - _rinfo.mat_change_count++; - //_setup_material_overrides(e->material,NULL,material_overrides); - //_setup_material_skeleton(material,skeleton); - } else { - - if (prev_skeleton!=skeleton) { - //_setup_material_skeleton(material,skeleton); - }; - } - - client_tex_index = 0; - if (geometry!=prev_geometry || geometry->type!=prev_geometry_type || prev_skeleton!=skeleton) { - - _setup_geometry(geometry, material,e->skeleton,e->instance->morph_values.ptr()); - }; - if(normal_map) { - Texture *normal = texture_owner.get( material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL] ); - ERR_FAIL_COND(!normal); - - - - glActiveTexture(GL_TEXTURE1); - - glClientActiveTexture(GL_TEXTURE1); - glEnable(GL_TEXTURE_2D); - - // _render(e->geometry, material, skeleton,e->owner); - client_tex_index = 1; - _setup_geometry(e->geometry, material,e->skeleton,e->instance->morph_values.ptr()); - glBindTexture( GL_TEXTURE_2D,normal->tex_id ); - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); - } - - // if (i==0 || light_key!=prev_light_key) - _setup_lights(e->lights,e->light_count); - - _set_cull(e->mirror,p_reverse_cull); - - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glPushMatrix(); - - - if (e->instance->billboard || e->instance->depth_scale) { - - Transform xf=e->instance->transform; - if (e->instance->depth_scale) { - - if (camera_projection.matrix[3][3]) { - //orthogonal matrix, try to do about the same - //with viewport size - //real_t w = Math::abs( 1.0/(2.0*(p_projection.matrix[0][0])) ); - real_t h = Math::abs( 1.0/(2.0*camera_projection.matrix[1][1]) ); - float sc = (h*2.0); //consistent with Y-fov - xf.basis.scale( Vector3(sc,sc,sc)); - } else { - //just scale by depth - real_t sc = -camera_plane.distance_to(xf.origin); - xf.basis.scale( Vector3(sc,sc,sc)); - } - } - - if (e->instance->billboard) { - - Vector3 scale = xf.basis.get_scale(); - xf.set_look_at(xf.origin,xf.origin+camera_transform.get_basis().get_axis(2),camera_transform.get_basis().get_axis(1)); - xf.basis.scale(scale); - } - _gl_mult_transform(xf); // for fixed pipeline - - } else { - _gl_mult_transform(e->instance->transform); // for fixed pipeline - } - - - - //bool changed_shader = material_shader.bind(); - //if ( changed_shader && material->shader_cache && !material->shader_cache->params.empty()) - // _setup_shader_params(material); - - _render(geometry, material, skeleton,e->owner); - - - - prev_material=material; - prev_skeleton=skeleton; - prev_geometry=geometry; - prev_light_key=e->light_key; - prev_baked_light=baked_light; - prev_geometry_type=geometry->type; - } - - - -}; - -void RasterizerGLES1::_process_blur(int times, float inc) { - - float spost = 0.0f; - float alphainc = 0.9f / times; - float alpha = 0.2f; - int num; - - // glDisable(GL_TEXTURE_GEN_S); - // glDisable(GL_TEXTURE_GEN_T); - - glEnable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - glEnable(GL_BLEND); - - - glBindTexture(GL_TEXTURE_2D, BlurTexture); - - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glOrthof(0, viewport.width, viewport.height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - alphainc = alpha / times; - /* - glBegin(GL_QUADS); - for (num = 0;num < times;num++) - { - glColor4f(1.0f, 1.0f, 1.0f, alpha); - glTexCoord2f(0+spost,1-spost); - glVertex2f(0,0); - - glTexCoord2f(0+spost,0+spost); - glVertex2f(0, viewport.height); - - glTexCoord2f(1-spost,0+spost); - glVertex2f(viewport.width, viewport.height); - - glTexCoord2f(1-spost,1-spost); - glVertex2f(viewport.width,0); - - - spost += inc; - alpha = alpha - alphainc; - } - glEnd(); - */ - //attempt at porting - - GLfloat vertices[] = { - 0, 0, - 0, (GLfloat)viewport.height, - (GLfloat)viewport.width, (GLfloat)viewport.height, - (GLfloat)viewport.width, 0 - }; - - GLubyte indices[] = {0, 1, 2, 0, 2, 3}; - // GLubyte indices[] = {0, 1, 2, 3}; - - - - - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - // glEnableClientState(GL_COLOR_ARRAY); - - for (num = 0; num < times; num++) { - glColor4f(1.0f, 1.0f, 1.0f, alpha); - GLfloat texCoords[] = { - 0+spost, 1-spost, - 0+spost, 0+spost, - 1-spost, 0+spost, - 1-spost, 1-spost - }; -/* - GLfloat colors[] = { - 1.0f, 1.0f, 1.0f, alpha, - 1.0f, 1.0f, 1.0f, alpha, - 1.0f, 1.0f, 1.0f, alpha, - 1.0f, 1.0f, 1.0f, alpha - };*/ - - glVertexPointer(2, GL_FLOAT, 0, vertices); - glTexCoordPointer(2, GL_FLOAT, 0, texCoords); - // glColorPointer(4, GL_FLOAT, 0, colors); - - // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - spost += inc; - alpha = alpha - alphainc; - } - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glBindTexture(GL_TEXTURE_2D,0); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); -} - - -void RasterizerGLES1::end_scene() { - - glEnable(GL_BLEND); - glDepthMask(GL_TRUE); - glEnable(GL_DEPTH_TEST); - glDisable(GL_SCISSOR_TEST); - depth_write=true; - depth_test=true; - - if (current_env) { - - switch(current_env->bg_mode) { - - case VS::ENV_BG_KEEP: { - //copy from framebuffer if framebuffer - glClear(GL_DEPTH_BUFFER_BIT); - } break; - case VS::ENV_BG_DEFAULT_COLOR: - case VS::ENV_BG_COLOR: { - //only in the runner - if(is_editor != true) { - Color bgcolor; - if (current_env->bg_mode==VS::ENV_BG_COLOR) - bgcolor = current_env->bg_param[VS::ENV_BG_PARAM_COLOR]; - else - bgcolor = Globals::get_singleton()->get("render/default_clear_color"); - // bgcolor = _convert_color(bgcolor); - float a = 1.0; - glClearColor(bgcolor.r,bgcolor.g,bgcolor.b,a); - glClearDepthf(1.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - } else { - glClear(GL_DEPTH_BUFFER_BIT); - } - } break; - case VS::ENV_BG_TEXTURE: - case VS::ENV_BG_CUBEMAP: - case VS::ENV_BG_TEXTURE_RGBE: - case VS::ENV_BG_CUBEMAP_RGBE: { - //a bit broken for now - - glClear(GL_DEPTH_BUFFER_BIT); - } break; - - } - } else { - - Color c = Color(0.3,0.3,0.3); - glClearColor(c.r,c.g,c.b,0.0); - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - } -#ifdef GLES_OVER_GL - //glClearDepth(1.0); -#else - // glClearDepthf(1.0); -#endif - - // glClear(GL_DEPTH_BUFFER_BIT); - if(current_env->fx_enabled[VS::ENV_FX_FOG]) { - - Color col_begin = current_env->fx_param[VS::ENV_FX_PARAM_FOG_BEGIN_COLOR]; - Color col_end = current_env->fx_param[VS::ENV_FX_PARAM_FOG_END_COLOR]; - - GLfloat begin[4]={ - col_begin.r, - col_begin.g, - col_begin.b, - 1.0 - }; - GLfloat end[4]={ - col_end.r, - col_end.g, - col_end.b, - 1.0 - }; - glEnable(GL_FOG); - glFogf(GL_FOG_MODE,GL_LINEAR); - glFogf(GL_FOG_DENSITY, current_env->fx_param[VS::ENV_FX_PARAM_FOG_ATTENUATION]); - glFogf(GL_FOG_START,current_env->fx_param[VS::ENV_FX_PARAM_FOG_BEGIN]); - glFogf(GL_FOG_END, camera_z_far); - glFogfv(GL_FOG_COLOR, end); - glLightfv(GL_LIGHT5,GL_DIFFUSE, begin); - - // material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,true); - } - - - - for(int i=0;ifx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) { - glViewport(0,0,256,256); - - _render_list_forward(&opaque_render_list); - - glBindTexture(GL_TEXTURE_2D, BlurTexture); - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 256, 256, 0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - } - - _render_list_forward(&opaque_render_list); - - alpha_render_list.sort_z(); - glEnable(GL_BLEND); - - _render_list_forward(&alpha_render_list); - - glPopMatrix(); - // canvas_shader.set_conditional(CanvasShaderGLES2::DEBUG_ENCODED_32,false); - /* - canvas_begin(); - glDisable(GL_BLEND); - _set_glcoloro(Color(1,1,1), 1); - // canvas_shader.bind(); - - - List samplers; - sampled_light_owner.get_owned_list(&samplers); - - Size2 debug_size(128,128); - Size2 ofs; - - - for (List::Element *E=samplers.front();E;E=E->next()) { - - SampledLight *sl=sampled_light_owner.get(E->get()); - - _debug_draw_shadow(sl->texture, Rect2( ofs, debug_size )); - - ofs.x+=debug_size.x/2; - if ( (ofs.x+debug_size.x) > viewport.width ) { - - ofs.x=0; - ofs.y+=debug_size.y; - } - }*/ - -// material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,false); - if(current_env->fx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) - _process_blur(current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_TIMES], current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_ALPHA]); - - - - // _debug_shadows(); -} -void RasterizerGLES1::end_shadow_map() { -#if 0 - ERR_FAIL_COND(!shadow); - ERR_FAIL_INDEX(shadow_pass,shadow->shadow_buffers.size()); - - glDisable(GL_BLEND); - glDisable(GL_SCISSOR_TEST); - glEnable(GL_DEPTH_TEST); - glDepthMask(true); - - - ShadowBuffer *sb = shadow->shadow_buffers[shadow_pass]; - - ERR_FAIL_COND(!sb); - - glBindFramebuffer(GL_FRAMEBUFFER, sb->fbo); - glViewport(0, 0, sb->size, sb->size); - - glColorMask(0, 0, 0, 0); - - glEnable(GL_POLYGON_OFFSET_FILL); - //glPolygonOffset(4,8); - glPolygonOffset( 4.0f, 4096.0f); - glPolygonOffset( 8.0f, 16.0f); - - glClearDepth(1.0f); - glClear(GL_DEPTH_BUFFER_BIT); - CameraMatrix cm; - float z_near,z_far; - Transform light_transform; - - float dp_direction=0.0; - bool flip_facing=false; - - switch(shadow->base->type) { - - case VS::LIGHT_DIRECTIONAL: { - - cm = shadow->custom_projection; - light_transform=shadow->custom_transform; - z_near=cm.get_z_near(); - z_far=cm.get_z_far(); - - } break; - case VS::LIGHT_OMNI: { - - material_shader.set_conditional(MaterialShaderGLES1::USE_DUAL_PARABOLOID,true); - dp_direction = shadow_pass?1.0:0.0; - flip_facing = (shadow_pass == 1); - light_transform=shadow->transform; - z_near=0; - z_far=shadow->base->vars[ VS::LIGHT_VAR_RADIUS ]; - } break; - case VS::LIGHT_SPOT: { - - float far = shadow->base->vars[ VS::LIGHT_VAR_RADIUS ]; - ERR_FAIL_COND( far<=0 ); - float near= far/200.0; - if (near<0.05) - near=0.05; - - float angle = shadow->base->vars[ VS::LIGHT_VAR_SPOT_ANGLE ]; - - cm.set_perspective( angle*2.0, 1.0, near, far ); - shadow->projection=cm; // cache - light_transform=shadow->transform; - z_near=cm.get_z_near(); - z_far=cm.get_z_far(); - - } break; - } - - Transform light_transform_inverse = light_transform.inverse(); - - opaque_render_list.sort_mat(); - - glLightf(GL_LIGHT5,GL_LINEAR_ATTENUATION,z_near); - glLightf(GL_LIGHT5,GL_QUADRATIC_ATTENUATION,z_far); - glLightf(GL_LIGHT5,GL_CONSTANT_ATTENUATION,dp_direction); - - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(&cm.matrix[0][0]); - glMatrixMode(GL_MODELVIEW); - _gl_load_transform(light_transform_inverse); - glPushMatrix(); - - for(int i=0;i<4;i++) { - for(int j=0;j<3;j++) { - - material_shader.set_conditional(_gl_light_version[i][j],false); //start false by default - } - material_shader.set_conditional(_gl_light_shadow[i],false); - } - - _render_list_forward(&opaque_render_list,flip_facing); - - material_shader.set_conditional(MaterialShaderGLES1::USE_DUAL_PARABOLOID,false); - glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); - if (framebuffer.active) - glBindFramebufferEXT(GL_FRAMEBUFFER,framebuffer.fbo); - else - glBindFramebufferEXT(GL_FRAMEBUFFER,0); - - glDisable(GL_POLYGON_OFFSET_FILL); - - glColorMask(1, 1, 1, 1); - shadow=NULL; -#endif -} - -void RasterizerGLES1::_debug_draw_shadow(GLuint tex, const Rect2& p_rect) { - - -/* - Transform modelview; - modelview.translate(-(viewport.width / 2.0f), -(viewport.height / 2.0f), 0.0f); - modelview.scale( Vector3( 2.0f / viewport.width, -2.0f / viewport.height, 1.0f ) ); - modelview.translate(p_rect.pos.x, p_rect.pos.y, 0); - // material_shader.set_uniform_default(MaterialShaderGLES1::MODELVIEW_TRANSFORM, *e->transform); - _gl_load_transform(modelview); - glBindTexture(GL_TEXTURE_2D,p_buffer->depth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); - - Vector3 coords[4]= { - Vector3(p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y+p_rect.size.height, 0 ), - Vector3(p_rect.pos.x, - p_rect.pos.y+p_rect.size.height, 0 ) - }; - - Vector3 texcoords[4]={ - Vector3( 0.0f,0.0f, 0), - Vector3( 1.0f,0.0f, 0), - Vector3( 1.0f, 1.0f, 0), - Vector3( 0.0f, 1.0f, 0), - }; - - _draw_primitive(4,coords,0,0,texcoords); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);*/ - Matrix32 modelview; - modelview.translate(p_rect.pos.x, p_rect.pos.y); - // canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, modelview); - _gl_mult_transform(modelview); - glBindTexture(GL_TEXTURE_2D,tex); - - Vector3 coords[4]= { - Vector3(p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y, 0 ), - Vector3(p_rect.pos.x+p_rect.size.width, - p_rect.pos.y+p_rect.size.height, 0 ), - Vector3(p_rect.pos.x, - p_rect.pos.y+p_rect.size.height, 0 ) - }; - - Vector3 texcoords[4]={ - Vector3( 0.0f,0.0f, 0), - Vector3( 1.0f,0.0f, 0), - Vector3( 1.0f, 1.0f, 0), - Vector3( 0.0f, 1.0f, 0), - }; - - _draw_primitive(4,coords,0,0,texcoords); - -} - -void RasterizerGLES1::_debug_draw_shadows_type(Vector& p_shadows,Point2& ofs) { - - -// Size2 debug_size(128,128); - Size2 debug_size(512,512); - - for (int i=0;iowner) - continue; - - if (sb->owner->base->type==VS::LIGHT_DIRECTIONAL) { - - if (sb->owner->shadow_pass!=scene_pass-1) - continue; - } else { - - if (sb->owner->shadow_pass!=frame) - continue; - } - // _debug_draw_shadow(sb, Rect2( ofs, debug_size )); - ofs.x+=debug_size.x; - if ( (ofs.x+debug_size.x) > viewport.width ) { - - ofs.x=0; - ofs.y+=debug_size.y; - } - } - -} - - -void RasterizerGLES1::_debug_shadows() { - - return; -#if 0 - canvas_begin(); - glUseProgram(0); - glDisable(GL_BLEND); - Size2 ofs; - - /* - for(int i=0;i<16;i++) { - glActiveTexture(GL_TEXTURE0+i); - //glDisable(GL_TEXTURE_2D); - } - glActiveTexture(GL_TEXTURE0); - //glEnable(GL_TEXTURE_2D); - */ - - - _debug_draw_shadows_type(near_shadow_buffers,ofs); - _debug_draw_shadows_type(far_shadow_buffers,ofs); -#endif -} - -void RasterizerGLES1::end_frame() { - - /* - if (framebuffer.active) { - - canvas_begin(); //resets stuff and goes back to fixedpipe - glBindFramebuffer(GL_FRAMEBUFFER,0); - - //copy to main bufferz - glEnable(GL_TEXTURE_2D); - - glBindTexture(GL_TEXTURE_2D,framebuffer.color); - glBegin(GL_QUADS); - glTexCoord2f(0,0); - glVertex2f(-1,-1); - glTexCoord2f(0,1); - glVertex2f(-1,+1); - glTexCoord2f(1,1); - glVertex2f(+1,+1); - glTexCoord2f(1,0); - glVertex2f(+1,-1); - glEnd(); - - - } - */ - - //print_line("VTX: "+itos(_rinfo.vertex_count)+" OBJ: "+itos(_rinfo.object_count)+" MAT: "+itos(_rinfo.mat_change_count)+" SHD: "+itos(_rinfo.shader_change_count)); - - OS::get_singleton()->swap_buffers(); -} - -/* CANVAS API */ - - -void RasterizerGLES1::reset_state() { - - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); //unbind - glBindBuffer(GL_ARRAY_BUFFER,0); - - glActiveTexture(GL_TEXTURE0); - glClientActiveTexture(GL_TEXTURE0); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glColor4f(1,1,1,1); - - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); -// glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -// glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - canvas_blend=VS::MATERIAL_BLEND_MODE_MIX; - glLineWidth(1.0); - glDisable(GL_LIGHTING); - -} - - - - -void RasterizerGLES1::canvas_begin() { - - - reset_state(); - canvas_opacity=1.0; - glEnable(GL_BLEND); - - -} - -void RasterizerGLES1::canvas_disable_blending() { - - glDisable(GL_BLEND); -} - -void RasterizerGLES1::canvas_set_opacity(float p_opacity) { - - canvas_opacity = p_opacity; -} - -void RasterizerGLES1::canvas_set_blend_mode(VS::MaterialBlendMode p_mode) { - - switch(p_mode) { - - case VS::MATERIAL_BLEND_MODE_MIX: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - case VS::MATERIAL_BLEND_MODE_ADD: { - - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - - } break; - case VS::MATERIAL_BLEND_MODE_SUB: { - - //glBlendEquation(GL_FUNC_SUBTRACT); - glBlendFunc(GL_SRC_ALPHA,GL_ONE); - } break; - case VS::MATERIAL_BLEND_MODE_MUL: { - //glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } break; - - } - -} - - -void RasterizerGLES1::canvas_begin_rect(const Matrix32& p_transform) { - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glScalef(2.0 / viewport.width, -2.0 / viewport.height, 0); - glTranslatef((-(viewport.width / 2.0)), (-(viewport.height / 2.0)), 0); - _gl_mult_transform(p_transform); - - glPushMatrix(); - -} - -void RasterizerGLES1::canvas_set_clip(bool p_clip, const Rect2& p_rect) { - - if (p_clip) { - - glEnable(GL_SCISSOR_TEST); - // glScissor(viewport.x+p_rect.pos.x,viewport.y+ (viewport.height-(p_rect.pos.y+p_rect.size.height)), - //p_rect.size.width,p_rect.size.height); - //glScissor(p_rect.pos.x,(viewport.height-(p_rect.pos.y+p_rect.size.height)),p_rect.size.width,p_rect.size.height); - glScissor(viewport.x+p_rect.pos.x,viewport.y+ (window_size.y-(p_rect.pos.y+p_rect.size.height)), - p_rect.size.width,p_rect.size.height); - } else { - - glDisable(GL_SCISSOR_TEST); - } - - -} - -void RasterizerGLES1::canvas_end_rect() { - - glPopMatrix(); -} - -void RasterizerGLES1::canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width) { - - glDisable(GL_TEXTURE_2D); - _set_glcoloro( p_color,canvas_opacity ); - - Vector3 verts[2]={ - Vector3(p_from.x,p_from.y,0), - Vector3(p_to.x,p_to.y,0) - }; - Color colors[2]={ - p_color, - p_color - }; - colors[0].a*=canvas_opacity; - colors[1].a*=canvas_opacity; - glLineWidth(p_width); - _draw_primitive(2,verts,0,colors,0); - -} - -static void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_flip_h=false,bool p_flip_v=false ) { - - - Vector3 texcoords[4]= { - Vector3( p_src_region.pos.x/p_tex_size.width, - p_src_region.pos.y/p_tex_size.height, 0), - - Vector3((p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, - p_src_region.pos.y/p_tex_size.height, 0), - - Vector3( (p_src_region.pos.x+p_src_region.size.width)/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0), - - Vector3( p_src_region.pos.x/p_tex_size.width, - (p_src_region.pos.y+p_src_region.size.height)/p_tex_size.height, 0) - }; - - - if (p_flip_h) { - SWAP( texcoords[0], texcoords[1] ); - SWAP( texcoords[2], texcoords[3] ); - } - if (p_flip_v) { - SWAP( texcoords[1], texcoords[2] ); - SWAP( texcoords[0], texcoords[3] ); - } - - Vector3 coords[4]= { - Vector3( p_rect.pos.x, p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width, p_rect.pos.y+p_rect.size.height, 0 ), - Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) - }; - - _draw_primitive(4,coords,0,0,texcoords); -} - -static void _draw_quad(const Rect2& p_rect) { - - Vector3 coords[4]= { - Vector3( p_rect.pos.x,p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y, 0 ), - Vector3( p_rect.pos.x+p_rect.size.width,p_rect.pos.y+p_rect.size.height, 0 ), - Vector3( p_rect.pos.x,p_rect.pos.y+p_rect.size.height, 0 ) - }; - - _draw_primitive(4,coords,0,0,0); - -} - - -void RasterizerGLES1::canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate) { - - _set_glcoloro( p_modulate,canvas_opacity ); - - if ( p_texture.is_valid() ) { - - glEnable(GL_TEXTURE_2D); - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - - if (!(p_flags&CANVAS_RECT_REGION)) { - - Rect2 region = Rect2(0,0,texture->width,texture->height); - _draw_textured_quad(p_rect,region,region.size,p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V); - - } else { - - - _draw_textured_quad(p_rect, p_source, Size2(texture->width,texture->height),p_flags&CANVAS_RECT_FLIP_H,p_flags&CANVAS_RECT_FLIP_V ); - - } - } else { - - glDisable(GL_TEXTURE_2D); - _draw_quad( p_rect ); - - } - - -} -void RasterizerGLES1::canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margin, bool p_draw_center,const Color& p_modulate) { - - _set_glcoloro( p_modulate,canvas_opacity ); - - - Texture *texture = texture_owner.get( p_texture ); - ERR_FAIL_COND(!texture); - - glEnable(GL_TEXTURE_2D); - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - - - /* CORNERS */ - - _draw_textured_quad( // top left - Rect2( p_rect.pos, Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), - Rect2( Point2(), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_TOP])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // top right - Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), - Rect2( Point2(texture->width-p_margin[MARGIN_RIGHT],0), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_TOP])), - Size2( texture->width, texture->height ) ); - - - _draw_textured_quad( // bottom left - Rect2( Point2(p_rect.pos.x,p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), - Rect2( Point2(0,texture->height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_LEFT],p_margin[MARGIN_BOTTOM])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // bottom right - Rect2( Point2( p_rect.pos.x + p_rect.size.width - p_margin[MARGIN_RIGHT], p_rect.pos.y + p_rect.size.height - p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), - Rect2( Point2(texture->width-p_margin[MARGIN_RIGHT],texture->height-p_margin[MARGIN_BOTTOM]), Size2(p_margin[MARGIN_RIGHT],p_margin[MARGIN_BOTTOM])), - Size2( texture->width, texture->height ) ); - - Rect2 rect_center( p_rect.pos+Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( p_rect.size.width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], p_rect.size.height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); - - Rect2 src_center( Point2( p_margin[MARGIN_LEFT], p_margin[MARGIN_TOP]), Size2( texture->width - p_margin[MARGIN_LEFT] - p_margin[MARGIN_RIGHT], texture->height - p_margin[MARGIN_TOP] - p_margin[MARGIN_BOTTOM] )); - - - _draw_textured_quad( // top - Rect2( Point2(rect_center.pos.x,p_rect.pos.y),Size2(rect_center.size.width,p_margin[MARGIN_TOP])), - Rect2( Point2(p_margin[MARGIN_LEFT],0), Size2(src_center.size.width,p_margin[MARGIN_TOP])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // bottom - Rect2( Point2(rect_center.pos.x,rect_center.pos.y+rect_center.size.height),Size2(rect_center.size.width,p_margin[MARGIN_BOTTOM])), - Rect2( Point2(p_margin[MARGIN_LEFT],src_center.pos.y+src_center.size.height), Size2(src_center.size.width,p_margin[MARGIN_BOTTOM])), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // left - Rect2( Point2(p_rect.pos.x,rect_center.pos.y),Size2(p_margin[MARGIN_LEFT],rect_center.size.height)), - Rect2( Point2(0,p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_LEFT],src_center.size.height)), - Size2( texture->width, texture->height ) ); - - _draw_textured_quad( // right - Rect2( Point2(rect_center.pos.x+rect_center.size.width,rect_center.pos.y),Size2(p_margin[MARGIN_RIGHT],rect_center.size.height)), - Rect2( Point2(src_center.pos.x+src_center.size.width,p_margin[MARGIN_TOP]), Size2(p_margin[MARGIN_RIGHT],src_center.size.height)), - Size2( texture->width, texture->height ) ); - - if (p_draw_center) { - - _draw_textured_quad( - rect_center, - src_center, - Size2( texture->width, texture->height )); - } - -} -void RasterizerGLES1::canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width) { - - ERR_FAIL_COND(p_points.size()<1); - Vector3 verts[4]; - Vector3 uvs[4]; - - _set_glcoloro( Color(1,1,1),canvas_opacity ); - - for(int i=0;itex_id ); - } - } - - glLineWidth(p_width); - _draw_primitive(p_points.size(),&verts[0],NULL,p_colors.size()?&p_colors[0]:NULL,p_uvs.size()?uvs:NULL); - -} - -static const int _max_draw_poly_indices = 8*1024; -static uint16_t _draw_poly_indices[_max_draw_poly_indices]; -static float _verts3[_max_draw_poly_indices]; - -void RasterizerGLES1::canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor) { - - bool do_colors=false; - - //reset_state(); - if (p_singlecolor) { - Color m = *p_colors; - m.a*=canvas_opacity; - glColor4f(m.r, m.g, m.b, m.a); - } else if (!p_colors) { - glColor4f(1, 1, 1, canvas_opacity); - } else - do_colors=true; - - glColor4f(1, 1, 1, 1); - - Texture* texture = NULL; - if (p_texture.is_valid()) { - glEnable(GL_TEXTURE_2D); - texture = texture_owner.get( p_texture ); - if (texture) { - glActiveTexture(GL_TEXTURE0); - glBindTexture( GL_TEXTURE_2D,texture->tex_id ); - } - } - - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(2, GL_FLOAT, 0, (GLvoid*)p_vertices); - if (do_colors) { - - glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(4,GL_FLOAT, 0, p_colors); - - } else { - glDisableClientState(GL_COLOR_ARRAY); - } - - if (texture && p_uvs) { - - glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, p_uvs); - - } else { - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - - if (p_indices) { - - for (int i=0; i *p_effects) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - p_effects->clear(); - p_effects->push_back("bgcolor"); - p_effects->push_back("skybox"); - p_effects->push_back("antialias"); - //p_effects->push_back("hdr"); - p_effects->push_back("glow"); // glow has a bloom parameter, too - p_effects->push_back("ssao"); - p_effects->push_back("fog"); - p_effects->push_back("dof_blur"); - p_effects->push_back("toon"); - p_effects->push_back("edge"); - -} -void RasterizerGLES1::fx_set_active(RID p_fx,const String& p_effect, bool p_active) { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - if (p_effect=="bgcolor") - fx->bgcolor_active=p_active; - else if (p_effect=="skybox") - fx->skybox_active=p_active; - else if (p_effect=="antialias") - fx->antialias_active=p_active; - else if (p_effect=="glow") - fx->glow_active=p_active; - else if (p_effect=="ssao") - fx->ssao_active=p_active; - else if (p_effect=="fog") - fx->fog_active=p_active; -// else if (p_effect=="dof_blur") -// fx->dof_blur_active=p_active; - else if (p_effect=="toon") - fx->toon_active=p_active; - else if (p_effect=="edge") - fx->edge_active=p_active; -} -bool RasterizerGLES1::fx_is_active(RID p_fx,const String& p_effect) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND_V(!fx,false); - - if (p_effect=="bgcolor") - return fx->bgcolor_active; - else if (p_effect=="skybox") - return fx->skybox_active; - else if (p_effect=="antialias") - return fx->antialias_active; - else if (p_effect=="glow") - return fx->glow_active; - else if (p_effect=="ssao") - return fx->ssao_active; - else if (p_effect=="fog") - return fx->fog_active; - //else if (p_effect=="dof_blur") - // return fx->dof_blur_active; - else if (p_effect=="toon") - return fx->toon_active; - else if (p_effect=="edge") - return fx->edge_active; - - return false; -} -void RasterizerGLES1::fx_get_effect_params(RID p_fx,const String& p_effect,List *p_params) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - - if (p_effect=="bgcolor") { - - p_params->push_back( PropertyInfo( Variant::COLOR, "color" ) ); - } else if (p_effect=="skybox") { - p_params->push_back( PropertyInfo( Variant::_RID, "cubemap" ) ); - } else if (p_effect=="antialias") { - - p_params->push_back( PropertyInfo( Variant::REAL, "tolerance", PROPERTY_HINT_RANGE,"1,128,1" ) ); - - } else if (p_effect=="glow") { - - p_params->push_back( PropertyInfo( Variant::INT, "passes", PROPERTY_HINT_RANGE,"1,4,1" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.01,8.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "bloom", PROPERTY_HINT_RANGE,"-1.0,1.0,0.01" ) ); - - } else if (p_effect=="ssao") { - - p_params->push_back( PropertyInfo( Variant::REAL, "radius", PROPERTY_HINT_RANGE,"0.0,16.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "max_distance", PROPERTY_HINT_RANGE,"0.0,256.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "range_max", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "range_min", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.0,8.0,0.01" ) ); - - } else if (p_effect=="fog") { - - p_params->push_back( PropertyInfo( Variant::REAL, "begin", PROPERTY_HINT_RANGE,"0.0,8192,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "end", PROPERTY_HINT_RANGE,"0.0,8192,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "attenuation", PROPERTY_HINT_RANGE,"0.0,8.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::COLOR, "color_begin" ) ); - p_params->push_back( PropertyInfo( Variant::COLOR, "color_end" ) ); - p_params->push_back( PropertyInfo( Variant::BOOL, "fog_bg" ) ); - -// } else if (p_effect=="dof_blur") { -// return fx->dof_blur_active; - } else if (p_effect=="toon") { - p_params->push_back( PropertyInfo( Variant::REAL, "treshold", PROPERTY_HINT_RANGE,"0.0,1.0,0.01" ) ); - p_params->push_back( PropertyInfo( Variant::REAL, "soft", PROPERTY_HINT_RANGE,"0.001,1.0,0.001" ) ); - } else if (p_effect=="edge") { - - } -} -Variant RasterizerGLES1::fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND_V(!fx,Variant()); - - if (p_effect=="bgcolor") { - - if (p_param=="color") - return fx->bgcolor; - } else if (p_effect=="skybox") { - if (p_param=="cubemap") - return fx->skybox_cubemap; - } else if (p_effect=="antialias") { - - if (p_param=="tolerance") - return fx->antialias_tolerance; - - } else if (p_effect=="glow") { - - if (p_param=="passes") - return fx->glow_passes; - if (p_param=="attenuation") - return fx->glow_attenuation; - if (p_param=="bloom") - return fx->glow_bloom; - - } else if (p_effect=="ssao") { - - if (p_param=="attenuation") - return fx->ssao_attenuation; - if (p_param=="max_distance") - return fx->ssao_max_distance; - if (p_param=="range_max") - return fx->ssao_range_max; - if (p_param=="range_min") - return fx->ssao_range_min; - if (p_param=="radius") - return fx->ssao_radius; - - } else if (p_effect=="fog") { - - if (p_param=="begin") - return fx->fog_near; - if (p_param=="end") - return fx->fog_far; - if (p_param=="attenuation") - return fx->fog_attenuation; - if (p_param=="color_begin") - return fx->fog_color_near; - if (p_param=="color_end") - return fx->fog_color_far; - if (p_param=="fog_bg") - return fx->fog_bg; -// } else if (p_effect=="dof_blur") { -// return fx->dof_blur_active; - } else if (p_effect=="toon") { - if (p_param=="treshold") - return fx->toon_treshold; - if (p_param=="soft") - return fx->toon_soft; - - } else if (p_effect=="edge") { - - } - return Variant(); -} -void RasterizerGLES1::fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_value) { - - FX *fx = fx_owner.get(p_fx); - ERR_FAIL_COND(!fx); - - if (p_effect=="bgcolor") { - - if (p_param=="color") - fx->bgcolor=p_value; - } else if (p_effect=="skybox") { - if (p_param=="cubemap") - fx->skybox_cubemap=p_value; - - } else if (p_effect=="antialias") { - - if (p_param=="tolerance") - fx->antialias_tolerance=p_value; - - } else if (p_effect=="glow") { - - if (p_param=="passes") - fx->glow_passes=p_value; - if (p_param=="attenuation") - fx->glow_attenuation=p_value; - if (p_param=="bloom") - fx->glow_bloom=p_value; - - } else if (p_effect=="ssao") { - - if (p_param=="attenuation") - fx->ssao_attenuation=p_value; - if (p_param=="radius") - fx->ssao_radius=p_value; - if (p_param=="max_distance") - fx->ssao_max_distance=p_value; - if (p_param=="range_max") - fx->ssao_range_max=p_value; - if (p_param=="range_min") - fx->ssao_range_min=p_value; - - } else if (p_effect=="fog") { - - if (p_param=="begin") - fx->fog_near=p_value; - if (p_param=="end") - fx->fog_far=p_value; - if (p_param=="attenuation") - fx->fog_attenuation=p_value; - if (p_param=="color_begin") - fx->fog_color_near=p_value; - if (p_param=="color_end") - fx->fog_color_far=p_value; - if (p_param=="fog_bg") - fx->fog_bg=p_value; -// } else if (p_effect=="dof_blur") { -// fx->dof_blur_active=p_value; - } else if (p_effect=="toon") { - - if (p_param=="treshold") - fx->toon_treshold=p_value; - if (p_param=="soft") - fx->toon_soft=p_value; - - } else if (p_effect=="edge") { - - } - -} - -/* ENVIRONMENT */ - -RID RasterizerGLES1::environment_create() { - - Environment * env = memnew( Environment ); - return environment_owner.make_rid(env); -} - -void RasterizerGLES1::environment_set_background(RID p_env,VS::EnvironmentBG p_bg) { - - ERR_FAIL_INDEX(p_bg,VS::ENV_BG_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->bg_mode=p_bg; -} - -VS::EnvironmentBG RasterizerGLES1::environment_get_background(RID p_env) const{ - - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,VS::ENV_BG_MAX); - return env->bg_mode; -} - -void RasterizerGLES1::environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value){ - - ERR_FAIL_INDEX(p_param,VS::ENV_BG_PARAM_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->bg_param[p_param]=p_value; - -} - -void RasterizerGLES1::environment_set_group(RID p_env,VS::Group p_param, const Variant& p_value){ - - ERR_FAIL_INDEX(p_param,VS::ENV_GROUP_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->group[p_param]=p_value; - -} -Variant RasterizerGLES1::environment_get_group(RID p_env,VS::Group p_param) const{ - - ERR_FAIL_INDEX_V(p_param,VS::ENV_GROUP_MAX,Variant()); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,Variant()); - return env->group[p_param]; - -} - -Variant RasterizerGLES1::environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const{ - - ERR_FAIL_INDEX_V(p_param,VS::ENV_BG_PARAM_MAX,Variant()); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,Variant()); - return env->bg_param[p_param]; - -} - -void RasterizerGLES1::environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled){ - - ERR_FAIL_INDEX(p_effect,VS::ENV_FX_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->fx_enabled[p_effect]=p_enabled; -} -bool RasterizerGLES1::environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const{ - - ERR_FAIL_INDEX_V(p_effect,VS::ENV_FX_MAX,false); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,false); - return env->fx_enabled[p_effect]; - -} - -void RasterizerGLES1::environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value){ - - ERR_FAIL_INDEX(p_param,VS::ENV_FX_PARAM_MAX); - Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND(!env); - env->fx_param[p_param]=p_value; -} -Variant RasterizerGLES1::environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const{ - - ERR_FAIL_INDEX_V(p_param,VS::ENV_FX_PARAM_MAX,Variant()); - const Environment * env = environment_owner.get(p_env); - ERR_FAIL_COND_V(!env,Variant()); - return env->fx_param[p_param]; - -} - -/* SAMPLED LIGHT */ - -RID RasterizerGLES1::sampled_light_dp_create(int p_width,int p_height) { - - SampledLight *slight = memnew(SampledLight); - slight->w=p_width; - slight->h=p_height; - slight->multiplier=1.0; - slight->is_float=false; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1,&slight->texture); - glBindTexture(GL_TEXTURE_2D, slight->texture); -// for debug, but glitchy -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - // Remove artifact on the edges of the shadowmap - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - - if (slight->is_float) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_width, p_height, 0, GL_RGBA, GL_FLOAT,NULL); - } else { - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_width, p_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - - } - - return sampled_light_owner.make_rid(slight); -}/* -#include "io/resource_saver.h" -#include "scene/resources/texture.h"*/ -void RasterizerGLES1::sampled_light_dp_update(RID p_sampled_light, const Color *p_data, float p_multiplier) { - - SampledLight *slight = sampled_light_owner.get(p_sampled_light); - ERR_FAIL_COND(!slight); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, slight->texture); - - if (slight->is_float) { - - - glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,slight->w, slight->h, GL_RGBA, GL_FLOAT,p_data); - - - } else { - //convert to bytes - uint8_t *tex8 = (uint8_t*)alloca(slight->w*slight->h*4); - // DVector tex; - const float* src=(const float*)p_data; - - for(int i=0;iw*slight->h*4;i++) { - - tex8[i]=Math::fast_ftoi(CLAMP(src[i]*255.0,0.0,255.0)); - // tex.push_back(Math::fast_ftoi(CLAMP(src[i]*255.0,0.0,255.0))); - } - /* - Image img(slight->w,slight->h,0,Image::FORMAT_RGBA,tex); - Ref it = memnew( ImageTexture ); - it->create_from_image(img); - ResourceSaver::save("baked.png",it);*/ - glTexSubImage2D(GL_TEXTURE_2D, 0,0,0,slight->w, slight->h, GL_RGBA, GL_UNSIGNED_BYTE,p_data); - } - - slight->multiplier=p_multiplier; - -} - -/*MISC*/ - -bool RasterizerGLES1::is_texture(const RID& p_rid) const { - - return texture_owner.owns(p_rid); -} -bool RasterizerGLES1::is_material(const RID& p_rid) const { - - return material_owner.owns(p_rid); -} -bool RasterizerGLES1::is_mesh(const RID& p_rid) const { - - return mesh_owner.owns(p_rid); -} - -bool RasterizerGLES1::is_immediate(const RID& p_rid) const { - - return immediate_owner.owns(p_rid); -} - -bool RasterizerGLES1::is_multimesh(const RID& p_rid) const { - - return multimesh_owner.owns(p_rid); -} -bool RasterizerGLES1::is_particles(const RID &p_beam) const { - - return particles_owner.owns(p_beam); -} - -bool RasterizerGLES1::is_light(const RID& p_rid) const { - - return light_owner.owns(p_rid); -} -bool RasterizerGLES1::is_light_instance(const RID& p_rid) const { - - return light_instance_owner.owns(p_rid); -} -bool RasterizerGLES1::is_particles_instance(const RID& p_rid) const { - - return particles_instance_owner.owns(p_rid); -} -bool RasterizerGLES1::is_skeleton(const RID& p_rid) const { - - return skeleton_owner.owns(p_rid); -} -bool RasterizerGLES1::is_environment(const RID& p_rid) const { - - return environment_owner.owns(p_rid); -} -bool RasterizerGLES1::is_fx(const RID& p_rid) const { - - return fx_owner.owns(p_rid); -} -bool RasterizerGLES1::is_shader(const RID& p_rid) const { - - return false; -} - -void RasterizerGLES1::free(const RID& p_rid) { - - if (texture_owner.owns(p_rid)) { - - // delete the texture - Texture *texture = texture_owner.get(p_rid); - - glDeleteTextures( 1,&texture->tex_id ); - _rinfo.texture_mem-=texture->total_data_size; - texture_owner.free(p_rid); - memdelete(texture); - - } else if (shader_owner.owns(p_rid)) { - - // delete the texture - Shader *shader = shader_owner.get(p_rid); - - - - shader_owner.free(p_rid); - memdelete(shader); - - } else if (material_owner.owns(p_rid)) { - - Material *material = material_owner.get( p_rid ); - ERR_FAIL_COND(!material); - - material_owner.free(p_rid); - memdelete(material); - - } else if (mesh_owner.owns(p_rid)) { - - Mesh *mesh = mesh_owner.get(p_rid); - ERR_FAIL_COND(!mesh); - for (int i=0;isurfaces.size();i++) { - - Surface *surface = mesh->surfaces[i]; - if (surface->array_local != 0) { - memfree(surface->array_local); - }; - if (surface->index_array_local != 0) { - memfree(surface->index_array_local); - }; - - if (mesh->morph_target_count>0) { - - for(int i=0;imorph_target_count;i++) { - - memfree(surface->morph_targets_local[i].array); - } - memfree(surface->morph_targets_local); - surface->morph_targets_local=NULL; - } - - if (surface->vertex_id) - glDeleteBuffers(1,&surface->vertex_id); - if (surface->index_id) - glDeleteBuffers(1,&surface->index_id); - - memdelete( surface ); - }; - - mesh->surfaces.clear(); - - mesh_owner.free(p_rid); - memdelete(mesh); - - } else if (multimesh_owner.owns(p_rid)) { - - MultiMesh *multimesh = multimesh_owner.get(p_rid); - ERR_FAIL_COND(!multimesh); - - multimesh_owner.free(p_rid); - memdelete(multimesh); - - } else if (particles_owner.owns(p_rid)) { - - Particles *particles = particles_owner.get(p_rid); - ERR_FAIL_COND(!particles); - - particles_owner.free(p_rid); - memdelete(particles); - } else if (immediate_owner.owns(p_rid)) { - - Immediate *immediate = immediate_owner.get(p_rid); - ERR_FAIL_COND(!immediate); - - immediate_owner.free(p_rid); - memdelete(immediate); - } else if (particles_instance_owner.owns(p_rid)) { - - ParticlesInstance *particles_isntance = particles_instance_owner.get(p_rid); - ERR_FAIL_COND(!particles_isntance); - - particles_instance_owner.free(p_rid); - memdelete(particles_isntance); - - } else if (skeleton_owner.owns(p_rid)) { - - Skeleton *skeleton = skeleton_owner.get( p_rid ); - ERR_FAIL_COND(!skeleton) - - skeleton_owner.free(p_rid); - memdelete(skeleton); - - } else if (light_owner.owns(p_rid)) { - - Light *light = light_owner.get( p_rid ); - ERR_FAIL_COND(!light) - - light_owner.free(p_rid); - memdelete(light); - - } else if (light_instance_owner.owns(p_rid)) { - - LightInstance *light_instance = light_instance_owner.get( p_rid ); - ERR_FAIL_COND(!light_instance); - light_instance->clear_shadow_buffers(); - light_instance_owner.free(p_rid); - memdelete( light_instance ); - - } else if (fx_owner.owns(p_rid)) { - - FX *fx = fx_owner.get( p_rid ); - ERR_FAIL_COND(!fx); - - fx_owner.free(p_rid); - memdelete( fx ); - - } else if (environment_owner.owns(p_rid)) { - - Environment *env = environment_owner.get( p_rid ); - ERR_FAIL_COND(!env); - - environment_owner.free(p_rid); - memdelete( env ); - } else if (sampled_light_owner.owns(p_rid)) { - - SampledLight *sampled_light = sampled_light_owner.get( p_rid ); - ERR_FAIL_COND(!sampled_light); - - sampled_light_owner.free(p_rid); - memdelete( sampled_light ); - }; -} - - -void RasterizerGLES1::custom_shade_model_set_shader(int p_model, RID p_shader) { - - -}; - -RID RasterizerGLES1::custom_shade_model_get_shader(int p_model) const { - - return RID(); -}; - -void RasterizerGLES1::custom_shade_model_set_name(int p_model, const String& p_name) { - -}; - -String RasterizerGLES1::custom_shade_model_get_name(int p_model) const { - - return String(); -}; - -void RasterizerGLES1::custom_shade_model_set_param_info(int p_model, const List& p_info) { - -}; - -void RasterizerGLES1::custom_shade_model_get_param_info(int p_model, List* p_info) const { - -}; - - -void RasterizerGLES1::ShadowBuffer::init(int p_size) { - - -#if 0 - size=p_size; - - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &depth); - ERR_FAIL_COND(depth==0); - - /* Setup Depth Texture */ - glBindTexture(GL_TEXTURE_2D, depth); - glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, p_size, p_size, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - float border_color[]={1.0f, 1.0f, 1.0f, 1.0f}; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); - - /* Create FBO */ - glGenFramebuffers(1, &fbo); - - ERR_FAIL_COND( fbo==0 ); - - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0); - glDrawBuffer(GL_FALSE); - glReadBuffer(GL_FALSE); - - /* Check FBO creation */ - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); - - ERR_FAIL_COND( status==GL_FRAMEBUFFER_UNSUPPORTED ); - - glBindFramebufferEXT(GL_FRAMEBUFFER, 0); -#endif - -} - -void RasterizerGLES1::_init_shadow_buffers() { - - int near_shadow_size=GLOBAL_DEF("rasterizer/near_shadow_size",512); - int far_shadow_size=GLOBAL_DEF("rasterizer/far_shadow_size",64); - - near_shadow_buffers.resize( GLOBAL_DEF("rasterizer/near_shadow_count",4) ); - far_shadow_buffers.resize( GLOBAL_DEF("rasterizer/far_shadow_count",16) ); - - shadow_near_far_split_size_ratio = GLOBAL_DEF("rasterizer/shadow_near_far_split_size_ratio",0.3); - - for (int i=0;imake_current(); - - - - Set extensions; - Vector strings = String((const char*)glGetString( GL_EXTENSIONS )).split(" ",false); - for(int i=0;i textures; - texture_owner.get_owned_list(&textures); - keep_copies=false; - for(List::Element *E=textures.front();E;E=E->next()) { - - RID tid = E->get(); - Texture *t=texture_owner.get(tid); - ERR_CONTINUE(!t); - t->tex_id=0; - t->data_size=0; - glGenTextures(1, &t->tex_id); - t->active=false; - texture_allocate(tid,t->width,t->height,t->format,t->flags); - bool had_image=false; - for(int i=0;i<6;i++) { - if (!t->image[i].empty()) { - texture_set_data(tid,t->image[i],VS::CubeMapSide(i)); - had_image=true; - } - } - - if (!had_image && t->reloader) { - Object *rl = ObjectDB::get_instance(t->reloader); - if (rl) - rl->call(t->reloader_func,tid); - } - } - - keep_copies=true; - - -} - -bool RasterizerGLES1::has_feature(VS::Features p_feature) const { - - switch( p_feature) { - case VS::FEATURE_SHADERS: return false; - case VS::FEATURE_NEEDS_RELOAD_HOOK: return use_reload_hooks; - default: return false; - - } - -} - - -RasterizerGLES1::RasterizerGLES1(bool p_keep_copies,bool p_use_reload_hooks) { - skinned_buffer = NULL; - - keep_copies=p_keep_copies; - pack_arrays=false; - use_reload_hooks=p_use_reload_hooks; - - frame = 0; -}; - -RasterizerGLES1::~RasterizerGLES1() { - -}; - - -#endif diff --git a/platform/vita/rasterizer_vita.h b/platform/vita/rasterizer_vita.h deleted file mode 100644 index 720da7b7..00000000 --- a/platform/vita/rasterizer_vita.h +++ /dev/null @@ -1,1301 +0,0 @@ -/*************************************************************************/ -/* rasterizer_gles1.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef RASTERIZER_GLES1_H -#define RASTERIZER_GLES1_H - -#include "servers/visual/rasterizer.h" - -#ifdef __psp2__ - -#include "image.h" -#include "rid.h" -#include "servers/visual_server.h" -#include "list.h" -#include "map.h" -#include "camera_matrix.h" -#include "sort.h" -// #include "tools/editor/scene_tree_editor.h" -#include "platform_config.h" -#ifndef GLES1_INCLUDE_H -#include -// #include "immvertex.h" -#else -#include GLES1_INCLUDE_H -#endif - - -#include "servers/visual/particle_system_sw.h" - -/** - @author Juan Linietsky -*/ -class RasterizerGLES1 : public Rasterizer { - - enum { - - MAX_SCENE_LIGHTS=2048, - LIGHT_SPOT_BIT=0x80, - DEFAULT_SKINNED_BUFFER_SIZE = 1024 * 1024, // 10k vertices - MAX_HW_LIGHTS = 8, //yay! pvrpsp2 supports 8 hw lights - }; - #ifdef PSP - void glActiveTexture(int a1) { }; - void glClientActiveTexture(int a1) { }; - #endif - - GLuint BlurTexture; - - uint8_t *skinned_buffer; - int skinned_buffer_size; - bool pvr_supported; - bool s3tc_supported; - bool etc_supported; - bool npo2_textures_available; - bool pack_arrays; - bool use_reload_hooks; - bool is_editor; - uint8_t client_tex_index = 0; - - - Image _get_gl_image_and_format(const Image& p_image, Image::Format p_format, uint32_t p_flags,GLenum& r_gl_format,int &r_gl_components,bool &r_has_alpha_cache,bool &r_compressed); - - - struct Texture { - - uint32_t flags; - int width,height; - int alloc_width, alloc_height; - Image::Format format; - - GLenum target; - GLenum gl_format_cache; - int gl_components_cache; - int data_size; //original data size, useful for retrieving back - bool format_has_alpha; - bool compressed; - bool disallow_mipmaps; - int total_data_size; - - Image image[6]; - - bool active; - GLuint tex_id; - - ObjectID reloader; - StringName reloader_func; - - Texture() { - - flags=width=height=0; - tex_id=0; - data_size=0; - format=Image::FORMAT_GRAYSCALE; - gl_components_cache=0; - format_has_alpha=false; - active=false; - disallow_mipmaps=false; -// gen_mipmap=true; - compressed=false; - total_data_size=0; - } - - ~Texture() { - - if (tex_id!=0) { - - glDeleteTextures(1,&tex_id); - } - } - }; - - mutable RID_Owner texture_owner; - - struct Shader { - - String vertex_code; - String fragment_code; - String light_code; - VS::ShaderMode mode; - Map params; - int fragment_line; - int vertex_line; - int light_line; - bool valid; - bool has_alpha; - bool use_world_transform; - - }; - - mutable RID_Owner shader_owner; - - - struct Material { - - bool fixed_flags[VS::FIXED_MATERIAL_FLAG_MAX]; - bool flags[VS::MATERIAL_FLAG_MAX]; - Variant parameters[VisualServer::FIXED_MATERIAL_PARAM_MAX]; - RID textures[VisualServer::FIXED_MATERIAL_PARAM_MAX]; - - VS::MaterialDepthDrawMode depth_draw_mode; - - Transform uv_transform; - VS::FixedMaterialTexCoordMode texcoord_mode[VisualServer::FIXED_MATERIAL_PARAM_MAX]; - - VS::MaterialBlendMode blend_mode; - - float line_width; - float point_size; - bool has_alpha; - - RID shader; // shader material - uint64_t last_pass; - - Map shader_params; - - - Material() { - - - for(int i=0;i material_owner; - - void _material_check_alpha(Material *p_material); - - - struct Geometry { - - enum Type { - GEOMETRY_INVALID, - GEOMETRY_SURFACE, - GEOMETRY_POLY, - GEOMETRY_PARTICLES, - GEOMETRY_MULTISURFACE, - }; - - Type type; - RID material; - bool has_alpha; - bool material_owned; - - Geometry() { has_alpha=false; material_owned = false; } - virtual ~Geometry() {}; - }; - - struct GeometryOwner { - - virtual ~GeometryOwner() {} - }; - - class Mesh; - - struct Surface : public Geometry { - - struct ArrayData { - - uint32_t ofs,size,datatype,count; - bool normalize; - bool bind; - - ArrayData() { ofs=0; size=0; count=0; datatype=0; normalize=0; bind=false;} - }; - - Mesh *mesh; - - Array data; - Array morph_data; - ArrayData array[VS::ARRAY_MAX]; - // support for vertex array objects - GLuint array_object_id; - // support for vertex buffer object - GLuint vertex_id; // 0 means, unconfigured - GLuint index_id; // 0 means, unconfigured - // no support for the above, array in localmem. - uint8_t *array_local; - uint8_t *index_array_local; - - bool packed; - - struct MorphTarget { - uint32_t configured_format; - uint8_t *array; - }; - - MorphTarget* morph_targets_local; - int morph_target_count; - AABB aabb; - - int array_len; - int index_array_len; - int max_bone; - - float vertex_scale; - float uv_scale; - float uv2_scale; - - VS::PrimitiveType primitive; - - uint32_t format; - uint32_t configured_format; - - int stride; - int local_stride; - uint32_t morph_format; - - bool active; - - Point2 uv_min; - Point2 uv_max; - - Surface() { - - - array_len=0; - local_stride=0; - morph_format=0; - type=GEOMETRY_SURFACE; - primitive=VS::PRIMITIVE_POINTS; - index_array_len=0; - vertex_scale=1.0; - uv_scale=1.0; - uv2_scale=1.0; - - format=0; - stride=0; - morph_targets_local=0; - morph_target_count=0; - - array_local = index_array_local = 0; - vertex_id = index_id = 0; - - active=false; - packed=false; - } - - ~Surface() { - - } - }; - - - struct Mesh { - - bool active; - Vector surfaces; - int morph_target_count; - VS::MorphTargetMode morph_target_mode; - AABB custom_aabb; - - mutable uint64_t last_pass; - Mesh() { - morph_target_mode=VS::MORPH_MODE_NORMALIZED; - morph_target_count=0; - last_pass=0; - active=false; - } - }; - mutable RID_Owner mesh_owner; - - Error _surface_set_arrays(Surface *p_surface, uint8_t *p_mem,uint8_t *p_index_mem,const Array& p_arrays,bool p_main); - - struct MultiMesh; - - struct MultiMeshSurface : public Geometry { - - Surface *surface; - MultiMeshSurface() { type=GEOMETRY_MULTISURFACE; } - }; - - struct MultiMesh : public GeometryOwner { - - struct Element { - - float matrix[16]; - uint8_t color[4]; - Element() { - matrix[0]=1; - matrix[1]=0; - matrix[2]=0; - matrix[3]=0; - - matrix[4]=0; - matrix[5]=1; - matrix[6]=0; - matrix[7]=0; - - matrix[8]=0; - matrix[9]=0; - matrix[10]=1; - matrix[11]=0; - - matrix[12]=0; - matrix[13]=0; - matrix[14]=0; - matrix[15]=1; - }; - - - }; - - AABB aabb; - RID mesh; - int visible; - - //IDirect3DVertexBuffer9* instance_buffer; - Vector elements; - Vector cache_surfaces; - mutable uint64_t last_pass; - GLuint tex_id; - int tw; - int th; - - SelfList dirty_list; - - MultiMesh() : dirty_list(this) { - - tw=1; - th=1; - tex_id=0; - last_pass=0; - visible = -1; - } - }; - - mutable RID_Owner multimesh_owner; - mutable SelfList::List _multimesh_dirty_list; - - struct Immediate { - - RID material; - int empty; - }; - - mutable RID_Owner immediate_owner; - - struct Particles : public Geometry { - - ParticleSystemSW data; // software particle system - - Particles() { - type=GEOMETRY_PARTICLES; - - } - }; - - mutable RID_Owner particles_owner; - - struct ParticlesInstance : public GeometryOwner { - - RID particles; - - ParticleSystemProcessSW particles_process; - Transform transform; - - ParticlesInstance() { } - }; - - mutable RID_Owner particles_instance_owner; - ParticleSystemDrawInfoSW particle_draw_info; - - struct Skeleton { - - Vector bones; - - }; - - mutable RID_Owner skeleton_owner; - - - struct Light { - - VS::LightType type; - float vars[VS::LIGHT_PARAM_MAX]; - Color colors[3]; - bool shadow_enabled; - RID projector; - bool volumetric_enabled; - Color volumetric_color; - - - Light() { - - vars[VS::LIGHT_PARAM_SPOT_ATTENUATION]=1; - vars[VS::LIGHT_PARAM_SPOT_ANGLE]=45; - vars[VS::LIGHT_PARAM_ATTENUATION]=1.0; - vars[VS::LIGHT_PARAM_ENERGY]=1.0; - vars[VS::LIGHT_PARAM_RADIUS]=1.0; - vars[VS::LIGHT_PARAM_SHADOW_Z_OFFSET]=0.05; - - colors[VS::LIGHT_COLOR_DIFFUSE]=Color(1,1,1); - colors[VS::LIGHT_COLOR_SPECULAR]=Color(1,1,1); - shadow_enabled=false; - volumetric_enabled=false; - } - }; - - - struct Environment { - - - VS::EnvironmentBG bg_mode; - Variant bg_param[VS::ENV_BG_PARAM_MAX]; - bool fx_enabled[VS::ENV_FX_MAX]; - Variant fx_param[VS::ENV_FX_PARAM_MAX]; - Variant group[VS::ENV_GROUP_MAX]; - - Environment() { - - bg_mode=VS::ENV_BG_DEFAULT_COLOR; - bg_param[VS::ENV_BG_PARAM_COLOR]=Color(0,0,0); - bg_param[VS::ENV_BG_PARAM_TEXTURE]=RID(); - bg_param[VS::ENV_BG_PARAM_CUBEMAP]=RID(); - bg_param[VS::ENV_BG_PARAM_ENERGY]=1.0; - - for(int i=0;i environment_owner; - Environment *current_env; - - struct SampledLight { - - int w,h; - GLuint texture; - float multiplier; - bool is_float; - }; - - mutable RID_Owner sampled_light_owner; - - struct ShadowBuffer; - - struct LightInstance { - - struct SplitInfo { - - CameraMatrix camera; - Transform transform; - float near; - float far; - }; - - RID light; - Light *base; - Transform transform; - CameraMatrix projection; - - Transform custom_transform; - CameraMatrix custom_projection; - - Vector3 light_vector; - Vector3 spot_vector; - float linear_att; - - uint64_t shadow_pass; - uint64_t last_pass; - uint16_t sort_key; - - Vector shadow_buffers; - - void clear_shadow_buffers() { - - for (int i=0;iowner != this ); - - sb->owner=NULL; - } - - shadow_buffers.clear(); - } - - LightInstance() { shadow_pass=0; last_pass=0; sort_key=0; } - - }; - mutable RID_Owner light_owner; - mutable RID_Owner light_instance_owner; - - LightInstance *light_instances[MAX_SCENE_LIGHTS]; - LightInstance *directional_lights[4]; -// LightInstance *directional_light_instances[MAX_SCENE_LIGHTS]; - int light_instance_count; - int directional_light_count; - int last_light_id; - - - struct RenderList { - - enum { - MAX_ELEMENTS=4096, - MAX_LIGHTS=8192 - }; - - struct Element { - - - float depth; - const InstanceData *instance; - const Skeleton *skeleton; - union { - uint16_t lights[MAX_HW_LIGHTS]; - uint64_t light_key; - }; - - const Geometry *geometry; - const Material *material; - const GeometryOwner *owner; - uint16_t light_count; - bool mirror; - - - }; - - - Element _elements[MAX_ELEMENTS]; - Element *elements[MAX_ELEMENTS]; - int element_count; - - void clear() { - - element_count=0; - } - - struct SortZ { - - _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { - - return A->depth > B->depth; - } - }; - - void sort_z() { - - SortArray sorter; - sorter.sort(elements,element_count); - } - - - struct SortMat { - - _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { - // TODO move to a single uint64 (one comparison) - if (A->material == B->material) { - - return A->light_key < B->light_key; - } else { - - return (A->material < B->material); - } - } - }; - - void sort_mat() { - - SortArray sorter; - sorter.sort(elements,element_count); - } - - struct SortMatLight { - - _FORCE_INLINE_ bool operator()(const Element* A, const Element* B ) const { - - if (A->material->flags[VS::MATERIAL_FLAG_UNSHADED] == B->material->flags[VS::MATERIAL_FLAG_UNSHADED]) { - - if (A->material == B->material) { - - if (A->geometry == B->geometry) { - - return A->light_keylight_key; - } else - return (A->geometry < B->geometry); - } else { - - return (A->material < B->material); - } - } else { - - return (int(A->material->flags[VS::MATERIAL_FLAG_UNSHADED]) < int(B->material->flags[VS::MATERIAL_FLAG_UNSHADED])); - } - } - }; - - void sort_mat_light() { - - SortArray sorter; - sorter.sort(elements,element_count); - } - - _FORCE_INLINE_ Element* add_element() { - - if (element_count>MAX_ELEMENTS) - return NULL; - elements[element_count]=&_elements[element_count]; - return elements[element_count++]; - } - - RenderList() { - - element_count = 0; - for (int i=0;i fx_owner; - - - FX *scene_fx; - CameraMatrix camera_projection; - Transform camera_transform; - Transform camera_transform_inverse; - float camera_z_near; - float camera_z_far; - Size2 camera_vp_size; - Color last_color; - - Plane camera_plane; - - bool keep_copies; - - bool depth_write; - bool depth_test; - int blend_mode; - bool lighting; - - _FORCE_INLINE_ void _add_geometry( const Geometry* p_geometry, const InstanceData *p_instance, const Geometry *p_geometry_cmp, const GeometryOwner *p_owner); - - void _render_list_forward(RenderList *p_render_list,bool p_reverse_cull=false); - - void _setup_light(LightInstance* p_instance, int p_idx); - void _setup_lights(const uint16_t * p_lights,int p_light_count); - - _FORCE_INLINE_ void _setup_shader_params(const Material *p_material); - void _setup_fixed_material(const Geometry *p_geometry,const Material *p_material); - void _setup_material(const Geometry *p_geometry,const Material *p_material); - - Error _setup_geometry(const Geometry *p_geometry, const Material* p_material,const Skeleton *p_skeleton, const float *p_morphs); - void _render(const Geometry *p_geometry,const Material *p_material, const Skeleton* p_skeleton, const GeometryOwner *p_owner); - - - /***********/ - /* SHADOWS */ - /***********/ - - struct ShadowBuffer { - - int size; - GLuint fbo; - GLuint depth; - LightInstance *owner; - void init(int p_size); - ShadowBuffer() { size=0; depth=0; owner=NULL; } - }; - - Vector near_shadow_buffers; - Vector far_shadow_buffers; - - LightInstance *shadow; - int shadow_pass; - void _init_shadow_buffers(); - - float shadow_near_far_split_size_ratio; - bool _allocate_shadow_buffers(LightInstance *p_instance, Vector& p_buffers); - void _debug_draw_shadow(GLuint tex, const Rect2& p_rect); - void _debug_draw_shadows_type(Vector& p_shadows,Point2& ofs); - void _debug_shadows(); - void reset_state(); - - /***********/ - /* FBOs */ - /***********/ - - - struct FrameBuffer { - - GLuint fbo; - GLuint color; - GLuint depth; - int width,height; - bool buff16; - bool active; - - struct Blur { - - GLuint fbo; - GLuint color; - } blur[2]; - - } framebuffer; - - void _update_framebuffer(); - void _process_glow_and_bloom(); - - /*********/ - /* FRAME */ - /*********/ - - struct _Rinfo { - - int texture_mem; - int vertex_count; - int object_count; - int mat_change_count; - int shader_change_count; - - } _rinfo; - - GLuint white_tex; - RID canvas_tex; - float canvas_opacity; - VS::MaterialBlendMode canvas_blend; - _FORCE_INLINE_ Texture* _bind_canvas_texture(const RID& p_texture); - - - int _setup_geometry_vinfo; - - bool cull_front; - _FORCE_INLINE_ void _set_cull(bool p_front,bool p_reverse_cull=false); - - Size2 window_size; - VS::ViewportRect viewport; - double last_time; - double time_delta; - uint64_t frame; - uint64_t scene_pass; - - //void _draw_primitive(int p_points, const Vector3 *p_vertices, const Vector3 *p_normals, const Color* p_colors, const Vector3 *p_uvs,const Plane *p_tangents=NULL,int p_instanced=1); - //void _draw_textured_quad(const Rect2& p_rect, const Rect2& p_src_region, const Size2& p_tex_size,bool p_h_flip=false, bool p_v_flip=false ); - //void _draw_quad(const Rect2& p_rect); - void _process_blur(int times, float inc); - -public: - - /* TEXTURE API */ - - virtual RID texture_create(); - virtual void texture_allocate(RID p_texture,int p_width, int p_height,Image::Format p_format,uint32_t p_flags=VS::TEXTURE_FLAGS_DEFAULT); - virtual void texture_set_data(RID p_texture,const Image& p_image,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT); - virtual Image texture_get_data(RID p_texture,VS::CubeMapSide p_cube_side=VS::CUBEMAP_LEFT) const; - virtual void texture_set_flags(RID p_texture,uint32_t p_flags); - virtual uint32_t texture_get_flags(RID p_texture) const; - virtual Image::Format texture_get_format(RID p_texture) const; - virtual uint32_t texture_get_width(RID p_texture) const; - virtual uint32_t texture_get_height(RID p_texture) const; - virtual bool texture_has_alpha(RID p_texture) const; - virtual void texture_set_size_override(RID p_texture,int p_width, int p_height); - virtual void texture_set_reload_hook(RID p_texture,ObjectID p_owner,const StringName& p_function) const; - - /* SHADER API */ - - virtual RID shader_create(VS::ShaderMode p_mode=VS::SHADER_MATERIAL); - - virtual void shader_set_mode(RID p_shader,VS::ShaderMode p_mode); - virtual VS::ShaderMode shader_get_mode(RID p_shader) const; - - virtual void shader_set_code(RID p_shader, const String& p_vertex, const String& p_fragment,const String& p_light,int p_vertex_ofs=0,int p_fragment_ofs=0,int p_light_ofs=0); - virtual String shader_get_fragment_code(RID p_shader) const; - virtual String shader_get_vertex_code(RID p_shader) const; - virtual String shader_get_light_code(RID p_shader) const; - - virtual void shader_get_param_list(RID p_shader, List *p_param_list) const; - - /* COMMON MATERIAL API */ - - virtual RID material_create(); - - virtual void material_set_shader(RID p_shader_material, RID p_shader); - virtual RID material_get_shader(RID p_shader_material) const; - - virtual void material_set_param(RID p_material, const StringName& p_param, const Variant& p_value); - virtual Variant material_get_param(RID p_material, const StringName& p_param) const; - - virtual void material_set_flag(RID p_material, VS::MaterialFlag p_flag,bool p_enabled); - virtual bool material_get_flag(RID p_material,VS::MaterialFlag p_flag) const; - - virtual void material_set_depth_draw_mode(RID p_material, VS::MaterialDepthDrawMode p_mode); - virtual VS::MaterialDepthDrawMode material_get_depth_draw_mode(RID p_material) const; - - virtual void material_set_blend_mode(RID p_material,VS::MaterialBlendMode p_mode); - virtual VS::MaterialBlendMode material_get_blend_mode(RID p_material) const; - - virtual void material_set_line_width(RID p_material,float p_line_width); - virtual float material_get_line_width(RID p_material) const; - - /* FIXED MATERIAL */ - - virtual RID fixed_material_create(); - - virtual void fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled); - virtual bool fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const; - - virtual void fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value); - virtual Variant fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const; - - virtual void fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture); - virtual RID fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const; - - virtual void fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode); - virtual VS::FixedMaterialTexCoordMode fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const; - - virtual void fixed_material_set_uv_transform(RID p_material,const Transform& p_transform); - virtual Transform fixed_material_get_uv_transform(RID p_material) const; - - virtual void fixed_material_set_point_size(RID p_material,float p_size); - virtual float fixed_material_get_point_size(RID p_material) const; - - /* MESH API */ - - - virtual RID mesh_create(); - - virtual void mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive,const Array& p_arrays,const Array& p_blend_shapes=Array(),bool p_alpha_sort=false); - virtual Array mesh_get_surface_arrays(RID p_mesh,int p_surface) const; - virtual Array mesh_get_surface_morph_arrays(RID p_mesh,int p_surface) const; - virtual void mesh_add_custom_surface(RID p_mesh,const Variant& p_dat); - - virtual void mesh_set_morph_target_count(RID p_mesh,int p_amount); - virtual int mesh_get_morph_target_count(RID p_mesh) const; - - virtual void mesh_set_morph_target_mode(RID p_mesh,VS::MorphTargetMode p_mode); - virtual VS::MorphTargetMode mesh_get_morph_target_mode(RID p_mesh) const; - - virtual void mesh_surface_set_material(RID p_mesh, int p_surface, RID p_material,bool p_owned=false); - virtual RID mesh_surface_get_material(RID p_mesh, int p_surface) const; - - virtual int mesh_surface_get_array_len(RID p_mesh, int p_surface) const; - virtual int mesh_surface_get_array_index_len(RID p_mesh, int p_surface) const; - virtual uint32_t mesh_surface_get_format(RID p_mesh, int p_surface) const; - virtual VS::PrimitiveType mesh_surface_get_primitive_type(RID p_mesh, int p_surface) const; - - virtual void mesh_remove_surface(RID p_mesh,int p_index); - virtual int mesh_get_surface_count(RID p_mesh) const; - - virtual AABB mesh_get_aabb(RID p_mesh,RID p_skeleton=RID()) const; - - virtual void mesh_set_custom_aabb(RID p_mesh,const AABB& p_aabb); - virtual AABB mesh_get_custom_aabb(RID p_mesh) const; - - /* MULTIMESH API */ - - virtual RID multimesh_create(); - - virtual void multimesh_set_instance_count(RID p_multimesh,int p_count); - virtual int multimesh_get_instance_count(RID p_multimesh) const; - - virtual void multimesh_set_mesh(RID p_multimesh,RID p_mesh); - virtual void multimesh_set_aabb(RID p_multimesh,const AABB& p_aabb); - virtual void multimesh_instance_set_transform(RID p_multimesh,int p_index,const Transform& p_transform); - virtual void multimesh_instance_set_color(RID p_multimesh,int p_index,const Color& p_color); - - virtual RID multimesh_get_mesh(RID p_multimesh) const; - virtual AABB multimesh_get_aabb(RID p_multimesh) const;; - - virtual Transform multimesh_instance_get_transform(RID p_multimesh,int p_index) const; - virtual Color multimesh_instance_get_color(RID p_multimesh,int p_index) const; - - virtual void multimesh_set_visible_instances(RID p_multimesh,int p_visible); - virtual int multimesh_get_visible_instances(RID p_multimesh) const; - - /* IMMEDIATE API */ - - virtual RID immediate_create(); - virtual void immediate_begin(RID p_immediate,VS::PrimitiveType p_rimitive,RID p_texture=RID()); - virtual void immediate_vertex(RID p_immediate,const Vector3& p_vertex); - virtual void immediate_normal(RID p_immediate,const Vector3& p_normal); - virtual void immediate_tangent(RID p_immediate,const Plane& p_tangent); - virtual void immediate_color(RID p_immediate,const Color& p_color); - virtual void immediate_uv(RID p_immediate,const Vector2& tex_uv); - virtual void immediate_uv2(RID p_immediate,const Vector2& tex_uv); - virtual void immediate_end(RID p_immediate); - virtual void immediate_clear(RID p_immediate); - virtual AABB immediate_get_aabb(RID p_immediate) const; - virtual void immediate_set_material(RID p_immediate,RID p_material); - virtual RID immediate_get_material(RID p_immediate) const; - - - /* PARTICLES API */ - - virtual RID particles_create(); - - virtual void particles_set_amount(RID p_particles, int p_amount); - virtual int particles_get_amount(RID p_particles) const; - - virtual void particles_set_emitting(RID p_particles, bool p_emitting); - virtual bool particles_is_emitting(RID p_particles) const; - - virtual void particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility); - virtual AABB particles_get_visibility_aabb(RID p_particles) const; - - virtual void particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents); - virtual Vector3 particles_get_emission_half_extents(RID p_particles) const; - - virtual void particles_set_emission_base_velocity(RID p_particles, const Vector3& p_base_velocity); - virtual Vector3 particles_get_emission_base_velocity(RID p_particles) const; - - virtual void particles_set_emission_points(RID p_particles, const DVector& p_points); - virtual DVector particles_get_emission_points(RID p_particles) const; - - virtual void particles_set_gravity_normal(RID p_particles, const Vector3& p_normal); - virtual Vector3 particles_get_gravity_normal(RID p_particles) const; - - virtual void particles_set_variable(RID p_particles, VS::ParticleVariable p_variable,float p_value); - virtual float particles_get_variable(RID p_particles, VS::ParticleVariable p_variable) const; - - virtual void particles_set_randomness(RID p_particles, VS::ParticleVariable p_variable,float p_randomness); - virtual float particles_get_randomness(RID p_particles, VS::ParticleVariable p_variable) const; - - virtual void particles_set_color_phase_pos(RID p_particles, int p_phase, float p_pos); - virtual float particles_get_color_phase_pos(RID p_particles, int p_phase) const; - - virtual void particles_set_color_phases(RID p_particles, int p_phases); - virtual int particles_get_color_phases(RID p_particles) const; - - virtual void particles_set_color_phase_color(RID p_particles, int p_phase, const Color& p_color); - virtual Color particles_get_color_phase_color(RID p_particles, int p_phase) const; - - virtual void particles_set_attractors(RID p_particles, int p_attractors); - virtual int particles_get_attractors(RID p_particles) const; - - virtual void particles_set_attractor_pos(RID p_particles, int p_attractor, const Vector3& p_pos); - virtual Vector3 particles_get_attractor_pos(RID p_particles,int p_attractor) const; - - virtual void particles_set_attractor_strength(RID p_particles, int p_attractor, float p_force); - virtual float particles_get_attractor_strength(RID p_particles,int p_attractor) const; - - virtual void particles_set_material(RID p_particles, RID p_material,bool p_owned=false); - virtual RID particles_get_material(RID p_particles) const; - - virtual AABB particles_get_aabb(RID p_particles) const; - - virtual void particles_set_height_from_velocity(RID p_particles, bool p_enable); - virtual bool particles_has_height_from_velocity(RID p_particles) const; - - virtual void particles_set_use_local_coordinates(RID p_particles, bool p_enable); - virtual bool particles_is_using_local_coordinates(RID p_particles) const; - - /* SKELETON API */ - - virtual RID skeleton_create(); - virtual void skeleton_resize(RID p_skeleton,int p_bones); - virtual int skeleton_get_bone_count(RID p_skeleton) const; - virtual void skeleton_bone_set_transform(RID p_skeleton,int p_bone, const Transform& p_transform); - virtual Transform skeleton_bone_get_transform(RID p_skeleton,int p_bone); - - - /* LIGHT API */ - - virtual RID light_create(VS::LightType p_type); - virtual VS::LightType light_get_type(RID p_light) const; - - virtual void light_set_color(RID p_light,VS::LightColor p_type, const Color& p_color); - virtual Color light_get_color(RID p_light,VS::LightColor p_type) const; - - virtual void light_set_shadow(RID p_light,bool p_enabled); - virtual bool light_has_shadow(RID p_light) const; - - virtual void light_set_volumetric(RID p_light,bool p_enabled); - virtual bool light_is_volumetric(RID p_light) const; - - virtual void light_set_projector(RID p_light,RID p_texture); - virtual RID light_get_projector(RID p_light) const; - - virtual void light_set_var(RID p_light, VS::LightParam p_var, float p_value); - virtual float light_get_var(RID p_light, VS::LightParam p_var) const; - - virtual void light_set_operator(RID p_light,VS::LightOp p_op); - virtual VS::LightOp light_get_operator(RID p_light) const; - - virtual void light_omni_set_shadow_mode(RID p_light,VS::LightOmniShadowMode p_mode); - virtual VS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) const; - - - virtual void light_directional_set_shadow_mode(RID p_light,VS::LightDirectionalShadowMode p_mode); - virtual VS::LightDirectionalShadowMode light_directional_get_shadow_mode(RID p_light) const; - virtual void light_directional_set_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param, float p_value); - virtual float light_directional_get_shadow_param(RID p_light,VS::LightDirectionalShadowParam p_param) const; - - virtual AABB light_get_aabb(RID p_poly) const; - - - virtual RID light_instance_create(RID p_light); - virtual void light_instance_set_transform(RID p_light_instance,const Transform& p_transform); - - virtual bool light_instance_has_shadow(RID p_light_instance) const; - virtual bool light_instance_assign_shadow(RID p_light_instance); - virtual ShadowType light_instance_get_shadow_type(RID p_light_instance) const; - virtual int light_instance_get_shadow_passes(RID p_light_instance) const; - virtual bool light_instance_get_pssm_shadow_overlap(RID p_light_instance) const; - virtual void light_instance_set_custom_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); - virtual int light_instance_get_shadow_size(RID p_light_instance, int p_index=0) const { return 1; } - - virtual ShadowType light_instance_get_shadow_type(RID p_light_instance,bool p_far=false) const; - virtual void light_instance_set_shadow_transform(RID p_light_instance, int p_index, const CameraMatrix& p_camera, const Transform& p_transform, float p_split_near=0,float p_split_far=0); - - virtual void shadow_clear_near(); - virtual bool shadow_allocate_near(RID p_light); - virtual bool shadow_allocate_far(RID p_light); - - - /* PARTICLES INSTANCE */ - - virtual RID particles_instance_create(RID p_particles); - virtual void particles_instance_set_transform(RID p_particles_instance,const Transform& p_transform); - - /* VIEWPORT */ - - virtual RID viewport_data_create(); - - virtual RID render_target_create(); - virtual void render_target_set_size(RID p_render_target, int p_width, int p_height); - virtual RID render_target_get_texture(RID p_render_target) const; - virtual bool render_target_renedered_in_frame(RID p_render_target); - - /* RENDER API */ - /* all calls (inside begin/end shadow) are always warranted to be in the following order: */ - - virtual void begin_frame(); - - virtual void set_viewport(const VS::ViewportRect& p_viewport); - virtual void set_render_target(RID p_render_target,bool p_transparent_bg=false,bool p_vflip=false); - virtual void clear_viewport(const Color& p_color); - virtual void capture_viewport(Image* r_capture); - - - virtual void begin_scene(RID p_viewport_data,RID p_env,VS::ScenarioDebugMode p_debug); - virtual void begin_shadow_map( RID p_light_instance, int p_shadow_pass ); - - virtual void set_camera(const Transform& p_world,const CameraMatrix& p_projection); - - virtual void add_light( RID p_light_instance ); ///< all "add_light" calls happen before add_geometry calls - - - virtual void add_mesh( const RID& p_mesh, const InstanceData *p_data); - virtual void add_multimesh( const RID& p_multimesh, const InstanceData *p_data); - virtual void add_immediate( const RID& p_immediate, const InstanceData *p_data) {} - virtual void add_particles( const RID& p_particle_instance, const InstanceData *p_data); - - virtual void end_scene(); - virtual void end_shadow_map(); - - virtual void end_frame(); - - /* CANVAS API */ - - virtual void canvas_begin(); - virtual void canvas_disable_blending(); - virtual void canvas_set_opacity(float p_opacity); - virtual void canvas_set_blend_mode(VS::MaterialBlendMode p_mode); - virtual void canvas_begin_rect(const Matrix32& p_transform); - virtual void canvas_set_clip(bool p_clip, const Rect2& p_rect); - virtual void canvas_end_rect(); - virtual void canvas_draw_line(const Point2& p_from, const Point2& p_to,const Color& p_color,float p_width); - virtual void canvas_draw_rect(const Rect2& p_rect, int p_flags, const Rect2& p_source,RID p_texture,const Color& p_modulate); - virtual void canvas_draw_style_box(const Rect2& p_rect, RID p_texture,const float *p_margins, bool p_draw_center=true,const Color& p_modulate=Color(1,1,1)); - virtual void canvas_draw_primitive(const Vector& p_points, const Vector& p_colors,const Vector& p_uvs, RID p_texture,float p_width); - virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor); - virtual void canvas_set_transform(const Matrix32& p_transform); - - /* FX */ - - virtual RID fx_create(); - virtual void fx_get_effects(RID p_fx,List *p_effects) const; - virtual void fx_set_active(RID p_fx,const String& p_effect, bool p_active); - virtual bool fx_is_active(RID p_fx,const String& p_effect) const; - virtual void fx_get_effect_params(RID p_fx,const String& p_effect,List *p_params) const; - virtual Variant fx_get_effect_param(RID p_fx,const String& p_effect,const String& p_param) const; - virtual void fx_set_effect_param(RID p_fx,const String& p_effect, const String& p_param, const Variant& p_pvalue); - - /* ENVIRONMENT */ - - virtual RID environment_create(); - - virtual void environment_set_background(RID p_env,VS::EnvironmentBG p_bg); - virtual VS::EnvironmentBG environment_get_background(RID p_env) const; - - virtual void environment_set_background_param(RID p_env,VS::EnvironmentBGParam p_param, const Variant& p_value); - virtual Variant environment_get_background_param(RID p_env,VS::EnvironmentBGParam p_param) const; - - virtual void environment_set_group(RID p_env,VS::Group p_group, const Variant& p_param); - virtual Variant environment_get_group(RID p_env, VS::Group p_param) const; - - virtual void environment_set_enable_fx(RID p_env,VS::EnvironmentFx p_effect,bool p_enabled); - virtual bool environment_is_fx_enabled(RID p_env,VS::EnvironmentFx p_effect) const; - - virtual void environment_fx_set_param(RID p_env,VS::EnvironmentFxParam p_param,const Variant& p_value); - virtual Variant environment_fx_get_param(RID p_env,VS::EnvironmentFxParam p_param) const; - - /* SAMPLED LIGHT */ - virtual RID sampled_light_dp_create(int p_width,int p_height); - virtual void sampled_light_dp_update(RID p_sampled_light,const Color *p_data,float p_multiplier); - - - /*MISC*/ - - virtual bool is_texture(const RID& p_rid) const; - virtual bool is_material(const RID& p_rid) const; - virtual bool is_mesh(const RID& p_rid) const; - virtual bool is_multimesh(const RID& p_rid) const; - virtual bool is_immediate(const RID& p_rid) const; - virtual bool is_particles(const RID &p_beam) const; - - virtual bool is_light(const RID& p_rid) const; - virtual bool is_light_instance(const RID& p_rid) const; - virtual bool is_particles_instance(const RID& p_rid) const; - virtual bool is_skeleton(const RID& p_rid) const; - virtual bool is_environment(const RID& p_rid) const; - virtual bool is_fx(const RID& p_rid) const; - virtual bool is_shader(const RID& p_rid) const; - - virtual void free(const RID& p_rid); - - virtual void custom_shade_model_set_shader(int p_model, RID p_shader); - virtual RID custom_shade_model_get_shader(int p_model) const; - virtual void custom_shade_model_set_name(int p_model, const String& p_name); - virtual String custom_shade_model_get_name(int p_model) const; - virtual void custom_shade_model_set_param_info(int p_model, const List& p_info); - virtual void custom_shade_model_get_param_info(int p_model, List* p_info) const; - - - virtual void init(); - virtual void finish(); - - virtual int get_render_info(VS::RenderInfo p_info); - - void reload_vram(); - - virtual bool needs_to_draw_next_frame() const; - - virtual bool has_feature(VS::Features p_feature) const; - - -#ifdef TOOLS_ENABLED - RasterizerGLES1(bool p_keep_copies=true,bool p_use_reload_hooks=false); -#else - RasterizerGLES1(bool p_keep_copies=false,bool p_use_reload_hooks=false); -#endif - virtual ~RasterizerGLES1(); -}; - -#endif -#endif From 09837a77a161567f1e9ed5aa8c0cb343a634f264 Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sat, 1 Feb 2025 21:00:03 +0100 Subject: [PATCH 13/15] Merge vita gles1, make envmaps actually gles1 and implement pseudo reflections --- drivers/SCsub | 2 +- drivers/gles1/rasterizer_gles1.cpp | 148 +++++++++++++++++++++++++---- drivers/gles1/rasterizer_gles1.h | 6 ++ 3 files changed, 136 insertions(+), 20 deletions(-) diff --git a/drivers/SCsub b/drivers/SCsub index ae13aadf..99d2ddd4 100644 --- a/drivers/SCsub +++ b/drivers/SCsub @@ -13,7 +13,7 @@ if env["platform"] in ("x11", "vita", "javascript"): SConscript('gles2/SCsub'); if env["platform"] in ("x11soft", "windows"): SConscript('gl11/SCsub'); -elif env["platform"] != "vita": +else: SConscript('gles1/SCsub'); SConscript('gl_context/SCsub'); diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index 06df6228..e63faa4e 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -38,6 +38,27 @@ #include "gl_context/context_gl.h" #include +#ifndef GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT +#define GL_TEXTURE_CUBE_MAP_OES GL_TEXTURE_CUBE_MAP_EXT +#endif + +#ifdef __psp2__ +#include +#include +#endif + +#ifndef GL_TEXTURE_GEN_MODE_OES +#define GL_TEXTURE_GEN_MODE_OES GL_TEXTURE_GEN_MODE +#define GL_REFLECTION_MAP_OES GL_REFLECTION_MAP_ARB +#define glTexGeniOES glTexGeni +#endif + _FORCE_INLINE_ static void _gl_load_transform(const Transform& tr) { GLfloat matrix[16]={ /* build a 16x16 matrix */ @@ -3563,13 +3584,17 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP] ); ERR_FAIL_COND(!texture); - glEnable(GL_TEXTURE_2D); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); - glActiveTexture(GL_TEXTURE0); + + + glTexGeniOES(GL_S, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + glTexGeniOES(GL_T, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + glTexGeniOES(GL_R, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + glBindTexture( GL_TEXTURE_2D,texture->tex_id ); @@ -3577,8 +3602,31 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat // glDisable(GL_TEXTURE_GEN_T); } else { + // glDisable(GL_TEXTURE_CUBE_MAP_OES); + glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + glDisable(GL_TEXTURE_2D); + +#else + + if(p_material->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_ENVMAP] && p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP].is_valid()) { + + Texture *texture = texture_owner.get( p_material->textures[VS::FIXED_MATERIAL_PARAM_ENVMAP] ); + ERR_FAIL_COND(!texture); + + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_GEN_STR_OES); + + + glTexGeniOES(GL_TEXTURE_GEN_STR_OES, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + glBindTexture( GL_TEXTURE_2D,texture->tex_id ); + + } else { + glActiveTexture(GL_TEXTURE0); + glDisable(GL_TEXTURE_GEN_STR_OES); glDisable(GL_TEXTURE_2D); #endif if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { @@ -3591,13 +3639,20 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glBindTexture( GL_TEXTURE_2D,texture->tex_id ); // tc0_id_cache = texture->tex_id; + } else if(p_material->fixed_flags[VS::FIXED_MATERIAL_FLAG_USE_REFLECTION]) { + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, reflect_texture); + reflect = true; } else { + // glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_2D); + } -#ifndef __psp2__ +// #ifndef __psp2__ } -#endif +// #endif } @@ -4701,17 +4756,15 @@ void RasterizerGLES1::_render_list_forward(RenderList *p_render_list,bool p_reve // glDisable(GL_TEXTURE_2D); } - -// if(!normal_map) { -// -// // glActiveTexture(GL_TEXTURE1); -// // glClientActiveTexture(GL_TEXTURE1); -// glDisable(GL_TEXTURE_2D); -// } + + + if(!normal_map) { + + glActiveTexture(GL_TEXTURE1); + glClientActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + } if (material!=prev_material || geometry_cmp!=prev_geometry_cmp) { - - - // glDisable(GL_TEXTURE_2D); _setup_material(e->geometry,material); if(material->textures[VS::FIXED_MATERIAL_PARAM_NORMAL].is_valid() && material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { normal_map = true; @@ -5115,8 +5168,16 @@ void RasterizerGLES1::end_scene() { // material_shader.set_conditional( MaterialShaderGLES1::USE_FOG,false); if(current_env->fx_enabled[VS::ENV_FX_ES1_BLUR] && !is_editor) _process_blur(current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_TIMES], current_env->fx_param[VS::ENV_FX_PARAM_ES1_BLUR_ALPHA]); - - + if(!is_editor && reflect) { + // glEnable(GL_TEXTURE_CUBE_MAP_OES); + glViewport(0,0,256,256); + glBindTexture(GL_TEXTURE_2D, reflect_texture); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 256, 256, 0); + glBindTexture(GL_TEXTURE_2D, 0); + glViewport( viewport.x, window_size.height-(viewport.height+viewport.y), viewport.width,viewport.height ); + + } + reflect = false; // _debug_shadows(); } @@ -5375,6 +5436,7 @@ void RasterizerGLES1::end_frame() { */ //print_line("VTX: "+itos(_rinfo.vertex_count)+" OBJ: "+itos(_rinfo.object_count)+" MAT: "+itos(_rinfo.mat_change_count)+" SHD: "+itos(_rinfo.shader_change_count)); + OS::get_singleton()->swap_buffers(); } @@ -6593,7 +6655,13 @@ void RasterizerGLES1::init() { glewInit(); #endif - +#ifdef __psp2__ + glTexGeniOES = (PFNGLTEXGENIOESPROC)eglGetProcAddress("glTexGeniOES"); + + if (!glTexGeniOES) { + printf("Failed to load glTexGeniOES\n"); + } +#endif scene_pass=1; @@ -6667,6 +6735,48 @@ void RasterizerGLES1::init() { GL_LUMINANCE, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + + glGenTextures(1, &reflect_texture); + glBindTexture(GL_TEXTURE_2D, reflect_texture); +/* + + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES, 0, 4, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES, 0, 4, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES, 0, 4, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES, 0, 4, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES, 0, 4, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES, 0, 4, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, 0);*/ + + +#ifdef __psp2__ + glEnable(GL_TEXTURE_GEN_STR_OES); + glTexGeniOES(GL_TEXTURE_GEN_STR_OES, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); +#else + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + glTexGeniOES(GL_S, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + glTexGeniOES(GL_T, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + glTexGeniOES(GL_R, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); + +#endif + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#ifdef __psp2__ + glDisable(GL_TEXTURE_GEN_STR_OES); +#else + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); +#endif } void RasterizerGLES1::finish() { diff --git a/drivers/gles1/rasterizer_gles1.h b/drivers/gles1/rasterizer_gles1.h index 64c70fd4..b3bcd338 100644 --- a/drivers/gles1/rasterizer_gles1.h +++ b/drivers/gles1/rasterizer_gles1.h @@ -68,6 +68,12 @@ class RasterizerGLES1 : public Rasterizer { MAX_HW_LIGHTS = 4, #endif }; + +#ifdef __psp2__ + typedef void (*PFNGLTEXGENIOESPROC)(GLenum coord, GLenum pname, GLint param); + PFNGLTEXGENIOESPROC glTexGeniOES = NULL; +#endif + #ifdef PSP void glActiveTexture(int a1) { }; void glClientActiveTexture(int a1) { }; From 2fd6006c4e75a60e453626ba3157e9195405cadf Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sat, 1 Feb 2025 21:06:05 +0100 Subject: [PATCH 14/15] Merge vita gles1, make envmaps actually gles1 and implement pseudo reflections --- drivers/gles1/rasterizer_gles1.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index e63faa4e..b4ccb9d3 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -3620,7 +3620,6 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_GEN_STR_OES); - glTexGeniOES(GL_TEXTURE_GEN_STR_OES, GL_TEXTURE_GEN_MODE_OES, GL_REFLECTION_MAP_OES); glBindTexture( GL_TEXTURE_2D,texture->tex_id ); From 834eece6adc24767a6333138aec56f808057ec5d Mon Sep 17 00:00:00 2001 From: technicaljicama Date: Sat, 1 Feb 2025 21:11:21 +0100 Subject: [PATCH 15/15] Merge vita gles1, make envmaps actually gles1 and implement pseudo reflections --- drivers/gles1/rasterizer_gles1.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/drivers/gles1/rasterizer_gles1.cpp b/drivers/gles1/rasterizer_gles1.cpp index d7ea7ea1..b4ccb9d3 100644 --- a/drivers/gles1/rasterizer_gles1.cpp +++ b/drivers/gles1/rasterizer_gles1.cpp @@ -3608,7 +3608,6 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_2D); -<<<<<<< HEAD #else @@ -3628,8 +3627,6 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_GEN_STR_OES); glDisable(GL_TEXTURE_2D); -======= ->>>>>>> 2f243fa7ee88cb0c9ca9b35a9c0a5e838ee8fbd1 #endif if (p_material->textures[VS::FIXED_MATERIAL_PARAM_DIFFUSE].is_valid()) { @@ -3652,15 +3649,9 @@ void RasterizerGLES1::_setup_fixed_material(const Geometry *p_geometry,const Mat glDisable(GL_TEXTURE_2D); } -<<<<<<< HEAD // #ifndef __psp2__ } // #endif -======= -#ifndef __psp2__ - } -#endif ->>>>>>> 2f243fa7ee88cb0c9ca9b35a9c0a5e838ee8fbd1 }

    fl@(d*M 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Ṕ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 z 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