From d24f925b0a6c86ef16ef8b1d29c077be6fae70d8 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sun, 30 Jun 2024 19:45:52 +0200 Subject: [PATCH] Screen no longer flickers when moving ; added dark background ; added player control keys --- a.out | Bin 882693 -> 886895 bytes display.cmi | Bin 7333 -> 8379 bytes display.cmo | Bin 22900 -> 28731 bytes display.ml | 163 +++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 143 insertions(+), 20 deletions(-) diff --git a/a.out b/a.out index f30b51fb33d46c4ac39e641f9bf20872245f5401..3aecaa06ed61f7fea7be50ff3378f93babed34a6 100755 GIT binary patch delta 4911 zcmbVPdw5jE6~A}0o9x}p#NF&JO9*K;JVF9VA(Dhg1vUmDkfK3({ect;_$Z_jA0JeR zo9LpTr4}kVD32y;?E|dR+Aggq(qhG`l~!p5A|)wM`W0$y5%~(q_WbV7C7TWSLGSnd za^^hd%$YOi%xqS7lzsBu@`i{Wu|-lM_J|{r8cB;dBSyp(Nqz>*0e%R(}pr^ z0M&iV$fh|D8X~+xX90h+8T}LnFa`1%wQ6k1lIa5p`VBmON%7|rW@c z3-jPQMt{Z>YWctw$hw8~Wz4R!X<9kcdPN_i+Aa~WEz;?sF41R94Xd&lRSdS!<}p$j zkloCH3~s_|dV`{kiEjE$w_LDgFBg!(%`8SL1IdE@ml$@&00wkU#+{5h#$B|2M7lRz zz(bg*jhg%XG!~1Q`((MLM}!aa8dexsB6%l}T}v3tU>=WSLE<`(TxOj`?A*%OwXTEW zh%b|qxJ-nX!MUwg^ieb6dJ45TWZh`z}RBXKypybga{`)BLrD-H&!~G4kM&Kkx=Ec+WMY>1|=p*}$<| zCB{RuDZj@9m^rB4C$qCGHA_tOQ%ap`s&gzg3Umfz1Y@o;-AD`Cgf~BzS@c>KBaH#) z=)a|mQ@m}^RtLR4DZSq`=$s6`fV50TIs<(fWEc$eWRnUS1%{yKF%q)}8SIGGw+k;V z^Gj#p``q6PS%wP2b%76S!GB_IT-~|Zq?Sp%u%2caro}hkD>u(5b()!*lH}Zcoo6C9 z2xK&4C7a{+M*s+Tvzf1^&xP++uv=JtJJV9mEog}OQA{xnxqxf}j}!BY+#$d#83 z4^?#Vitip0PKUW2+FR`M(#wt9GfUH@n~I$L=c81YpnZpgo2r~r_`l!1hwd$q=eRM1 zf?nZvU@Og3=ai!yI}stZRk6?AM?@(dI3n!P)D;}52skGMywjfp_9Wl{`1 zf60sEEYNq|0Tkjl2?EGr;7bnR(iAg@Jj)y&@L550n;{SbW(5pewB@LH)ke+joC>oN zScu9OjCux&senF9lV9_hx%v-jOuHDO{|IFt(0?2!Kfz5^t#3CktY}BOIH2oJ+Iw6K)OSQr z92bFo9_(pAyd*?^rEE6>o9jzi~z=6McPaWS%IXr;#;+CoDxS()jNOWT&3rlObeE_yURSa`G%m&_Zzy(e z++=r5Y%+eMWWU{byR0_$DeldUJLMkF?-cizqWh^)mzzCrEB5z_z5{VJHN=FI8fDoK$G>1>AdQAC#$si9NYsUt z{qZzE@ih+FU;i`JI%KZ?7h30#BlVAHFStY0=8&89!&ILtEA=C^Hv=Tx1lJX)Z1yAA+z)T#uLy5XlNK6 zPvTF|T0;)hPtuEqJfibrG4CQhAiQ}m zV8|lOgx8HprYmW^lwL>ee=);Th+9_5z9nhrdwTrv^Pc>(N>$WXN2{Y!B12~TBA@k~>|>t#yXAaZTPYQqhS?`kRz|lA@E7^i@he zMbW7V`tce)?vXBP&Xh&d26FaLUHC1!?msuLrK&%h5E_z0ymimBOuG zXFlN+@=D==y@#fI)UIZqpfc zpRik6f5sJnk&l*^3FlzE(=fz+0z>rg`G0j^1K3L*P4|l@DEOGMidNJabLfVxVo=t2 z)?ClPhldp7F^pN7f&53$g6n=L)1M_C?q4PS^&OkeK1}SvI&>*xJf?aS6vT2QpESA6ze@qYzBpAT5 zJOo4q6nYQ}ZN(y65fFJOf>tO}WphDfZ>2yqMrJH~(ed2rouu<#^5uKqIo~~ZdFS1m zD~Bu&51y|x-J&PyR^6s|)4S_-UDX}Bb1z?e&eFhf_zgbXn0k#Lw;JVt@%Lx7PbT%9&m##6;y^{04wh3;M3VM!~c*Uu(P-EoE0*)<+OuI zRB|e9V+ip(hH3-sroBsXq2H6d!r1MEbf&G8dX?n&@e+rT>IYJ;#sYvb>KZAlu<UT3s(=)fh~Mk=h0+Hxif9S}a(yj~7-wM(1+6-f6{S z$q>?Nq^VYN9Y$O*5?8ultoD(NZIb-4$e~s*4(YDIeHp$yN zExS_4vICn^po2AFqZhZ$kE`0a7YBMN_JwGeLJWCn z4PW8{FRWk(Q1d~0@GB~qO$9|OiZ(oG(uZ)A4<2D(;|w2MVBZ*{dO~+gMkBezC;nFQ zVd7HKNd)AJRbS;mYA}_Q=sEHDP5R+~iFw1M$CK7*oER_G*7|QW+Jo3dNFg`~A}3}% z`mob0;&M)}LMu|*Iua*2-+_k~sA)rYQaoNj6yIR-Eg~(7ISKIv%z8j$P|I<+u{HyI z1r(s2JIOshVF-S`k z&D5Px*Pi%gZ~haFhA3_$m|1kh`Pjd z$R&&>(DB5sjw~7HIIe}K`@34m5wrA@7H7=Tr>jN$hvkFoZQ@0P(|=5kw8~FAL5j1PH<_F0<_TO0n@gcc*ooF23lTB+PB)y|j~bKao3j zx?=BuEQhbai$Uz{GOv2#=P$wkZL=Xu?SR5xalVrkVCeBPq0>Z+A z3gR&!$Fg`dq8tl^n{a2qfCnJBD57$DEQ-2hQO;G^zpA^sY8U*z4DYY5dhh*J)z#J2 z=D5oI8Ch9bgKXVwGv+VbO-Q?=gjf#}(mI!rR_C>jxxR3@-&L)x(^AV^k&v&-SythX zfU^2XY>y+hF}gI#6$-hk2Wqj6Y8?JVmnQfEk!(lQp;#}SB@Vdpi-dob@Fhl|wxBIr z)1SMgiojrPjX=VPQK;8#(Af_rh zI_7XJQF}Wan0tb&Fbv8XBWE>3BEF%jCgDvaRPT0yvH_GWG4&oDZKFJchftnGUj1Itoy};BeZs8puxCRBb9bvS6cZy=pL~_SMl} zXroDw(?%14>|%}DN{tk3l&4pn9#bFF(LCDdg%OVIYzO@ht30k>$cw2XbTpq{Sfb7z zmd*3a#QfI%Uw(B=&nD@`A(^`vEQ`RhJf?bdw4GADG1AB^#v1jJ8d|uI zK^+=X7wBjVXDQ<4^wxGNxCqi5W#8t=CQ#zW=c<=oadQC@rn2XG(sEdvsZ(&8TGXs>ZJi$NE zk(n*2w2|QlhDq7(lk_+)YAU+Fma|6>m)(S%kscLE@h$H4IFY&o? z!Q94`yQ6YcJt)cDFX49jqr?hBrNRgF$3vV{^hYGI!c$soF49@yQRz~9R+1x?JZL)a zAeAPVrHLj=GEp+i@li4a8pT7SCYYncz^z%1)n1k(otVz@NZ3i&rtLh(LfX4&l2%6v zr|8*qm5Ms)MVV4j=i81!s_CzbiMpC7jd?C4qoDCu(D*cZb{qIS^Za@ln+@fmV5!%Q z5AGe@?{n1eB}qM9!ZzL9aH%LmFUpsSGWDV{Qc*V~9Z8vsrNZtK?qNFbX`+WrWH(V3 z%WF1qLz4^8{s-%OviVt%**M?)Juo(Gob7;)U7aIqJ5OjTzLt1nB>`v zd@GO_phXX8LGP?>Jiy%t-dYz)4$Bp{DiLQbTfgNvt260#;i3jp3wCn{fAHkpz5Bf64*<>&qCs)YpEONQM zVdDt^${y|>IHuYy#NnT6jyKWR-#dT2b@sXy>(IzTjemen~2QBA7 z%lYWHGY{Tne%)jk8)dehu_qRG^j_2IQ08K%Wba7{k1+=RUa4%XQ6?|$e=^G2OZCPX zWyw<6Q$|^;ROU3wu4b32mN-HZNjl zJ;ejulj1G0kc^<6l@zWhqnot%%x;>>x~W03D1{CR#&EO;Oyr)tjOVsi+b!36)7WfPEy7OVE@oXOb@h`5rn{L5F8iayAd9G0A!o zFePzUx6hPZ!z9~DGS5gjgp%^pEo@3gn4|{e0wknCLMBQs;lV>p@=Fq;lAYKTq>CIV z`%T&Rm~1ymszSmOQ1)jjt~6zy$u^J)RJJ>t{`9TZSMJAq zmb$>b%loE-FVF$rZzq|NJV~rt!V@Jt$(Xh)rLt#@vKpyuvQf5CDw{%gHq)enKN}g5 zsT@q>;4d6ZXStpMasv{BkQl~X&+^~}nyaNPsiwL1xm~VKchDaUd2uiE0nb^nu$+~6 zmUE?Phs+T0IRT$%iA1fIKZ>#!^yDmQl)}OrDC%?wQJPzh_uz-Vw9Q>7o zMI8K%gT-{PEH;4F(D6R#*bajX9%Qk>D#gb?9j#P%$m@!D*^C6`Lw#_piquc98~(-9 zmb_sUiG2@w(vQ+W``atSVNR44Cqj$LQJSzlT$tWuT3Lvcp(l#LF1Rm5f%C$gNn3UZ>IY=op*nG1J9`UA3Rx!%w z0Njwi64KWoTMe4a4Mz92+8ZzF23`+1e4^}aPuK z;6}Wp>=yARuDY429t6;!$FtC5Dykmh!HZN?jRR6cRa1(+kqmc<3y%yw(KS`EogiCS zZuD|rp;F6LwlbA70L!3f67=kZDrb3+!BpA;Sx--;5+go8_TN8@L#ZWrzLeNM6sT8@}iRd_IfHR%ncmWuSN^5MhOYqYq7R~m>dn(*K;)*=_kR&0@sBCJi3 z(WV8jhHnXKOCF47ZSsI@V{O<07%0U?oBMgS0<c2T!v$qk!PC96tcGst@wZDJs58 zWz*4o638ZYvX)fo^F&HOIZEfcDmH;+8|`H^6<`b4yP>+4kvfB(mj(TPU)UE67)!<%#=}l+EEwNok1^b3yiK!Jn~N*;0`8-hEQdtFetv_$ z&%p=G8LqDNkTo8%g6M1^52i9_M}X|5&br9X@ED$(5+?@aLvCs}>kP|Y=1m;xkdK6w z0|FkTV<+|2A#Uzt4h}PyxYiznKCeNah3FF3T0L0GT;f{0kGXUQ0~5TVh*O^zUvZZg zn3ap{_Y(f9;=P0%5muzV&Ob!yQT>q3vXnN5S&U?yxcsGnUkP}ERSmCuXf;{xgr zfLd1Lq9{Hl;OC5^j@7s>ia!N3D7c(@84#v3J+$|zOvfz!w&7M z6nBZ&8}=39{d2fw)m@xeLFcVWX}kAR=}@m#+yX^4fpgd^<>56^Ex;- zf}<7#Tt4-nj(Ni6^EmaCDxQ^id!5v6;eFK;z2HB+s4?lBo=7{Ve+uDq)W~5Gf6tBl zz>K7U(hPF$hnxq|NIDNvnUNA8->}Xp3r@h@rmGA;H<>OT*Inc@7yAUiG`>HI(w~gm zL7gtje%8yDCjQ@}_g~cURZ;H(cih0izd5+bau^Lt8_0D-?s&|hfCpig!yF*zXby?= zYb7YB`QS#WZ|iI9cLDu{JA|V6G)aCHrP4O?GB!}94cirN=qfXW&y{X4Bo2n$frcu0 z(3Baf0rDd?loY}9GdzVq!yU2rXzM!WXd`pfQD{rAE7IiukErk)btEk>zjH@7n4>wM z41>I%Ag=)(&E>%*=I8(reDT#k^D3_sLOg^(CH{5MH2$48YE#nh+nP~&a@3-3$=<;o z{#mbSiTMFvRn#_UfBoDgvre7=dF+*m#jl;aju%FTJ^rXI=i9t#H8&b+>(>98l+bgp zMbo*L3_(X=#veS|CE36@1|)7E~Ne9Eu(u27#H^GK&jNMTkPPPdvxQCrjU#e=Wpzp}1i z@sHc4&;0lmP0QdckGUeg30|xgwLKUO?&;fXbK|*M%CwW07ORrmL4iom?onI*4^Mu3 zv-8@7^#0@4UQe!1{NEbgGNZQ7@fdJS%CV~lS|9l3^dR+K$xQ!X2)~m@ZBy!DMDsS` zt8wRp#e=U_yCstT^qX(gmb?7;^g0%xren$7~QqY$1cfmHvPgMwG}*&|KpOu zt80(0ylX|{{dIOtGd@v9ZCx8B7w!J@-tBV&p>A1`Ij1!(Wq|P&C~9jMw|nlL^PgY1 zVeG6x$0=V-&@_7v{(lEJ8s1RA<=1FJs2>@5#w zw{PFRyQ{5h{EQ_#8M|QzW6moXOCE~<*BQ<34MZz~-jT){BeUEaiv&h^$}590&?dZ} z*zHcNk1tC1Mk3yk-HgO~Jqdr}i&6ujSiU>%)|}@)XKwiGW(D7(;3h<%C-cbb_)kOS z;H?V2O~Fl3L2tr!^pwl0r6_|_6`W@0lWwC7_nJgYpIKm5dGLN!tVRIzZ8+t)o2inGjezl3VaGoALIZqn$6odARJ$c2! zus3$ELf1l1vgulKx~7GoeFEBvgq~ueFF0L6FSoJVNUw-_+WJ77SeLPO3^O%8Gn$S7 zwk@B|%s} zeUtvLzFnl}QuNv&Sy2f%=73{qLid?yE2o;@->NJ@K^>K#EDQ>pL$@XL3KPA{gO(3a zl8l-M<|Oo(iQY4lT-6VgTw}B>@|OD}UeAb;qdEew7|7XkqNU-=pwCn2_xK{-s*tB70@@U_|MWD4wJmR%w8C&W*hTT?+Rd29m6pfA zc@dIWLSJE`Yq-*vgQ&Nofsznt&xwmGLsFZ7oNLOzcEBMaK*4DvJq9ae@$S6oEhNQBD ze$+%`FbO9#e1vDw%;ztxEb(N6_PnU?CVpN5ippIIzMB*)LxEUV#e0vfNZo&$RO7%R zs*yLPry>^h@aueZGzdknVYomUYvzzsU zdUK%Oe9SrD!pkVAzfHG>J=^CuK z1|eyG&Rn86A6D>SJM#h?Jz}FFHhPrm3b3JY#VWXBE!I_L;muUnq6n|c<@J?SMq?gq zJ8_Y{APTJIXVusEi_n%sf@Sq9!h1$Xr4++ z^fAz;TjEZLDpWpd+$zQ6x5- z!&GxZxYF+hqdfISV#0Le~NTq%reN%17>OpRXbjl@d*s9J%IGgFAE zt5g|vfD`Uk5*UV4dxK&JZRK(sg(!yvut|_S6_Tqlhuy-MPdQv*U3d;@(JF5RXtV5j z{oP2&eOg$Nsi0K;xtDv)Y|^^Q(8y)4v#6b2%tnrDT*6FdC2IGB{LmjkL3T z+(!TA`D%55O@l`FL8G2%)D=bn<(toNLxxK>EoXGQ!ik<^r+PnSF;|g!LcwFK6Mwz! zV^3Nxxp`(|Etg!F*;AG)Lk5nsT$$1}-g3$P5}SZ+bxDqR+NzX2BfvxfCJFGY0Fwon zBEWMrJsp6}gT@`9u^XqSqcD2X^i;Cme0tKOmF1ohpv|=>=1H2E{W6uQ57u?FBv%UT zD@e(LlpK@`2;&ZtTgZa89PR>NwB=Tj+#gb7ri8OlPTs`WY#}#?d3ZZ^HB0fdE`YQIiDn_13L?;^B{ErO3n}l z-TJisEXE~ssloXpV4xz1S0&E?HzzOI>K~&zUQx#>38e{NlBx?NG_2NKE?qU2t5&)e zTCVldwTRzs#!7p!sN`hrx@V5WvAamMf zrmZ!Su7u^1_fNLlay5~o_RuObl;%z8x!2@~y&~V&1$aY%HwAc$O34Cf2brxP(}kt9 z5e9#laXN7Mn9EB^$as%1_|v1)fe-qN zIb%9!%mHm7r))};%7XfiqvMp$fIAu0bo{&86 zNw}XV9|iD0n;W3bElBARMha2R2DZee%mr;Rr_3kHpCr!#3EwBm5I`BY8iA`ZQig?b z3sEiuwv^ZmL<~EGF-L`QjA9xBTTe0cQUcOc-BL%niU^b-Tq&DW~I0 zad;KJv_LNYn0nCQn?;-amlsPSovn10T*aqGa z8KwR}Nh!|33gY-na(ql27Xao!?s>?)h#Y@dMxI6-xxhAZj&z^Df~T>PQ|MPnicdI& zo&+!#^6Eg|6=>8EMnj@-1KUK+AM_UD*60;V0`P*=Pw}7A_!HM7lJP$h9+U96geOSy zR)G1C*AnuwQ1UimX>V^&pb-6Hfdq<8A&^jm?y>W=GkDfESeUrKn= zd^_TB^Ki)IzmAXO;U6SCB_Ta=IB3VO`=wjCw|`GW{K+0OlOw*7@LL-32#u(eZe`p0 zwOAv565uq=)nfpQA@2joJB)J`5ys~FMm~wgx*jqfO6#kBD4fWzA zo(jY$A?0D`S1J9Qgy%_NA;3}S@ChtR;o{#Jy3nDEpra zM2M@U$q`3FTrEwbnh0^VJVb;gNVtv&Y2NfVB%!hcyGVq41jlqFd`%cLiSQz@!$eq! zgzJfL2W5Cf5-NMfOGNmg;Fyhs2Zb@06FTby!;cr{2OaH2#+Z*WsKWnNhW$k+?%G$` z=kUs+Wpjrt_#=5=I+wnn@?V|FPh=Q6(>Ya{&+ZkNSdfSLc(x z#@1dsvuW4bU(!==-{UZh*5+$!k7oeChs9mt_Gc+#!wscQz!`(ewtiTkG-Mz&yiz#9t;_v5g*>$Z4!cc%s$>Qx)f#~wd7 zPgk<-9*W(b8+Q%(?%|VvwOpOrrt6T^7c%yy{e48+oVe>KKJ^c7e&qZ+*S&N0)9(89 zN-|x;5&R++cRjHe`d-sGdOqpc@|UOss3Qf;zl<=e}DU4P>Dj)u`jRMa_Kj*nV+T8&z!9zMEH7Gu_ z>&`U_O{dD@Vop;VuHHIq-LG|5Hk$s?l@A>&GYprY=@clT7v*tR(xB5T>uh!vJ=i#P zVCz=bUF7ke$`_XFNS?UBRSKvnM_tZW!%4;}=Fe8~#Yh8#HIElQ)VlwBxS5 j8^$edcB=Wg?ei9u9rGP{)9P2IW4~(n@8tgm-oF0_JAQdK diff --git a/display.cmo b/display.cmo index edcc38e901cc1d7bd70fa32effe029b164e43e19..eb1af1bad8d2f71d1eae73cad2fc96dba59b112b 100644 GIT binary patch literal 28731 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 EfBzQ~Y5)KL diff --git a/display.ml b/display.ml index 65d8167..2a38f0e 100644 --- a/display.ml +++ b/display.ml @@ -40,13 +40,16 @@ type pt_2d = {mutable x : float ; mutable y : float} ;; (* ------------------------------------------------------------- *) let camera_xyz = {x = 0.0 ; y = 0.0 ; z = 0.0} ;; -let camera_angle = ref 0 ;; (* in degrees *) +let camera_angle_x = ref 0 ;; +let camera_angle_y = ref 0 ;; +let camera_angle_z = ref 0 ;; +(* in degrees *) (* ------------------------------------------------------------- *) (* let should_be_drawn (pt : pt_3d) = let translated = {x = pt.x -. camera_xyz.x; y = pt.y -. camera_xyz.y; z = pt.z +. camera_xyz.z} in - (translated.z *. Float.cos ((float_of_int !camera_angle) *. 3.14159255358 /. 180.) -. translated.x *. Float.sin ((float_of_int !camera_angle) *. 3.14159255358 /. 180.)) > 0. ;; + (translated.z *. Float.cos ((float_of_int !camera_angle_y) *. 3.14159255358 /. 180.) -. translated.x *. Float.sin ((float_of_int !camera_angle_y) *. 3.14159255358 /. 180.)) > 0. ;; *) let should_be_drawn_gr (pt : pt_3d) = @@ -121,9 +124,9 @@ let adjust_to_camera (shape : pt_3d array) = let res2 = Array.make (Array.length shape) {z =0.0 ; x =0.0 ; y =0.0} in for i = 0 to Array.length shape -1 do res2.(i) <- { - x = res.(i).x *. Float.cos ((float_of_int !camera_angle) *. 3.14159255358 /. 180.) +. res.(i).z *. Float.sin ((float_of_int !camera_angle) *. 3.14159255358 /. 180.); + x = res.(i).x *. Float.cos ((float_of_int !camera_angle_y) *. 3.14159255358 /. 180.) +. res.(i).z *. Float.sin ((float_of_int !camera_angle_y) *. 3.14159255358 /. 180.); y = res.(i).y; - z = res.(i).z *. Float.cos ((float_of_int !camera_angle) *. 3.14159255358 /. 180.) -. res.(i).x *. Float.sin ((float_of_int !camera_angle) *. 3.14159255358 /. 180.) + z = res.(i).z *. Float.cos ((float_of_int !camera_angle_y) *. 3.14159255358 /. 180.) -. res.(i).x *. Float.sin ((float_of_int !camera_angle_y) *. 3.14159255358 /. 180.) } done; (*debug_1 res2 ;*) @@ -272,7 +275,7 @@ let draw_multiples_cubes (cubes : pt_3d array array) screen_wd screen_ht fov = draw_cube_p new_arr.(i) screen_wd screen_ht fov 192 192 192 done ;; -let draw_multiples_cubes_colored (cubes : pt_3d array array) maxlen rs gs bs screen_wd screen_ht fov = +let draw_multiples_cubes_colored (cubes : pt_3d array array) maxlen rs gs bs screen_wd screen_ht fov render_dist = let n = maxlen in let new_arr = Array.make n cubes.(0) @@ -306,7 +309,8 @@ let draw_multiples_cubes_colored (cubes : pt_3d array array) maxlen rs gs bs scr for i = 0 to n-1 do (*Printf.printf "drawing cube (%f, %f, %f) with distance %f" new_arr.(i).(0).x new_arr.(i).(0).y new_arr.(i).(0).z distances.(i); Stdlib.print_endline "...";*) - draw_cube_p new_arr.(i) screen_wd screen_ht fov reds.(i) greens.(i) blues.(i) + if distances.(i) <= (float_of_int render_dist) then + draw_cube_p new_arr.(i) screen_wd screen_ht fov reds.(i) greens.(i) blues.(i) done ;; let create_cube x0' y0' z0' sz' = @@ -389,6 +393,32 @@ let hehe () = Unix.sleepf 1.0; close_graph () ;; +(* + 7--------6 + /| /| + / | / | + 4--------5 | + | | | | + | 3-----|--2 + | / | / + |/ |/ + 0--------1 + +[|graphed.(0); graphed.(1); graphed.(2); graphed.(3); graphed.(0)|]; +[|graphed.(4); graphed.(5); graphed.(6); graphed.(7); graphed.(4)|]; +[|graphed.(0); graphed.(1); graphed.(5); graphed.(4); graphed.(0)|]; +[|graphed.(1); graphed.(2); graphed.(6); graphed.(5); graphed.(1)|]; +[|graphed.(2); graphed.(3); graphed.(7); graphed.(6); graphed.(2)|]; +[|graphed.(3); graphed.(0); graphed.(4); graphed.(7); graphed.(3)|]; + +*) + +let print_cube (cube : pt_3d array) = + for j = 0 to 7 do + Printf.printf " {%f, %f, %f}\n" cube.(j).x cube.(j).y cube.(j).z + done; + Stdlib.print_endline " " ;; + let get1char () = let termio = Unix.tcgetattr Unix.stdin in let () = @@ -405,11 +435,13 @@ let get1char () = type tile = Free | Wall | Crate | Exit | Craxit | Camera ;; -let width = 5 -and height = 5 -and depth = 5 ;; +let width = 15 +and height = 15 +and depth = 15 ;; (* dimensions *) +let render_distance = 7 ;; + let laby = Array.make width [|[||]|] ;; for i = 0 to width -1 do laby.(i) <- Array.make_matrix height depth Wall @@ -417,6 +449,32 @@ done ;; let n_walls = ref (width*height*depth) ;; +let is_collision_cube (cam_coords : pt_3d) (cube : pt_3d array) = + (*Printf.printf "testing cube [%b, %b, %b, %b, %b, %b] :" + (cube.(0).x >= (-. cam_coords.x)) + (cube.(0).y >= (-. cam_coords.x)) + (cube.(0).z >= cam_coords.z) + (cube.(6).x <= (-. cam_coords.x)) + (cube.(6).y <= (-. cam_coords.y)) + (cube.(6).z <= cam_coords.z) ; + Printf.printf "\n||{%f, %f, %f}, {%f, %f, %f}||\n" cube.(0).x cube.(0).y cube.(0).z cube.(6).x cube.(6).y cube.(6).z; + Printf.printf "with coords (%f, %f, %f)\n" (-. cam_coords.x) (-. cam_coords.y) cam_coords.z; + Stdlib.print_endline " ";*) + cube.(0).x <= (-. cam_coords.x) && + cube.(0).y <= (-. cam_coords.y) && + cube.(0).z <= cam_coords.z && + cube.(6).x >= (-. cam_coords.x) && + cube.(6).y >= (-. cam_coords.y) && + cube.(6).z >= cam_coords.z ;; + +let is_collision (cam_coords : pt_3d) (cubes : pt_3d array array) = + let res = ref false in + let n = !n_walls in + for i = 0 to n-1 do + if not !res then + res := is_collision_cube cam_coords cubes.(i) + done; + !res ;; let convert_laby laby = let width = Array.length laby and height = Array.length laby.(0) @@ -466,16 +524,81 @@ let cheesify laby = done done;; -cheesify laby ;; +let print_cubes (cubes : pt_3d array array) = + for i = 0 to !n_walls -1 do + for j = 0 to 7 do + Printf.printf " {%f, %f, %f}\n" cubes.(i).(j).x cubes.(i).(j).y cubes.(i).(j).z + done; + Stdlib.print_endline " " + done ;; -let (cs, rs, gs, bs) = convert_laby laby ;; +(* z q s d for movement, p to go up, m to go down, a to rotate left, e to rotate right *) +let rec move_cam (cubes : pt_3d array array) b c =(* Printf.printf "[%b]" b; Stdlib.print_endline " " ; *)match c with + | 'z' -> + camera_xyz.z <- camera_xyz.z +. Float.cos ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x +. Float.sin ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + if b && (is_collision camera_xyz cubes) then move_cam cubes false 's' + | 'q' -> + camera_xyz.z <- camera_xyz.z +. Float.cos (((float_of_int !camera_angle_y) +. 90.) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x +. Float.sin (((float_of_int !camera_angle_y) +. 90.) *. 3.1415926535 /. 180.); + if b && (is_collision camera_xyz cubes) then move_cam cubes false 'q' + | 's' -> + camera_xyz.z <- camera_xyz.z -. Float.cos ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x -. Float.sin ((float_of_int !camera_angle_y) *. 3.1415926535 /. 180.); + if b && (is_collision camera_xyz cubes) then move_cam cubes false 'z' + | 'd' -> + camera_xyz.z <- camera_xyz.z +. Float.cos (((float_of_int !camera_angle_y) -. 90.) *. 3.1415926535 /. 180.); + camera_xyz.x <- camera_xyz.x +. Float.sin (((float_of_int !camera_angle_y) -. 90.) *. 3.1415926535 /. 180.); + if b && (is_collision camera_xyz cubes) then move_cam cubes false 'q' + | 'p' -> + camera_xyz.y <- camera_xyz.y -. 1.; + if b && (is_collision camera_xyz cubes) then move_cam cubes false 'm' + | 'm' -> + camera_xyz.y <- camera_xyz.y +. 1.; + if b && (is_collision camera_xyz cubes) then move_cam cubes false 'p' + | 'a' -> camera_angle_y := !camera_angle_y + 15 + | 'e' -> camera_angle_y := !camera_angle_y - 15 + | _ -> () ;; -camera_xyz.z <- -. (2.) ;; -camera_xyz.x <- -. (float_of_int width) /. 2. ;; -camera_xyz.y <- -. (float_of_int height) /. 2. ;; -while true do - open_graph " 1500x1000"; - draw_multiples_cubes_colored cs !n_walls rs gs bs 1500 1000 fov ; - camera_xyz.z <- camera_xyz.z +. 1.; - Unix.sleepf 1.25 -done ;; \ No newline at end of file +let play laby = + cheesify laby; + let (cs, rs, gs, bs) = convert_laby laby in + + camera_xyz.z <- -. (1.5) ; + camera_xyz.x <- -. (float_of_int width) /. 2. ; + camera_xyz.y <- -. (float_of_int height) /. 2. ; + + (*print_cubes cs ;*) + + while true do + auto_synchronize false; + open_graph " 1500x1000"; + set_color black; + fill_poly [|(0, 0); (1500, 0); (1500, 1000); (0, 1000); (0, 0)|]; + set_color white; + + draw_multiples_cubes_colored cs !n_walls rs gs bs 1500 1000 fov render_distance ; + + auto_synchronize true; + + Printf.printf "current pos : (%f, %f, %f)" (-. camera_xyz.x) (-. camera_xyz.y) camera_xyz.z; + Stdlib.print_endline " "; + + let usr_input = get1char () in + move_cam cs true usr_input + done ;; + +let test1 laby = + cheesify laby ; + let (cs, rs, gs, bs) = convert_laby laby in + camera_xyz.z <- -. (1.5) ; + camera_xyz.x <- -. (float_of_int width) /. 2. ; + camera_xyz.y <- -. (float_of_int height) /. 2. ; + while true do + open_graph " 1500x1000"; + draw_multiples_cubes_colored cs !n_walls rs gs bs 1500 1000 fov render_distance ; + camera_xyz.z <- camera_xyz.z +. 1.; + Unix.sleepf 1.25 + done ;; + +play laby ;; \ No newline at end of file