From ae8005dcebfff562c28b2dc5bf1802e7fa0be74f Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Mon, 30 Sep 2024 15:46:19 +0100 Subject: [PATCH] add shader strings for open gl --- ffi/gles3-export.c | 1 - ffi/gles3-import.sml | 19 ++++++++++++------- ffi/glfw-input.sml | 5 +++++ shell/gl-shaders.sml | 23 +++++++++++++++++++++++ shf | Bin 837688 -> 837632 bytes shf.mlb | 1 + 6 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 shell/gl-shaders.sml diff --git a/ffi/gles3-export.c b/ffi/gles3-export.c index 2e32429..79e7a11 100644 --- a/ffi/gles3-export.c +++ b/ffi/gles3-export.c @@ -7,7 +7,6 @@ unsigned int VERTEX_SHADER = GL_VERTEX_SHADER; unsigned int FRAGMENT_SHADER = GL_FRAGMENT_SHADER; unsigned int TRIANGLES = GL_TRIANGLES; -unsigned int TRIANGLE_FAN = GL_TRIANGLE_FAN; unsigned int STATIC_DRAW = GL_STATIC_DRAW; unsigned int DYNAMIC_DRAW = GL_DYNAMIC_DRAW; diff --git a/ffi/gles3-import.sml b/ffi/gles3-import.sml index d876cea..1afc329 100644 --- a/ffi/gles3-import.sml +++ b/ffi/gles3-import.sml @@ -10,16 +10,23 @@ struct (* OpenGL constants used. *) val (VERTEX_SHADER, _) = _symbol "VERTEX_SHADER" public : ( unit -> shader_type ) * ( shader_type -> unit ); + val VERTEX_SHADER = VERTEX_SHADER () + val (FRAGMENT_SHADER, _) = _symbol "FRAGMENT_SHADER" public : ( unit -> shader_type ) * ( shader_type -> unit ); + val FRAGMENT_SHADER = FRAGMENT_SHADER () + val (TRIANGLES, _) = _symbol "TRIANGLES" public : ( unit -> draw_mode ) * ( draw_mode -> unit ); - val (TRIANGLE_FAN, _) = - _symbol "TRIANGLE_FAN" public : ( unit -> draw_mode ) * ( draw_mode -> unit ); + val TRIANGLES = TRIANGLES () + val (STATIC_DRAW, _) = _symbol "STATIC_DRAW" public : ( unit -> update_mode ) * ( update_mode -> unit ); + val STATIC_DRAW = STATIC_DRAW () + val (DYNAMIC_DRAW, _) = _symbol "DYNAMIC_DRAW" public : ( unit -> update_mode ) * ( update_mode -> unit ); + val DYNAMIC_DRAW = DYNAMIC_DRAW () (* OpenGL functions used. *) val loadGlad = _import "loadGlad" public : unit -> unit; @@ -44,15 +51,13 @@ struct val attachShader = _import "attachShader" public : program * shader -> unit; val linkProgram = _import "linkProgram" public : program -> unit; val useProgram = _import "useProgram" public : program -> unit; + + val deleteShader = _import "deleteShader" public : program -> unit; val deleteProgram = _import "deleteProgram" public : program -> unit; val clearColor = _import "clearColor" public : Real32.real * Real32.real * Real32.real * Real32.real -> unit; val clear = _import "clear" public : unit -> unit; - val drawArrays = _import "drawArrays" public : draw_mode * int * int -> unit; - val getUniformLocation = - _import "getUniformLocation" public : program * string -> int; - val uniform4f = - _import "uniform4f" public : int * Real32.real * Real32.real * Real32.real * Real32.real -> unit; + val drawArrays = _import "drawArrays" public : draw_mode * int * int -> unit; end diff --git a/ffi/glfw-input.sml b/ffi/glfw-input.sml index f83307d..1759120 100644 --- a/ffi/glfw-input.sml +++ b/ffi/glfw-input.sml @@ -5,8 +5,13 @@ struct (* Constants. *) val (PRESS, _) = _symbol "PRESS" public : ( unit -> int ) * ( int -> unit ); + val PRESS = PRESS () + val (REPEAT, _) = _symbol "REPEAT" public : ( unit -> int ) * ( int -> unit ); + val REPEAT = REPEAT () + val (RELEASE, _) = _symbol "RELEASE" public : ( unit -> int ) * ( int -> unit ); + val RELEASE = RELEASE () end diff --git a/shell/gl-shaders.sml b/shell/gl-shaders.sml new file mode 100644 index 0000000..f426c2e --- /dev/null +++ b/shell/gl-shaders.sml @@ -0,0 +1,23 @@ +structure GlShaders = +struct + val xyrgbVertexShaderString = + "#version 300 es\n\ + \layout (location = 0) in vec2 apos;\n\ + \layout (location = 1) in vec3 col;\n\ + \out vec3 frag_col;\n\ + \void main()\n\ + \{\n\ + \ frag_col = col;\n\ + \ gl_Position = vec4(apos.x, apos.y, 0.0f, 1.0f);\n\ + \}" + + val rgbFragmentShaderString = + "#version 300 es\n\ + \precision mediump float;\n\ + \in vec3 frag_col;\n\ + \out vec4 FragColor;\n\ + \void main()\n\ + \{\n\ + \ FragColor = vec4(frag_col.x, frag_col.y, frag_col.z, 1.0f);\n\ + \}" +end diff --git a/shf b/shf index 821dd0fd32385cf85a98aa60259f640a8a92bc17..baa6fde4c0af8d88865cb09fc0cb7092fd48c0a4 100755 GIT binary patch delta 31260 zcma)l3tUuH*Z0|HxDO)3MHp0=!3%gvK~2F-2P_3E1LN_b9@D{FSZ1JBrlkX!sa<5e zEv(c*OVO+cOdYVYK}*rBK)YZUA5bgQG_Z?M5#N8Gvu7O7^M3F5@%!PLv;J$Xz4qE` zuf5Mchq0<;sI6pZNg|Uf``ya|tHw#{&pSozJ{IwL;+;pXWIufUGkX8uuELB1n^rH2 zdZ$@#2xjH$YPt?)j&-eFr{QyU=rmUHPG#t0{;Xu3IXcSdh`U?0<0DDM!Xzi6obK+)4gjF(v1}s0-W$tyb2>FnRoolL7R%p7VHT8Uu$?Mf z!P=U_Xlewzh2qR`c2qnIRh*sJi~ZmOW#{lj)}6^M65ZF2UF7bK?$3%jJ=`DGV14ue zHd<~BcP<^k!eq`^dkee9-B>Y*t>)KZgV_#F4-ST#;4e;6`F_bT1pew|)xERHihBh2 z;+#(nVOb0gofyh~0i{E?vR8Pk4-9AL6fZ`wv4D$5uyiJy{OD*3n*d|Zuv8{1LFqP9 zwfgW#kJVVe1?QxCQzQl5#+iE z@@FHRnaT#lG?F|*lBTsWAE|Xkn3MxrKSq*TZ`n?<)7WAbN1LXx0g*-P)}JIPC*H@>ZkF)-qP*{% zPX2frY=1%z=COx@tn1}r)^V01?%OVz?CH zkf*gtk|lM2x>RqWE7MsoHiHZ^*j?S4LT#stWU1Zehu`Uv-8DpNZ2l)o<5SXoBzt>jXB4+~o;qf*=z)>8Q+<}Rw&k!=jBYMNG)!;E zImPjkeHMB!6Fr#WXK7z1vCA_kZ6@m-35`32hD~TlZ_whIY^m{Bm=v*px>WB#u-IQq z*O_@tgQdz$GR$J#ea%jJ#D|oOj|Nk@yuX(uwNKwI@8@kg=)qa+HfEzuv)F>bVs58c zst>2g*=$M3j8-|v3Mb;Eh|9WG+A^DUV~wd`BlOH0NRVSlGRWn=K9efG$1EX0v3}|}Z?Bx_oJMyWTjgs2UKF9-%0~=*&=lpm?Rrx#&pUF5E!QRf*0&J%k z+-uZ@?><6lbJ;)HFO>W!OXz7`)0xw#)9pSLDn*nP%k}QKO_Nybi}W1~ut%wVE)xC| zMIq3!T27` z((Ve8+G`%b0KX&eAA>MU2WaABm<6VK8ePb`(;JVm!K}ApqL1xy)r1b6JrJ*}Ux*oW zWU8h8aEJvqEbTlz{mEQ_Mvqfk0iu*nn+n+Ak^UESIVNU1#Tz@uQz2c4G)IOZ%gT@v zE+n$zOqg)y-@=)_Bp0%g$k*Eo*xdOM6+C~_fYt&bW7Ted2Bo+_VYgMG`l%Q@*(y%4$dFkM-QXnjm&Pas;> z398&~n)5h|P!aRZ)s*yhBx58Um?v2v1*2^+>oNZKeKC zu$agv@YxkF@rhaKDnqWKAY1AFC)jvas5WaFqgu$K`X^vFSK;=MMycEp+%CGuyY|&2 zX}zOK-bXzavS_kC$xJL&*ho>Oqm?fDWvrHS4u3@l7h*ed=_|UrkoBiK7C~H6#ie9b z{6Dl|5sT|N9s7i0>=O>74LJbwJwR%gOsMrp!dj|d#1hyyWLV4+Mq3A}iU+%h-gZMi z$MZ}=I^wfQZ#!i}t{0)syT++WVk?HFZc@8dPg9>_eY-S4rYHvT#g^1EvOmS5l*%DX z#h%JBi>jZ(oY0uPVgpDwwlF7Znj#dkxY-9HL z9#}^FX#Nt!^qfEKSi%PNJaLCQp&k#iwDY;aXDY+o;N_u_T9>c^C@npo#)_j;x?;8( z)UKQhzTww;^nok$n$Vrfo@Nn|Xr7_|)`YaP;L06OtBn;iBYH1|W=7BATym{WQF zG~^j1Qy?vVhV^9*Dtm?{h6ajCjDh85AEYzSun~brvekL#AmdUbxO5MVT*@Y}MPyjU z5{65X>f1lj!hz|!`j#wY?kTC7XKZ7Jx|P5Rm2Dj-RZGX@Tdkko0ZQkVvO(-0iitqS zpMNVgei)^}A{(P{`!%+y+*oe7Sf|WXtFq2UUOw-_x^>D@9hWN=x~O^?%1#{DiY5I^ zEGXbtRr7B$+E{nLSKyKKA&s=L(diawVIB@3frt2b6ik`o+fiK3eB^ki6)ghomLgIv3<@z z2ajj-T>>^dNHuqe5E=sy4G)WzT8q(>Y}J728`VG(Wj~9Bw-?QNmc^wzg4C(vnrvym z6$?`&(vgqV11Zw_vM_bAtpQeqNoYg0H(_P9VH)vGm<`j%5kNDV~_m3Dee0Be=(a?Y4w z*2+rcoT71-_UqmGPE;*El1{3V9K)1?@GW1`&dK$rFj~EwO=M^2%yIL3i(AUeB(jiihf zER+(TXBn~syVvKr@eSPg8_%YV>{T`4UTzYXw_ct+IF0<1ev?WOD?aeF?W1<{)`zg1w=G?Z#jjO*7`v^XzQMwE@?{p`_w(IY%L@2h?oMnC>m_HoEiX|m52k;t z!5lhH&vEqOhxjTMN5|K&0dkMg^yx;{H^{b775&qn9)6s~@)dhr3F{l{dY36TKJIGe zc$X>F$_l>4OmA<5?9aDz8wmmPR1=@lnG!a(%lU51a|`e+^|P}Pu`_fGH(ZvrH3l|Z z2Wkmp!_Q$KtMutRT54zg{Ty@t-rpEb6Q{8ld8aTuOEtWL+U=~n&$+v#^<-Lr=%%b? z!E7hpxfY$9Mvt#$y@Dq5)f6LzDYb1arqq4Zx|WTQ9~`f`_<(9@5Z%9yb-#5rEV<&b zc{%SjF@r}4Vb{2+2acbat zwmhs63Cb657m}9W?wNFScs&xd(Lg_}M}k_&xB&&#MTNu?%u=T6)>c2&=qA35@r{aX zn{+#Tw9#7|kegc->A=Q2ROzK;+=x9`0I{5Hbk9cYcTP~zMp&KAON)cn7s$@-8mCn(sQY_0q zQTA&rp^t5l%Kg|EohXL${ngDaA6#29_7Mo8iP$FGe^~vf+a@eL|E7Oz!rpS9Vj$3# zpc+_5A8lfHnQig%ttgfylC`J306{Qe-ffwn&{K|LLt6nQzryY^T87Cv78`E4QG4T1 zdo3ww3bi+nHoSthe7b7e(o?maMqOUT-K32keU-&U=HH4r6(GGJw>)z?U9#-81V|^W zRQ4+3(@W7aTO(CHnRg16THM^XJLIS~-Z3kgUqfJg)m9t^Rr&%Iy@slxL$CS%qF0+3 zPTVJOrA8Z5qfx|i7+hDDjU?9EL?6AzhA!I|E3MB%XHC9Ri?s5N>PlQ&e5E>8KE7Jv zEx)6B4|qjx8QUGz<+zp+taMY7y{N!8NvgF?dL2Bz?c4$S7JkE(jiyvTuN51;>FA5N z+up*j({UZ44CEnVK zY}!v}wzA$4II{4;D)KDm4!>2N#=}Mi2hIo?b_3Nw$b_rj;&epO+oSBG2wY6`s@%a&~ z)fOn{oP(8g#~{06&D!5SCK~&f(BfB$xmEPYeVpa`vEx=%rl-9yL!FLW$0IZ0pF@sq zbN<~Kr5qR(_h{oq@xV4#&rg5iDQyRC&26ef60O>SwYQeu*n!iWY?W!EJ9lEe?@xI< zSRys;WW5n>zj8#oo&HgdXzS9IXqz4XR-^qnL$s%}dbdAE;0G@ct@K4Xn;FP=U{QSV zD18@O!FG`0O_peUL)Cqb>+(2bGTw;ulZa9AZUioe3-iFGzNrLm@|y@;tYQIkB5V&E zAA`U-!r1>5I9jlWnS)H3e=AF5V+L*6gQ;+l(%!YS=L2BKD#rNDHihT>G zh_$MOv|5$e35oUeIFwNGH^0RmVIdUwHZoPF)VDE3uG6fy5wGc7E0Ng0Sv0(l`8RtW zWZS=SF6&G8RPYUCp=$4fJ3)AtaZ6?63sNMltzg^ak8h=^2Ur3Eb1^y3n>CihYHu4Y1@(JoV&T`B+)0+KAN6rjteFuA`a5X%U_ou9Li|HewN1GRC(X+$DLv!ZftpSZl#_FaAsLFjQiUc zyO-w>clJ2FbpYk-3jKBfvt&F)I@xXV>~1v4$%gyXUhIsbx_!(P#zS`qSA5gSj}?1& zqeD(M_!cW`Es~`iAB<`|P8k|?Z1)=|*S{m!tfQDJ7T@hvnDN0# z`FiQh4y8#|SddXRs+8=nuEN8lhp0<6yURBR3Kp_YXWgi4Jqu*jst`7})!4-z{ug~( zjoa2uZf>80?6$C(Xm~lskEa?xq;_jfnpSU*qveDP0P)-;Rvu z*SCRMh`oyicqgU4%MwB?r#jTT<5L~OOfkxSlijK|<)HoVqKIszTi(M;^Au%+L>wP2 zt^eh|v|YdbD}7hTk`K$Rrx8MH9_vA`zlSP*p6rKMLSJhabvzIM)fuJ3Y0?jyG2(Ff zS-4yTm-!t~SvQJ*pT+mv2wzcXaML!x9-nrz^?tCfV2%CluhOIMvr)bI9Ku<09Li{! zPRbdIC@T`yMEi5;(t5s#K1-jxk0ZpV`6V}O>t=t-{n^^j{=4PoMmorFh%LkY3U{5C z^h22G8S0fpb8wr%^X`QYaDE!W=-3A=TMipSTU}z;mNJa<~bbYNE*9)^mrkfxSXCkV#bzw{i2wV2sBjI#pVK4(F)+Jk^Th zAIZh)ITizV$Z;Rr_hE_Z_u9)XkF=$RuZjkl;w2YqpbCHST%cjP!!4?-27 zn{-<3#Ls_t&EQ0u`XOd;8x`^JNVMxiRM+#$RbT5Ts={F?jO8iv;EfdV%Ie8Sv2}^3 zdp<&7oruB=n( zFg%Mmm@!0V4AFC#Atx#Gn34&F#}JO8s`plU{}_8W^8{q2!PqkNm)iMB`Ipm~{Rw0< zkGVVEZ{h%f$2t$O9&TmzCR@)oU(`)r+4#{fuWrRuQw!t&q3jbZA+m9g8jM5jO1@V} zt{(PiG9PE%BWI85$T@$f?+E^2PU1!NwvLmDZnd-?5c+zn@Hn=hB zshaIl=gs%2d1~FT=5-8niMlaMF@de=Zzot>7>|heL22L!I`|Z_p_np1#`2P?2pdhM zYJ1UW&xB)39wQ!~ZS?-f@XDl`lqm2dT-7UAk=C`U&L!;o-SX*FcoNx)0((*!y6Tf` zXwTcw0q+o{Dh4P;=42-rJT^cpRhjtHleG%$%2lxG8P#12+@*>SSfno+HTlxZA7JB?@fn^h z4^h=DRP!0CiGh07p%2)#)gfQoDebg!^+p}L*KhjrzjAC5G_@N0o>Lr2q_leWEUGz| zk{f5y)q2#WcPa7|ZdB7L?-YU(PerE?%g2PwRQmK3i@nu5VjsmZ;wsI7(fOsbh(ySB|33hZID1WzgC$ z*klx^i(GI$8NNh~ilMYGS(I@FGi8F5>qzvay(|9s|Tk3!&3X>R9MKOa8?IL z6HO^<4~@U0l%cLxLy^z(KM+Aq+oS?YG_crY@A!W>)GPir9V$jdTY_lb zT`>;RgAK5PV%mU;AtkA8e)XH^4dOnM-fut>eyd1eAv2yq^ki(dq&NzhkLVrdNFo)T z!CJ9Pk?LvctJ+x!JIcd4JQ8-#sd!>vqs29fq}&)!6Tik|yCM$ntRU$c0>@rb5P zn14VuZ~g`+$MJOQH_%NNErQi0{*{g#t4S@LkCXXv#IL^!H+{nv^f~hrdUDJEURn3i zQ{TdBF>U6gnQFde3FD*?wF}37y%CB!82c3)9%U+9hA5}Or@@nO@{Ni73% z98BzSQT6AIUpk}Gus^n7=N6CYiDz4>57J9bEWt1Rd2B1pbm&#(`K)5mN*yo}GVbxe za*~Ifo>_TfMT;{pS&wZS>T6xRb0f zdz!vd{RxFXHarZo$uVtws`GL_pPC>U=)gU>`i!K@1t4Xvj)J=q>`fh=`<4PzuCcf+aev0*);9d+ zmOE=j%ccZ7Kd-g?-I?<5wJWTZcj|j_G)TJ5BK!s^E?NwvYjPo%Uo*KDRIi8+rMzmX~tQk5I9dE`m z*q~hXk@l!MPOc-)XV!V959T@ST%~(1VvoA*D9Q~L@}TeK%88*nRb4xD(~x{4sQx0_ zc~xx(`|C@{m|{hgiZ0<86;C@hUSfmHy)hG}LqWMo#(PY6AbZE+It%syUOBH2MrNJYcko73=_i{ZfWmW za-{skQS9ZGe6XuShbJmLXfCt;AY?k0)RZ5g_Ny3@fz# zluv$A+oz!?2USxosbXPPDzQ%^*rHa|tkd{+u^)=T09;;vV zG`ybDJ34*wo>&}f`m?`6`tzD&I zO7|SWO7|jgZoVD@>-^-e8IFwR1<2eKJs%*CjF}1fC?Ri(x=H?<0QqYckP7JUu1cHEs8D&FPCnejIW1h4W%de9kCdN} zSqLX|!i3br%R~>-b(43<2>YAe5p!5cQ%*0Mag~p z&Um+z5XTBr4_!Ns;P$7PY?IWXjFkgG z-bugcr2dG0g~XE&l{xu6C7UYZVEZyA*seRJh;9!_5kA;X>hSyCEGZ&>oD{LwB1O0} z@LzM(DeTfs`*J~{6wwCECShY+cbndxgS{xys^X4cDI{8sGb|e0-hxsk$#Gxuc5&J< zIvQQ;O%DM5M~`&8OegiXgxM#x=ww9-L8zNKFdZ*o$^H4^f%)mB>r~uF!4Zi%^W1b; zWy*EOl0!;?Y3eGqbF6nAeG1d&nKwifm4!F1eIT}?ib9NX+%nq@HvFrT^7*yuFS=2e zK80Vao+)Nd-jG+WKi6Cr+_>gFnSpZMf-M*CzhbZaW_!Wr3pW&;E~DJVpVc`(HOXsq zK}TZkzx7RTw;q}5e5kiPh{;D{iTcQ&c5}treM6*u6MQAZJN@N;<^IyJydzU-NniN~ z$T(*t$a{k#PmRZUOD}ug{!V)0TAFetd z`72gOlSawoL0%aJy*lTqQSyD^W2@)3(}ou@0ULgL`%D8z>7NP zA2Z}XL*UKt^OcSdTA;Z2@B(=ZJLTNHK;9}tXu=b+-UmXH7o$I?Xv<u? zj;EXxm&o@8C?jA^wg2ttB+H*^?Kz!k?F&xPfoJ7^A{-&h(JKUgxx5ZWKV6Rg!;z^g zxI=&&5cmL-mB=Y4eeV8I=z zevUKgzTm$K&w95K1LgBf_47@5z860Cf520`>|6fZ{zU0+FM*u@7LcZ>yfQdwwj|pJ zm*CNcaL~>5hT zuFA97O#0y}l3*r<{EVb=4Rzl3v-~OJu)bA3%;{&Xaysy^YbX*kos+N0TM^@-&g;L( z=eV5no8RQ!er&9B#b5G_Zp`Am6sGId9cy#QAYDQvo{cJ>xOqNOHSVWx=Ha!> z?pj_Csk)n%7cEsAv^;E~f;Buc4beRguZV`|M*F)4*=IkFM6}{ugj$B^e7WD(hv+^< z504JjJ!B9)Y{WW*-jzrW=jdU&q2J1`K<9!`pT2ni^Z8c-eVwla`t2NqO>}yS-vIP< zUW(rcf7x~W^E=1*Id_inpA$eCnf}3)n1O#ou<1kJa#?;w!Myz>E{0Zv$&u+lkWwbVJD&;uv+2YHXdRk>W`A%6 zhmegoJH_+Q+zI|k{4$zMoToU2f0Rq*pKf$+f`4C+KR%SjlVKd;(s<71j+IZzt^k$XrqBIWA z5O5bkOIEA!3@Y@7-C_+MxXc^Y3+==g+}ictaG-$mJuuti)pn?W%RO+iH_SW6f0{jT zo;UoMib_c@y4$vU!@UG-^T0LUuvx&h9=O#T#*9~f0$y?(H*fXw9EC&q$?(A0-tYhc zmw4bJZ+L-#>pXC!H;f9T{6xR(ZoA1FeptY{9@yaUaxGE7r5-rV8%9Z0ei}S*p*Nf% z;OI5(w#&TXnF6+Y;CgR(mVg}|n3Z|CHb=nC9yr+>4i|7@iM#DQZ#Y1}`5xHr4deV= z`6>6nHQsQ40XKW#R&Th6fRpU*w$0nTJRc?C0uP++4L>5_3J+Z54JQb=#RFG*!?<%+ zev;O@+ivoP{RCX#feqWeT)RuaRUSCa8#W2J%>x&D!w(8LWu3e2GH*Cuz$-m)y*I3s zS%}nnVD`F~YYT;Tz!;CgR(rGOheFx&0rTCRWtcDr3m_J$J$oZ^A=yy3Pj zs#d-SwtK_10xtEyHQsQkfNMQ)t2dl4;5H9ze$&hI6ago`>GnL^8x9a~t_Lpih8x6I zYNZFR^oGj?T;+kAyx~OxZWiz^GVFnCPm03j-t{nX{UoJvc)z%Gi0zyk-cN;qQ(qEr z^aiy)y~s`t-#vcw{fhj^?>oQm{aXCm{2ue4@4vzSxc^E2Km2Yk!Xl&5enyR@7A;6 z_~7K=$-&PCe;nKt+#Gx<_-gPk!M(cN)n#v&eO*p>`LRoI$P-cBLwbh9h1?qQSjdWy zZ6Sw3J_$J!@@q(F*SM}Dy58IM(XI=-u8J({y1nbpuJ3mp8#*quF!b@z)u9JM&xD>0 z4KegE3^a^4++~<$SZXLWylU8IIB94wTr*_)v+D+PSl_UWuzSLu30o0X7PdX?jj)qp zKZacn^9_#;PYJ&*JSY4P|GD9-!gq&PhS!AGg?}6VWBA4J(1^hiLnCq`9*uY*;^l~) zG^fJfnH_qY`b`m8f|dwcCury>6&Hgi)upP}p(BN!pe2IVJzrSqkKX`iVP)W}cQ5;} z<$C8zY~q_iUjq$pz1~>?S^(Mr`XXo>sC4amXYbyU)C2Sm&=SxB&^@3fpr&80cfJQY z3bYZ_3M%1%pbB&#=mpTbLH8NkI@g2d#I$u*^^ulIx%hArj47avp!uM`g3bjE=nF?c zdw?zn9R<1)Gz;`a(0tHR(5FGGKubVtL0<>`7PJb~r+Zsx185J>pFl@}N(qv5H)uq{ zzfiOBVHg-IK{G&0L8pLLffj()f-VPb04)V=2HgYN2I>M0=+V~sIcPL!GiV~{U!W<@ zS)GALOmXFF5WTbz%jSSB{$tnqt@qvFvr(rT8c4Ei`AYW_jW-3=^c(gG!Yjs*->)*(^cKG=p-)fFi&%dGRiQXCg!Ipzug8&MojC-bkG2%(i8;XJ^QD*Hwe=9Y0)k1J0DrW2|g zNrIY)ed`5h2zIUqP6iAkncpgwg~>8+okc>{=FzG5hD!wdhL`L+uNJEW9PQC|xA+~p zTI&wAK&6jW_nWB{1V0sK9RH?y(SXB9(b- z*9vyCN4vfW{YxUlxuB@P6k!B&0hg3{L0x3{-pfde7{V%# zku-1ECD=F8r_dX25OA|cyX<=2qOhT%3VjJss1J-qKyhc7ZJM*?NWCrH6^~Bk~!>lp;lvgOGL)2-b9n zd0=;2H{kj!FeZ`Vs#06}U4`FLtU6CpK36-PA*e(}TuP!%Tq;RO6$sQl5wPn6jAbDC zX9y=z=Fbo=5W)>YxLHsem2s(Zs`i#LeW5mN5ww5|E$Bp@Fp?|S?jbFpG{AVr?EV%s ztO~ORs^mKEhD-lTr-=(UlDQSC&6L^-FB?SzZ9>=`CHy@y;N&&|o4&kx%1GjC7E=U2 zLs0w`|24D`O=;KQiCcS-K;6|RkqQA1al(YV8HRwNmg z;a~VLIJ18VI;Mvc#?GLfEX!Hb8MM`Boz2&WX8P!psMJT_!^rPd9_j4t%m;O!%kZr_ zzH-S&Kf)R6t4}fEE-kZ|8jdubO!7heHoRm`O(5*3 zbRW&QrCNnlC?#89Bx~f|O6zX8Q@|yZ$Kg5+9Hj^wr3$ihxI&!!xNp#nxVz^gR7Ev_ zsobIu4IChNwa!+H{y&T%i_+m<7F|r&<5e+d%~(DD;=h3mck0(r)@Y1r#hu8T3TO45 z`s@7rAuGqDrCJ}=Pj_5<;oy+BltoQ|V_HV3u;L#687$zIQO>XoeJrDj@i1)3)Mw#* z!k(#LgZ9l6V7K(iiHc6B=)#*q5xE3-NW~HrHVMOO|D&ZA-<#X3SJXJ4UYVf3%A%dC z?$UQPumb0%Df(mnOmgPU)UVNDyVm*;I&X3Y=IeLrFbyjo(f^EkQ#MyW4V9EVs$_rW zqqr)dU5~=gMoOKhpC)5|zcLR=o#bqvr@xoKQvR_1#CMx2jnJPJnrY258$?%eX zys;|zX4Sh!s($2B;Y*Oh>-QkZZJMG$LMn8?&Dy&J-$LwV7%xw{8U9tkb(9Af6LQzf zXk!tb;RI&@Yf!URQso*%E1wJ{xWZ1m1oNr!mYWS_;Y|)6=tg38NTtv&yM9efiKd9` z8m&sTB+;a``a#IPqP6hKrt#{QF{+q@n${xLRhnQvDBu(_tV0!Pbgo**M+O^+^(YsM z`rqu?eQByOe38}$cufRwN z8DBvhOUV8T2BS_h7%}5iVVt6IIC}8Swx$Unb;;?3GSJ=&G8 zBJR!91S!P59aqKzjjizUswd5q_8NrIIZgto>^1%Pm@3Wmt%YzHmQ(~^-mD*o?8w{< z>1cY2lPub`8AH*c8H$<=wS`=K(+j+{Xy7XXc2V{gr8HGSN|uatVhdWZl3}ajRvL)h z)}Q8Y)sM!aT)7pMJ&BkDpp}w2slYe8z`!D^aiF{9_(m5n11PWzy>8QtdX1V5_(dR|S;39b?p>Nuja#s3sg_->!IA!-YrbRO{$*B0e*=FbQ*ZJ&frusMdRMias?0Z$Q6iVI!n>Kv232bK3Q#;^QKGkq$ z3AKW0%+gHEv@BJ%oXk6+lSHXI(S4Jq{H+yINmK+WHasdyxHjDoBE%PNeMSk zkMw`2!uZy^Juo?i=DdZl)=}kKa0-7q{}v+BqNz@!CaXFbWOy5Jo!BwBx3GBvwo%&K zur-%fy$#E?cz&paFPW1J%KJB%4Rq$;5Lra#3V7?VL%{dr>VBu2GQCo{UBqDCP5|$ypGO5of@jJmTeb2iOkh#r-V|gm8j3D zMh_aP2~6Wkjh!;9+D-r&4(it=w`q#O;5-#xsTqcG;PWDjkRF89zciboe+f10=-x$= zTgm<|LK;e~?;`%?n&SG%bhQl&zTO1>V!poz?+a+td)QAPTi?f3KHdL5um)PiiA2>P zMyn=fpU-d`Vuv6VK*@*rO@>Bl-b{CoYYrj)i4^z&!c#&;A1FJ~LKpgD(bS?|vsE4J z3jiYxs$INd-Fow+T_mJ%pH-uDB)JB{D=D)E4M zQM^9{6Z@zSu^`wqDPqM-nS4QrrtFWfzO@Xd;*a!C7#*4oXD_@c$i=WhISSuxnv!{s zfN}eORB5a5C|bt1-{XqkvR*ohZD9ZzkAYiCc_79%O@Ui9S8XAYYL3A~618$-C37vh zl1QnwN{(%+RhY+dWlYg5TBjdXEnp*Y98z^u$Vo1h9Y>-RXa;@vJXJWKl21VDY05i+ zb}aPN3AD4E&YZxghEn#&V20A1k0D~AO&`Pkd};zQS~Yd%`2tVlClO|=rguXNRd^+_ zPZV3ppTJ0lMygCmm6H7vM7dc5e=OiSs^QuVnlTEW&)bN`mrI&I<=UF?3{YTY$MLD+ zLJ_2}3~c%oy~>~_&fG_a&k!t0V>t-#{qoVrUCL*$ywd$&ZHT&@AmDte|4fOHu@1KI z$gd9fzz#Ck!=zQ**|=}v&SQmEO;*;!jc7Vv51kZhuZM-#DeV+0%Oa{jg<)_|=4t&1 zgYwWHE#CKpsu@7`(|kuZln$Rpc409+4b=up{TznsXwK)ja#7{yaM+>=#iA!w6Szg= zaFV9GuLI`w&q9VT5NC^~#{5TUS5e^?&<@pPmTr;Tco~N?GzD=0;84V}j_Nt=($tE( zgf^D$FA*1P;=e>c7EvCqj3t^~#}OfneBp4CrlMT&z%|@f3Z3~=zb8RO=D~F zVozWi5Y}2vV9ErXOY97c;0WgorXtQ_&hT8<*jld-zpAeev3lZEEZVz8y24n;Zl6jggz?SrpdqG1l*!YTi>Os3t1HSozh0? zcSs#86@7i@QLKl4iqr#ishO2v2q)jN95q%-~Wyip5x#;F&5^9aP_h2!?99b!V|#HTfK* zkn-oCgIaeE@ib|Y_xv`ggtC9Yj7DElY$&ZMbSCxuiU6>+Ihs^kRsIuPbJy+5H_ z7wG;g=yEBZ;vm+wly?;(cpPyRBDi6=3Jf;}oM1cfGq3=f!$~e}`WfoDJLF^$o{T^Q zxz>WT57lgWe|uT=R-)uqs76yBCrNnb0jEne<2q}NDva;J;c$VbFuWk(nbfMh<#;CePZD%E={em9g!1Nakb`}|bg|IeHcGy+n zEXw;8P6cQt;I{(Cp#X=YHS?xjz$U7Jag1pzCmCe^4a7#-oHSF>Z*UgpsJJpFYVPD( z)~fC2QWKX-qW0g=PZy>Aj^Eq_5Qfa?E(i2}O# zmwt`0Su>%QZ&HP;$ljqew5tQ|q-b*Uq>##@)(-4`0;uS3^wgm#lM`Q2Z8cKm-*6L! zyAw`3=zdP}X%#00RLw~_UF4){gE4rTF;{cndiGV-PSyr{@L*QDp(Yq-Ihx_?|C%b3 zvY|D2yfIhf?=pd63&Efqsu|QB0>%QwpdFy82tNxL`)Ng66SA1iYSVaHE5mrSW-EM$ zfU77?M(5fzMX6fASyU|t4>l%ga(D$+55B=WNlXX0O_LYhwzxx_sS6&D5ZiUZyjbqi z1+PIhO!WbC3KemZM8|z#VWG$l_v*TMt7@T~48DkND5d$L6IGf%o)J>`7InaoTICCq zSRT1>fo8mN9I8ndF~8s!XrFIz1pAVz{a_ydnGH0OuM3F^O?e3{Q+xYf7!HW>gR?c| zr#mJ42S;V52zcOZ6;2XxHu(J6N0R89U`tcEyxc{yeVDGW+V=f}t?ERs5Sq-D;Y6FJv3$XA*38AH1%IU`w_gzUM;*mO0Q@Xs zY6GvU{Qi>7n67X_Rlc-WD3ms+V=z$gKP5vThUgq%G^RAfEMc~A|8_4-`7aGw8lm8B( z+^9*a`vt#FGl&nX%98u9=obnn<_q}(&EOVuc{q`CR*h$ykS|r`ACSs54eS;TG#*iV z>CV-oZbKp}?pU{=^qDbDwWaSgnL{vA-&1Nx@Ze1UovIrSO{s|ipHFg0vzqr8{8CL= zZl_9EHQp;=lO~B~QWJ-liPqk0R68x{)Lw5QLswLs{X)ANNNkz(n&$TRb_GBTHEU&-;J0aZ4Ed@dsYGLE zp^$IUtkx^R=SlEd0nbG08yXyMbO_l+8rgR!FEltR^|)IlQ0Op#LjJre-(Rw56#f#1vNY>PI3 z-4`4g>|EpuZuIrd?GC4COs0PnEj$_=5m+MjTi6sI4IaZ*QavYOWH=T)BG7%WI+wDK t1&;}Ah}SDUDxpn4yX1$fm2EowkSO~um~`=PUuioQ9L-LUp*A?-{{V`shd}@U delta 30739 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 diff --git a/shf.mlb b/shf.mlb index 3f543b1..8f0d450 100644 --- a/shf.mlb +++ b/shf.mlb @@ -14,4 +14,5 @@ in ffi/glfw-input.sml end +shell/gl-shaders.sml shell/shell.sml