From 5951108c0a47fed6d78e442ae4233d9d34eafe13 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 14 Apr 2010 10:55:22 +0200 Subject: [PATCH 01/10] Added tank textures --- model/tank.blend | Bin 183512 -> 208164 bytes model/tank.obj | 3845 +++++++++++++++++++++++++++------------------- src/HTanks.hs | 6 +- src/Render.hs | 8 +- tex/Cannon.png | Bin 581 -> 33663 bytes tex/Tank.png | Bin 288 -> 2291 bytes 6 files changed, 2258 insertions(+), 1601 deletions(-) diff --git a/model/tank.blend b/model/tank.blend index baf699eb4f6a79430e9b91dcb6275ea11ca4a5ce..fdcf0029e08e7d1b2c8652624826ea930152ce46 100644 GIT binary patch literal 208164 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%0DSc<`i6L`B{@E4*S+~E^2@rn$-Bex&CM6mjc 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 literal 183512 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 wK5#M=_}|X^F@e90H unsafePreservingMatrix $ do @@ -152,7 +150,7 @@ render = do translate $ Vector3 x y (0 :: GLfloat) rotate rotDir $ Vector3 0 0 (1 :: GLfloat) - --textureBinding Texture2D $= Just textureTank + textureBinding Texture2D $= Just textureTank unsafePreservingMatrix $ do rotate 90 $ Vector3 1 0 (0 :: GLfloat) @@ -160,14 +158,12 @@ render = do rotate (rotAim-rotDir) $ Vector3 0 0 (1 :: GLfloat) - --textureBinding Texture2D $= Just textureCannon + textureBinding Texture2D $= Just textureCannon unsafePreservingMatrix $ do rotate 90 $ Vector3 1 0 (0 :: GLfloat) drawObject modelTank 0 - texture Texture2D $= Enabled - forM_ bulletlist $ \bullet -> unsafePreservingMatrix $ do let x = realToFrac . bulletX $ bullet y = realToFrac . bulletY $ bullet diff --git a/tex/Cannon.png b/tex/Cannon.png index 7ab3f67b7d0f7ff288982ca32b21b18d40b07bd7..8f18db9d23d1394b4beb2ab23f44b1904034c062 100644 GIT binary patch literal 33663 zcmb@u1yqz_v^F|)cQ?`?sUS#$AV>&EcZqZ;AOk~pBPxg>tq6#KbPO$_NC`*}DGfsp z&3(sn|NowQ?^)-@`j@c4kD2d#W50Vp&$IWQINir;B!rBF5D0|ik-Ewg2m}-SiV4BT z1wW3UW9Q%phW8USWk~rT^9J}2uAQcu3gia;FR$hE8*qidOWo8P0wJP8e`7#0KhT4V zcs`G`Rq>{=NyzU|zoF}kg+SOLk5rTlpwruP{;w<@gLp5I-h+*>icOE>g7Mda_JT97 zzj60Jf3{yn(!Xy9W!yo>mKq!w=M7i9r18i9V%NTD}y`s$4E1sf)0 z`cre0s=D;CtN>(d5DGSQ4iEY8HwSi6S9@HJ?DY+TwFDil*95mYUdSnH@GGgPs7%mA zX)CIze8&!rjg8HKkW)}lP(e62IP5UNRTV7=xEf0U0aw2oF=mCv8b$bUC%ykotYJhT zCV{Iay{qsf9v1^+RBX;FK{szk+RlYoXoQxl2Af({$si8b`gUZffC2uk@{LU9jrK~C z^*Yl2Z@S_MeDAqUek&Wqb-t!$-cY0w;NlYORaS{p>=ddfAVB4sXqrLDFYjM&`FzB> zg)N@n;YBRGKWxH|UIhxvpw@wzseOvyg4hAEX~dd4zf?h}(9=$V&?y`_wH zZ}%dmuM3+x5afxc>SH>K4$F6<9btBl=46rjt)!KN0nzGJ(X7E~DY5e5Zm#^~Pc*%} z6YIL)-%304&GtSmaj)VJ!CQ_ix^+Ke`BF7;T?pc;OdlEzfjJgw=+plq<@n;LSNAjH z%df@LU(Z$2_#k;t(_W3e_Fz&}R{RB%xs-^u&yyTyvT(IXD3n7azfD&*NGjkRkI0~n z5EzSgcaVOz_ievZ3M{cdXG&s@5~2?a690^X<_qN|ahF*5mgRbr@Y-}28(A9<}s3X8*+=kx2TB3n4Nuo*8|~o_rzzn zBlyLst7JG2*|`uS%Zk*2L2fq}Y|;@ly@6&0nC> ziN zl;8Fd5iqTlL}uJ7tl>zR7Yp^);E`^90~>Np#Gnl3osTMB*2z0;`r6F6i zjrapaMdbpCX~w|IA`(ekWKRo;8e?Zzs}t?>TizI8N1q-M-wEKMA1IzoW3Rle9Oj&* zuKFa_S!_K$xxiFK0$Pdfo27ozLBx3|4sEhX*$Hc6?blkgda<8R0Eb(py7gD09C1rPHS zl`Imve6+rgOV!nTsF{}ySQajufahwxD@rZ@2o4xurs~_T2XI9=y+J+)!y}G-ZgAe! zU3O>ce5ja0^gi1%RenmUGJJU>3nz(9?``~bU)Fn{L5rGql3vC2)nAi7hQ{bzre7rG zlfF~GAA;RaFcOi;U$o{Q8RySbWzLemS3#E=|FP0@S$-Q)*}S?elH3;CMHMsUrBWjx zijlXKY}=eLyGe(kn#RXIJ2c__G2;CJF;Bu9DKT$M9b$#B)JuFH^B7wu38I)ta;JFl z{M%DeFv+{{r9?JeN%AyF5ZE-ZLb@tC2*gw_;qd)o z$AoDz4gmo_HyF0ZmSz?H+LJg%iv&EwS#-!4&b;+W1<^M&lU0t-J;^%il=Z{S|0SZ} z{rOcn@J((B{HEN*Yta#ibM;_s&PIxiWC8*L5HMPLtWppn8V^)djH6v4<)eAok_Q?5 z1HZEHCa6j7{$&6gdh1q1(~6!1;oKkBfIkk^#D;n!jIOG{rM`44j*l

HZ*3_cl(# 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 EFJF&+B>(^b delta 532 zcmez0#&ncLu`|HWotI0Bi-CcG*VDr#2uM4CFb5luT$NdPZ=#}IJu`=hj>Y#%c`u-t zWQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FMhJw4NZ$Nk>pEv^p;{s0?$B>F!Z)X_h9dZzG zoqzep9Y!sW$uSDC3mRk8Ww$@D;PgEqJBiDA>Kw+|r!tRS%-YK4X#UJTGd1PB(qH@R z_h*^}oH!I)AVj@W$8E*eoqaMAw@i-;{@9wmp65iPpaEOl*_Ii{j;wE}oh~S+*`WD> zZ;C@|Qt)D?Z3m=3)Fdt4A-vy{V}0Y?UaP7y2D?48Col@1t`X(bfBUbyxAag)^V*h; z&)?|#i_prXgbivZQ_v_CcF%{dq$?|`N`2x}M z(lzDGZR%PFeoXZ|R%O0mgZ|GSXQoXnKU!&`keB0jK&axC!NLvc-rc$OU3t|_N*kAk zhCMphtn)m~SVu^;cz5Y8o%T%Q)gP_}mWrF%a7(XrTe<1C@cZ}wbOIl3V>;c(XShbH z`l8@DE2(*E7ZtblUNTuDwOMXP!P!QSyW-4IywhbmO>3=$cDr~tBZa8b9jkhk?gg{1 Tt>)Pbj8g_rS3j3^P6Y zhCC27XS$&V6yYrJh%9Dc;1&j9Muu5)B!GhKC7!;n?6+8W1uXe`8(&y5FmM!mx;TbZ z+P{AX0 z4FB?Oo9Qz!?3rI0EBny(-S^!<7rJi0o!fQ)*Pu8<@?2 zDO-k>fx#k;8Jx@m5@F)Pcbok4coWGf1h6We_JjvUwxRF!@%%>1(u`! z)4*B`_V+XL~?*Rv{Gr>uwpwn!K}UHx3vIVCg!0A)`+ A^Z)<= literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg4W)2Y@&ABJ-cL0SXOI#yLobz*Y zQ}ap~oQqNuOHxx5$}>wc6x=<11Hv2m#DR*cJzX3_DsH{KxsjJafrr_^;m`k~NC`o9 zlXI6OSErtocsR2>?A7n^Uu;L1-<*#u@x2Mug9A9E#GMTQ$uIiP@OA^xb+|xDPuUGl Zk21d4*{n^oRxAgr^mO%eS?83{1OPJZN|pcs From a19dc0d6aa982d138f46305cdea6443cb45a5fd3 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 16 Apr 2010 03:08:48 +0200 Subject: [PATCH 02/10] Added more models and render with perspective transform now --- .gitignore | 1 + model/bullet.blend | Bin 0 -> 145396 bytes model/bullet.obj | 657 +++++++++++++++++++++++++++++++++++++++++++++ model/cube.blend | Bin 0 -> 138032 bytes model/cube.mtl | 11 + model/cube.obj | 427 +++++++++++++++++++++++++++++ src/GLX.hs | 9 +- src/HTanks.hs | 8 +- src/Model.hs | 4 +- src/Render.hs | 76 ++++-- 10 files changed, 1156 insertions(+), 37 deletions(-) create mode 100644 model/bullet.blend create mode 100644 model/bullet.obj create mode 100644 model/cube.blend create mode 100644 model/cube.mtl create mode 100644 model/cube.obj diff --git a/.gitignore b/.gitignore index 733412c..b203cf3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *~ dist +*.blend1 diff --git a/model/bullet.blend b/model/bullet.blend new file mode 100644 index 0000000000000000000000000000000000000000..de0814342a763d746b480794601748b538697b0c GIT binary patch literal 145396 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 Oxl?8p7ZRb*zyAZ@9lV7A literal 0 HcmV?d00001 diff --git a/model/bullet.obj b/model/bullet.obj new file mode 100644 index 0000000..7e8de49 --- /dev/null +++ b/model/bullet.obj @@ -0,0 +1,657 @@ +# Blender3D v249 OBJ File: bullet.blend +# www.blender3d.org +o Circle +v 0.035355 -0.000000 -0.035355 +v 0.046194 -0.000000 -0.019134 +v 0.050000 0.000000 0.000000 +v 0.046194 0.000000 0.019134 +v 0.035355 0.000000 0.035355 +v 0.019134 0.000000 0.046194 +v 0.000000 0.000000 0.050000 +v -0.019134 0.000000 0.046194 +v -0.035355 0.000000 0.035355 +v -0.046194 0.000000 0.019134 +v -0.050000 -0.000000 -0.000000 +v -0.046194 -0.000000 -0.019134 +v -0.035355 -0.000000 -0.035355 +v -0.019134 -0.000000 -0.046194 +v 0.000000 -0.000000 -0.050000 +v 0.019134 -0.000000 -0.046194 +v 0.035355 0.019620 -0.035355 +v 0.046194 0.019620 -0.019134 +v 0.050000 0.019620 0.000000 +v 0.046194 0.019620 0.019134 +v 0.035355 0.019620 0.035355 +v 0.019134 0.019620 0.046194 +v 0.000000 0.019620 0.050000 +v -0.019134 0.019620 0.046194 +v -0.035355 0.019620 0.035355 +v -0.046194 0.019620 0.019134 +v -0.050000 0.019620 -0.000000 +v -0.046194 0.019620 -0.019134 +v -0.035355 0.019620 -0.035355 +v -0.019134 0.019620 -0.046194 +v 0.000000 0.019620 -0.050000 +v 0.019134 0.019620 -0.046194 +v 0.028321 0.019620 -0.028321 +v 0.037004 0.019620 -0.015327 +v 0.040053 0.019620 0.000000 +v 0.037004 0.019620 0.015327 +v 0.028321 0.019620 0.028321 +v 0.015327 0.019620 0.037004 +v 0.000000 0.019620 0.040053 +v -0.015327 0.019620 0.037004 +v -0.028321 0.019620 0.028321 +v -0.037004 0.019620 0.015327 +v -0.040053 0.019620 -0.000000 +v -0.037004 0.019620 -0.015327 +v -0.028321 0.019620 -0.028321 +v -0.015327 0.019620 -0.037004 +v 0.000000 0.019620 -0.040053 +v 0.015327 0.019620 -0.037004 +v 0.037004 0.036977 -0.015327 +v 0.028321 0.036977 -0.028321 +v 0.040053 0.036977 0.000000 +v 0.037004 0.036977 0.015327 +v 0.028321 0.036977 0.028321 +v 0.015327 0.036977 0.037004 +v 0.000000 0.036977 0.040053 +v -0.015327 0.036977 0.037004 +v -0.028321 0.036977 0.028321 +v -0.037004 0.036977 0.015327 +v -0.040053 0.036977 -0.000000 +v -0.037004 0.036977 -0.015327 +v -0.028321 0.036977 -0.028321 +v -0.015327 0.036977 -0.037004 +v 0.000000 0.036977 -0.040053 +v 0.015327 0.036977 -0.037004 +v 0.036574 0.036977 -0.036574 +v 0.047786 0.036977 -0.019794 +v 0.051723 0.036977 0.000000 +v 0.047786 0.036977 0.019794 +v 0.036574 0.036977 0.036574 +v 0.019794 0.036977 0.047786 +v 0.000000 0.036977 0.051723 +v -0.019794 0.036977 0.047786 +v -0.036574 0.036977 0.036574 +v -0.047786 0.036977 0.019794 +v -0.051723 0.036977 -0.000000 +v -0.047786 0.036977 -0.019794 +v -0.036574 0.036977 -0.036574 +v -0.019794 0.036977 -0.047786 +v 0.000000 0.036977 -0.051723 +v 0.019794 0.036977 -0.047786 +v 0.047786 0.131305 -0.019794 +v 0.036574 0.131305 -0.036574 +v 0.051723 0.131305 -0.000000 +v 0.047786 0.131305 0.019794 +v 0.036574 0.131305 0.036574 +v 0.019794 0.131305 0.047786 +v 0.000000 0.131305 0.051723 +v -0.019794 0.131305 0.047786 +v -0.036574 0.131305 0.036574 +v -0.047786 0.131305 0.019794 +v -0.051723 0.131305 -0.000000 +v -0.047786 0.131305 -0.019794 +v -0.036574 0.131305 -0.036574 +v -0.019794 0.131305 -0.047786 +v 0.000000 0.131305 -0.051723 +v 0.019794 0.131305 -0.047786 +v 0.029520 0.156208 -0.029520 +v 0.038570 0.156208 -0.015976 +v 0.041747 0.156208 -0.000000 +v 0.038570 0.156208 0.015976 +v 0.029520 0.156208 0.029520 +v 0.015976 0.156208 0.038570 +v 0.000000 0.156208 0.041747 +v -0.015976 0.156208 0.038570 +v -0.029520 0.156208 0.029520 +v -0.038570 0.156208 0.015976 +v -0.041747 0.156208 -0.000000 +v -0.038570 0.156208 -0.015976 +v -0.029520 0.156208 -0.029520 +v -0.015976 0.156208 -0.038570 +v 0.000000 0.156208 -0.041747 +v 0.015976 0.156208 -0.038570 +v 0.016971 0.174319 -0.016971 +v 0.022174 0.174319 -0.009185 +v 0.024001 0.174319 -0.000000 +v 0.022174 0.174319 0.009185 +v 0.016971 0.174319 0.016971 +v 0.009185 0.174319 0.022174 +v 0.000000 0.174319 0.024001 +v -0.009185 0.174319 0.022174 +v -0.016971 0.174319 0.016971 +v -0.022174 0.174319 0.009185 +v -0.024001 0.174319 -0.000000 +v -0.022174 0.174319 -0.009185 +v -0.016971 0.174319 -0.016971 +v -0.009185 0.174319 -0.022174 +v 0.000000 0.174319 -0.024001 +v 0.009185 0.174319 -0.022174 +v 0.000000 0.182620 -0.000000 +v 0.000000 0.000000 0.000000 +vt 0.442348 0.723517 +vt 0.486308 0.831276 +vt 0.418328 0.734761 +vt 0.395167 0.750823 +vt 0.373643 0.774765 +vt 0.355531 0.806014 +vt 0.344085 0.847527 +vt 0.345069 0.900493 +vt 0.631555 0.864578 +vt 0.625044 0.921431 +vt 0.622930 0.819506 +vt 0.606315 0.784119 +vt 0.585782 0.758952 +vt 0.563073 0.740060 +vt 0.539419 0.727158 +vt 0.515323 0.719335 +vt 0.490992 0.716078 +vt 0.466625 0.717152 +vt 0.435373 0.277216 +vt 0.403973 0.264260 +vt 0.500079 0.097230 +vt 0.370265 0.246237 +vt 0.335730 0.219943 +vt 0.300081 0.182134 +vt 0.262476 0.125117 +vt 0.216974 0.025934 +vt 0.778332 0.030350 +vt 0.738758 0.123675 +vt 0.701168 0.180870 +vt 0.664816 0.219670 +vt 0.629820 0.246695 +vt 0.596015 0.265220 +vt 0.563142 0.277262 +vt 0.530889 0.284061 +vt 0.498888 0.286402 +vt 0.466847 0.284667 +vt 0.459076 0.657593 +vt 0.425050 0.662927 +vt 0.492525 0.656254 +vt 0.526268 0.659145 +vt 0.560395 0.666499 +vt 0.595895 0.678983 +vt 0.633372 0.697880 +vt 0.672738 0.726412 +vt 0.715266 0.766419 +vt 0.758543 0.827819 +vt 0.799890 0.921453 +vt 0.187806 0.885604 +vt 0.230129 0.805500 +vt 0.272531 0.751734 +vt 0.313481 0.714767 +vt 0.352656 0.690394 +vt 0.389517 0.673219 +vt 0.454967 0.604740 +vt 0.415050 0.607973 +vt 0.493828 0.603607 +vt 0.532820 0.605524 +vt 0.573377 0.611385 +vt 0.616082 0.620340 +vt 0.662800 0.633827 +vt 0.716953 0.655882 +vt 0.778810 0.684490 +vt 0.857426 0.732283 +vt 0.960309 0.806764 +vt 0.057122 0.775946 +vt 0.144127 0.716184 +vt 0.215313 0.674136 +vt 0.275173 0.645576 +vt 0.325884 0.628063 +vt 0.372403 0.614745 +vt 0.454414 0.411584 +vt 0.410358 0.408623 +vt 0.497682 0.413327 +vt 0.541389 0.413677 +vt 0.586156 0.410672 +vt 0.633149 0.407708 +vt 0.685877 0.402631 +vt 0.746282 0.392320 +vt 0.815042 0.377662 +vt 0.895950 0.356644 +vt 0.995142 0.323746 +vt 0.011842 0.328297 +vt 0.111950 0.356544 +vt 0.190537 0.373008 +vt 0.257165 0.387893 +vt 0.313761 0.396372 +vt 0.364103 0.403965 +vt 0.456937 0.383080 +vt 0.413987 0.379535 +vt 0.498747 0.385110 +vt 0.540505 0.383766 +vt 0.583838 0.382503 +vt 0.629454 0.375367 +vt 0.679524 0.364508 +vt 0.736206 0.351371 +vt 0.800809 0.330810 +vt 0.875776 0.303252 +vt 0.958165 0.266489 +vt 0.046418 0.264682 +vt 0.129767 0.300477 +vt 0.203269 0.329077 +vt 0.266294 0.346593 +vt 0.320660 0.364084 +vt 0.369024 0.373744 +vt 0.460561 0.338929 +vt 0.422574 0.332644 +vt 0.498173 0.341211 +vt 0.536405 0.339836 +vt 0.575642 0.334995 +vt 0.616907 0.325682 +vt 0.661410 0.311265 +vt 0.711247 0.291253 +vt 0.764908 0.259158 +vt 0.827888 0.217071 +vt 0.907128 0.167677 +vt 0.091213 0.167936 +vt 0.169329 0.215271 +vt 0.235118 0.254654 +vt 0.288750 0.286234 +vt 0.336602 0.308830 +vt 0.380534 0.325355 +vt 0.462452 0.318040 +vt 0.426722 0.312070 +vt 0.497797 0.320014 +vt 0.533811 0.318275 +vt 0.570605 0.312568 +vt 0.608932 0.302035 +vt 0.649660 0.285578 +vt 0.693702 0.261242 +vt 0.743464 0.226984 +vt 0.800880 0.178871 +vt 0.884225 0.108849 +vt 0.118541 0.109644 +vt 0.198644 0.175916 +vt 0.254967 0.224836 +vt 0.303820 0.258704 +vt 0.347531 0.283186 +vt 0.388815 0.300133 +vn 0.384594 0.819025 -0.425703 +vn 0.000000 1.000000 0.000000 +vn 0.553056 0.801019 -0.229072 +vn 0.534013 0.845454 0.000000 +vn 0.553056 0.801019 0.229072 +vn 0.384594 0.819025 0.425703 +vn 0.192419 0.819025 0.540483 +vn -0.029054 0.819025 0.572985 +vn -0.246101 0.819025 0.518235 +vn -0.425703 0.819025 0.384594 +vn -0.540483 0.819025 0.192419 +vn -0.572985 0.819025 -0.029054 +vn -0.518235 0.819025 -0.246101 +vn -0.384594 0.819025 -0.425703 +vn -0.192419 0.819025 -0.540483 +vn 0.029054 0.819025 -0.572985 +vn 0.204352 0.845454 -0.493362 +vn 0.622639 -0.561296 -0.545183 +vn 0.646901 -0.713920 -0.267953 +vn 0.000000 -1.000000 0.000000 +vn 0.825770 -0.561296 -0.054750 +vn 0.783868 -0.561296 0.265419 +vn 0.622639 -0.561296 0.545183 +vn 0.366588 -0.561296 0.741966 +vn 0.054750 -0.561296 0.825770 +vn -0.265419 -0.561296 0.783868 +vn -0.545183 -0.561296 0.622639 +vn -0.741966 -0.561296 0.366588 +vn -0.825770 -0.561296 0.054750 +vn -0.783868 -0.561296 -0.265419 +vn -0.622608 -0.561296 -0.545183 +vn -0.366588 -0.561296 -0.741966 +vn -0.054750 -0.561296 -0.825770 +vn 0.340922 -0.454176 -0.823084 +vn 0.305734 0.601337 -0.738151 +vn 0.586932 0.546983 -0.596881 +vn 0.007019 0.546983 -0.837092 +vn -0.313822 0.546983 -0.776055 +vn -0.586932 0.546983 -0.596881 +vn -0.770653 0.546983 -0.326853 +vn -0.837092 0.546983 -0.007019 +vn -0.776055 0.546983 0.313822 +vn -0.596881 0.546983 0.586932 +vn -0.326853 0.546983 0.770653 +vn -0.007019 0.546983 0.837092 +vn 0.313822 0.546983 0.776055 +vn 0.586932 0.546983 0.596881 +vn 0.805261 0.490127 0.333537 +vn 0.798975 0.601337 0.000000 +vn 0.805261 0.490127 -0.333537 +vn 0.370312 0.252174 -0.894009 +vn 0.692618 0.189581 -0.695914 +vn 0.002319 0.189581 -0.981842 +vn -0.373577 0.189581 -0.907987 +vn -0.692618 0.189581 -0.695914 +vn -0.906217 0.189581 -0.377880 +vn -0.981842 0.189581 -0.002319 +vn -0.907987 0.189581 0.373577 +vn -0.695914 0.189581 0.692618 +vn -0.377880 0.189581 0.906217 +vn -0.002319 0.189581 0.981842 +vn 0.373577 0.189581 0.907987 +vn 0.692618 0.189581 0.695914 +vn 0.896969 0.151463 0.415265 +vn 0.975829 0.216468 0.028871 +vn 0.916471 0.126194 -0.379620 +vn 0.527360 -0.713157 -0.461776 +vn -0.039247 -0.804895 -0.592059 +vn -0.527360 -0.713157 -0.461776 +vn -0.663961 -0.713157 -0.224799 +vn -0.699454 -0.713157 0.046358 +vn -0.628468 -0.713157 0.310495 +vn -0.461776 -0.713157 0.527360 +vn -0.224799 -0.713157 0.663961 +vn 0.046358 -0.713157 0.699454 +vn 0.310495 -0.713157 0.628468 +vn 0.527360 -0.713157 0.461776 +vn 0.663961 -0.713157 0.224799 +vn 0.592059 -0.804895 -0.039247 +vn 0.505570 -0.836940 -0.209418 +vn 0.168493 -0.897824 -0.406781 +vn 0.461776 -0.713157 -0.527360 +vn 0.054750 -0.561296 -0.825770 +vn -0.190283 -0.804895 -0.562029 +vn -0.461776 -0.713157 -0.527360 +vn -0.628468 -0.713157 -0.310495 +vn -0.699454 -0.713157 -0.046358 +vn -0.663961 -0.713157 0.224799 +vn -0.527360 -0.713157 0.461776 +vn -0.310495 -0.713157 0.628468 +vn -0.046358 -0.713157 0.699454 +vn 0.224799 -0.713157 0.663961 +vn 0.461776 -0.713157 0.527360 +vn 0.628468 -0.713157 0.310495 +vn 0.825770 -0.561296 0.054750 +vn 0.733879 -0.607440 -0.303964 +vn 0.340922 0.454176 -0.823084 +vn 0.527360 0.713157 -0.461776 +vn -0.046358 0.713157 -0.699454 +vn -0.310495 0.713157 -0.628468 +vn -0.527360 0.713157 -0.461776 +vn -0.663961 0.713157 -0.224799 +vn -0.699454 0.713157 0.046358 +vn -0.628468 0.713157 0.310495 +vn -0.461776 0.713157 0.527360 +vn -0.224799 0.713157 0.663961 +vn 0.046358 0.713157 0.699454 +vn 0.310495 0.713157 0.628468 +vn 0.527360 0.713157 0.461776 +vn 0.663961 0.713157 0.224799 +vn 0.699454 0.713157 -0.046358 +vn 0.406781 0.897824 -0.168493 +vn 0.168493 0.897824 -0.406781 +vn 0.461776 0.713157 -0.527360 +vn 0.046358 0.713157 -0.699454 +vn -0.224799 0.713157 -0.663961 +vn -0.461776 0.713157 -0.527360 +vn -0.628468 0.713157 -0.310495 +vn -0.699454 0.713157 -0.046358 +vn -0.663961 0.713157 0.224799 +vn -0.527360 0.713157 0.461776 +vn -0.310495 0.713157 0.628468 +vn -0.046358 0.713157 0.699454 +vn 0.224799 0.713157 0.663961 +vn 0.461776 0.713157 0.527360 +vn 0.628468 0.713157 0.310495 +vn 0.699454 0.713157 0.046358 +vn 0.823084 0.454176 -0.340922 +usemtl None_Untitled +s 1 +f 113/1/1 129/2/2 114/3/3 +f 115/4/4 114/3/3 129/2/2 +f 116/5/5 115/4/4 129/2/2 +f 117/6/6 116/5/5 129/2/2 +f 118/7/7 117/6/6 129/2/2 +f 119/8/8 118/7/7 129/2/2 +f 120/9/9 119/10/8 129/2/2 +f 121/11/10 120/9/9 129/2/2 +f 122/12/11 121/11/10 129/2/2 +f 123/13/12 122/12/11 129/2/2 +f 124/14/13 123/13/12 129/2/2 +f 125/15/14 124/14/13 129/2/2 +f 126/16/15 125/15/14 129/2/2 +f 127/17/16 126/16/15 129/2/2 +f 128/18/17 127/17/16 129/2/2 +f 128/18/17 129/2/2 113/1/1 +f 1/19/18 2/20/19 130/21/20 +f 2/20/19 3/22/21 130/21/20 +f 3/22/21 4/23/22 130/21/20 +f 4/23/22 5/24/23 130/21/20 +f 5/24/23 6/25/24 130/21/20 +f 6/25/24 7/26/25 130/21/20 +f 7/27/25 8/28/26 130/21/20 +f 8/28/26 9/29/27 130/21/20 +f 9/29/27 10/30/28 130/21/20 +f 10/30/28 11/31/29 130/21/20 +f 11/31/29 12/32/30 130/21/20 +f 12/32/30 13/33/31 130/21/20 +f 13/33/31 14/34/32 130/21/20 +f 14/34/32 15/35/33 130/21/20 +f 15/35/33 16/36/34 130/21/20 +f 16/36/34 1/19/18 130/21/20 +f 112/37/35 128/18/17 113/1/1 +f 112/37/35 113/1/1 97/38/36 +f 112/37/35 111/39/37 127/17/16 +f 112/37/35 127/17/16 128/18/17 +f 111/39/37 110/40/38 126/16/15 +f 111/39/37 126/16/15 127/17/16 +f 110/40/38 109/41/39 125/15/14 +f 110/40/38 125/15/14 126/16/15 +f 109/41/39 108/42/40 124/14/13 +f 109/41/39 124/14/13 125/15/14 +f 108/42/40 107/43/41 123/13/12 +f 108/42/40 123/13/12 124/14/13 +f 107/43/41 106/44/42 122/12/11 +f 107/43/41 122/12/11 123/13/12 +f 106/44/42 105/45/43 121/11/10 +f 106/44/42 121/11/10 122/12/11 +f 105/45/43 104/46/44 120/9/9 +f 105/45/43 120/9/9 121/11/10 +f 104/46/44 103/47/45 119/10/8 +f 104/46/44 119/10/8 120/9/9 +f 103/48/45 102/49/46 118/7/7 +f 103/48/45 118/7/7 119/8/8 +f 102/49/46 101/50/47 117/6/6 +f 102/49/46 117/6/6 118/7/7 +f 101/50/47 100/51/48 116/5/5 +f 101/50/47 116/5/5 117/6/6 +f 100/51/48 99/52/49 116/5/5 +f 99/52/49 115/4/4 116/5/5 +f 99/52/49 98/53/50 114/3/3 +f 99/52/49 114/3/3 115/4/4 +f 97/38/36 113/1/1 114/3/3 +f 97/38/36 114/3/3 98/53/50 +f 96/54/51 112/37/35 97/38/36 +f 96/54/51 97/38/36 82/55/52 +f 96/54/51 95/56/53 111/39/37 +f 96/54/51 111/39/37 112/37/35 +f 95/56/53 94/57/54 110/40/38 +f 95/56/53 110/40/38 111/39/37 +f 94/57/54 93/58/55 109/41/39 +f 94/57/54 109/41/39 110/40/38 +f 93/58/55 92/59/56 108/42/40 +f 93/58/55 108/42/40 109/41/39 +f 92/59/56 91/60/57 107/43/41 +f 92/59/56 107/43/41 108/42/40 +f 91/60/57 90/61/58 106/44/42 +f 91/60/57 106/44/42 107/43/41 +f 90/61/58 89/62/59 105/45/43 +f 90/61/58 105/45/43 106/44/42 +f 89/62/59 88/63/60 104/46/44 +f 89/62/59 104/46/44 105/45/43 +f 88/63/60 87/64/61 103/47/45 +f 88/63/60 103/47/45 104/46/44 +f 87/65/61 86/66/62 102/49/46 +f 87/65/61 102/49/46 103/48/45 +f 86/66/62 85/67/63 101/50/47 +f 86/66/62 101/50/47 102/49/46 +f 85/67/63 84/68/64 100/51/48 +f 85/67/63 100/51/48 101/50/47 +f 84/68/64 83/69/65 100/51/48 +f 83/69/65 99/52/49 100/51/48 +f 83/69/65 81/70/66 98/53/50 +f 83/69/65 98/53/50 99/52/49 +f 82/55/52 97/38/36 98/53/50 +f 82/55/52 98/53/50 81/70/66 +f 80/71/34 96/54/51 82/55/52 +f 80/71/34 82/55/52 65/72/67 +f 80/71/34 79/73/68 95/56/53 +f 80/71/34 95/56/53 96/54/51 +f 79/73/68 78/74/32 94/57/54 +f 79/73/68 94/57/54 95/56/53 +f 78/74/32 77/75/69 93/58/55 +f 78/74/32 93/58/55 94/57/54 +f 77/75/69 76/76/70 92/59/56 +f 77/75/69 92/59/56 93/58/55 +f 76/76/70 75/77/71 91/60/57 +f 76/76/70 91/60/57 92/59/56 +f 75/77/71 74/78/72 90/61/58 +f 75/77/71 90/61/58 91/60/57 +f 74/78/72 73/79/73 89/62/59 +f 74/78/72 89/62/59 90/61/58 +f 73/79/73 72/80/74 88/63/60 +f 73/79/73 88/63/60 89/62/59 +f 72/80/74 71/81/75 87/64/61 +f 72/80/74 87/64/61 88/63/60 +f 71/82/75 70/83/76 86/66/62 +f 71/82/75 86/66/62 87/65/61 +f 70/83/76 69/84/77 85/67/63 +f 70/83/76 85/67/63 86/66/62 +f 69/84/77 68/85/78 84/68/64 +f 69/84/77 84/68/64 85/67/63 +f 68/85/78 67/86/79 83/69/65 +f 68/85/78 83/69/65 84/68/64 +f 67/86/79 66/87/80 81/70/66 +f 67/86/79 81/70/66 83/69/65 +f 65/72/67 82/55/52 81/70/66 +f 65/72/67 81/70/66 66/87/80 +f 64/88/81 80/71/34 65/72/67 +f 64/88/81 65/72/67 50/89/82 +f 64/88/81 63/90/83 79/73/68 +f 64/88/81 79/73/68 80/71/34 +f 63/90/83 62/91/84 79/73/68 +f 62/91/84 78/74/32 79/73/68 +f 62/91/84 61/92/85 77/75/69 +f 62/91/84 77/75/69 78/74/32 +f 61/92/85 60/93/86 76/76/70 +f 61/92/85 76/76/70 77/75/69 +f 60/93/86 59/94/87 75/77/71 +f 60/93/86 75/77/71 76/76/70 +f 59/94/87 58/95/88 74/78/72 +f 59/94/87 74/78/72 75/77/71 +f 58/95/88 57/96/89 73/79/73 +f 58/95/88 73/79/73 74/78/72 +f 57/96/89 56/97/90 72/80/74 +f 57/96/89 72/80/74 73/79/73 +f 56/97/90 55/98/91 71/81/75 +f 56/97/90 71/81/75 72/80/74 +f 55/99/91 54/100/92 70/83/76 +f 55/99/91 70/83/76 71/82/75 +f 54/100/92 53/101/93 69/84/77 +f 54/100/92 69/84/77 70/83/76 +f 53/101/93 52/102/94 68/85/78 +f 53/101/93 68/85/78 69/84/77 +f 52/102/94 51/103/95 67/86/79 +f 52/102/94 67/86/79 68/85/78 +f 51/103/95 49/104/96 67/86/79 +f 49/104/96 66/87/80 67/86/79 +f 50/89/82 65/72/67 66/87/80 +f 50/89/82 66/87/80 49/104/96 +f 48/105/97 64/88/81 50/89/82 +f 48/105/97 50/89/82 33/106/98 +f 48/105/97 47/107/99 63/90/83 +f 48/105/97 63/90/83 64/88/81 +f 47/107/99 46/108/100 62/91/84 +f 47/107/99 62/91/84 63/90/83 +f 46/108/100 45/109/101 61/92/85 +f 46/108/100 61/92/85 62/91/84 +f 45/109/101 44/110/102 60/93/86 +f 45/109/101 60/93/86 61/92/85 +f 44/110/102 43/111/103 59/94/87 +f 44/110/102 59/94/87 60/93/86 +f 43/111/103 42/112/104 58/95/88 +f 43/111/103 58/95/88 59/94/87 +f 42/112/104 41/113/105 57/96/89 +f 42/112/104 57/96/89 58/95/88 +f 41/113/105 40/114/106 56/97/90 +f 41/113/105 56/97/90 57/96/89 +f 40/114/106 39/115/107 55/98/91 +f 40/114/106 55/98/91 56/97/90 +f 39/116/107 38/117/108 54/100/92 +f 39/116/107 54/100/92 55/99/91 +f 38/117/108 37/118/109 53/101/93 +f 38/117/108 53/101/93 54/100/92 +f 37/118/109 36/119/110 52/102/94 +f 37/118/109 52/102/94 53/101/93 +f 36/119/110 35/120/111 51/103/95 +f 36/119/110 51/103/95 52/102/94 +f 35/120/111 34/121/112 49/104/96 +f 35/120/111 49/104/96 51/103/95 +f 33/106/98 50/89/82 49/104/96 +f 33/106/98 49/104/96 34/121/112 +f 32/122/113 48/105/97 33/106/98 +f 32/122/113 33/106/98 17/123/114 +f 32/122/113 31/124/115 47/107/99 +f 32/122/113 47/107/99 48/105/97 +f 31/124/115 30/125/116 46/108/100 +f 31/124/115 46/108/100 47/107/99 +f 30/125/116 29/126/117 45/109/101 +f 30/125/116 45/109/101 46/108/100 +f 29/126/117 28/127/118 44/110/102 +f 29/126/117 44/110/102 45/109/101 +f 28/127/118 27/128/119 43/111/103 +f 28/127/118 43/111/103 44/110/102 +f 27/128/119 26/129/120 42/112/104 +f 27/128/119 42/112/104 43/111/103 +f 26/129/120 25/130/121 41/113/105 +f 26/129/120 41/113/105 42/112/104 +f 25/130/121 24/131/122 40/114/106 +f 25/130/121 40/114/106 41/113/105 +f 24/131/122 23/132/123 39/115/107 +f 24/131/122 39/115/107 40/114/106 +f 23/133/123 22/134/124 38/117/108 +f 23/133/123 38/117/108 39/116/107 +f 22/134/124 21/135/125 37/118/109 +f 22/134/124 37/118/109 38/117/108 +f 21/135/125 20/136/126 36/119/110 +f 21/135/125 36/119/110 37/118/109 +f 20/136/126 19/137/127 35/120/111 +f 20/136/126 35/120/111 36/119/110 +f 19/137/127 18/138/128 34/121/112 +f 19/137/127 34/121/112 35/120/111 +f 17/123/114 33/106/98 34/121/112 +f 17/123/114 34/121/112 18/138/128 +f 17/123/114 1/19/18 16/36/34 +f 17/123/114 16/36/34 32/122/113 +f 16/36/34 15/35/33 31/124/115 +f 16/36/34 31/124/115 32/122/113 +f 15/35/33 14/34/32 30/125/116 +f 15/35/33 30/125/116 31/124/115 +f 14/34/32 13/33/31 29/126/117 +f 14/34/32 29/126/117 30/125/116 +f 13/33/31 12/32/30 28/127/118 +f 13/33/31 28/127/118 29/126/117 +f 12/32/30 11/31/29 27/128/119 +f 12/32/30 27/128/119 28/127/118 +f 11/31/29 10/30/28 26/129/120 +f 11/31/29 26/129/120 27/128/119 +f 10/30/28 9/29/27 25/130/121 +f 10/30/28 25/130/121 26/129/120 +f 9/29/27 8/28/26 24/131/122 +f 9/29/27 24/131/122 25/130/121 +f 8/28/26 7/27/25 23/132/123 +f 8/28/26 23/132/123 24/131/122 +f 7/26/25 6/25/24 22/134/124 +f 7/26/25 22/134/124 23/133/123 +f 6/25/24 5/24/23 21/135/125 +f 6/25/24 21/135/125 22/134/124 +f 5/24/23 4/23/22 20/136/126 +f 5/24/23 20/136/126 21/135/125 +f 4/23/22 3/22/21 19/137/127 +f 4/23/22 19/137/127 20/136/126 +f 3/22/21 2/20/19 18/138/128 +f 3/22/21 18/138/128 19/137/127 +f 1/19/18 17/123/114 18/138/128 +f 1/19/18 18/138/128 2/20/19 diff --git a/model/cube.blend b/model/cube.blend new file mode 100644 index 0000000000000000000000000000000000000000..af529d02127a7afc05b3d796fe02dea2da88c0f9 GIT binary patch literal 138032 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 literal 0 HcmV?d00001 diff --git a/model/cube.mtl b/model/cube.mtl new file mode 100644 index 0000000..5bc3a52 --- /dev/null +++ b/model/cube.mtl @@ -0,0 +1,11 @@ +# Material Count: 1 +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.483062 0.483062 0.483062 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 + + diff --git a/model/cube.obj b/model/cube.obj new file mode 100644 index 0000000..838f922 --- /dev/null +++ b/model/cube.obj @@ -0,0 +1,427 @@ +# Blender3D v249 OBJ File: cube.blend +# www.blender3d.org +o Cube +v -0.445003 -0.500000 0.445003 +v -0.445003 -0.500000 -0.445003 +v 0.445003 -0.500000 -0.445003 +v 0.445003 -0.500000 0.445003 +v -0.445003 0.500000 0.445003 +v 0.445003 0.500000 0.445003 +v 0.445003 0.500000 -0.445003 +v -0.445003 0.500000 -0.445003 +v 0.500000 0.445003 0.445003 +v 0.500000 -0.445003 0.445003 +v 0.500000 -0.445003 -0.445003 +v 0.500000 0.445003 -0.445003 +v -0.445003 0.445003 0.500000 +v -0.445003 -0.445003 0.500000 +v 0.445003 -0.445003 0.500000 +v 0.445003 0.445003 0.500000 +v -0.500000 0.445003 -0.445003 +v -0.500000 -0.445003 -0.445003 +v -0.500000 -0.445003 0.445003 +v -0.500000 0.445003 0.445003 +v -0.445003 -0.445003 -0.500000 +v -0.445003 0.445003 -0.500000 +v 0.445003 0.445003 -0.500000 +v 0.445003 -0.445003 -0.500000 +v 0.490850 -0.467094 0.445003 +v 0.467094 -0.490850 0.445003 +v 0.467094 -0.490850 -0.445003 +v 0.490850 -0.467094 -0.445003 +v -0.445003 -0.467094 0.490850 +v -0.445003 -0.490850 0.467094 +v 0.445003 -0.490850 0.467094 +v 0.445003 -0.467094 0.490850 +v -0.445003 -0.490850 -0.467094 +v -0.445003 -0.467094 -0.490850 +v 0.445003 -0.467094 -0.490850 +v 0.445003 -0.490850 -0.467094 +v -0.490850 -0.467094 -0.445003 +v -0.467094 -0.490850 -0.445003 +v -0.467094 -0.490850 0.445003 +v -0.490850 -0.467094 0.445003 +v -0.445003 0.467094 -0.490850 +v -0.445003 0.490850 -0.467094 +v 0.445003 0.490850 -0.467093 +v 0.445003 0.467094 -0.490849 +v -0.467094 0.490850 -0.445003 +v -0.490850 0.467094 -0.445003 +v -0.490850 0.467094 0.445003 +v -0.467094 0.490850 0.445003 +v 0.467093 0.490850 0.445003 +v 0.490849 0.467094 0.445003 +v 0.490850 0.467094 -0.445003 +v 0.467094 0.490850 -0.445003 +v -0.445003 0.490850 0.467094 +v -0.445003 0.467094 0.490850 +v 0.445003 0.467094 0.490850 +v 0.445003 0.490850 0.467094 +v 0.467094 0.445003 -0.490849 +v 0.490850 0.445003 -0.467094 +v 0.490850 -0.445003 -0.467094 +v 0.467094 -0.445003 -0.490850 +v 0.490849 0.445003 0.467094 +v 0.467093 0.445003 0.490850 +v 0.467094 -0.445003 0.490850 +v 0.490850 -0.445003 0.467094 +v -0.467094 0.445003 0.490850 +v -0.490850 0.445003 0.467094 +v -0.490850 -0.445003 0.467094 +v -0.467094 -0.445003 0.490850 +v -0.490850 0.445003 -0.467094 +v -0.467094 0.445003 -0.490850 +v -0.467094 -0.445003 -0.490850 +v -0.490850 -0.445003 -0.467094 +v 0.468509 -0.478868 -0.468509 +v 0.468509 -0.468509 -0.478868 +v 0.478868 -0.468509 -0.468509 +v 0.468509 -0.478868 0.468509 +v 0.478868 -0.468509 0.468509 +v 0.468509 -0.468509 0.478868 +v -0.468509 -0.478868 0.468509 +v -0.468509 -0.468509 0.478868 +v -0.478868 -0.468509 0.468509 +v -0.468509 -0.478868 -0.468509 +v -0.478868 -0.468509 -0.468509 +v -0.468509 -0.468509 -0.478868 +v 0.468509 0.478868 -0.468509 +v 0.478868 0.468509 -0.468509 +v 0.468509 0.468509 -0.478868 +v 0.468509 0.478868 0.468510 +v 0.468509 0.468509 0.478869 +v 0.478868 0.468509 0.468510 +v -0.468509 0.478868 0.468509 +v -0.478868 0.468509 0.468509 +v -0.468509 0.468509 0.478868 +v -0.468509 0.478868 -0.468509 +v -0.468509 0.468509 -0.478868 +v -0.478868 0.468509 -0.468509 +vt 0.968509 0.978868 +vt 0.978868 0.968509 +vt 0.968509 0.968509 +vt 0.031491 0.031491 +vt 0.021132 0.031491 +vt 0.031491 0.021132 +vt 0.021132 0.968509 +vt 0.031491 0.978868 +vt 0.031491 0.968509 +vt 0.968509 0.021131 +vt 0.978868 0.031490 +vt 0.968509 0.031490 +vt 0.054997 0.945003 +vt 0.032906 0.945003 +vt 0.054997 0.967094 +vt 0.054997 0.032906 +vt 0.032906 0.054997 +vt 0.054997 0.054997 +vt 0.945003 0.054997 +vt 0.967094 0.054997 +vt 0.945003 0.032906 +vt 0.968509 0.031491 +vt 0.945003 0.967094 +vt 0.967094 0.945003 +vt 0.945003 0.945003 +vt 0.967093 0.945003 +vt 0.031490 0.968509 +vt 0.967093 0.054997 +vt 0.945003 0.967093 +vt 0.009150 0.054997 +vt 0.009150 0.945003 +vt 0.990849 0.945003 +vt 0.978868 0.031491 +vt 0.990850 0.054997 +vt 0.990850 0.945003 +vt 0.945003 0.009150 +vt 0.054997 0.009150 +vt 0.990849 0.054997 +vt 0.945003 0.990849 +vt 0.054997 0.990850 +vt 0.945003 0.990850 +vt 0.968509 0.021132 +vn 0.539140 -0.462966 -0.703513 +vn 0.703513 -0.539140 -0.462966 +vn 0.462966 -0.703513 -0.539140 +vn 0.703513 -0.462966 0.539140 +vn 0.462966 -0.539140 0.703513 +vn 0.539140 -0.703513 0.462966 +vn -0.539140 -0.462966 0.703513 +vn -0.703513 -0.539140 0.462966 +vn -0.462966 -0.703513 0.539140 +vn -0.703513 -0.462966 -0.539140 +vn -0.462966 -0.539140 -0.703513 +vn -0.539140 -0.703513 -0.462966 +vn 0.703513 0.462966 -0.539140 +vn 0.462966 0.539140 -0.703513 +vn 0.539140 0.703513 -0.462966 +vn 0.539140 0.462966 0.703513 +vn 0.703513 0.539140 0.462966 +vn 0.462966 0.703513 0.539140 +vn -0.703513 0.462966 0.539140 +vn -0.462966 0.539140 0.703513 +vn -0.539140 0.703513 0.462966 +vn -0.539140 0.462966 -0.703513 +vn -0.703513 0.539140 -0.462966 +vn -0.462966 0.703513 -0.539140 +vn -0.153356 0.232643 -0.960387 +vn -0.499557 0.182134 -0.846889 +vn -0.200720 0.575213 -0.792962 +vn -0.182134 -0.499557 -0.846889 +vn -0.575213 -0.200720 -0.792962 +vn -0.193823 -0.127750 -0.972655 +vn 0.153356 -0.232643 -0.960387 +vn 0.499557 -0.182134 -0.846889 +vn 0.200720 -0.575213 -0.792962 +vn 0.182134 0.499557 -0.846889 +vn 0.575213 0.200720 -0.792962 +vn 0.193823 0.127750 -0.972655 +vn -0.960387 -0.232643 -0.153356 +vn -0.846889 -0.182134 -0.499557 +vn -0.792962 -0.575213 -0.200720 +vn -0.846889 0.499557 -0.182134 +vn -0.792962 0.200720 -0.575213 +vn -0.972655 0.127750 -0.193823 +vn -0.960387 0.232643 0.153356 +vn -0.846889 0.182134 0.499557 +vn -0.792962 0.575213 0.200720 +vn -0.846889 -0.499557 0.182134 +vn -0.792962 -0.200720 0.575213 +vn -0.972655 -0.127750 0.193823 +vn -0.127750 -0.193823 0.972655 +vn -0.499557 -0.182134 0.846889 +vn -0.200720 -0.575213 0.792962 +vn -0.182134 0.499557 0.846889 +vn -0.575213 0.200720 0.792962 +vn -0.232643 0.153356 0.960387 +vn 0.127750 0.193823 0.972655 +vn 0.499557 0.182134 0.846889 +vn 0.200720 0.575213 0.792962 +vn 0.182134 -0.499557 0.846889 +vn 0.575213 -0.200720 0.792962 +vn 0.232643 -0.153356 0.960387 +vn 0.976165 -0.153356 0.153356 +vn 0.846889 -0.182134 0.499557 +vn 0.814112 -0.553423 0.175848 +vn 0.846889 0.499557 0.182134 +vn 0.792962 0.200720 0.575213 +vn 0.960387 0.153356 0.232643 +vn 0.972655 0.193823 -0.127750 +vn 0.846889 0.182134 -0.499557 +vn 0.792962 0.575213 -0.200720 +vn 0.825434 -0.520432 -0.218574 +vn 0.792962 -0.200720 -0.575213 +vn 0.961516 -0.194220 -0.194220 +vn 0.232643 0.960387 0.153356 +vn 0.182134 0.846889 0.499557 +vn 0.575213 0.792962 0.200720 +vn -0.499557 0.846889 0.182134 +vn -0.200720 0.792962 0.575213 +vn -0.127750 0.972655 0.193823 +vn -0.182134 0.846889 -0.499557 +vn -0.575213 0.792962 -0.200720 +vn -0.232643 0.960387 -0.153356 +vn 0.127750 0.972655 -0.193823 +vn 0.499557 0.846889 -0.182134 +vn 0.200720 0.792962 -0.575213 +vn -0.194220 -0.961516 -0.194220 +vn -0.520432 -0.825434 -0.218574 +vn -0.200720 -0.792962 -0.575213 +vn -0.553423 -0.814112 0.175848 +vn -0.153356 -0.976165 0.153356 +vn -0.182134 -0.846889 0.499557 +vn 0.499557 -0.846889 0.182134 +vn 0.200720 -0.792962 0.575213 +vn 0.153356 -0.960387 0.232643 +vn 0.193823 -0.972655 -0.127750 +vn 0.182134 -0.846889 -0.499557 +vn 0.575213 -0.792962 -0.200720 +usemtl Material +s 1 +f 74/1/1 75/2/2 73/3/3 +f 77/4/4 78/5/5 76/6/6 +f 80/6/7 81/5/8 79/4/9 +f 83/7/10 84/8/11 82/9/12 +f 86/2/13 87/1/14 85/3/15 +f 89/10/16 90/11/17 88/12/18 +f 92/5/19 93/6/20 91/4/21 +f 95/8/22 96/7/23 94/9/24 +f 22/13/25 70/14/26 41/15/27 +f 70/14/26 95/9/22 41/15/27 +f 34/16/28 84/4/11 71/17/29 +f 34/16/28 71/17/29 21/18/30 +f 24/19/31 60/20/32 35/21/33 +f 60/20/32 74/22/1 35/21/33 +f 44/23/34 87/3/14 57/24/35 +f 44/23/34 57/24/35 23/25/36 +f 18/19/37 72/20/38 37/21/39 +f 72/20/38 83/22/10 37/21/39 +f 46/23/40 96/3/23 69/24/41 +f 46/23/40 69/24/41 17/25/42 +f 20/13/43 66/14/44 47/15/45 +f 66/14/44 92/9/19 47/15/45 +f 40/16/46 81/4/8 67/17/47 +f 40/16/46 67/17/47 19/18/48 +f 14/18/49 68/17/50 29/16/51 +f 68/17/50 80/4/7 29/16/51 +f 54/15/52 93/9/20 65/14/53 +f 54/15/52 65/14/53 13/13/54 +f 16/25/55 62/26/56 55/23/57 +f 62/26/56 89/3/16 55/23/57 +f 32/21/58 78/22/5 63/20/59 +f 32/21/58 63/20/59 15/19/60 +f 10/18/61 64/17/62 25/16/63 +f 64/17/62 77/4/4 25/16/63 +f 50/15/64 90/27/17 61/14/65 +f 50/15/64 61/14/65 9/13/66 +f 12/25/67 58/26/68 51/23/69 +f 58/26/68 86/3/13 51/23/69 +f 28/21/70 75/22/2 59/20/71 +f 28/21/70 59/20/71 11/19/72 +f 6/19/73 56/21/74 49/28/75 +f 56/21/74 88/12/18 49/28/75 +f 48/17/76 91/4/21 53/16/77 +f 48/17/76 53/16/77 5/18/78 +f 42/15/79 94/9/24 45/14/80 +f 42/15/79 45/14/80 8/13/81 +f 7/25/82 52/24/83 43/29/84 +f 52/24/83 85/3/15 43/29/84 +f 2/13/85 38/14/86 33/15/87 +f 38/14/86 82/9/12 33/15/87 +f 39/17/88 1/18/89 30/16/90 +f 39/17/88 30/16/90 79/4/9 +f 26/20/91 76/22/6 31/21/92 +f 26/20/91 31/21/92 4/19/93 +f 3/25/94 36/23/95 27/24/96 +f 36/23/95 73/3/3 27/24/96 +f 71/17/29 84/4/11 83/5/10 +f 71/17/29 83/5/10 72/30/38 +f 95/9/22 70/14/26 69/31/41 +f 95/9/22 69/31/41 96/7/23 +f 67/30/47 81/5/8 80/4/7 +f 67/30/47 80/4/7 68/17/50 +f 92/9/19 66/14/44 65/31/53 +f 92/9/19 65/31/53 93/7/20 +f 63/30/59 78/5/5 77/4/4 +f 63/30/59 77/4/4 64/17/62 +f 89/3/16 62/26/56 61/32/65 +f 89/3/16 61/32/65 90/2/17 +f 74/33/1 60/34/32 59/20/71 +f 74/33/1 59/20/71 75/22/2 +f 57/24/35 87/3/14 86/2/13 +f 57/24/35 86/2/13 58/35/68 +f 55/36/57 89/10/16 88/12/18 +f 55/36/57 88/12/18 56/21/74 +f 93/6/20 54/37/52 53/16/77 +f 93/6/20 53/16/77 91/4/21 +f 51/35/69 86/2/13 85/3/15 +f 51/35/69 85/3/15 52/24/83 +f 90/11/17 50/38/64 49/28/75 +f 90/11/17 49/28/75 88/12/18 +f 47/30/45 92/5/19 91/4/21 +f 47/30/45 91/4/21 48/17/76 +f 96/7/23 46/31/40 45/14/80 +f 96/7/23 45/14/80 94/9/24 +f 87/1/14 44/39/34 43/29/84 +f 87/1/14 43/29/84 85/3/15 +f 41/40/27 95/8/22 94/9/24 +f 41/40/27 94/9/24 42/15/79 +f 81/5/8 40/30/46 39/17/88 +f 81/5/8 39/17/88 79/4/9 +f 37/31/39 83/7/10 82/9/12 +f 37/31/39 82/9/12 38/14/86 +f 35/41/33 74/1/1 73/3/3 +f 35/41/33 73/3/3 36/23/95 +f 84/8/11 34/40/28 33/15/87 +f 84/8/11 33/15/87 82/9/12 +f 78/42/5 32/36/58 31/21/92 +f 78/42/5 31/21/92 76/22/6 +f 29/37/51 80/6/7 79/4/9 +f 29/37/51 79/4/9 30/16/90 +f 75/2/2 28/35/70 27/24/96 +f 75/2/2 27/24/96 73/3/3 +f 25/16/63 77/4/4 76/6/6 +f 25/16/63 76/6/6 26/37/91 +f 60/20/32 24/19/31 23/25/36 +f 60/20/32 23/25/36 57/24/35 +f 34/16/28 21/18/30 24/19/31 +f 34/16/28 24/19/31 35/21/33 +f 22/13/25 41/15/27 44/23/34 +f 22/13/25 44/23/34 23/25/36 +f 70/14/26 22/13/25 21/18/30 +f 70/14/26 21/18/30 71/17/29 +f 66/14/44 20/13/43 19/18/48 +f 66/14/44 19/18/48 67/17/47 +f 46/23/40 17/25/42 20/13/43 +f 46/23/40 20/13/43 47/15/45 +f 18/19/37 37/21/39 40/16/46 +f 18/19/37 40/16/46 19/18/48 +f 72/20/38 18/19/37 17/25/42 +f 72/20/38 17/25/42 69/24/41 +f 62/26/56 16/25/55 15/19/60 +f 62/26/56 15/19/60 63/20/59 +f 54/15/52 13/13/54 16/25/55 +f 54/15/52 16/25/55 55/23/57 +f 14/18/49 29/16/51 32/21/58 +f 14/18/49 32/21/58 15/19/60 +f 68/17/50 14/18/49 13/13/54 +f 68/17/50 13/13/54 65/14/53 +f 58/26/68 12/25/67 11/19/72 +f 58/26/68 11/19/72 59/20/71 +f 50/15/64 9/13/66 12/25/67 +f 50/15/64 12/25/67 51/23/69 +f 10/18/61 25/16/63 11/19/72 +f 25/16/63 28/21/70 11/19/72 +f 64/17/62 10/18/61 9/13/66 +f 64/17/62 9/13/66 61/14/65 +f 42/15/79 8/13/81 7/25/82 +f 42/15/79 7/25/82 43/29/84 +f 48/17/76 5/18/78 8/13/81 +f 48/17/76 8/13/81 45/14/80 +f 6/19/73 49/28/75 52/24/83 +f 6/19/73 52/24/83 7/25/82 +f 56/21/74 6/19/73 5/18/78 +f 56/21/74 5/18/78 53/16/77 +f 26/20/91 4/19/93 3/25/94 +f 26/20/91 3/25/94 27/24/96 +f 30/16/90 1/18/89 4/19/93 +f 30/16/90 4/19/93 31/21/92 +f 2/13/85 33/15/87 36/23/95 +f 2/13/85 36/23/95 3/25/94 +f 1/18/89 39/17/88 2/13/85 +f 39/17/88 38/14/86 2/13/85 +f 71/17/29 72/30/38 69/31/41 +f 71/17/29 69/31/41 70/14/26 +f 67/30/47 68/17/50 65/14/53 +f 67/30/47 65/14/53 66/31/44 +f 63/20/59 64/34/62 61/32/65 +f 63/20/59 61/32/65 62/26/56 +f 59/20/71 60/34/32 57/32/35 +f 59/20/71 57/32/35 58/26/68 +f 55/23/57 56/41/74 53/40/77 +f 55/23/57 53/40/77 54/15/52 +f 51/23/69 52/41/83 49/40/75 +f 51/23/69 49/40/75 50/15/64 +f 47/30/45 48/17/76 45/14/80 +f 47/30/45 45/14/80 46/31/40 +f 43/29/84 44/39/34 41/40/27 +f 43/29/84 41/40/27 42/15/79 +f 39/17/88 40/30/46 37/31/39 +f 39/17/88 37/31/39 38/14/86 +f 35/41/33 36/23/95 33/15/87 +f 35/41/33 33/15/87 34/40/28 +f 31/21/92 32/36/58 29/37/51 +f 31/21/92 29/37/51 30/16/90 +f 27/24/96 28/35/70 25/34/63 +f 27/24/96 25/34/63 26/20/91 +f 23/25/36 24/19/31 21/18/30 +f 23/25/36 21/18/30 22/13/25 +f 19/18/48 20/13/43 17/25/42 +f 19/18/48 17/25/42 18/19/37 +f 15/19/60 16/25/55 14/18/49 +f 16/25/55 13/13/54 14/18/49 +f 11/19/72 12/25/67 10/18/61 +f 12/25/67 9/13/66 10/18/61 +f 7/25/82 8/13/81 5/18/78 +f 7/25/82 5/18/78 6/19/73 +f 1/18/89 2/13/85 3/25/94 +f 1/18/89 3/25/94 4/19/93 diff --git a/src/GLX.hs b/src/GLX.hs index 9ad6392..8dbca6a 100644 --- a/src/GLX.hs +++ b/src/GLX.hs @@ -11,7 +11,7 @@ import Data.Maybe (isJust) import Data.Ratio import Graphics.Rendering.OpenGL.GL (($=), GLdouble, GLfloat, Vector3(..), Capability(..)) -import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho, translate, scale, rotate) +import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho, translate, scale, rotate, frustum) import Graphics.X11.Types import Graphics.X11.Xlib.Atom (internAtom) @@ -205,10 +205,11 @@ resize lw lh w h = do matrixMode $= Projection loadIdentity - ortho (-sf*aspectf) (sf*aspectf) (-sf) sf (-1) 1 - scale 1 1 (0.1 :: GLfloat) + --ortho (-sf*aspectf) (sf*aspectf) (-sf) sf (-1) 1 + --scale 1 1 (0.1 :: GLfloat) + frustum (-sf*aspectf) (sf*aspectf) (-sf) sf 10 100 rotate (-30) $ Vector3 1 0 (0 :: GLfloat) - translate $ Vector3 (-(fromIntegral lw)/2) (-(fromIntegral lh)/2) (0 :: GLfloat) + translate $ Vector3 (-(fromIntegral lw)/2) ((fromIntegral lh)/2) (-11 :: GLfloat) matrixMode $= Modelview 0 diff --git a/src/HTanks.hs b/src/HTanks.hs index 82338a4..2fd2148 100644 --- a/src/HTanks.hs +++ b/src/HTanks.hs @@ -33,12 +33,14 @@ main = do when (initialized gl) $ do currentTime <- getCurrentTime - let gamestate = GameState {level = theLevel, tanks = [ Tank 5.0 5.0 0 0 1.5 270 False 3 1 5 1 - , Tank 5.0 3.5 0 0 1.5 270 False 3 1 5 1 + let gamestate = GameState {level = theLevel, tanks = [ Tank 7.0 4.0 0 0 1.5 270 False 3 1 5 1 + , Tank 4.0 4.0 0 0 1.5 270 False 3 1 5 1 + , Tank 10.0 4.0 0 0 1.5 270 False 3 1 5 1 ], bullets = []} mainstate = MainState {run = True, driver = SomeDriver gl, time = currentTime, players = [ SomePlayer humanPlayer - , SomePlayer $ CPUPlayer 0 + , SomePlayer $ CPUPlayer (-90) + , SomePlayer $ CPUPlayer 90 ], textures = M.empty, models = M.empty, gameState = gamestate} runMain mainstate $ do diff --git a/src/Model.hs b/src/Model.hs index 0c273e9..e2c045a 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -6,10 +6,12 @@ module Model ( Model(..) import Paths_htanks import Data.Obj3D.GL (InterleavedObj) -data Model = ModelTank +data Model = ModelTank | ModelBullet | ModelBlock deriving (Eq, Ord, Show) modelPath :: Model -> IO FilePath modelPath t = getDataFileName $ "model/" ++ (name t) ++ ".obj" where name ModelTank = "tank" + name ModelBullet = "bullet" + name ModelBlock = "cube" diff --git a/src/Render.hs b/src/Render.hs index 91146ba..aa084d8 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -80,7 +80,7 @@ setup = do shadeModel $= Smooth lighting $= Enabled light (Light 0) $= Enabled - position (Light 0) $= Vertex4 (-1) (-1) 1 (0 :: GLfloat) + position (Light 0) $= Vertex4 (-1) (-1) 1.5 (0 :: GLfloat) colorMaterial $= Just (Front, AmbientAndDiffuse) clientState VertexArray $= Enabled @@ -96,6 +96,8 @@ setup = do getTexture TextureCrosshair getModel ModelTank + getModel ModelBullet + getModel ModelBlock return () @@ -113,6 +115,8 @@ render = do textureCrosshair <- getTexture TextureCrosshair modelTank <- getModel ModelTank + modelBullet <- getModel ModelBullet + modelBlock <- getModel ModelBlock (lw, lh) <- gets (level . gameState) >>= \l -> return (fromIntegral . levelWidth $ l :: GLfloat, fromIntegral . levelHeight $ l :: GLfloat) @@ -127,17 +131,17 @@ render = do normal $ Normal3 0 0 (1 :: GLfloat) unsafeRenderPrimitive Quads $ do - texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex2 0 lh + texCoord $ TexCoord2 (-0.5 :: GLfloat) (-0.5 :: GLfloat) + vertex $ Vertex2 (-1) (lh+1) - texCoord $ TexCoord2 (lw/2) 0 - vertex $ Vertex2 lw lh + texCoord $ TexCoord2 (lw/2+0.5) (-0.5) + vertex $ Vertex2 (lw+1) (lh+1) - texCoord $ TexCoord2 (lw/2) (lh/2) - vertex $ Vertex2 lw 0 + texCoord $ TexCoord2 (lw/2+0.5) (lh/2+0.5) + vertex $ Vertex2 (lw+1) (-1) - texCoord $ TexCoord2 0 (lh/2) - vertex $ Vertex2 (0 :: GLfloat) (0 :: GLfloat) + texCoord $ TexCoord2 (-0.5) (lh/2+0.5) + vertex $ Vertex2 (-1 :: GLfloat) (-1 :: GLfloat) bindInterleavedArrays modelTank @@ -163,30 +167,44 @@ render = do unsafePreservingMatrix $ do rotate 90 $ Vector3 1 0 (0 :: GLfloat) drawObject modelTank 0 + + texture Texture2D $= Disabled + bindInterleavedArrays modelBullet forM_ bulletlist $ \bullet -> unsafePreservingMatrix $ do - let x = realToFrac . bulletX $ bullet - y = realToFrac . bulletY $ bullet - rotDir = realToFrac . bulletDir $ bullet + let x = realToFrac . bulletX $ bullet + y = realToFrac . bulletY $ bullet + rotDir = realToFrac . bulletDir $ bullet - translate $ Vector3 x y (0.2 :: GLfloat) - rotate 30 $ Vector3 1 0 (0 :: GLfloat) - rotate rotDir $ Vector3 0 0 (1 :: GLfloat) + translate $ Vector3 x y (0.25 :: GLfloat) + rotate (rotDir-90) $ Vector3 0 0 (1 :: GLfloat) - textureBinding Texture2D $= Just textureBullet - - unsafeRenderPrimitive Quads $ do - texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex3 (-0.1 :: GLfloat) (-0.1 :: GLfloat) 0 - - texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat) - vertex $ Vertex3 (-0.1 :: GLfloat) (0.1 :: GLfloat) 0 - - texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat) - vertex $ Vertex3 (0.1 :: GLfloat) (0.1 :: GLfloat) 0 - - texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat) - vertex $ Vertex3 (0.1 :: GLfloat) (-0.1 :: GLfloat) 0 + unsafePreservingMatrix $ do + drawObject modelBullet 0 + + bindInterleavedArrays modelBlock + + texture Texture2D $= Enabled + textureBinding Texture2D $= Just textureWood + forM_ [0.5..13.5] $ \x -> unsafePreservingMatrix $ do + translate $ Vector3 x 8.5 (0.5 :: GLfloat) + rotate 90 $ Vector3 1 0 (0 :: GLfloat) + drawObject modelBlock 0 + + forM_ [0.5..13.5] $ \x -> unsafePreservingMatrix $ do + translate $ Vector3 x (-0.5) (0.5 :: GLfloat) + rotate 90 $ Vector3 1 0 (0 :: GLfloat) + drawObject modelBlock 0 + + forM_ [-0.5..8.5] $ \y -> unsafePreservingMatrix $ do + translate $ Vector3 (-0.5) y (0.5 :: GLfloat) + rotate 90 $ Vector3 1 0 (0 :: GLfloat) + drawObject modelBlock 0 + + forM_ [-0.5..8.5] $ \y -> unsafePreservingMatrix $ do + translate $ Vector3 14.5 y (0.5 :: GLfloat) + rotate 90 $ Vector3 1 0 (0 :: GLfloat) + drawObject modelBlock 0 depthFunc $= Just Always From 0c03d67f55e11631aa341089d9a3cc35010c0941 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 16 Apr 2010 09:20:01 +0200 Subject: [PATCH 03/10] Adapted to obj-model-opengl rename --- htanks.cabal | 2 +- src/HTanks.hs | 3 --- src/Model.hs | 2 +- src/Render.hs | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/htanks.cabal b/htanks.cabal index 38c443d..7785026 100644 --- a/htanks.cabal +++ b/htanks.cabal @@ -7,7 +7,7 @@ license: GPL-3 license-file: LICENSE author: Matthias Schiffer maintainer: matthias@gamezock.de -build-depends: base >= 4, syb, containers, mtl, time, X11, OpenGL, hwiid, obj-model, obj-model-gl +build-depends: base >= 4, syb, containers, mtl, time, X11, OpenGL, hwiid, obj-model, obj-model-opengl build-type: Simple data-files: tex/*.png model/*.obj diff --git a/src/HTanks.hs b/src/HTanks.hs index 2fd2148..110a2b1 100644 --- a/src/HTanks.hs +++ b/src/HTanks.hs @@ -20,9 +20,6 @@ import qualified Data.Map as M import qualified Data.Set as S import Data.Time -import Data.Obj3D -import Data.Obj3D.GL - main :: IO () main = do diff --git a/src/Model.hs b/src/Model.hs index e2c045a..3c88ec7 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -4,7 +4,7 @@ module Model ( Model(..) ) where import Paths_htanks -import Data.Obj3D.GL (InterleavedObj) +import Data.Obj3D.OpenGL (InterleavedObj) data Model = ModelTank | ModelBullet | ModelBlock deriving (Eq, Ord, Show) diff --git a/src/Render.hs b/src/Render.hs index aa084d8..5c961db 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -16,7 +16,7 @@ import Control.Monad.State import Data.Fixed import Data.Maybe import Data.Obj3D -import Data.Obj3D.GL +import Data.Obj3D.OpenGL import Data.Ratio import qualified Data.Map as M From ba7068c9400df7d471beecd3040a329b2344d308 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 16 Apr 2010 09:20:22 +0200 Subject: [PATCH 04/10] Properly align bullet model --- model/bullet.blend | Bin 145396 -> 145096 bytes model/bullet.obj | 260 ++++++++++++++++++++++----------------------- 2 files changed, 130 insertions(+), 130 deletions(-) diff --git a/model/bullet.blend b/model/bullet.blend index de0814342a763d746b480794601748b538697b0c..f4a4577740e7198052d9d2b84a6b983bde3a82a2 100644 GIT binary patch delta 18396 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 IsPRwyADAK(hX4Qo delta 18479 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 diff --git a/model/bullet.obj b/model/bullet.obj index 7e8de49..6244384 100644 --- a/model/bullet.obj +++ b/model/bullet.obj @@ -1,136 +1,136 @@ # Blender3D v249 OBJ File: bullet.blend # www.blender3d.org o Circle -v 0.035355 -0.000000 -0.035355 -v 0.046194 -0.000000 -0.019134 -v 0.050000 0.000000 0.000000 -v 0.046194 0.000000 0.019134 -v 0.035355 0.000000 0.035355 -v 0.019134 0.000000 0.046194 -v 0.000000 0.000000 0.050000 -v -0.019134 0.000000 0.046194 -v -0.035355 0.000000 0.035355 -v -0.046194 0.000000 0.019134 -v -0.050000 -0.000000 -0.000000 -v -0.046194 -0.000000 -0.019134 -v -0.035355 -0.000000 -0.035355 -v -0.019134 -0.000000 -0.046194 -v 0.000000 -0.000000 -0.050000 -v 0.019134 -0.000000 -0.046194 -v 0.035355 0.019620 -0.035355 -v 0.046194 0.019620 -0.019134 -v 0.050000 0.019620 0.000000 -v 0.046194 0.019620 0.019134 -v 0.035355 0.019620 0.035355 -v 0.019134 0.019620 0.046194 -v 0.000000 0.019620 0.050000 -v -0.019134 0.019620 0.046194 -v -0.035355 0.019620 0.035355 -v -0.046194 0.019620 0.019134 -v -0.050000 0.019620 -0.000000 -v -0.046194 0.019620 -0.019134 -v -0.035355 0.019620 -0.035355 -v -0.019134 0.019620 -0.046194 -v 0.000000 0.019620 -0.050000 -v 0.019134 0.019620 -0.046194 -v 0.028321 0.019620 -0.028321 -v 0.037004 0.019620 -0.015327 -v 0.040053 0.019620 0.000000 -v 0.037004 0.019620 0.015327 -v 0.028321 0.019620 0.028321 -v 0.015327 0.019620 0.037004 -v 0.000000 0.019620 0.040053 -v -0.015327 0.019620 0.037004 -v -0.028321 0.019620 0.028321 -v -0.037004 0.019620 0.015327 -v -0.040053 0.019620 -0.000000 -v -0.037004 0.019620 -0.015327 -v -0.028321 0.019620 -0.028321 -v -0.015327 0.019620 -0.037004 -v 0.000000 0.019620 -0.040053 -v 0.015327 0.019620 -0.037004 -v 0.037004 0.036977 -0.015327 -v 0.028321 0.036977 -0.028321 -v 0.040053 0.036977 0.000000 -v 0.037004 0.036977 0.015327 -v 0.028321 0.036977 0.028321 -v 0.015327 0.036977 0.037004 -v 0.000000 0.036977 0.040053 -v -0.015327 0.036977 0.037004 -v -0.028321 0.036977 0.028321 -v -0.037004 0.036977 0.015327 -v -0.040053 0.036977 -0.000000 -v -0.037004 0.036977 -0.015327 -v -0.028321 0.036977 -0.028321 -v -0.015327 0.036977 -0.037004 -v 0.000000 0.036977 -0.040053 -v 0.015327 0.036977 -0.037004 -v 0.036574 0.036977 -0.036574 -v 0.047786 0.036977 -0.019794 -v 0.051723 0.036977 0.000000 -v 0.047786 0.036977 0.019794 -v 0.036574 0.036977 0.036574 -v 0.019794 0.036977 0.047786 -v 0.000000 0.036977 0.051723 -v -0.019794 0.036977 0.047786 -v -0.036574 0.036977 0.036574 -v -0.047786 0.036977 0.019794 -v -0.051723 0.036977 -0.000000 -v -0.047786 0.036977 -0.019794 -v -0.036574 0.036977 -0.036574 -v -0.019794 0.036977 -0.047786 -v 0.000000 0.036977 -0.051723 -v 0.019794 0.036977 -0.047786 -v 0.047786 0.131305 -0.019794 -v 0.036574 0.131305 -0.036574 -v 0.051723 0.131305 -0.000000 -v 0.047786 0.131305 0.019794 -v 0.036574 0.131305 0.036574 -v 0.019794 0.131305 0.047786 -v 0.000000 0.131305 0.051723 -v -0.019794 0.131305 0.047786 -v -0.036574 0.131305 0.036574 -v -0.047786 0.131305 0.019794 -v -0.051723 0.131305 -0.000000 -v -0.047786 0.131305 -0.019794 -v -0.036574 0.131305 -0.036574 -v -0.019794 0.131305 -0.047786 -v 0.000000 0.131305 -0.051723 -v 0.019794 0.131305 -0.047786 -v 0.029520 0.156208 -0.029520 -v 0.038570 0.156208 -0.015976 -v 0.041747 0.156208 -0.000000 -v 0.038570 0.156208 0.015976 -v 0.029520 0.156208 0.029520 -v 0.015976 0.156208 0.038570 -v 0.000000 0.156208 0.041747 -v -0.015976 0.156208 0.038570 -v -0.029520 0.156208 0.029520 -v -0.038570 0.156208 0.015976 -v -0.041747 0.156208 -0.000000 -v -0.038570 0.156208 -0.015976 -v -0.029520 0.156208 -0.029520 -v -0.015976 0.156208 -0.038570 -v 0.000000 0.156208 -0.041747 -v 0.015976 0.156208 -0.038570 -v 0.016971 0.174319 -0.016971 -v 0.022174 0.174319 -0.009185 -v 0.024001 0.174319 -0.000000 -v 0.022174 0.174319 0.009185 -v 0.016971 0.174319 0.016971 -v 0.009185 0.174319 0.022174 -v 0.000000 0.174319 0.024001 -v -0.009185 0.174319 0.022174 -v -0.016971 0.174319 0.016971 -v -0.022174 0.174319 0.009185 -v -0.024001 0.174319 -0.000000 -v -0.022174 0.174319 -0.009185 -v -0.016971 0.174319 -0.016971 -v -0.009185 0.174319 -0.022174 -v 0.000000 0.174319 -0.024001 -v 0.009185 0.174319 -0.022174 -v 0.000000 0.182620 -0.000000 -v 0.000000 0.000000 0.000000 +v 0.035355 -0.130372 -0.035355 +v 0.046194 -0.130372 -0.019134 +v 0.050000 -0.130372 0.000000 +v 0.046194 -0.130372 0.019134 +v 0.035355 -0.130372 0.035355 +v 0.019134 -0.130372 0.046194 +v 0.000000 -0.130372 0.050000 +v -0.019134 -0.130372 0.046194 +v -0.035355 -0.130372 0.035355 +v -0.046194 -0.130372 0.019134 +v -0.050000 -0.130372 0.000000 +v -0.046194 -0.130372 -0.019134 +v -0.035355 -0.130372 -0.035355 +v -0.019134 -0.130372 -0.046194 +v 0.000000 -0.130372 -0.050000 +v 0.019134 -0.130372 -0.046194 +v 0.035355 -0.110752 -0.035355 +v 0.046194 -0.110752 -0.019134 +v 0.050000 -0.110752 0.000000 +v 0.046194 -0.110752 0.019134 +v 0.035355 -0.110752 0.035355 +v 0.019134 -0.110752 0.046194 +v 0.000000 -0.110752 0.050000 +v -0.019134 -0.110752 0.046194 +v -0.035355 -0.110752 0.035355 +v -0.046194 -0.110752 0.019134 +v -0.050000 -0.110752 0.000000 +v -0.046194 -0.110752 -0.019134 +v -0.035355 -0.110752 -0.035355 +v -0.019134 -0.110752 -0.046194 +v 0.000000 -0.110752 -0.050000 +v 0.019134 -0.110752 -0.046194 +v 0.028321 -0.110752 -0.028321 +v 0.037004 -0.110752 -0.015327 +v 0.040053 -0.110752 0.000000 +v 0.037004 -0.110752 0.015327 +v 0.028321 -0.110752 0.028321 +v 0.015327 -0.110752 0.037004 +v 0.000000 -0.110752 0.040053 +v -0.015327 -0.110752 0.037004 +v -0.028321 -0.110752 0.028321 +v -0.037004 -0.110752 0.015327 +v -0.040053 -0.110752 0.000000 +v -0.037004 -0.110752 -0.015327 +v -0.028321 -0.110752 -0.028321 +v -0.015327 -0.110752 -0.037004 +v 0.000000 -0.110752 -0.040053 +v 0.015327 -0.110752 -0.037004 +v 0.037004 -0.093395 -0.015327 +v 0.028321 -0.093395 -0.028321 +v 0.040053 -0.093395 0.000000 +v 0.037004 -0.093395 0.015327 +v 0.028321 -0.093395 0.028321 +v 0.015327 -0.093395 0.037004 +v 0.000000 -0.093395 0.040053 +v -0.015327 -0.093395 0.037004 +v -0.028321 -0.093395 0.028321 +v -0.037004 -0.093395 0.015327 +v -0.040053 -0.093395 0.000000 +v -0.037004 -0.093395 -0.015327 +v -0.028321 -0.093395 -0.028321 +v -0.015327 -0.093395 -0.037004 +v 0.000000 -0.093395 -0.040053 +v 0.015327 -0.093395 -0.037004 +v 0.036574 -0.093395 -0.036574 +v 0.047786 -0.093395 -0.019794 +v 0.051723 -0.093395 0.000000 +v 0.047786 -0.093395 0.019794 +v 0.036574 -0.093395 0.036574 +v 0.019794 -0.093395 0.047786 +v 0.000000 -0.093395 0.051723 +v -0.019794 -0.093395 0.047786 +v -0.036574 -0.093395 0.036574 +v -0.047786 -0.093395 0.019794 +v -0.051723 -0.093395 0.000000 +v -0.047786 -0.093395 -0.019794 +v -0.036574 -0.093395 -0.036574 +v -0.019794 -0.093395 -0.047786 +v 0.000000 -0.093395 -0.051723 +v 0.019794 -0.093395 -0.047786 +v 0.047786 0.000933 -0.019794 +v 0.036574 0.000933 -0.036574 +v 0.051723 0.000933 0.000000 +v 0.047786 0.000933 0.019794 +v 0.036574 0.000933 0.036574 +v 0.019794 0.000933 0.047786 +v 0.000000 0.000933 0.051723 +v -0.019794 0.000933 0.047786 +v -0.036574 0.000933 0.036574 +v -0.047786 0.000933 0.019794 +v -0.051723 0.000933 -0.000000 +v -0.047786 0.000933 -0.019794 +v -0.036574 0.000933 -0.036574 +v -0.019794 0.000933 -0.047786 +v 0.000000 0.000933 -0.051723 +v 0.019794 0.000933 -0.047786 +v 0.029520 0.025836 -0.029520 +v 0.038570 0.025836 -0.015976 +v 0.041747 0.025836 0.000000 +v 0.038570 0.025836 0.015976 +v 0.029520 0.025836 0.029520 +v 0.015976 0.025836 0.038570 +v 0.000000 0.025836 0.041747 +v -0.015976 0.025836 0.038570 +v -0.029520 0.025836 0.029520 +v -0.038570 0.025836 0.015976 +v -0.041747 0.025836 -0.000000 +v -0.038570 0.025836 -0.015976 +v -0.029520 0.025836 -0.029520 +v -0.015976 0.025836 -0.038570 +v 0.000000 0.025836 -0.041747 +v 0.015976 0.025836 -0.038570 +v 0.016971 0.043947 -0.016971 +v 0.022174 0.043947 -0.009185 +v 0.024001 0.043947 -0.000000 +v 0.022174 0.043947 0.009185 +v 0.016971 0.043947 0.016971 +v 0.009185 0.043947 0.022174 +v 0.000000 0.043947 0.024001 +v -0.009185 0.043947 0.022174 +v -0.016971 0.043947 0.016971 +v -0.022174 0.043947 0.009185 +v -0.024001 0.043947 -0.000000 +v -0.022174 0.043947 -0.009185 +v -0.016971 0.043947 -0.016971 +v -0.009185 0.043947 -0.022174 +v 0.000000 0.043947 -0.024001 +v 0.009185 0.043947 -0.022174 +v 0.000000 0.052248 -0.000000 +v 0.000000 -0.130372 0.000000 vt 0.442348 0.723517 vt 0.486308 0.831276 vt 0.418328 0.734761 From d7971385e844e24d9d851d3d142895b5cb89c91b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 3 Jan 2011 15:31:53 +0100 Subject: [PATCH 05/10] Added some fixes for current opengl library --- src/DefaultPlayer.hs | 4 ++-- src/HWiidPlayer.hs | 4 ++-- src/Render.hs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/DefaultPlayer.hs b/src/DefaultPlayer.hs index 7f97f39..e16502a 100644 --- a/src/DefaultPlayer.hs +++ b/src/DefaultPlayer.hs @@ -8,7 +8,7 @@ import qualified Data.Set as S import Data.Fixed import Data.Ratio ((%)) import Data.Typeable -import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..)) +import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..), Vertex2(..)) import Graphics.Rendering.OpenGL.GL.BeginEnd (unsafeRenderPrimitive, PrimitiveMode(..)) import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate, rotate) import Graphics.Rendering.OpenGL.GL.VertexSpec @@ -41,7 +41,7 @@ instance Player DefaultPlayer where | otherwise = DefaultPlayer keys aimx aimy shoot renderPlayer (DefaultPlayer _ aimx aimy _) = unsafePreservingMatrix $ do - translate $ Vector3 aimx aimy (0.2 :: GLfloat) + translate $ Vector3 (realToFrac aimx) (realToFrac aimy) (0.2 :: GLfloat) rotate 30 $ Vector3 1 0 (0 :: GLfloat) unsafeRenderPrimitive Quads $ do diff --git a/src/HWiidPlayer.hs b/src/HWiidPlayer.hs index db35871..04ea38e 100644 --- a/src/HWiidPlayer.hs +++ b/src/HWiidPlayer.hs @@ -12,7 +12,7 @@ import Data.Maybe import Data.Ratio ((%)) import Data.Typeable import HWiid -import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..)) +import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..), Vertex2(..)) import Graphics.Rendering.OpenGL.GL.BeginEnd (unsafeRenderPrimitive, PrimitiveMode(..)) import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate, rotate) import Graphics.Rendering.OpenGL.GL.VertexSpec @@ -65,7 +65,7 @@ instance Player HWiidPlayer where renderPlayer (HWiidPlayer _ _ aims) = unsafePreservingMatrix $ do let (x, y) = mulV (1/(fromIntegral $ length aims)) $ foldr addV (0, 0) aims - translate $ Vector3 x y (0.2 :: GLfloat) + translate $ Vector3 (realToFrac x) (realToFrac y) (0.2 :: GLfloat) rotate 30 $ Vector3 1 0 (0 :: GLfloat) unsafeRenderPrimitive Quads $ do diff --git a/src/Render.hs b/src/Render.hs index 5c961db..de61593 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -22,7 +22,7 @@ import qualified Data.Map as M import Bindings.GLPng -import Graphics.Rendering.OpenGL.GL (($=), GLfloat, GLdouble, Capability(..), Vector3(..)) +import Graphics.Rendering.OpenGL.GL (($=), GLfloat, GLdouble, Capability(..), Vector3(..), Vertex2(..), Vertex4(..)) import Graphics.Rendering.OpenGL.GL.BeginEnd (unsafeRenderPrimitive, PrimitiveMode(..)) import Graphics.Rendering.OpenGL.GL.CoordTrans import Graphics.Rendering.OpenGL.GL.Colors From 83f0606ea9dfd6b493097dc97330055dff4a2867 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 24 Jun 2011 21:50:32 +0200 Subject: [PATCH 06/10] Added Transformable class to simplify collision calculation --- htanks.cabal | 8 ++-- src/CPUPlayer.hs | 11 ++++-- src/Collision.hs | 93 +++++++++++++++++++++----------------------- src/DefaultPlayer.hs | 15 +++---- src/Game.hs | 26 +++++++++---- src/HTanks.hs | 11 +++--- src/HWiidPlayer.hs | 12 +++--- src/Player.hs | 5 ++- src/Render.hs | 13 ++++--- src/Simulation.hs | 82 +++++++++++++++++--------------------- src/Tank.hs | 30 ++++++++++---- src/Transformable.hs | 37 ++++++++++++++++++ src/Vector.hs | 59 ++++++++++++++++++++++++++++ 13 files changed, 258 insertions(+), 144 deletions(-) create mode 100644 src/Transformable.hs create mode 100644 src/Vector.hs diff --git a/htanks.cabal b/htanks.cabal index 7785026..86f8ab1 100644 --- a/htanks.cabal +++ b/htanks.cabal @@ -6,14 +6,14 @@ category: Game license: GPL-3 license-file: LICENSE author: Matthias Schiffer -maintainer: matthias@gamezock.de -build-depends: base >= 4, syb, containers, mtl, time, X11, OpenGL, hwiid, obj-model, obj-model-opengl +maintainer: mschiffer@universe-factory.net +build-depends: base >= 4, syb, containers, mtl, time, X11, OpenGL, hwiid, obj-model, obj-model-opengl, fixed-point, vector-space, fixed-point-vector-space build-type: Simple data-files: tex/*.png model/*.obj executable: HTanks hs-source-dirs: src main-is: HTanks.hs -other-modules: Collision, CPUPlayer, DefaultPlayer, HWiidPlayer, Game, GLDriver, GLX, Level, MainLoop, Paths_htanks, Player, Render, Simulation, Texture, Debris, - Tank, Model, Bindings.GLX, Bindings.GLPng +other-modules: Collision, CPUPlayer, DefaultPlayer, HWiidPlayer, Game, GLDriver, GLX, Level, MainLoop, Paths_htanks, Player, Render, Simulation, Texture, Transformable, Debris, + Tank, Model, Vector, Bindings.GLX, Bindings.GLPng extra-libraries: glpng diff --git a/src/CPUPlayer.hs b/src/CPUPlayer.hs index a9eb6d8..55722bf 100644 --- a/src/CPUPlayer.hs +++ b/src/CPUPlayer.hs @@ -4,17 +4,20 @@ module CPUPlayer ( CPUPlayer(..) ) where -import Data.Fixed -import Data.Ratio ((%)) import Data.Typeable +import Transformable +import Vector import GLDriver import Player -data CPUPlayer = CPUPlayer Micro +data CPUPlayer = CPUPlayer Vector deriving (Typeable, Show) instance Player CPUPlayer where -- playerUpdate (CPUPlayer angle) _ = return (CPUPlayer (if (angle+0.2) > 180 then angle-359.8 else angle+0.2), Just angle, True, Just (-angle), ((fromIntegral . round $ angle) == angle) && ((round $ angle) `mod` 2 == 0)) - playerUpdate (CPUPlayer angle) _ = return (CPUPlayer (if (angle+0.2) > 180 then angle-359.8 else angle+0.2), Just angle, True, Just (-angle), False) + playerUpdate (CPUPlayer dir) _ = return (CPUPlayer dir', Just dir', True, Just mirrordir, False) + where + dir' = (rotate (0.2*pi/180)) >< dir + mirrordir = Vector (vectorX dir') (-(vectorY dir')) diff --git a/src/Collision.hs b/src/Collision.hs index 3138473..909e7f7 100644 --- a/src/Collision.hs +++ b/src/Collision.hs @@ -5,68 +5,63 @@ module Collision ( collisionTankBorder import Tank import Game +import Transformable -import Data.Fixed -import Data.Ratio +import qualified Vector as V +import Data.VectorSpace -tankWidth :: Micro +tankWidth :: Coord tankWidth = 0.4 -tankLength :: Micro +tankLength :: Coord tankLength = 0.95 -bulletDiameter :: Micro +bulletDiameter :: Coord bulletDiameter = 0.05 -collisionTankBorder :: Micro -> Micro -> Tank -> Tank -collisionTankBorder lw lh tank = tank {tankX = newx, tankY = newy} - where - dir = (fromRational . toRational . tankDir $ tank)*pi/180 - cosd = fromRational (round ((cos dir)*1000000)%1000000) - sind = fromRational (round ((sin dir)*1000000)%1000000) - - points = [ (tankLength/2, tankWidth/2) - , (-tankLength/2, tankWidth/2) - , (-tankLength/2, -tankWidth/2) - , (tankLength/2, -tankWidth/2) - ] - - rotp (x, y) = (cosd*x - sind*y, sind*x + cosd*y) - transp (x, y) = (x + tankX tank, y + tankY tank) - - pointst = map (transp . rotp) points - minx = minimum $ map fst pointst - maxx = maximum $ map fst pointst - miny = minimum $ map snd pointst - maxy = maximum $ map snd pointst - - dx = if minx < 0 then (-minx) else if maxx > lw then (-maxx+lw) else 0 - dy = if miny < 0 then (-miny) else if maxy > lh then (-maxy+lh) else 0 - - newx = (tankX tank) + dx - newy = (tankY tank) + dy +collisionTankBorder :: Coord -> Coord -> Tank -> Tank +collisionTankBorder lw lh tank = (translate dx dy) >< tank + where + corners = [ V.Vector (tankLength/2) (tankWidth/2) + , V.Vector (-tankLength/2) (tankWidth/2) + , V.Vector (-tankLength/2) (-tankWidth/2) + , V.Vector (tankLength/2) (-tankWidth/2) + ] + + rotp v = V.rotateV (tankDir tank) >< v + transp v = V.translateV v >< tankPos tank + + points = map (transp . rotp) corners + minx = minimum $ map V.vertexX points + maxx = maximum $ map V.vertexX points + miny = minimum $ map V.vertexY points + maxy = maximum $ map V.vertexY points + + dx = if minx < 0 then (-minx) else if maxx > lw then (-maxx+lw) else 0 + dy = if miny < 0 then (-miny) else if maxy > lh then (-maxy+lh) else 0 collisionBulletBullet :: (Bullet, Bullet) -> (Bullet, Bullet) -> Bool collisionBulletBullet (b1, b1') (b2, b2') = distancesq < (bulletDiameter^2) - where - distancesq = (bulletX b1' - bulletX b2')^2 + (bulletY b1' - bulletY b2')^2 + where + distancesq = (bulletX b1' - bulletX b2')^2 + (bulletY b1' - bulletY b2')^2 collisionBulletTank :: (Bullet, Bullet) -> (Tank, Tank) -> Bool collisionBulletTank (b, b') (tank, tank') = (not ((between bx minx maxx) && (between by miny maxy))) && ((between bx' minx maxx) && (between by' miny maxy)) - where - between x a b = x >= a && x <= b + where + between x a b = x >= a && x <= b + + rotp t v = V.rotateV' (tankDir t) >< v + transp t v = V.diffV (tankPos t) v - dir t = (fromRational . toRational . tankDir $ t)*pi/180 - cosd t = fromRational (round ((cos $ dir t)*1000000)%1000000) - sind t = fromRational (round ((sin $ dir t)*1000000)%1000000) + V.Vector bx by = (rotp tank) . (transp tank) $ bulletPos b + V.Vector bx' by' = (rotp tank') . (transp tank') $ bulletPos b' - rotp t (x, y) = ((cosd t)*x + (sind t)*y, -(sind t)*x + (cosd t)*y) - transp t (x, y) = (x - tankX t, y - tankY t) - - (bx, by) = (rotp tank) . (transp tank) $ (bulletX b, bulletY b) - (bx', by') = (rotp tank') . (transp tank') $ (bulletX b', bulletY b') - - minx = -tankLength/2 - maxx = tankLength/2 - miny = -tankWidth/2 - maxy = tankWidth/2 + minx = -tankLength/2 + maxx = tankLength/2 + miny = -tankWidth/2 + maxy = tankWidth/2 + +collisionTankTank :: ((Tank, Tank), (Tank, Tank)) -> ((Tank, Tank), (Tank, Tank)) +collisionTankTank ((t1, t1'), (t2, t2')) = ((t1, t1'), (t2, t2')) +-- where + \ No newline at end of file diff --git a/src/DefaultPlayer.hs b/src/DefaultPlayer.hs index e16502a..00dce95 100644 --- a/src/DefaultPlayer.hs +++ b/src/DefaultPlayer.hs @@ -16,8 +16,9 @@ import Graphics.Rendering.OpenGL.GL.VertexSpec import Tank import GLDriver import Player - - +import Vector +import Transformable (Coord) +import Data.VectorSpace data DefaultPlayer = DefaultPlayer (S.Set Key) Float Float Bool deriving (Typeable, Show) @@ -26,12 +27,12 @@ instance Player DefaultPlayer where playerUpdate (DefaultPlayer keys aimx aimy shoot) tank = let x = (if (S.member KeyLeft keys) then (-1) else 0) + (if (S.member KeyRight keys) then 1 else 0) y = (if (S.member KeyDown keys) then (-1) else 0) + (if (S.member KeyUp keys) then 1 else 0) - ax = aimx - (fromRational . toRational . tankX $ tank) - ay = aimy - (fromRational . toRational . tankY $ tank) + ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) + ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) move = (x /= 0 || y /= 0) - angle = if move then Just $ fromRational $ round ((atan2 y x)*1000000*180/pi)%1000000 else Nothing - aangle = if (ax /= 0 || ay /= 0) then Just $ fromRational $ round ((atan2 ay ax)*1000000*180/pi)%1000000 else Nothing - in return (DefaultPlayer keys aimx aimy False, angle, move, aangle, shoot) + dir = if move then Just (normalized $ Vector x y) else Nothing + adir = if (ax /= 0 || ay /= 0) then Just (normalized $ Vector ax ay) else Nothing + in return (DefaultPlayer keys aimx aimy False, dir, move, adir, shoot) handleEvent (DefaultPlayer keys aimx aimy shoot) ev | Just (KeyPressEvent key) <- fromEvent ev = DefaultPlayer (S.insert key keys) aimx aimy shoot diff --git a/src/Game.hs b/src/Game.hs index 5af2ad2..16b04d8 100644 --- a/src/Game.hs +++ b/src/Game.hs @@ -1,26 +1,36 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} module Game ( Bullet(..) + , bulletX + , bulletY , GameState(..) ) where import Level import Tank - -import Control.Monad -import Control.Monad.State -import Data.Fixed +import Transformable +import Vector data Bullet = Bullet - { bulletX :: !Micro - , bulletY :: !Micro - , bulletDir :: !Micro - , bulletSpeed :: !Micro + { bulletPos :: !Vertex + , bulletDir :: !Vector + , bulletSpeed :: !Coord , bulletBouncesLeft :: !Int , bulletTank :: !Int } deriving (Eq, Show) +bulletX :: Bullet -> Coord +bulletX = vertexX . bulletPos + +bulletY :: Bullet -> Coord +bulletY = vertexY . bulletPos + +instance Transformable Bullet where + t >< b = b { bulletPos = pos, bulletDir = dir } where + pos = t >< bulletPos b + dir = t >< bulletDir b + data GameState = GameState { level :: !Level , tanks :: ![Tank] diff --git a/src/HTanks.hs b/src/HTanks.hs index 110a2b1..0974ffd 100644 --- a/src/HTanks.hs +++ b/src/HTanks.hs @@ -20,6 +20,7 @@ import qualified Data.Map as M import qualified Data.Set as S import Data.Time +import Vector main :: IO () main = do @@ -30,14 +31,14 @@ main = do when (initialized gl) $ do currentTime <- getCurrentTime - let gamestate = GameState {level = theLevel, tanks = [ Tank 7.0 4.0 0 0 1.5 270 False 3 1 5 1 - , Tank 4.0 4.0 0 0 1.5 270 False 3 1 5 1 - , Tank 10.0 4.0 0 0 1.5 270 False 3 1 5 1 + let gamestate = GameState {level = theLevel, tanks = [ Tank (Vertex 7.0 4.0) (Vector 1 0) (Vector 1 0) 1.5 (270*pi/180) False 3 1 5 1 + , Tank (Vertex 4.0 4.0) (Vector 1 0) (Vector 1 0) 1.5 (270*pi/180) False 3 1 5 1 + , Tank (Vertex 10.0 4.0) (Vector 1 0) (Vector 1 0) 1.5 (270*pi/180) False 3 1 5 1 ], bullets = []} mainstate = MainState {run = True, driver = SomeDriver gl, time = currentTime, players = [ SomePlayer humanPlayer - , SomePlayer $ CPUPlayer (-90) - , SomePlayer $ CPUPlayer 90 + , SomePlayer $ CPUPlayer $ Vector 0 (-1) + , SomePlayer $ CPUPlayer $ Vector 0 1 ], textures = M.empty, models = M.empty, gameState = gamestate} runMain mainstate $ do diff --git a/src/HWiidPlayer.hs b/src/HWiidPlayer.hs index 04ea38e..d98b9c9 100644 --- a/src/HWiidPlayer.hs +++ b/src/HWiidPlayer.hs @@ -20,6 +20,8 @@ import Graphics.Rendering.OpenGL.GL.VertexSpec import Player import Tank +import qualified Transformable as T +import qualified Vector as V data HWiidPlayer = HWiidPlayer Wiimote WiimoteAccCal [(Float, Float)] @@ -51,15 +53,15 @@ instance Player HWiidPlayer where then take irSkipSmooth newaims else newaims (aimx, aimy) = if null aims then (0, 0) else mulV (1/(fromIntegral $ length aims)) (foldr addV (0, 0) aims) - ax = aimx - (fromRational . toRational . tankX $ tank) - ay = aimy - (fromRational . toRational . tankY $ tank) - aangle = if (ax /= 0 || ay /= 0) then Just $ fromRational $ round ((atan2 ay ax)*1000000*180/pi)%1000000 else Nothing + ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) + ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) + aim = if (ax /= 0 || ay /= 0) then Just $ V.Vector ax ay else Nothing move = (mx /= 0 || my /= 0) angle = atan2 my mx - moveangle = if move then Just $ fromRational $ round ((angle - (sin $ 8*x)/8)*1000000*180/pi)%1000000 else Nothing + dir = if move then Just $ T.rotate (fromRational $ round ((angle - (sin $ 8*x)/8)*1000000*180/pi)%1000000) T.>< V.Vector 1 0 else Nothing when foo $ print state - return (HWiidPlayer wiimote cal aims, moveangle, move, aangle, shoot) + return (HWiidPlayer wiimote cal aims, dir, move, aim, shoot) renderPlayer (HWiidPlayer _ _ []) = return () renderPlayer (HWiidPlayer _ _ aims) = unsafePreservingMatrix $ do diff --git a/src/Player.hs b/src/Player.hs index 4784b8b..67d9f78 100644 --- a/src/Player.hs +++ b/src/Player.hs @@ -4,7 +4,8 @@ module Player ( Player(..) , SomePlayer(..) ) where -import Data.Fixed +import Transformable +import Vector import Data.Typeable import Tank @@ -12,7 +13,7 @@ import GLDriver (SomeEvent) class Player a where - playerUpdate :: a -> Tank -> IO (a, Maybe Micro, Bool, Maybe Micro, Bool) + playerUpdate :: a -> Tank -> IO (a, Maybe Vector, Bool, Maybe Vector, Bool) handleEvent :: a -> SomeEvent -> a handleEvent player _ = player diff --git a/src/Render.hs b/src/Render.hs index de61593..abe652e 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -10,6 +10,7 @@ import Player import Tank import Texture import Model +import qualified Vector as V import Control.Monad.State @@ -148,11 +149,11 @@ render = do forM_ tanklist $ \tank -> unsafePreservingMatrix $ do let x = realToFrac . tankX $ tank y = realToFrac . tankY $ tank - rotDir = realToFrac . tankDir $ tank - rotAim = realToFrac . tankAim $ tank + rotDir = realToFrac . V.toAngle . tankDir $ tank + rotAim = realToFrac . V.toAngle . tankAim $ tank translate $ Vector3 x y (0 :: GLfloat) - rotate rotDir $ Vector3 0 0 (1 :: GLfloat) + rotate (rotDir*180/pi) $ Vector3 0 0 (1 :: GLfloat) textureBinding Texture2D $= Just textureTank @@ -160,7 +161,7 @@ render = do rotate 90 $ Vector3 1 0 (0 :: GLfloat) drawObject modelTank 1 - rotate (rotAim-rotDir) $ Vector3 0 0 (1 :: GLfloat) + rotate ((rotAim-rotDir)*180/pi) $ Vector3 0 0 (1 :: GLfloat) textureBinding Texture2D $= Just textureCannon @@ -174,10 +175,10 @@ render = do forM_ bulletlist $ \bullet -> unsafePreservingMatrix $ do let x = realToFrac . bulletX $ bullet y = realToFrac . bulletY $ bullet - rotDir = realToFrac . bulletDir $ bullet + rotDir = realToFrac . V.toAngle . bulletDir $ bullet translate $ Vector3 x y (0.25 :: GLfloat) - rotate (rotDir-90) $ Vector3 0 0 (1 :: GLfloat) + rotate ((rotDir*180/pi)-90) $ Vector3 0 0 (1 :: GLfloat) unsafePreservingMatrix $ do drawObject modelBullet 0 diff --git a/src/Simulation.hs b/src/Simulation.hs index c1debb2..3cf4fec 100644 --- a/src/Simulation.hs +++ b/src/Simulation.hs @@ -7,31 +7,33 @@ import Level import MainLoop import Player import Tank +import Transformable +import Vector import Control.Monad.State -import Data.Fixed import Data.List import Data.Maybe -import Data.Ratio +import Data.VectorSpace -updateAngle :: Micro -> Tank -> Tank -updateAngle angle tank = tank {tankDir = newangle180} +updateAngle :: Vector -> Tank -> Tank +updateAngle dir tank = tank {tankDir = rotate newangle >< Vector 1 0} where - oldangle = tankDir tank + oldangle = toAngle . tankDir $ tank + angle = toAngle dir tspeed = (tankTurnspeed tank)/100 diff = angle - oldangle - diff360 = if (diff > 180) - then (diff-360) - else if (diff <= -180) - then (diff+360) + diff360 = if (diff > pi) + then (diff-2*pi) + else if (diff <= -pi) + then (diff+2*pi) else diff - (diff180, angle180) = if (diff360 > 90) - then (diff360-180, oldangle+180) - else if (diff360 <= -90) - then (diff360+180, oldangle-180) + (diff180, angle180) = if (diff360 > pi/2) + then (diff360-180, oldangle+pi) + else if (diff360 <= -pi/2) + then (diff360+pi, oldangle-pi) else (diff360, oldangle) turn = if (diff180 > tspeed) @@ -41,21 +43,19 @@ updateAngle angle tank = tank {tankDir = newangle180} else diff180 newangle = angle180 + turn - - newangle180 = if (newangle > 180) - then (newangle-360) - else if (newangle <= -180) - then (newangle+360) - else newangle +approx :: Vector -> Vector -> Bool +approx (Vector x1 y1) (Vector x2 y2) = x1 `approx'` x2 && y1 `approx'` y2 + where + approx' a b = (abs (a-b)) < 0.000001 -updateTank :: GameState -> Maybe Micro -> Bool -> Maybe Micro -> State Tank () -updateTank game angle move aangle = do - when (isJust angle) $ - modify $ updateAngle $ fromJust angle +updateTank :: GameState -> Maybe Vector -> Bool -> Maybe Vector -> State Tank () +updateTank game dir move aim = do + when (isJust dir) $ + modify $ updateAngle $ fromJust dir - when (isJust aangle) $ - modify $ \tank -> tank {tankAim = fromJust aangle} + when (isJust aim) $ + modify $ \tank -> tank {tankAim = fromJust aim} when move $ do tank <- get @@ -63,12 +63,8 @@ updateTank game angle move aangle = do tspeed = tankSpeed tank moved = tankMoving tank - when (isNothing angle || (isJust angle && (tdir == fromJust angle)) || moved) $ do - let anglej = (fromRational . toRational $ tdir)*pi/180 - dx = tspeed * fromRational (round ((cos anglej)*1000)%100000) - dy = tspeed * fromRational (round ((sin anglej)*1000)%100000) - - put tank {tankX = dx + tankX tank, tankY = dy + tankY tank, tankMoving = True} + when (isNothing dir || (isJust dir && (tdir `approx` fromJust dir) || moved)) $ + put $ translateV (tdir ^* (tspeed/100)) >< tank {tankMoving = True} when (not move) $ do modify $ \tank -> tank {tankMoving = False} @@ -79,22 +75,17 @@ updateTank game angle move aangle = do updateBullet :: GameState -> Bullet -> (Bullet, Bool) -updateBullet game bullet = (bullet {bulletX = newx, bulletY = newy, bulletDir = dir3, bulletBouncesLeft = bounces3}, bounces3 >= 0) +updateBullet game bullet = (bullet {bulletPos = Vertex x' y', bulletDir = Vector dx' dy', bulletBouncesLeft = bounces3}, bounces3 >= 0) where - angle = (fromRational . toRational . bulletDir $ bullet)*pi/180 speed = bulletSpeed bullet - dx = speed * fromRational (round ((cos angle)*1000)%100000) - dy = speed * fromRational (round ((sin angle)*1000)%100000) - x = dx + bulletX bullet - y = dy + bulletY bullet + d@(Vector dx dy) = bulletDir bullet + Vertex x y = translateV (d ^* (speed/100)) >< bulletPos bullet + bounces = bulletBouncesLeft bullet lw = fromIntegral . levelWidth . level $ game lh = fromIntegral . levelHeight . level $ game - dir = bulletDir bullet - bounces = bulletBouncesLeft bullet - sg = if dir < 0 then -1 else 1 - (newx, dir2, bounces2) = if x < 0 then (-x, sg*180 - dir, bounces-1) else if x > lw then (2*lw-x, sg*180 - dir, bounces-1) else (x, dir, bounces) - (newy, dir3, bounces3) = if y < 0 then (-y, -dir2, bounces2-1) else if y > lh then (2*lh-y, -dir2, bounces2-1) else (y, dir2, bounces2) + (x', dx', bounces2) = if x < 0 then (-x, -dx, bounces-1) else if x > lw then (2*lw-x, -dx, bounces-1) else (x, dx, bounces) + (y', dy', bounces3) = if y < 0 then (-y, -dy, bounces2-1) else if y > lh then (2*lh-y, -dy, bounces2-1) else (y, dy, bounces2) gameStep :: [(Tank, Bool)] -> GameState -> GameState gameStep tanksshoot state = state {tanks = thetanks, bullets = newbullets ++ (map snd . filter fst $ leftbullets2)} @@ -104,8 +95,7 @@ gameStep tanksshoot state = state {tanks = thetanks, bullets = newbullets ++ (ma thetanks = map (\(tank, n) -> tank {tankBulletsLeft = (tankBulletsLeft tank) + (countLostTankBullets n leftbullets2)}) $ zip newtanks2 [0..] newtanks = map (\(tank, shoot, _) -> if (shoot && (tankBulletsLeft tank) > 0) then tank {tankBulletsLeft = (tankBulletsLeft tank) - 1} else tank) $ ts newbullets = map (\(tank, n) -> Bullet - { bulletX = tankX tank - , bulletY = tankY tank + { bulletPos = tankPos tank , bulletDir = tankAim tank , bulletSpeed = tankBulletSpeed tank , bulletBouncesLeft = tankBulletBounces tank @@ -144,6 +134,6 @@ simulationStep = do modify $ \state -> state {players = p, gameState = gameStep (zip t s) (gameState state)} where updateTank' game (player, tank) = do - (p, angle, move, aangle, shoot) <- playerUpdate player tank - let t = execState (updateTank game angle move aangle) tank + (p, dir, move, aim, shoot) <- playerUpdate player tank + let t = execState (updateTank game dir move aim) tank return $ if (tankLife tank > 0) then (p, t, shoot) else (player, tank, False) diff --git a/src/Tank.hs b/src/Tank.hs index 2fbf612..f3230f2 100644 --- a/src/Tank.hs +++ b/src/Tank.hs @@ -1,18 +1,32 @@ module Tank ( Tank(..) + , tankX + , tankY ) where -import Data.Fixed +import Transformable +import Vector data Tank = Tank - { tankX :: !Micro - , tankY :: !Micro - , tankDir :: !Micro - , tankAim :: !Micro - , tankSpeed :: !Micro - , tankTurnspeed :: !Micro + { tankPos :: !Vertex + , tankDir :: !Vector + , tankAim :: !Vector + , tankSpeed :: !Coord + , tankTurnspeed :: !Coord , tankMoving :: !Bool - , tankBulletSpeed :: !Micro + , tankBulletSpeed :: !Coord , tankBulletBounces :: !Int , tankBulletsLeft :: !Int , tankLife :: !Int } deriving (Eq, Show) + +tankX :: Tank -> Coord +tankX = vertexX . tankPos + +tankY :: Tank -> Coord +tankY = vertexY . tankPos + +instance Transformable Tank where + t >< tank = tank { tankPos = pos, tankDir = dir, tankAim = aim } where + pos = t >< tankPos tank + dir = t >< tankDir tank + aim = t >< tankAim tank \ No newline at end of file diff --git a/src/Transformable.hs b/src/Transformable.hs new file mode 100644 index 0000000..2fd64fe --- /dev/null +++ b/src/Transformable.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE TypeOperators, TypeSynonymInstances #-} + +module Transformable ( Coord + , Vector3 + , Transform + , Transformable(..) + , translate + , rotate + , scale + ) where + +import Data.LinearMap + +type Coord = Double + +type Vector3 = (Coord, Coord, Coord) +type Transform = Vector3 :-* Vector3 + +class Transformable a where + (><) :: Transform -> a -> a + +instance Transformable Transform where + t1 >< t2 = t1 *.* t2 + +instance Transformable Vector3 where + t >< v = t `lapply` v + +translate :: Coord -> Coord -> Transform +translate dx dy = linear $ \(x, y, w) -> (x + w*dx, y + w*dy, w) + +rotate :: Coord -> Transform +rotate a = linear $ \(x, y, w) -> (c*x - s*y, s*x + c*y, w) where + c = cos a + s = sin a + +scale :: Coord -> Transform +scale s = linear $ \(x, y, w) -> (s*y, s*y, w) diff --git a/src/Vector.hs b/src/Vector.hs new file mode 100644 index 0000000..847be58 --- /dev/null +++ b/src/Vector.hs @@ -0,0 +1,59 @@ +{-# LANGUAGE TypeFamilies #-} + +module Vector ( Vertex(..) + , Vector(..) + , toAngle + , translateV + , translateV' + , rotateV + , rotateV' + , diffV + ) where + +import Transformable + +import Data.AdditiveGroup +import Data.VectorSpace +import Data.LinearMap + +data Vertex = Vertex { vertexX :: Coord, vertexY :: Coord } deriving (Show, Eq) +instance Transformable Vertex where + t >< (Vertex x y) = Vertex x' y' + where + (x', y', _) = t >< (x, y, 1) :: Vector3 + +data Vector = Vector { vectorX :: Coord, vectorY :: Coord } deriving (Show, Eq) +instance Transformable Vector where + t >< (Vector x y) = Vector x' y' + where + (x', y', _) = t >< (x, y, 0) :: Vector3 + +instance AdditiveGroup Vector where + zeroV = Vector 0 0 + Vector x1 y1 ^+^ Vector x2 y2 = Vector (x1+x2) (y1+y2) + negateV (Vector x y) = Vector (-x) (-y) + +instance VectorSpace Vector where + type Scalar Vector = Coord + s *^ Vector x y = Vector (s*x) (s*y) + +instance InnerSpace Vector where + Vector x1 y1 <.> Vector x2 y2 = x1*x2 + y1*y2 + +toAngle :: Vector -> Coord +toAngle (Vector x y) = atan2 y x + +translateV :: Vector -> Transform +translateV (Vector x y) = translate x y + +translateV' :: Vector -> Transform +translateV' = translateV . negateV + +rotateV :: Vector -> Transform +rotateV (Vector c s) = linear $ \(x, y, w) -> (c*x - s*y, s*x + c*y, w) + +rotateV' :: Vector -> Transform +rotateV' (Vector c s) = rotateV $ Vector c (-s) + +diffV :: Vertex -> Vertex -> Vector +diffV (Vertex x1 y1) (Vertex x2 y2) = Vector (x2-x1) (y2-y1) From 8f1fd98cd69659446b9fdd11c0f3d2b860d779f7 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 24 Jun 2011 23:04:21 +0200 Subject: [PATCH 07/10] Consider bullet diameter in tank/bullet collision tests --- src/Collision.hs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Collision.hs b/src/Collision.hs index 909e7f7..6ce2df7 100644 --- a/src/Collision.hs +++ b/src/Collision.hs @@ -56,10 +56,10 @@ collisionBulletTank (b, b') (tank, tank') = (not ((between bx minx maxx) && (bet V.Vector bx by = (rotp tank) . (transp tank) $ bulletPos b V.Vector bx' by' = (rotp tank') . (transp tank') $ bulletPos b' - minx = -tankLength/2 - maxx = tankLength/2 - miny = -tankWidth/2 - maxy = tankWidth/2 + minx = -(tankLength+bulletDiameter)/2 + maxx = (tankLength+bulletDiameter)/2 + miny = -(tankWidth+bulletDiameter)/2 + maxy = (tankWidth+bulletDiameter)/2 collisionTankTank :: ((Tank, Tank), (Tank, Tank)) -> ((Tank, Tank), (Tank, Tank)) collisionTankTank ((t1, t1'), (t2, t2')) = ((t1, t1'), (t2, t2')) From cc53496bab9ad2bbfc3fb2868cd10fa46f612e69 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Jun 2011 20:55:51 +0200 Subject: [PATCH 08/10] Reworked Transform as a type class --- src/CPUPlayer.hs | 7 ++--- src/Collision.hs | 17 ++++++----- src/DefaultPlayer.hs | 4 +-- src/Game.hs | 5 ++-- src/HTanks.hs | 13 ++++---- src/HWiidPlayer.hs | 4 +-- src/Player.hs | 3 +- src/Simulation.hs | 20 +++++++------ src/Tank.hs | 7 ++--- src/Transformable.hs | 40 ++++++++++++++----------- src/Vector.hs | 70 ++++++++++++++++++++++++++++++++------------ 11 files changed, 115 insertions(+), 75 deletions(-) diff --git a/src/CPUPlayer.hs b/src/CPUPlayer.hs index 55722bf..ced2220 100644 --- a/src/CPUPlayer.hs +++ b/src/CPUPlayer.hs @@ -12,12 +12,11 @@ import GLDriver import Player -data CPUPlayer = CPUPlayer Vector +data CPUPlayer = CPUPlayer Rotation deriving (Typeable, Show) instance Player CPUPlayer where -- playerUpdate (CPUPlayer angle) _ = return (CPUPlayer (if (angle+0.2) > 180 then angle-359.8 else angle+0.2), Just angle, True, Just (-angle), ((fromIntegral . round $ angle) == angle) && ((round $ angle) `mod` 2 == 0)) - playerUpdate (CPUPlayer dir) _ = return (CPUPlayer dir', Just dir', True, Just mirrordir, False) + playerUpdate (CPUPlayer dir) _ = return (CPUPlayer dir', Just dir', True, Just $ negateV dir', False) where - dir' = (rotate (0.2*pi/180)) >< dir - mirrordir = Vector (vectorX dir') (-(vectorY dir')) + dir' = (fromAngle (0.2*pi/180)) >< dir diff --git a/src/Collision.hs b/src/Collision.hs index 6ce2df7..19e6ef5 100644 --- a/src/Collision.hs +++ b/src/Collision.hs @@ -20,7 +20,7 @@ bulletDiameter :: Coord bulletDiameter = 0.05 collisionTankBorder :: Coord -> Coord -> Tank -> Tank -collisionTankBorder lw lh tank = (translate dx dy) >< tank +collisionTankBorder lw lh tank = V.Vector dx dy >< tank where corners = [ V.Vector (tankLength/2) (tankWidth/2) , V.Vector (-tankLength/2) (tankWidth/2) @@ -28,8 +28,8 @@ collisionTankBorder lw lh tank = (translate dx dy) >< tank , V.Vector (tankLength/2) (-tankWidth/2) ] - rotp v = V.rotateV (tankDir tank) >< v - transp v = V.translateV v >< tankPos tank + rotp v = tankDir tank >< v + transp v = v >< tankPos tank points = map (transp . rotp) corners minx = minimum $ map V.vertexX points @@ -50,7 +50,7 @@ collisionBulletTank (b, b') (tank, tank') = (not ((between bx minx maxx) && (bet where between x a b = x >= a && x <= b - rotp t v = V.rotateV' (tankDir t) >< v + rotp t v = tankDir t >:< v transp t v = V.diffV (tankPos t) v V.Vector bx by = (rotp tank) . (transp tank) $ bulletPos b @@ -61,7 +61,8 @@ collisionBulletTank (b, b') (tank, tank') = (not ((between bx minx maxx) && (bet miny = -(tankWidth+bulletDiameter)/2 maxy = (tankWidth+bulletDiameter)/2 -collisionTankTank :: ((Tank, Tank), (Tank, Tank)) -> ((Tank, Tank), (Tank, Tank)) -collisionTankTank ((t1, t1'), (t2, t2')) = ((t1, t1'), (t2, t2')) --- where - \ No newline at end of file +collisionTankTank :: ((Tank, Tank), (Tank, Tank)) -> (Tank, Tank) +collisionTankTank ((t1, t1'), (t2, t2')) = (t1'', t2'') + where + t1'' = t1' + t2'' = t2' diff --git a/src/DefaultPlayer.hs b/src/DefaultPlayer.hs index 00dce95..4ac6bac 100644 --- a/src/DefaultPlayer.hs +++ b/src/DefaultPlayer.hs @@ -30,8 +30,8 @@ instance Player DefaultPlayer where ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) move = (x /= 0 || y /= 0) - dir = if move then Just (normalized $ Vector x y) else Nothing - adir = if (ax /= 0 || ay /= 0) then Just (normalized $ Vector ax ay) else Nothing + dir = if move then Just (fromVector $ Vector x y) else Nothing + adir = if (ax /= 0 || ay /= 0) then Just (fromVector $ Vector ax ay) else Nothing in return (DefaultPlayer keys aimx aimy False, dir, move, adir, shoot) handleEvent (DefaultPlayer keys aimx aimy shoot) ev diff --git a/src/Game.hs b/src/Game.hs index 16b04d8..c97b5de 100644 --- a/src/Game.hs +++ b/src/Game.hs @@ -8,13 +8,12 @@ module Game ( Bullet(..) import Level import Tank -import Transformable import Vector data Bullet = Bullet { bulletPos :: !Vertex - , bulletDir :: !Vector + , bulletDir :: !Rotation , bulletSpeed :: !Coord , bulletBouncesLeft :: !Int , bulletTank :: !Int @@ -27,7 +26,7 @@ bulletY :: Bullet -> Coord bulletY = vertexY . bulletPos instance Transformable Bullet where - t >< b = b { bulletPos = pos, bulletDir = dir } where + transform t b = b { bulletPos = pos, bulletDir = dir } where pos = t >< bulletPos b dir = t >< bulletDir b diff --git a/src/HTanks.hs b/src/HTanks.hs index 0974ffd..dd60903 100644 --- a/src/HTanks.hs +++ b/src/HTanks.hs @@ -10,6 +10,8 @@ import DefaultPlayer import HWiidPlayer import Simulation import Tank +import Vector + import GLDriver import GLX @@ -20,7 +22,6 @@ import qualified Data.Map as M import qualified Data.Set as S import Data.Time -import Vector main :: IO () main = do @@ -31,14 +32,14 @@ main = do when (initialized gl) $ do currentTime <- getCurrentTime - let gamestate = GameState {level = theLevel, tanks = [ Tank (Vertex 7.0 4.0) (Vector 1 0) (Vector 1 0) 1.5 (270*pi/180) False 3 1 5 1 - , Tank (Vertex 4.0 4.0) (Vector 1 0) (Vector 1 0) 1.5 (270*pi/180) False 3 1 5 1 - , Tank (Vertex 10.0 4.0) (Vector 1 0) (Vector 1 0) 1.5 (270*pi/180) False 3 1 5 1 + let gamestate = GameState {level = theLevel, tanks = [ Tank (Vertex 7.0 4.0) zeroV zeroV 1.5 (270*pi/180) False 3 1 5 1 + , Tank (Vertex 4.0 4.0) zeroV zeroV 1.5 (270*pi/180) False 3 1 5 1 + , Tank (Vertex 10.0 4.0) zeroV zeroV 1.5 (270*pi/180) False 3 1 5 1 ], bullets = []} mainstate = MainState {run = True, driver = SomeDriver gl, time = currentTime, players = [ SomePlayer humanPlayer - , SomePlayer $ CPUPlayer $ Vector 0 (-1) - , SomePlayer $ CPUPlayer $ Vector 0 1 + , SomePlayer $ CPUPlayer $ fromAngle $ -pi/2 + , SomePlayer $ CPUPlayer $ fromAngle $ pi/2 ], textures = M.empty, models = M.empty, gameState = gamestate} runMain mainstate $ do diff --git a/src/HWiidPlayer.hs b/src/HWiidPlayer.hs index d98b9c9..9517394 100644 --- a/src/HWiidPlayer.hs +++ b/src/HWiidPlayer.hs @@ -55,11 +55,11 @@ instance Player HWiidPlayer where (aimx, aimy) = if null aims then (0, 0) else mulV (1/(fromIntegral $ length aims)) (foldr addV (0, 0) aims) ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) - aim = if (ax /= 0 || ay /= 0) then Just $ V.Vector ax ay else Nothing + aim = if (ax /= 0 || ay /= 0) then Just . V.fromVector $ V.Vector ax ay else Nothing move = (mx /= 0 || my /= 0) angle = atan2 my mx - dir = if move then Just $ T.rotate (fromRational $ round ((angle - (sin $ 8*x)/8)*1000000*180/pi)%1000000) T.>< V.Vector 1 0 else Nothing + dir = if move then Just $ V.fromAngle (fromRational $ round ((angle - (sin $ 8*x)/8)*1000000)%1000000) else Nothing when foo $ print state return (HWiidPlayer wiimote cal aims, dir, move, aim, shoot) diff --git a/src/Player.hs b/src/Player.hs index 67d9f78..9239443 100644 --- a/src/Player.hs +++ b/src/Player.hs @@ -4,7 +4,6 @@ module Player ( Player(..) , SomePlayer(..) ) where -import Transformable import Vector import Data.Typeable @@ -13,7 +12,7 @@ import GLDriver (SomeEvent) class Player a where - playerUpdate :: a -> Tank -> IO (a, Maybe Vector, Bool, Maybe Vector, Bool) + playerUpdate :: a -> Tank -> IO (a, Maybe Rotation, Bool, Maybe Rotation, Bool) handleEvent :: a -> SomeEvent -> a handleEvent player _ = player diff --git a/src/Simulation.hs b/src/Simulation.hs index 3cf4fec..ca335f2 100644 --- a/src/Simulation.hs +++ b/src/Simulation.hs @@ -16,8 +16,8 @@ import Data.Maybe import Data.VectorSpace -updateAngle :: Vector -> Tank -> Tank -updateAngle dir tank = tank {tankDir = rotate newangle >< Vector 1 0} +updateAngle :: Rotation -> Tank -> Tank +updateAngle dir tank = tank { tankDir = fromAngle newangle } where oldangle = toAngle . tankDir $ tank angle = toAngle dir @@ -44,12 +44,14 @@ updateAngle dir tank = tank {tankDir = rotate newangle >< Vector 1 0} newangle = angle180 + turn -approx :: Vector -> Vector -> Bool -approx (Vector x1 y1) (Vector x2 y2) = x1 `approx'` x2 && y1 `approx'` y2 +approx :: Rotation -> Rotation -> Bool +approx r1 r2 = c1 `approx'` c2 && s1 `approx'` s2 where approx' a b = (abs (a-b)) < 0.000001 + Vector c1 s1 = toVector r1 + Vector c2 s2 = toVector r2 -updateTank :: GameState -> Maybe Vector -> Bool -> Maybe Vector -> State Tank () +updateTank :: GameState -> Maybe Rotation -> Bool -> Maybe Rotation -> State Tank () updateTank game dir move aim = do when (isJust dir) $ modify $ updateAngle $ fromJust dir @@ -64,7 +66,7 @@ updateTank game dir move aim = do moved = tankMoving tank when (isNothing dir || (isJust dir && (tdir `approx` fromJust dir) || moved)) $ - put $ translateV (tdir ^* (tspeed/100)) >< tank {tankMoving = True} + put $ ((toVector tdir) ^* (tspeed/100)) >< tank {tankMoving = True} when (not move) $ do modify $ \tank -> tank {tankMoving = False} @@ -75,11 +77,11 @@ updateTank game dir move aim = do updateBullet :: GameState -> Bullet -> (Bullet, Bool) -updateBullet game bullet = (bullet {bulletPos = Vertex x' y', bulletDir = Vector dx' dy', bulletBouncesLeft = bounces3}, bounces3 >= 0) +updateBullet game bullet = (bullet {bulletPos = Vertex x' y', bulletDir = fromVector $ Vector dx' dy', bulletBouncesLeft = bounces3}, bounces3 >= 0) where speed = bulletSpeed bullet - d@(Vector dx dy) = bulletDir bullet - Vertex x y = translateV (d ^* (speed/100)) >< bulletPos bullet + d@(Vector dx dy) = toVector $ bulletDir bullet + Vertex x y = (d ^* (speed/100)) >< bulletPos bullet bounces = bulletBouncesLeft bullet lw = fromIntegral . levelWidth . level $ game lh = fromIntegral . levelHeight . level $ game diff --git a/src/Tank.hs b/src/Tank.hs index f3230f2..a595618 100644 --- a/src/Tank.hs +++ b/src/Tank.hs @@ -3,13 +3,12 @@ module Tank ( Tank(..) , tankY ) where -import Transformable import Vector data Tank = Tank { tankPos :: !Vertex - , tankDir :: !Vector - , tankAim :: !Vector + , tankDir :: !Rotation + , tankAim :: !Rotation , tankSpeed :: !Coord , tankTurnspeed :: !Coord , tankMoving :: !Bool @@ -26,7 +25,7 @@ tankY :: Tank -> Coord tankY = vertexY . tankPos instance Transformable Tank where - t >< tank = tank { tankPos = pos, tankDir = dir, tankAim = aim } where + transform t tank = tank { tankPos = pos , tankDir = dir, tankAim = aim } where pos = t >< tankPos tank dir = t >< tankDir tank aim = t >< tankAim tank \ No newline at end of file diff --git a/src/Transformable.hs b/src/Transformable.hs index 2fd64fe..335b477 100644 --- a/src/Transformable.hs +++ b/src/Transformable.hs @@ -2,11 +2,12 @@ module Transformable ( Coord , Vector3 - , Transform + , TransformMap + , Transform(..) + , ReversibleTransform(..) , Transformable(..) - , translate - , rotate - , scale + , (><) + , (>:<) ) where import Data.LinearMap @@ -14,24 +15,29 @@ import Data.LinearMap type Coord = Double type Vector3 = (Coord, Coord, Coord) -type Transform = Vector3 :-* Vector3 +type TransformMap = Vector3 :-* Vector3 class Transformable a where - (><) :: Transform -> a -> a + transform :: TransformMap -> a -> a -instance Transformable Transform where - t1 >< t2 = t1 *.* t2 +class Transform a where + toMap :: a -> TransformMap + +class Transform a => ReversibleTransform a where + toMap' :: a -> TransformMap instance Transformable Vector3 where - t >< v = t `lapply` v + transform = lapply -translate :: Coord -> Coord -> Transform -translate dx dy = linear $ \(x, y, w) -> (x + w*dx, y + w*dy, w) +instance Transform TransformMap where + toMap = id -rotate :: Coord -> Transform -rotate a = linear $ \(x, y, w) -> (c*x - s*y, s*x + c*y, w) where - c = cos a - s = sin a +instance Transformable TransformMap where + transform = (*.*) + +(><) :: (Transform t, Transformable a) => t -> a -> a +t >< a = transform (toMap t) a + +(>:<) :: (ReversibleTransform t, Transformable a) => t -> a -> a +t >:< a = transform (toMap' t) a -scale :: Coord -> Transform -scale s = linear $ \(x, y, w) -> (s*y, s*y, w) diff --git a/src/Vector.hs b/src/Vector.hs index 847be58..174afd3 100644 --- a/src/Vector.hs +++ b/src/Vector.hs @@ -1,12 +1,20 @@ {-# LANGUAGE TypeFamilies #-} -module Vector ( Vertex(..) +module Vector ( Coord + , Transformable(..) + , Transform(..) + , ReversibleTransform(..) + , Vertex(..) , Vector(..) + , Rotation + , zeroV + , (^+^) + , negateV + , (><) , toAngle - , translateV - , translateV' - , rotateV - , rotateV' + , fromAngle + , toVector + , fromVector , diffV ) where @@ -18,13 +26,14 @@ import Data.LinearMap data Vertex = Vertex { vertexX :: Coord, vertexY :: Coord } deriving (Show, Eq) instance Transformable Vertex where - t >< (Vertex x y) = Vertex x' y' + transform t (Vertex x y) = Vertex x' y' where (x', y', _) = t >< (x, y, 1) :: Vector3 data Vector = Vector { vectorX :: Coord, vectorY :: Coord } deriving (Show, Eq) + instance Transformable Vector where - t >< (Vector x y) = Vector x' y' + transform t (Vector x y) = Vector x' y' where (x', y', _) = t >< (x, y, 0) :: Vector3 @@ -35,25 +44,50 @@ instance AdditiveGroup Vector where instance VectorSpace Vector where type Scalar Vector = Coord - s *^ Vector x y = Vector (s*x) (s*y) + r *^ Vector x y = Vector (r*x) (r*y) instance InnerSpace Vector where Vector x1 y1 <.> Vector x2 y2 = x1*x2 + y1*y2 -toAngle :: Vector -> Coord -toAngle (Vector x y) = atan2 y x +instance Transform Vector where + toMap (Vector dx dy) = linear $ \(x, y, w) -> (x+w*dx, y+w*dy, w) -translateV :: Vector -> Transform -translateV (Vector x y) = translate x y +instance ReversibleTransform Vector where + toMap' = toMap . negateV -translateV' :: Vector -> Transform -translateV' = translateV . negateV +data Rotation = Rotation { rotC :: Coord, rotS :: Coord } deriving (Show, Eq) -rotateV :: Vector -> Transform -rotateV (Vector c s) = linear $ \(x, y, w) -> (c*x - s*y, s*x + c*y, w) +instance Transformable Rotation where + transform t (Rotation c s) = Rotation (c'/l) (s'/l) + where + (c', s', _) = t >< (c, s, 0) :: Vector3 + l = sqrt $ c'^2 + s'^2 -rotateV' :: Vector -> Transform -rotateV' (Vector c s) = rotateV $ Vector c (-s) +instance AdditiveGroup Rotation where + zeroV = Rotation 1 0 + Rotation c1 s1 ^+^ Rotation c2 s2 = Rotation (c1*c2 - s1*s2) (s1*c2 + c1*s2) + negateV (Rotation c s) = Rotation (-c) s + +instance Transform Rotation where + toMap (Rotation c s) = linear $ \(x, y, w) -> (c*x - s*y, s*x + c*y, w) + +instance ReversibleTransform Rotation where + toMap' = toMap . negateV + + +toAngle :: Rotation -> Coord +toAngle (Rotation c s) = atan2 s c + +fromAngle :: Coord -> Rotation +fromAngle a = Rotation (cos a) (sin a) + +toVector :: Rotation -> Vector +toVector (Rotation c s) = Vector c s + +fromVector :: Vector -> Rotation +fromVector v = Rotation x y + where + Vector x y = normalized v diffV :: Vertex -> Vertex -> Vector diffV (Vertex x1 y1) (Vertex x2 y2) = Vector (x2-x1) (y2-y1) From ae4a69415050b61f4488255dad0b1c3d045e6de5 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Jun 2011 21:07:41 +0200 Subject: [PATCH 09/10] Express >< operator more elegant --- src/Transformable.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Transformable.hs b/src/Transformable.hs index 335b477..a99491d 100644 --- a/src/Transformable.hs +++ b/src/Transformable.hs @@ -36,8 +36,8 @@ instance Transformable TransformMap where transform = (*.*) (><) :: (Transform t, Transformable a) => t -> a -> a -t >< a = transform (toMap t) a +(><) = transform . toMap (>:<) :: (ReversibleTransform t, Transformable a) => t -> a -> a -t >:< a = transform (toMap' t) a +(>:<) = transform . toMap' From cfa9cf94568fbe1564e5b4e386a8170910bc552e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Jun 2011 23:41:53 +0200 Subject: [PATCH 10/10] Refactored to/fromVector functions --- src/DefaultPlayer.hs | 4 ++-- src/HWiidPlayer.hs | 2 +- src/Simulation.hs | 22 ++++++++++++---------- src/Vector.hs | 8 ++++---- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/DefaultPlayer.hs b/src/DefaultPlayer.hs index 4ac6bac..bb8cf75 100644 --- a/src/DefaultPlayer.hs +++ b/src/DefaultPlayer.hs @@ -30,8 +30,8 @@ instance Player DefaultPlayer where ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) move = (x /= 0 || y /= 0) - dir = if move then Just (fromVector $ Vector x y) else Nothing - adir = if (ax /= 0 || ay /= 0) then Just (fromVector $ Vector ax ay) else Nothing + dir = if move then Just (fst . fromVector $ Vector x y) else Nothing + adir = if (ax /= 0 || ay /= 0) then Just (fst . fromVector $ Vector ax ay) else Nothing in return (DefaultPlayer keys aimx aimy False, dir, move, adir, shoot) handleEvent (DefaultPlayer keys aimx aimy shoot) ev diff --git a/src/HWiidPlayer.hs b/src/HWiidPlayer.hs index 9517394..18fafba 100644 --- a/src/HWiidPlayer.hs +++ b/src/HWiidPlayer.hs @@ -55,7 +55,7 @@ instance Player HWiidPlayer where (aimx, aimy) = if null aims then (0, 0) else mulV (1/(fromIntegral $ length aims)) (foldr addV (0, 0) aims) ax = realToFrac $ aimx - (fromRational . toRational . tankX $ tank) ay = realToFrac $ aimy - (fromRational . toRational . tankY $ tank) - aim = if (ax /= 0 || ay /= 0) then Just . V.fromVector $ V.Vector ax ay else Nothing + aim = if (ax /= 0 || ay /= 0) then Just . fst . V.fromVector $ V.Vector ax ay else Nothing move = (mx /= 0 || my /= 0) angle = atan2 my mx diff --git a/src/Simulation.hs b/src/Simulation.hs index ca335f2..2d5a0fa 100644 --- a/src/Simulation.hs +++ b/src/Simulation.hs @@ -48,8 +48,8 @@ approx :: Rotation -> Rotation -> Bool approx r1 r2 = c1 `approx'` c2 && s1 `approx'` s2 where approx' a b = (abs (a-b)) < 0.000001 - Vector c1 s1 = toVector r1 - Vector c2 s2 = toVector r2 + Vector c1 s1 = toVector 1 r1 + Vector c2 s2 = toVector 1 r2 updateTank :: GameState -> Maybe Rotation -> Bool -> Maybe Rotation -> State Tank () updateTank game dir move aim = do @@ -57,7 +57,7 @@ updateTank game dir move aim = do modify $ updateAngle $ fromJust dir when (isJust aim) $ - modify $ \tank -> tank {tankAim = fromJust aim} + modify $ \tank -> tank { tankAim = fromJust aim } when move $ do tank <- get @@ -66,10 +66,10 @@ updateTank game dir move aim = do moved = tankMoving tank when (isNothing dir || (isJust dir && (tdir `approx` fromJust dir) || moved)) $ - put $ ((toVector tdir) ^* (tspeed/100)) >< tank {tankMoving = True} + put $ toVector (tspeed/100) tdir >< tank {tankMoving = True} when (not move) $ do - modify $ \tank -> tank {tankMoving = False} + modify $ \tank -> tank {tankMoving = False} let lw = fromIntegral . levelWidth . level $ game lh = fromIntegral . levelHeight . level $ game @@ -77,17 +77,19 @@ updateTank game dir move aim = do updateBullet :: GameState -> Bullet -> (Bullet, Bool) -updateBullet game bullet = (bullet {bulletPos = Vertex x' y', bulletDir = fromVector $ Vector dx' dy', bulletBouncesLeft = bounces3}, bounces3 >= 0) +updateBullet game bullet = (bullet {bulletPos = Vertex x' y', bulletDir = dir'', bulletBouncesLeft = bounces3}, bounces3 >= 0) where + rot180 = fromAngle pi + speed = bulletSpeed bullet - d@(Vector dx dy) = toVector $ bulletDir bullet - Vertex x y = (d ^* (speed/100)) >< bulletPos bullet + dir = bulletDir bullet + Vertex x y = toVector (speed/100) dir >< bulletPos bullet bounces = bulletBouncesLeft bullet lw = fromIntegral . levelWidth . level $ game lh = fromIntegral . levelHeight . level $ game - (x', dx', bounces2) = if x < 0 then (-x, -dx, bounces-1) else if x > lw then (2*lw-x, -dx, bounces-1) else (x, dx, bounces) - (y', dy', bounces3) = if y < 0 then (-y, -dy, bounces2-1) else if y > lh then (2*lh-y, -dy, bounces2-1) else (y, dy, bounces2) + (x', dir', bounces2) = if x < 0 then (-x, negateV dir, bounces-1) else if x > lw then (2*lw-x, negateV dir, bounces-1) else (x, dir, bounces) + (y', dir'', bounces3) = if y < 0 then (-y, rot180 ^-^ dir', bounces2-1) else if y > lh then (2*lh-y, rot180 ^-^ dir', bounces2-1) else (y, dir', bounces2) gameStep :: [(Tank, Bool)] -> GameState -> GameState gameStep tanksshoot state = state {tanks = thetanks, bullets = newbullets ++ (map snd . filter fst $ leftbullets2)} diff --git a/src/Vector.hs b/src/Vector.hs index 174afd3..749693e 100644 --- a/src/Vector.hs +++ b/src/Vector.hs @@ -81,11 +81,11 @@ toAngle (Rotation c s) = atan2 s c fromAngle :: Coord -> Rotation fromAngle a = Rotation (cos a) (sin a) -toVector :: Rotation -> Vector -toVector (Rotation c s) = Vector c s +toVector :: Coord -> Rotation -> Vector +toVector l (Rotation c s) = l *^ Vector c s -fromVector :: Vector -> Rotation -fromVector v = Rotation x y +fromVector :: Vector -> (Rotation, Coord) +fromVector v = (Rotation x y, magnitude v) where Vector x y = normalized v