From 0f38e9b4a281eafb5b4402eed0e8e8333a2b0c46 Mon Sep 17 00:00:00 2001 From: var Date: Sun, 26 Apr 2026 22:21:58 -0500 Subject: [PATCH] Make character run - new, less blocky character model with a run animation - remove .obj support in favor of .glb/.gltf - character faces camera direction and turns head - press Tab to rotate camera freely around the character --- .gitignore | 2 + res/model/human.glb | Bin 56132 -> 120840 bytes res/model/human.obj | 396 -------------------------------------------- res/tex/texture.png | Bin 1526 -> 1388 bytes src/game.c | 4 +- src/game.h | 1 + src/input.c | 1 + src/model.c | 162 ++---------------- src/model.h | 1 + src/render.c | 65 ++++++-- 10 files changed, 71 insertions(+), 561 deletions(-) delete mode 100644 res/model/human.obj diff --git a/.gitignore b/.gitignore index b297898..fa87957 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ obj/* Game Release *.xcf +*.blend +*.blend1 diff --git a/res/model/human.glb b/res/model/human.glb index 3702caca15da95da31b44b3de6dc488c1789f19d..75366812412d8be11171bca0a17795c168a4fbd8 100644 GIT binary patch literal 120840 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

Rus{JM53vVvdZ8Q|AZM%u! z*O>TqJot5m%(f!B6G1HZ2N^IQ@98WX=h z41Rrm;dU|eTrC)0BU~-luSM`{O!>74evOG=U&-}rYl%N!3wOY;tL6H&75rKteqA!x zudUXs9|hvqPjmg+x_q@Ad7~cy@=c zK>XJq{C82`7CiW`K>YV(@ZWun2lC**0`Xrf_-}_=lX>u8;S%`ob@1P#hS_}mIgtYK z-%;SdJ+i*xkG@J0=Ggpqz=>77|I|+f*?<2C-N0K{%n+J@|N4OcUhlDq2mcj_|JDHi z^)0o5XNSxX&f5HU)aNUC@Lz%W?+EbU_MH~+6PXDD@!!kfzx5AI=d0fsCTz3$@92iH zJov9b{C5`k?+2kB`J9^yf%vZm{P*qbhCKMMK>W83_;1reMS1XFgY3V*o;el_{%auq zd+dj+!QuD631yUlZR>ek+9j5h0e$Qd?gcZ-`7-wy-35xVZQ;m9VwVX9ej9*v; zcfA}UzFpeXTB1F&KK;BXKHOU)M%8a@EjOpAb!J>K{52OS7C+n2I%>L))i+ABRtS|p8j{Ph(#V!r%S@}|a)&{XYxc<*o#K;Q%R;F8NYw_=Wa8Sw0;@$0a ztqTvAw(igL!M}b`RjlvtZ|%#Mw&qxT@Ub)Ri`ilItQ!ybT89tx!J~x+;$I;RtPdxZ zw0?fLIPPI=Eis6>;wG}_V9B54qd@ByD zSQP*KpqqH+ljc^-_s_-R#fxBeTYquE3#B!4{oi8ew+J7+GF0qXRb{=@?ymSn8H9hU z9U-QCueQcCyeYo@DqFbjA1$80tg$BUyCz^jP=(Bj18fO`A2tJ_CHK5N$pQ&)ItlL5a z=yNXUbK52sPhR*ys0RAH1^OJDq`>E1J`rAnKC6R1W2yz=GS)015%k#)^!d-yrr4)F z!p}jUKY>0Y>o>;b=M=@CgFcsnKAE!(G3XPQ0e$WOeXc!HA7_;>g^Un6V81#uPpwFwI&wBp;xDQ_%7ZH8%8PMlHVf8TR z6OROa#(_TXhcv){Pb!JO0DXpnKA+7Cz&+*{$G1SAIl218pii6y`fLsQoOwAAPYrx4 z3<7;#0DYeRq&d#`{<+`_`qYCy=f6wbOU`J1ATU=s=~jvyDQ8EeO?27CV#KS zQ4Mbj%-7k%ebDFG%Nh*&6t06l?e#&{PjXf$pF_y-{o752t@maGzx+MOK*MRTlX3aV ziTt>|T{7C=&NlRg*rry;1b$gSXvX)EWd)@*2`|kU%b#g7HG|RXg=NeH{6%^cfA-Yc z3{6C`u)fAvywZO-Z#{M@W9x&hLh>)+_(Y4gm7``>fkHyMVsd=j>KQ@yD3Cp+8g}qPovDOLc;N~?~3B$`1j!6 zdxw~xCk?yy-s+=Ob$0~Q-?Ptg_y_1Y4CSjJK~ByEqG>MfH}pl zCO)}oFs_=@l~4cN&%7n;6+G{Y#H#A9=o2*tun@x5m4;?wTM5e{qUz3oA9*t8L-*E3IAc@9RBPah`;(Y!cBKK@uC|E!jS$&_^Efl zfoQg;GgY$tC$yj*^ak@fBp&nx#HMAuy5+eo54T(fPV_7&SlL0XDELf{Ie|h z=anJ5GXCBc!LI@TYy$on7QHItPP=HnBKT(~@XsL;i!i{y8tFt9k8gKc4t!4e-y9&O^*K9$yU}Z}ZPmk0QT^PG)3lHjdq)5|75~TnS0FI zWhVYP5d1TSuVnt_<}E@Jb~l#5NwH3p3}ceDBD4^5kz$D~d%6aSnF{<+t` zi5Vx(G5-wy`7`)ucpeigh|)qsA#3f`+K@P5^|^LiF~zbb0|oK2I` zbKkGp8h{ql?^jLD$yr9fU)8euy8qJmtK#cb-0;8eR~33c?0?^{ddK&x9{m@-U$qF{ PuiD|{{i@?`-mm&Ug0Y4) diff --git a/res/model/human.obj b/res/model/human.obj deleted file mode 100644 index 1b7fbc2..0000000 --- a/res/model/human.obj +++ /dev/null @@ -1,396 +0,0 @@ -# Blender 5.1.0 -# www.blender.org -o Cube -v 0.392226 5.791883 -0.323902 -v 1.000000 2.797271 -0.500000 -v 0.375191 5.791883 0.193573 -v 1.000000 2.797271 0.410409 -v 0.000000 2.797271 -0.500000 -v 0.000000 5.791883 0.313965 -v 0.000000 2.797271 0.410409 -v 0.000000 5.791883 -0.431258 -v 0.973876 5.462687 -0.577779 -v 1.000000 4.791883 -0.500000 -v 0.921580 3.413690 -0.372389 -v 0.973876 5.462687 0.615027 -v 1.000000 4.791883 0.533735 -v 0.815817 3.413690 0.422394 -v 0.000000 5.291883 -0.500000 -v 0.000000 4.791883 -0.500000 -v 0.000000 3.413690 -0.431220 -v 0.000000 5.291883 0.533735 -v 0.000000 4.791883 0.533735 -v 0.000000 3.413690 0.410409 -v 1.309145 5.351887 -0.469410 -v 1.226283 4.706231 -0.312568 -v 1.309145 5.351887 0.467801 -v 1.226283 4.706231 0.309653 -v 0.292031 0.000000 0.293679 -v 0.879388 0.000000 0.293679 -v 0.879388 0.000000 -0.293679 -v 0.292031 0.000000 -0.293679 -v 0.500000 6.791883 -0.500000 -v 0.500000 6.791883 0.500000 -v 0.000000 6.791883 -0.500000 -v 0.000000 6.791883 0.500000 -v 0.500000 5.899879 0.500000 -v 0.000000 5.899879 0.500000 -v 0.000000 5.899879 -0.500000 -v 0.500000 5.899879 -0.500000 -v 0.665692 5.541883 -0.391726 -v 0.525278 5.541883 0.301663 -v 0.000000 5.541883 -0.500000 -v 0.000000 5.541883 0.465368 -v 0.064081 2.647533 -0.468467 -v 0.064081 2.647533 0.392291 -v 0.995814 2.647533 0.392291 -v 0.995814 2.647533 -0.468467 -v 0.170786 1.383736 -0.403152 -v 0.973834 1.383736 0.355442 -v 0.170786 1.383736 0.355442 -v 0.973834 1.383736 -0.403152 -v 0.960790 4.541883 -0.436195 -v 0.907909 4.541883 0.461197 -v 0.000000 4.541883 -0.465610 -v 0.000000 4.541883 0.455205 -v 2.256556 4.848390 -0.244752 -v 2.192387 4.348389 -0.123293 -v 2.256556 4.848390 0.481030 -v 2.192387 4.348389 0.358559 -v 3.076406 4.246439 -0.125417 -v 3.033353 3.910976 -0.043927 -v 3.076406 4.246439 0.361528 -v 3.033353 3.910976 0.279360 -v -0.392226 5.791883 -0.323902 -v -1.000000 2.797271 -0.500000 -v -0.375191 5.791883 0.193573 -v -1.000000 2.797271 0.410409 -v -0.973876 5.462687 -0.577779 -v -1.000000 4.791883 -0.500000 -v -0.921580 3.413690 -0.372389 -v -0.973876 5.462687 0.615027 -v -1.000000 4.791883 0.533735 -v -0.815817 3.413690 0.422394 -v -1.309145 5.351887 -0.469410 -v -1.226283 4.706231 -0.312568 -v -1.309145 5.351887 0.467801 -v -1.226283 4.706231 0.309653 -v -0.292031 0.000000 0.293679 -v -0.879388 0.000000 0.293679 -v -0.879388 0.000000 -0.293679 -v -0.292031 0.000000 -0.293679 -v -0.500000 6.791883 -0.500000 -v -0.500000 6.791883 0.500000 -v -0.500000 5.899879 0.500000 -v -0.500000 5.899879 -0.500000 -v -0.665692 5.541883 -0.391726 -v -0.525278 5.541883 0.301663 -v -0.064081 2.647533 -0.468467 -v -0.064081 2.647533 0.392291 -v -0.995814 2.647533 0.392291 -v -0.995814 2.647533 -0.468467 -v -0.170786 1.383736 -0.403152 -v -0.973834 1.383736 0.355442 -v -0.170786 1.383736 0.355442 -v -0.973834 1.383736 -0.403152 -v -0.960790 4.541883 -0.436195 -v -0.907909 4.541883 0.461197 -v -2.256556 4.848390 -0.244752 -v -2.192387 4.348389 -0.123293 -v -2.256556 4.848390 0.481030 -v -2.192387 4.348389 0.358559 -v -3.076406 4.246439 -0.125417 -v -3.033353 3.910976 -0.043927 -v -3.076406 4.246439 0.361528 -v -3.033353 3.910976 0.279360 -vt 0.062500 0.812500 -vt 0.000000 0.750000 -vt 0.062500 0.750000 -vt 0.375000 0.500000 -vt 0.437500 0.562500 -vt 0.375000 0.562500 -vt 0.375000 0.437500 -vt 0.437500 0.500000 -vt 0.375000 0.625000 -vt 0.500000 0.562500 -vt 0.625000 0.625000 -vt 0.500000 0.625000 -vt 0.375000 0.875000 -vt 0.312500 0.937500 -vt 0.312500 0.875000 -vt 0.437500 0.875000 -vt 0.500000 0.937500 -vt 0.437500 0.937500 -vt 0.750000 0.937500 -vt 0.812500 1.000000 -vt 0.750000 1.000000 -vt 0.312500 0.750000 -vt 0.375000 0.812500 -vt 0.312500 0.812500 -vt 0.500000 0.750000 -vt 0.437500 0.812500 -vt 0.437500 0.750000 -vt 0.812500 0.437500 -vt 0.750000 0.500000 -vt 0.750000 0.437500 -vt 0.500000 0.812500 -vt 0.562500 0.875000 -vt 0.500000 0.875000 -vt 0.625000 0.812500 -vt 0.625000 0.875000 -vt 0.812500 0.875000 -vt 0.812500 0.937500 -vt 0.312500 0.500000 -vt 0.250000 0.562500 -vt 0.250000 0.500000 -vt 0.812500 0.562500 -vt 0.750000 0.562500 -vt 0.125000 0.812500 -vt 0.062500 0.875000 -vt 0.187500 0.875000 -vt 0.187500 0.812500 -vt 0.125000 0.937500 -vt 0.125000 0.875000 -vt 0.125000 0.750000 -vt 0.187500 0.750000 -vt 0.687500 0.500000 -vt 0.625000 0.562500 -vt 0.625000 0.500000 -vt 0.500000 0.437500 -vt 0.500000 0.500000 -vt 0.437500 0.625000 -vt 0.312500 0.625000 -vt 0.312500 0.562500 -vt 0.312500 0.437500 -vt 0.250000 0.750000 -vt 0.250000 0.937500 -vt 0.250000 0.875000 -vt 0.250000 0.812500 -vt 0.062500 0.937500 -vt 0.000000 0.875000 -vt 0.187500 0.937500 -vt 0.000000 0.812500 -vt 0.375000 0.750000 -vt 0.375000 0.937500 -vt 0.187500 0.500000 -vt 0.125000 0.562500 -vt 0.125000 0.500000 -vt 0.812500 0.625000 -vt 0.750000 0.625000 -vt 0.750000 0.875000 -vt 0.812500 0.812500 -vt 0.812500 0.687500 -vt 0.750000 0.750000 -vt 0.750000 0.687500 -vt 0.750000 0.812500 -vt 0.812500 0.750000 -vt 0.687500 0.812500 -vt 0.687500 0.875000 -vt 0.437500 0.437500 -vt 0.562500 0.812500 -vt 0.812500 0.500000 -vt 0.000000 0.937500 -vt 0.187500 0.562500 -vt 0.687500 0.562500 -vt 0.625000 0.437500 -s 0 -f 47/1 28/2 25/3 -f 37/4 3/5 38/6 -f 39/7 1/8 37/4 -f 3/5 40/9 38/6 -f 33/10 32/11 34/12 -f 14/13 7/14 4/15 -f 50/16 19/17 52/18 -f 13/19 18/20 19/21 -f 5/22 11/23 2/24 -f 16/25 49/26 51/27 -f 15/28 10/29 16/30 -f 11/23 4/15 2/24 -f 10/31 50/16 49/26 -f 10/31 24/32 13/33 -f 24/32 54/34 56/35 -f 13/19 23/36 12/37 -f 9/38 23/39 21/40 -f 10/29 21/41 22/42 -f 27/43 25/44 28/1 -f 46/45 27/43 48/46 -f 46/45 25/47 26/48 -f 48/46 28/49 45/50 -f 31/51 30/52 29/53 -f 35/54 29/53 36/55 -f 36/55 30/52 33/10 -f 3/5 36/55 33/10 -f 1/8 35/54 36/55 -f 3/5 34/12 6/56 -f 38/6 18/57 12/58 -f 15/59 37/4 9/38 -f 37/4 12/58 9/38 -f 2/24 41/60 5/22 -f 4/15 42/61 43/62 -f 4/15 44/63 2/24 -f 7/64 41/65 42/44 -f 44/63 45/50 41/60 -f 43/62 47/66 46/45 -f 43/62 48/46 44/63 -f 42/44 45/67 47/1 -f 11/23 50/16 14/13 -f 51/27 11/23 17/68 -f 14/13 52/18 20/69 -f 53/70 59/71 57/72 -f 22/42 53/73 54/74 -f 23/39 53/70 21/40 -f 24/75 55/76 23/36 -f 57/77 60/78 58/79 -f 56/80 59/81 55/76 -f 56/35 58/82 60/83 -f 54/74 57/77 58/79 -f 91/1 78/2 89/67 -f 83/4 63/5 61/8 -f 39/7 61/8 8/84 -f 40/9 63/5 84/6 -f 32/11 81/10 34/12 -f 7/14 70/13 64/15 -f 94/16 19/17 69/33 -f 69/19 18/20 68/37 -f 5/22 67/23 17/68 -f 93/26 16/25 51/27 -f 66/29 15/28 16/30 -f 64/15 67/23 62/24 -f 94/16 66/31 93/26 -f 74/32 66/31 69/33 -f 74/32 96/34 72/85 -f 73/36 69/19 68/37 -f 65/38 73/39 68/58 -f 66/29 71/41 65/86 -f 75/44 77/43 78/1 -f 77/43 90/45 92/46 -f 90/45 75/47 91/66 -f 78/49 92/46 89/50 -f 80/52 31/51 79/53 -f 79/53 35/54 82/55 -f 80/52 82/55 81/10 -f 63/5 82/55 61/8 -f 61/8 35/54 8/84 -f 34/12 63/5 6/56 -f 18/57 84/6 68/58 -f 15/59 83/4 39/7 -f 68/58 83/4 65/38 -f 85/60 62/24 5/22 -f 64/15 86/61 7/14 -f 88/63 64/15 62/24 -f 7/64 85/65 5/87 -f 89/50 88/63 85/60 -f 87/62 91/66 86/61 -f 92/46 87/62 88/63 -f 86/44 89/67 85/65 -f 67/23 94/16 93/26 -f 67/23 51/27 17/68 -f 70/13 52/18 94/16 -f 95/70 101/71 97/88 -f 72/42 95/73 71/41 -f 95/70 73/39 71/40 -f 97/76 74/75 73/36 -f 102/78 99/77 100/79 -f 101/81 98/80 97/76 -f 98/35 100/82 96/34 -f 96/74 99/77 95/73 -f 47/1 45/67 28/2 -f 37/4 1/8 3/5 -f 39/7 8/84 1/8 -f 3/5 6/56 40/9 -f 33/10 30/52 32/11 -f 14/13 20/69 7/14 -f 50/16 13/33 19/17 -f 13/19 12/37 18/20 -f 5/22 17/68 11/23 -f 16/25 10/31 49/26 -f 15/28 9/86 10/29 -f 11/23 14/13 4/15 -f 10/31 13/33 50/16 -f 10/31 22/85 24/32 -f 24/32 22/85 54/34 -f 13/19 24/75 23/36 -f 9/38 12/58 23/39 -f 10/29 9/86 21/41 -f 27/43 26/48 25/44 -f 46/45 26/48 27/43 -f 46/45 47/66 25/47 -f 48/46 27/43 28/49 -f 31/51 32/89 30/52 -f 35/54 31/90 29/53 -f 36/55 29/53 30/52 -f 3/5 1/8 36/55 -f 1/8 8/84 35/54 -f 3/5 33/10 34/12 -f 38/6 40/9 18/57 -f 15/59 39/7 37/4 -f 37/4 38/6 12/58 -f 2/24 44/63 41/60 -f 4/15 7/14 42/61 -f 4/15 43/62 44/63 -f 7/64 5/87 41/65 -f 44/63 48/46 45/50 -f 43/62 42/61 47/66 -f 43/62 46/45 48/46 -f 42/44 41/65 45/67 -f 11/23 49/26 50/16 -f 51/27 49/26 11/23 -f 14/13 50/16 52/18 -f 53/70 55/88 59/71 -f 22/42 21/41 53/73 -f 23/39 55/88 53/70 -f 24/75 56/80 55/76 -f 57/77 59/81 60/78 -f 56/80 60/78 59/81 -f 56/35 54/34 58/82 -f 54/74 53/73 57/77 -f 91/1 75/3 78/2 -f 83/4 84/6 63/5 -f 39/7 83/4 61/8 -f 40/9 6/56 63/5 -f 32/11 80/52 81/10 -f 7/14 20/69 70/13 -f 94/16 52/18 19/17 -f 69/19 19/21 18/20 -f 5/22 62/24 67/23 -f 93/26 66/31 16/25 -f 66/29 65/86 15/28 -f 64/15 70/13 67/23 -f 94/16 69/33 66/31 -f 74/32 72/85 66/31 -f 74/32 98/35 96/34 -f 73/36 74/75 69/19 -f 65/38 71/40 73/39 -f 66/29 72/42 71/41 -f 75/44 76/48 77/43 -f 77/43 76/48 90/45 -f 90/45 76/48 75/47 -f 78/49 77/43 92/46 -f 80/52 32/89 31/51 -f 79/53 31/90 35/54 -f 80/52 79/53 82/55 -f 63/5 81/10 82/55 -f 61/8 82/55 35/54 -f 34/12 81/10 63/5 -f 18/57 40/9 84/6 -f 15/59 65/38 83/4 -f 68/58 84/6 83/4 -f 85/60 88/63 62/24 -f 64/15 87/62 86/61 -f 88/63 87/62 64/15 -f 7/64 86/44 85/65 -f 89/50 92/46 88/63 -f 87/62 90/45 91/66 -f 92/46 90/45 87/62 -f 86/44 91/1 89/67 -f 67/23 70/13 94/16 -f 67/23 93/26 51/27 -f 70/13 20/69 52/18 -f 95/70 99/72 101/71 -f 72/42 96/74 95/73 -f 95/70 97/88 73/39 -f 97/76 98/80 74/75 -f 102/78 101/81 99/77 -f 101/81 102/78 98/80 -f 98/35 102/83 100/82 -f 96/74 100/79 99/77 diff --git a/res/tex/texture.png b/res/tex/texture.png index 4996be98c7935d69b6d98aa95168919995ffd73c..19902d5e641a0c50f2b4657fa0ab986a7149e9ef 100644 GIT binary patch literal 1388 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83893O0)X@p&(m}l9Aa^ImnE)e-c@Ne1&9>AYTTCDm4a%h86~fUqGRT7Yq!g1`G_Z5*Qe)W-u^_7tGleXakhs zEbxddW?;}$24TjErS@e&LG}_)Usv{5EYeKU7TwCu1wbnfdAc};RNQ)dXQ9{TM44j` zpNoduFx{45OFf!otkd~UglAs!O|=e^Wv+zXeD4Bic(eh?vn+NA-+s7B*e0^0Yr~bF@&&Si3&ffgue0^P!%-^5u+oCVd|DX4G*OVZy?c0OA zG*dtQlKJ}i^yA#s_x~UMvG>9})_6vSCy`%78CC}U|MdT_BsT*?0wcqT3BRWQzt4N% z`4Qy}K*x(QG%(~bKv^t#40jkJfTG+C4ov1qtULxCV5qP%C^SmLSdPDV51iX@|JC>V zCcdlx*R8z@40fPar6czl*7$B`kmi_XKUOl_6U4?X%8b-CqLjt1SxVr<|Eu+zzi~R zk;&F;ud+d*&!7Nw6i|eNfx!XD0{T+`=r literal 1526 zcmeAS@N?(olHy`uVBq!ia0y~yU;;83893O0)X@p&(m}l9Aa^ImnE)e-c@Ne1&9>AYTTCDm4a%h86~fUqGRT7Yq!g1`G_Z5*Qe)W-u^_7tGleXakhs zEbxddW?;}$24TjErS@e&LG}_)Usv{5EUb*&ssibYc^Md3eLP(pLn>~)y=#~q%q?;J zp?Q$tk*hmf_?|KE5NS^ld>O8BWa;eLnptMD3dn z7g`;*Y`JWf8}#V6P4t_+aZ=1bzuy0T?cD0T?L9~2?){$n^K$>|_w$$k`=fsTTX6lq z{IYk;{{6APQztGcIQ#C}jt+}o|8%cDo__gy_TT5%U%$O7Cw|nzVz2f*CWaH~hl3eX zrhe7_|H@E|f#CoX!vyDR>;J4i-h6Pux0*9)n{Pe#TP`dp__wZp;q&i5Dpr4eye~bU zk%2*nfnoK;zibJQZ}I9gaWgO^Ffw>3{N_E-KYxGrdH1ij|3fqX)&KGBFZ+K@j^ABa zKMJBIqCuL$oB?W6qjbYBUWdqQ|FdSK-e;Nf{W*h4KFbDRAc`?G{M>Y(L8j){BUhlo zAj>#Y_A~yd__6cr&&+!)P_fsVzj*GJiK~o2K0wf5i`(J3_x>J9xJjlia9SJtDfFuJOLab6Fr_Eynxd4=#1b~4IWC1;>0HlC!=U`xP0J3mMk*FNi zB!Z@+Do3~phhuOlM|c5Y1VW4`FOaBQfdLkFM466Ij_QSx6+j>4f3bfLj-S<%#|{b* N22WQ%mvv4FO#o6+T(tlI diff --git a/src/game.c b/src/game.c index d73ec9b..36e8c00 100644 --- a/src/game.c +++ b/src/game.c @@ -61,8 +61,8 @@ void Game_Update(GameState *gs) ShapeInstance *target = &(gs->testModel.instance); vec3 displacement; - glm_vec3_scale(gs->camera.front, -20.0f, displacement); - displacement[1] += 8.0f; + glm_vec3_scale(gs->camera.front, -30.0f, displacement); + displacement[1] += 10.0f; glm_vec3_add(target->position, move, target->position); glm_vec3_add(target->position, displacement, gs->camera.position); diff --git a/src/game.h b/src/game.h index 869a2ad..5ef2d34 100644 --- a/src/game.h +++ b/src/game.h @@ -16,6 +16,7 @@ typedef struct bool d; bool q; bool e; + bool freeLook; } InputState; typedef struct diff --git a/src/input.c b/src/input.c index dad151b..85485af 100644 --- a/src/input.c +++ b/src/input.c @@ -29,6 +29,7 @@ static void HandleKeyDown(GameState *gs, SDL_KeyCode sym) case SDLK_d: gs->input.d = true; break; case SDLK_q: gs->input.q = true; break; case SDLK_e: gs->input.e = true; break; + case SDLK_TAB: gs->input.freeLook = !gs->input.freeLook; break; } } diff --git a/src/model.c b/src/model.c index 4ed4fa1..3a9caed 100644 --- a/src/model.c +++ b/src/model.c @@ -217,6 +217,17 @@ Model Model_LoadGltf(char *path) printf("skin: %s, joints: %d\n", skin->name, skin->joints_count); model.jointMatrices = calloc(skin->joints_count, sizeof(mat4)); + for (int i = 0; i < skin->joints_count; i++) + { + cgltf_node *joint = skin->joints[i]; + + if (0 == strncmp(joint->name, "DEF-spine.004", 13)) + { + printf("head joint: %s\n", joint->name); + model.head = joint; + } + } + printf("Finished loading glTF model file.\n"); return model; } @@ -228,154 +239,3 @@ void Model_Free(Model model) cgltf_data *data = model.data; cgltf_free(data); } - -static enum -{ - OBJ_MAX_LINE_LENGTH = 256, - OBJ_MAX_ELEMENTS = 1024, - SHAPE_MAX_COORDS = 4096, - SHAPE_MAX_INDICES = 1024, -}; - -static struct VertRef -{ - uint16_t xyzIndex; // refers to a vertex in the obj file - uint16_t uvIndex; // refers to a UV texture coord in the obj file - uint16_t outIndex; // index of the combined vertex (xyzuv) in the output array -}; - -static int VertRef_Compare(const void *itemA, const void *itemB, void *udata) -{ - const struct VertRef *a = itemA; - const struct VertRef *b = itemB; - - if (a->xyzIndex < b->xyzIndex) return -1; - else if (a->xyzIndex > b->xyzIndex) return 1; - else return a->uvIndex < b->uvIndex ? -1 - : a->uvIndex > b->uvIndex ? 1 - : 0; -} - -static uint64_t VertRef_Hash(const void *item, uint64_t seed0, uint64_t seed1) -{ - const struct VertRef *vr = item; - uint64_t data = (uint64_t)vr->xyzIndex << 32; - data |= (uint64_t)vr->uvIndex; - return hashmap_sip(&data, sizeof(uint64_t), seed0, seed1); -} - -static void ReadCoords(const char *str, float *coords, int n) -{ - char *end = NULL; - - for (int i = 0; i < n; i++) - { - coords[i] = strtof(str, &end); - if (end == str) break; - str = end; - } -} - -static int ReadIndex(const char **str) -{ - const int maxLen = 15; - char buffer[maxLen + 1]; - int i; - - buffer[maxLen] = '\0'; - - for (i = 0; i < maxLen; i++) - { - char c = str[0][i]; - - if (c == '/' || c == '\0' || c == EOF || isspace(c)) - { - buffer[i++] = '\0'; - break; - } - - buffer[i] = c; - } - - *str += i; - return atoi(buffer); -} - -Shape *Model_ReadObjFile(const char *path) -{ - struct hashmap *map = hashmap_new(sizeof(struct VertRef), 256, 0, 0, VertRef_Hash, VertRef_Compare, NULL, NULL); - FILE *file = fopen(path, "r"); - - char line[OBJ_MAX_LINE_LENGTH]; - vec3 xyzVertices[OBJ_MAX_ELEMENTS]; - vec2 uvVertices[OBJ_MAX_ELEMENTS]; - int xyzNum = 0; - int uvNum = 0; - - GLfloat outVertices[SHAPE_MAX_COORDS]; - GLushort outIndices[SHAPE_MAX_INDICES]; - int numVertices = 0; - int numIndices = 0; - int numTriangles = 0; - - while (fgets(&(line[0]), OBJ_MAX_LINE_LENGTH, file) != NULL) - { - switch (line[0]) - { - case '#': // comment - break; - case 'o': // named object - xyzNum = 0; - uvNum = 0; - break; - case 'v': // vertex or texture coord - if (line[1] == 't') - ReadCoords(&(line[3]), (void*)&(uvVertices[uvNum++]), 2); - else - ReadCoords(&(line[2]), (void*)&(xyzVertices[xyzNum++]), 3); - break; - case 's': // smooth shading option - break; - case 'f': // face (assume it's a triangle) - { - const char *str = &(line[2]); - - for (int i = 0; i < 3; i++) - { - struct VertRef vertRef; - vertRef.xyzIndex = ReadIndex(&str) - 1; - vertRef.uvIndex = ReadIndex(&str) - 1; - struct VertRef *existing = hashmap_get(map, &vertRef); - - if (existing == NULL) - { - vertRef.outIndex = numVertices++; - outIndices[numIndices++] = vertRef.outIndex; - GLfloat *vOut = &(outVertices[vertRef.outIndex * 5]); - vOut[0] = xyzVertices[vertRef.xyzIndex][0]; - vOut[1] = xyzVertices[vertRef.xyzIndex][1]; - vOut[2] = xyzVertices[vertRef.xyzIndex][2]; - vOut[3] = 1.0f - uvVertices[vertRef.uvIndex][0]; - vOut[4] = uvVertices[vertRef.uvIndex][1]; - hashmap_set(map, &vertRef); - } - else - { - outIndices[numIndices++] = existing->outIndex; - } - } - - numTriangles++; - } - break; - default: - break; - } - } - - fclose(file); - hashmap_free(map); - - printf("Imported model with %d triangles.\n", numTriangles); - return Shape_New(outVertices, numVertices * 5, outIndices, numIndices, 1); -} diff --git a/src/model.h b/src/model.h index e3a1155..66676cc 100644 --- a/src/model.h +++ b/src/model.h @@ -8,6 +8,7 @@ typedef struct { void *data; void *skin; + void *head; mat4 *jointMatrices; GLuint *vbos; GLuint vao; diff --git a/src/render.c b/src/render.c index 74669af..1371e23 100644 --- a/src/render.c +++ b/src/render.c @@ -334,18 +334,39 @@ static void Transform(ShapeInstance *instance, mat4 *matrix) static void DrawModel(GameState *gs) { - Model model = gs->testModel; - ShapeInstance instance = model.instance; - cgltf_data *data = model.data; - cgltf_skin *skin = model.skin; + Model *model = &gs->testModel; + ShapeInstance instance = model->instance; + cgltf_data *data = model->data; + cgltf_skin *skin = model->skin; cgltf_animation *anim = data->animations; mat4 modelMatrix; glm_mat4_identity(modelMatrix); - Transform(&model.instance, &modelMatrix); - uint64_t ticks = SDL_GetTicks(); + if (!gs->input.freeLook) + { + // rotate the whole model to stay within this angle relative to the camera yaw + const float turnThreshold = 1.047197f; // 60 degrees + const float deg180 = 3.14159f; + const float deg360 = 6.28318f; + // convert camera yaw (rotation around Y axis) to radians and add 90 degrees so it aligns with the gltf model + float camYawRadsGltf = (gs->camera.rotation[0] / -57.295828f) + 1.570795f; + if (camYawRadsGltf > deg180) camYawRadsGltf = camYawRadsGltf - deg360; + float *modelYaw = model->instance.rotation + 1; + float diff = camYawRadsGltf - *modelYaw; + if (diff > deg180) diff -= deg360; + else if (diff < -deg180) diff += deg360; + + if (turnThreshold < diff) + *modelYaw = camYawRadsGltf - turnThreshold; + else if (diff < -turnThreshold) + *modelYaw = camYawRadsGltf + turnThreshold; + } + + Transform(&model->instance, &modelMatrix); + + uint64_t ticks = SDL_GetTicks64(); float t = ticks / 1000.0f; - while (t > 2.0f) t -= 2.0f; + while (t > 1.0f) t -= 1.0f; // apply local transformations for each bone for the current animation frame for (int i = 0; i < anim->channels_count; i++) @@ -415,14 +436,34 @@ static void DrawModel(GameState *gs) } } + if (!gs->input.freeLook) + { + // make head look where camera is looking + cgltf_node *head = model->head; + vec3 a, b, yAxis; + glm_vec3_zero(a); + glm_vec3_zero(b); + glm_vec3_zero(yAxis); + yAxis[1] = 1.0f; + a[2] = 1.0f; + glm_vec3_rotate(a, model->instance.rotation[1], yAxis); + b[0] = gs->camera.front[0]; + b[2] = gs->camera.front[2]; + versor desiredRotation, temp; + glm_quat_from_vecs(a, b, desiredRotation); + for (int i = 0; i < 4; i++) temp[i] = head->rotation[i]; + glm_quat_mul(temp, desiredRotation, temp); + for (int i = 0; i < 4; i++) head->rotation[i] = temp[i]; + } + // recalculate the joint matrices for (int i = 0; i < skin->joints_count; i++) { cgltf_node *joint = skin->joints[i]; - cgltf_node_transform_world(joint, (float*)model.jointMatrices[i]); + cgltf_node_transform_world(joint, (float*)model->jointMatrices[i]); mat4 inverseBind; cgltf_accessor_read_float(skin->inverse_bind_matrices, i, (float*)inverseBind, 16); - glm_mat4_mul(model.jointMatrices[i], inverseBind, model.jointMatrices[i]); + glm_mat4_mul(model->jointMatrices[i], inverseBind, model->jointMatrices[i]); } int shaderId = gs->modelShaderProgramId; @@ -430,12 +471,12 @@ static void DrawModel(GameState *gs) glUniformMatrix4fv(glGetUniformLocation(shaderId, "theModelMatrix"), 1, GL_FALSE, (void*)(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderId, "theViewMatrix"), 1, GL_FALSE, (void*)(gs->viewMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderId, "theProjMatrix"), 1, GL_FALSE, (void*)(gs->projMatrix)); - glUniformMatrix4fv(glGetUniformLocation(shaderId, "theJointMatrices"), 64, GL_FALSE, (void*)(model.jointMatrices)); + glUniformMatrix4fv(glGetUniformLocation(shaderId, "theJointMatrices"), 64, GL_FALSE, (void*)(model->jointMatrices)); glUniform1f(glGetUniformLocation(shaderId, "texIndex"), 6.0f); glBindTexture(GL_TEXTURE_2D, gs->textureId); - glBindVertexArray(model.vao); - glDrawElements(GL_TRIANGLES, model.indexCount, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(model->vao); + glDrawElements(GL_TRIANGLES, model->indexCount, GL_UNSIGNED_SHORT, 0); } void Render_Draw(GameState *gs)