From f548bdebb99fd47292577d4e142fe5da2db41b9b Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Thu, 26 Oct 2023 14:49:27 +0700 Subject: [PATCH] Pressing 1-4 loads a different sprite animation --- animation.h | 24 +++++++++ assets/player.png | Bin 0 -> 16327 bytes lib.h | 11 +---- main.c | 121 +++++++++++++++++++++++++++++++++++++++------- shaders/main.frag | 29 ++++++++--- 5 files changed, 149 insertions(+), 36 deletions(-) create mode 100644 animation.h create mode 100644 assets/player.png diff --git a/animation.h b/animation.h new file mode 100644 index 0000000..459a9d9 --- /dev/null +++ b/animation.h @@ -0,0 +1,24 @@ +#pragma once + +typedef struct { + char* name; + byte* imgData; + u16 animCount; + u16 width; + u16 height; +} SpriteSheet; + +typedef struct { + char* name; + f32 posX; + f32 posY; + u16 rows; + u16 cols; + u16 width; + u16 height; +} Animation; + +typedef struct { + float timeElapsed; + int frame; +} AnimationPlayback; diff --git a/assets/player.png b/assets/player.png new file mode 100644 index 0000000000000000000000000000000000000000..8809f43f3ad476f71ee40a4531945be4a929aa88 GIT binary patch literal 16327 zcmeHudpwi<|Nph~u-TkvWY$y;(b%xM)y6cX(<;hc(neS(iIgP9m=1HOD4jG-wMwBB zI?l1t$>Mga5TaC)q@1_!rO*AT`}fcHpYLD4$HPCD>#^(F`~5mTpRd>JJqNkVy|CIu zZ2$nUix+vW0sts@3kA?f@Xug$<0t?y(-wQW`$Pu>5fCyml?eU+`?3oIsZrHiU=vh$ z!q1C8IpfxIVTYaOxJG%sQ{7X^c>19tPx z`RGa?g zL#UY5bv@=S0>r#^fNm?^PaxTM$nabX@9S6jSjzHOvc)i-e3npE5jiO^uNXQ_iC3%< z>n7Kcj6-C7B;rU)$X0-*WvT8p$lRaLwt=Lt0eeeT7oP{s+F=N-oH2pBHGnGpfoS2|wvJ=BMy%?6=q%r}BK1yuPZrc?8J9gD zBK3O1?Q@sj-7k0Maax)E$+g@i8g|)uLfJIKPo+e_vaI|Snh>R_?}c)=!-2VwcI`uB z$y+q2eRjq#KeP9ux5`(POYX$C>tyC;s#79H*pk<%$nQ=c)wzGDy|RA#uCRyFcxak- zs!3)*z5cAs%(8HFUIXY{e=F=?gG~QAlE;0`_Q!`3ykDTA9BN!+96zedO`;6HK(j~a zKyWUp15RZ$%qg0Gp#01jdIUm;(muw$N>*@nHMytMDKR6W-njOKObL5)l40gCPU~}O z9>n)HZA1_6gj&BSY=(I4{$V z+htfbcOAsPTttK@8DqioV#|NTTwbO@ZOx*AM)->$9d&219U&R7M1-YT)-jMYf4pvT z9^<1rA^k$`8MTVN!+I@?TJm;@-l``@F{1keB+%NM;oNHwz*ea>gU7WqJ}yM9w=-U| zGjUwF9j!}ub@f}{p+qno7w;%ch5j_Y1YF5I*A)!-jInO*X#^Hw{T7A^zCWIt4!&@X zzX*CI4ZwRVddT!_BBTd_9>tsI@1*&eIkN8q;D(ChB=-CXk;e|}6HH}MdK)@Jy#+Xq zbcSa9g>AYlTsf4k&;tSu!rN&N-S?d`$_L7uv{Atxen`(BmAu-de-<$zvgc0VQU*|` zNxUrP(&cU2+A`!Dc)>mLG1Q)2E3Y{{h@J@v;@8R4FiejYU}(-UbHSYA00ZX5)sc|Q zW@s77O4x_W7&~I8PT1DSi)21&Rpum&K#YIL`YtW6F;DBj>72~XQ1ip4UFpUx7!q}< zZ^tT5aZ#&HwIeKV_miTSl~NS_zHalL53qcr`J>z>mUz{jK_myyDHwMTgWd`(a^|u6 zP`;y7x8^|8zwzeEvz8^ei~Wy`cY|AOJVZ?UKr)VD=Z=?~G>p#FAr$!z4q40(Bxr+B zBVrzxzc6^zGzwd|;KtAqyJ=jg?%X|L^%7|NmiyDkAnPy8&0g1$Hz?$Nb@~|hF}Ob0 zTn$b1by8u>cID7VLb2zF--wc5^nEkyStq(ggX}7lxTxkDw`Vb>! z3zQR9g-Iqex}pKlYi3aDP=TWpu^4p-bbnm1wj*Mgw@kynKMpA)8Qv~rSo*~2-aZx5 zIDugkxlwRnW9PK|Tu*N(as;wwukJ+~%qpG!a$^%v=u(2I?oXQ(jk~9ffN8s}mfl!- z?o7R`$A#tB0l5*)fVYJU6omt4EAHNg?i~!I(gW-5q>~9wW;DLgaOcElw63sj#ntFG zP73eF3nY|-z{eYuQ!e05mr@AScu>d(CwG=!h!?N?$#1Mx=!{lCTHH@~^6hz5Qadl4 zIb$dFV_e;mL%9~}%p?Wt5{Q0kF!p(WlTrsqb&d~t^`aHw#0SJfsR3P+fiM9g>Jaml zulaAHnY#OjasTgzfbh`NG%<7wy6W8i0n(qFa*Lh_2&prV{+H9S349Z%&$SkDO!vXQ zIKOSUTO5Ue5>lK;{I$2GA=GCpfcai$aAGWF9fem)59HkJ`^oZ?7hpSEc#v50_Ntqf zZ@x@#>3uvQHAU4(|5g65wxOx1$iIGlLGklWsgs~WDg;+ZzxDyySPXu2U>SVacr>*S zPOvuv+4d*p(&6IuXo&;V^RP;F79%?u`_HG~bE_mpkBfp&cr1GjcD^`~_dOdgg+8o$l`#1%Rh6}FJ z*-NW#alh7G-H5TotanRk*=K>N6&uD|-gWIi`KBjLtU9{mAN2_wGr%(ixXs^{5wgw5 zI;LCeW>Q-!;E~02d0yF~d-U6eQNaJt^952;&)!{wb>}je_1*5N0Kvi@@jDhc0qDYv zPr+cxD1T8EY%Cv0@*RiGO-g%SFx-M`KwY7tZgkGN_yXlz!&(ig8V;pb{!51zy!3T2 zOUhBOaJdGn6LeGZgx3a`CV1+df%xJ)vtQ9DOaT^0mMbeiD6>9P)3o~Qx>sr-r5!Ie zVintD*o?V*2HU>zP93g!hsqw~TO^JI6<#83dT4p~`;Nybac*ad%5C2740w&VybA#$ zjOBX5Yd0Xy(0aQS88O^$Q45+d8w+fU1ALE{CdN_Mo-ehH&)8Vpc-_%I?HF-8Tyos@ zcMpM~pM+-E?NShnrF_BOn|m>A{#Vn;RNz^cW23mi-H3@!zc}DiZVfqi9|x8nv7?1Nfg&Aem5D+c~k-A`(6xz_}6G-BrKdlU$ek<|z7 zZF(GHkQPo}$IZ0kgvpvOD?+TX_VxW5!O{OGZ@K8gdM5%evYTD>2={4j&^NZSERx-4 zc~%8R(7&v2nF9RP1SsB}RHaCZeAS|B&>11kvGN&agKf-#it1b!ecGwue;NZY^W`L{ zVJg6~J-Ib}ZPCEl#39Mf@1v-#UrZa(z%}V3m(aA{6S>V}Dbl{Ro?4wOX-tTC}>%Lcr@LvGi_TYp!3naz` zUnwtiA+x@sf$O;gx%d2Z=gN;vIL;$dPho#+DqaF&Bxi;dTs%NW&fUp)m2J9gJG?*3Q1K&~VMZv}p7 zzrqLe0Dpiv*2TPW)tLAgb9o>}emCB#>)<3`)q=g}Prry}!@(@h{wDUO@W97;n+{Aq zR{eY|bcS>GNnyvR;l4TS3t$V_$~<}qc3gD>ghAw1v}6qnWfs{LA zUfyCtD}rTt(aYq#ifM=W?psyKH=;W*C1Gr{?RFsR^=pA#4dj%X+rv=~x#{8wg^80a zb>nD_d(#3~e>wBQ>4*GVenpxlsYAi!f`OGG#SkH-$!lM(%m{x0Z1C;sRXG+D9>AKt ziQB6F0)Sd<6Gy?_qgk}<6P=0T730nAIg7O*nE_S$vkb54q_DWU!9xbNRVm&$!?iQ! z8QMP2^;>6o>9p!am>?NgW&#QPv=EoPze;v68l+RMd&EQTXALjybZ&24p!U~tu%7>G zf_4rm&D$LNvu8zZ7$AM@BYg;-|C9*GQg%vQD2ucba@!6Q>iWF){PDnBK)v`ew=Zsg z6e7HEdE^}hquJ}v!fMT=hz^&%N+2FVB%cG8Z;{0vpp-Q4DK!b*S#0 zl|pdmRr|t4_T!)d_}$v_fs~@jc6H^f@=0c&5Sjl0M!_mG2;~6;xXLJ+0c=YJXa(0W zA{ztUs3Dn2yAn~$Rc3V(%hc7E(>!x@Tduf zz%IkR^F}v?n_uZeIa~3wW?iSlwc~9<78efkw!$${Lo^AOwG#%c#TmZA&y$_n^Bo#n>dWex&-Lr3``M8PwFUArQl?4Qe|p=O z(GHe?>~Cf>5i%KtMcB!OH{uNc#?P~sqL$!@#viIM^F`WByl(8fN9YRbeG!=gnga(e z%kX72+mb&NATfpBg2D^?{T3wovOu>g)vW6h79ZCssvynnMQu$^wotR5PEanBSu0_} zYzymw{<-<@nS_}7p2!lm{R_|^MaixYEULIygoPv9txHKSTb0R-d?3ZwgH0~L7!6%o zvV#ZbAAS$TG*2#h#0=7NHY4HCG0=iyJzeX0TKF=3=nS}@U+1eik_Xj@viD2B9JhBU zsT9wPs%qvQt>L}Sp*6PRbo@8PTbd-MkKz=Sr2BaIVmG%e_z99SK*im|oQ`~<`Lfl~a#mY; z6CgC2uFS$kR0w@NMdWXMupXZ=BnxG1Lolo@3Vqd};V$FN>-rw~?oHGV_wx(7dH}g( z80R%aNtti0n^CE0lX+pt@1J2$Aqimn?cEnjC>Ppd0d9ACz=(86%FklX&PVN=&e;K% zuJr^v?11ZJA7RkdSmf%-Rlx8RmFZ8v2qk*=Ju?2G>?8FCKj%hj7KH)aU^B}IWYW|7 z8JfHw^#k<+!HnBE@^GEsDfyy7TNcLelz7TChMm4<43B-BzczR+q4K>(f;!p z8RoZhG`uA=FsAa1+b47G#+W;32{(S6Vl9O18i#s}9|Ub4v2Lc}57GVWL@@OaZiifH zL85KluD8BOOd-jKByLIS%rPkJc3DgLssqxyq%J+rz&K#YWRyE7AG3Mx)PrEyy|KC1 zuu6$lmgCjnW-_CCh0$1Hv1nZz=Ij=M{O&ovA(i`i9?uU4ZNw|u^kWr5{{-D83wYQN zjVctk^BRmnTgLT~eMTs+8QI3}7<^_QW1eJ40-@9 z$CK$Ph;RM8Y|Sh%*pE1a&Ga#c8Q@qzCw`S(efd3ga(4E#C}!}7b1!Nhvr;A@O3(n) zhi-BO3PHND;d-?)3yUU`!k(==YbgDP+Uu(5zqtRayqziu{?8`SGlNQGJJXr)&gTmf zY=+Y>>YMM@NexCu;V1oi@p%H+;TAJbje?C!bPCWQfEyS=HAV7KW>Q5M$maBuy8dX% z#R*j-STj`8;eLY81^jwg^;(sv3pr+82l_SRSq$54A{~6^3RpRacY;-R?T*qIJ=to! z?4`~QH0GF%L^a4f^{iGqL1lAKmBfCGmp(ECas#Ram~=6aizn1o*2_M`)Az3i%a+yA zvdsr(lBsu)JUSoy1FRodUJX5qbQ31mP;WMd%CJC%`{5m@0=@I0!JLtt z(VUyupY{TH7I*TQ(C#zq+w*uk0cGBXm`dprGuh_&;%63E$T*o*peHPEh9wVeX^R_{ z^erfCnecEPtPk?(eVD9wUYclVjdq>Wf0ERy-Am01re@mFzDGwdirJ%~1cZnN zm%jiM>qlnqOdN@&8d)gWrz8(GLLHr0Q|!AG4OkN-+U?=uHd8%qVww%Y4U}(0F;=iO z!paHAGA7n>tp2`>U?QOtynszB zK3Nc;0bs?`lUu91L+BicEcR!V3eP!4|h@a!sqG| zrA9X4@DT2r@xnpiO6+ZWJ2me7&Or|pdjV_loQG;n$fh7(&~SDCCuaVD=ZY1DZmrQO z$c8Pfx3I?Sy+dE-SEg$+22kLj$m24u4#sw#NN>8rrookM2;j8W3B2BLy8nnMk-X*Q zd$I|!aACY+>DXkm>mJFpnP14iiT zE6+(&Zhk_OB&zUID%|=kRH2NP)}gky;rl$fUksWXc$-i^T%%7$n+hYlVfqQB#`fg3 zXQXXr4)KX#?8wt^-?d%J?u7Z-k%o00-x$we+FxoR??RRaU*l=$Q8o;J<{oj z&9)*4T|X2b040@IzMq-5P{9jU4Dbr`u4*tcunF!VOb&kPY507q<;4LAmUf7$B`T&? zIQ6rf;pk-AHnhpb9B-j0uk-w+&52VpmG$$Ei|ousl*Zj zTsWKsyZa@$mG`Y;E`))#c%iR!C1&|<7tZPWQyNS_vfo6)1&E9EB))im+Od-cy~uVS zJVik7`BtF85#1>y3o(w zEJ$eC?ZQs(csdmC*NQrI#plQ|9w86tGx3w@ESWn`(4bpsO*l$sg~5OvzcNO%sdiS0 zXg(>~2a-FK18TPjOPNE#9kAFn-)gYVVEwjNPs;uvOgE+U*2nPuDvf;{_p85~Gzm?2 zA++RVVBJ#NLu*DT2u3Ny#V^uS;Ju{ws&4PSHyQ%96UZc8clnrDxj*Efv0tktF(yQK zA)cpSekxAbiRsxJQ&^2q;@)Va^GJJ%u%>47Co`O@QcrX&Pf8y7w0#1ju+jZFiEqR} zww!|ruLg#~eOb~r+OFn!?stzPP{T`ODT{7Y{#^*I#nxEB-R%3rck-f`@_v{zhDC>o z-tf}3OGz1ar0cGCFc)89G%HptWN7?>ak@80hBZTq9*P4;-EpoMrf0dyjEy1YR;kgF zQcl@>mtG<=M;*U=plg=HvjRzr{~Lm5@KFghw2jsml$LB7xU6OHAk?bhnS7Ml~KKx`%7aZzo;n4Fb4g{s;W>fS0lO zgqetJA&nbO@7ryz=9zE%faZfBDG6ZGZL z?Fr~>41R1)g52#$3pN7f-LY&N1*j#_hboB_N~R|vqR%`#y-k>41Fc5nhzW0bM1-OV z%?bm?w~q*OAf~9*u=Xe3JCJLFS7y@TS0&*-QVfW_wW}qC!+D{LMFC(Rr9H2hbAG5`Gnb=pOQ?w&1uu*X0CHL!mdl-%Pl3X=*BH^ZU1g8^+uY)?BXTu zUOS|#XmP9&9n;5;g#{00X6_~=80kffKI*nQ^$4+Q1lU7c)cbP(j_lLa7NO6<&W~M~ z+it+_Sr0y}E*8HQWc@*e8m0h$9tQZyM&ZL>n7HF@rj?aUjM(6BUX(eVCer_7HY`!V znYUItoG-eIXhbWT*g&wSY3(d!9B>*nV3x{(EV9q9uQaHM-TWT=Z7iyD?E3k=IjNkQ>E2crK+o2ON#47COKglt+;6)*vnTF zKIr+(tdBMXUM{DeP9AaP+~Ex1Dfv!_cR~3dk+q#m3Xi$pH4t`d&z2N*?+Kqfx7p-t zT2n3C4i0veQk<74CS(!2xE(Ip;fM8ce^K-(-Ofe9?vX-)c}Z#K)9MQ?<>6JT49H3L z;Tnwiq|^o@4OSu$hltrER#@^6b49Y{wpX1Ep%2`Tt#a>U7xaPyXTj#}iWc0Ghq3q0 zskeSjG`Zo#vRfT)j=wVQZZyMw-}ojZW_bzaJ<2Z#U?kQEGu4VL1FRXu&rFdBC8?S5 zGm@X)wT??D8yQO{VV-ZipLn|ZX|=Op0I*uNA!v9s^>D}A(72k0j&w(2RegWRrpey{ zu`b{(FGGaE4#bzHaJzWAE2X5a9DzO?XwFIFT|& zgUv#XdvC5OC!~P~7Q9l?Hx(~+pY*PyEp|(((Yl#ZpBhDtEyezuMU1&+`aNOqjK%}y zogp;|ZPh@8D?N>xsQZ|Xl^>~PtfPT#inE8X(FPbi?)o z(Bx0?mKPwxTkU3;YwuN7?yJyL-Q2p}g$qAtTpizRDy+Z9G&EC)oN73JIr>a0&^hkZ=kK tr;u<838#>73JIr>@P9=@t|J^Uw|{zVWA$?k_z(KP;)TmSuY2$k{|EFh!Dj#f literal 0 HcmV?d00001 diff --git a/lib.h b/lib.h index 0def033..3c39aeb 100644 --- a/lib.h +++ b/lib.h @@ -8,6 +8,7 @@ typedef uint8_t u8; // typedef char16_t c16; typedef uint16_t u16; +typedef int16_t i16; typedef int32_t b32; typedef int32_t i32; typedef uint32_t u32; @@ -19,16 +20,6 @@ typedef char byte; typedef ptrdiff_t size; typedef size_t usize; -typedef struct Animation { - char* name; - u16 x_pos; - u16 y_pos; - u16 rows; - u16 cols; - u16 width; - u16 height; -} Animation; - typedef struct s8 { u8* data; usize size; diff --git a/main.c b/main.c index b181208..35bffb2 100644 --- a/main.c +++ b/main.c @@ -7,6 +7,7 @@ #include "lib.h" #include "stb_image.h" #include "rendering.h" +#include "animation.h" #include "libcyaml/include/cyaml/cyaml.h" #define PI 3.14159f @@ -20,6 +21,7 @@ typedef struct State { float px; float py; int spriteY; + int currentAnim; } State; void framebuffer_size_callback(GLFWwindow* window, int width, int height) { @@ -35,11 +37,17 @@ void processInput(GLFWwindow *window, State* state) { } float amount = 1.0f; - if (glfwGetKey(window, GLFW_KEY_J) == GLFW_RELEASE) { - state->spriteY -= 1; + if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS) { + state->currentAnim = 0; } - if (glfwGetKey(window, GLFW_KEY_K) == GLFW_RELEASE) { - state->spriteY += 1; + if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS) { + state->currentAnim = 1; + } + if (glfwGetKey(window, GLFW_KEY_3) == GLFW_PRESS) { + state->currentAnim = 2; + } + if (glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS) { + state->currentAnim = 3; } if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) { state->camY -= amount; @@ -53,7 +61,7 @@ void processInput(GLFWwindow *window, State* state) { if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) { state->camX += amount; } - amount = 1.1f; + amount = 2.1f; if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { state->py -= amount; } @@ -128,13 +136,63 @@ int main(void) { unsigned int textureID; int width, height, channels; - char* data = (char*)stbi_load("assets/player.png", &width, &height, &channels, 4); + byte* data = (char*)stbi_load("assets/player.png", &width, &height, &channels, 4); // char* data = (char*)stbi_load("imports/sprites/player/idle.png", &width, &height, &channels, 4); if (data == NULL) { fprintf(stderr, "Could not load texture\n"); return -1; } + SpriteSheet spriteSheet = { + .name = "player", + .imgData = data, + .animCount = 4, + .width = width, + .height = height, + }; + + Animation idle = { + .name = "idle", + .posX = 0, + .posY = 0, + .rows = 1, + .cols = 10, + .width = 48, + .height = 48, + }; + + Animation run = { + .name = "run", + .posX = 0, + .posY = 48 * 3, + .rows = 1, + .cols = 8, + .width = 48, + .height = 48, + }; + + Animation jump = { + .name = "jump", + .posX = 0, + .posY = 48, + .rows = 1, + .cols = 3, + .width = 48, + .height = 48, + }; + + Animation land = { + .name = "land", + .posX = 0, + .posY = 48 * 2, + .rows = 1, + .cols = 9, + .width = 48, + .height = 48, + }; + + Animation playerAnims[4] = {idle, run, jump, land}; + glGenTextures(1, &textureID); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID); @@ -169,7 +227,6 @@ int main(void) { glUseProgram(shaderProgram); - // vec4 vec = {1.0f, 0.0f, 0.0f, 1.0f}; mat4 model; mat4 projection; glm_mat4_identity(model); @@ -179,10 +236,8 @@ int main(void) { glm_translate(model, (vec3){state.px, state.py, 0.0f}); glm_translate(model, (vec3){0.f, 0.f, 0.0f}); glm_translate(model, (vec3){pivotx, pivoty, 0.0f}); - // glm_rotate(model, currentFrame, (vec3){0.0f, 0.0f, 1.0f}); glm_scale(model, (vec3){100.0f, 100.0f, 0.0f}); glm_translate(model, (vec3){-pivotx, -pivoty, 0.0f}); - // printf("X:%f Y:%f Z:%f\n", projection[3][0], projection[3][1], projection[3][2]); float worldUnitSizeInPixels = 2; // Desired size of a 1x1 area on the screen float hw = (SCREEN_WIDTH / 2.f) / worldUnitSizeInPixels; @@ -197,26 +252,56 @@ int main(void) { location = glGetUniformLocation(shaderProgram, "projection"); glUniformMatrix4fv(location, 1, GL_FALSE, projection[0]); - location = glGetUniformLocation(shaderProgram, "spriteColor"); - glUniform3f(location, 1.0f, 1.0f, 1.0f); + glUniform1i(glGetUniformLocation(shaderProgram, "image"), 0); + + Animation anim = playerAnims[state.currentAnim]; elapsed += deltaTime; if (elapsed > 0.1f) { frameCount += 1; - if (frameCount > 9) { + if (frameCount >= anim.cols) { frameCount = 0; } elapsed = 0.0f; } - location = glGetUniformLocation(shaderProgram, "spriteX"); - float spriteX = (float)frameCount / 10; - glUniform1f(location, spriteX); + location = glGetUniformLocation(shaderProgram, "posX"); + glUniform1f(location, anim.posX); - location = glGetUniformLocation(shaderProgram, "spriteY"); - glUniform1f(location, state.camY); + location = glGetUniformLocation(shaderProgram, "posY"); + glUniform1f(location, anim.posY); + + location = glGetUniformLocation(shaderProgram, "animRow"); + glUniform1i(location, frameCount); + + // We don't animate on the Y axis yet + location = glGetUniformLocation(shaderProgram, "animCol"); + glUniform1i(location, 0); + + location = glGetUniformLocation(shaderProgram, "rows"); + glUniform1i(location, anim.rows); + + location = glGetUniformLocation(shaderProgram, "cols"); + glUniform1i(location, anim.cols); + + location = glGetUniformLocation(shaderProgram, "spriteWidth"); + glUniform1i(location, anim.width); + + location = glGetUniformLocation(shaderProgram, "spriteHeight"); + glUniform1i(location, anim.height); + + location = glGetUniformLocation(shaderProgram, "atlasWidth"); + glUniform1i(location, spriteSheet.width); + + location = glGetUniformLocation(shaderProgram, "atlasHeight"); + glUniform1i(location, spriteSheet.height); + + // location = glGetUniformLocation(shaderProgram, "spriteColor"); + // glUniform3f(location, 1.0f, 1.0f, 1.0f); + + // SpriteSheet spriteSheet = spriteSheet; + // printf("%i\n", state.currentAnim); - glUniform1i(glGetUniformLocation(shaderProgram, "image"), 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID); diff --git a/shaders/main.frag b/shaders/main.frag index 72d9912..5fba5a9 100644 --- a/shaders/main.frag +++ b/shaders/main.frag @@ -3,20 +3,33 @@ in vec2 TexCoords; out vec4 color; uniform sampler2D image; + +uniform float posX; +uniform float posY; +uniform int animRow; +uniform int animCol; +uniform int rows; +uniform int cols; +uniform int spriteWidth; +uniform int spriteHeight; +uniform int atlasWidth; +uniform int atlasHeight; + +// Unused for now uniform vec3 spriteColor; -uniform float spriteX; -uniform float spriteY; void main() { - float r = (48.0 / 512.0); - float x = TexCoords.x * r + (int(spriteX * 10)) * r; - // float y = TexCoords.y * r + (int(spriteY * 10)) * r; - float y = TexCoords.y * r; + float rw = (float(spriteWidth) / float(atlasWidth)); + float rh = (float(spriteHeight) / float(atlasHeight)); + float x = TexCoords.x * rw + posX + animRow * rw; + float y = TexCoords.y * rh + (posY / float(atlasHeight)) + animCol * rh; float minb = 0.005; float maxb = 0.995; - if (TexCoords.x <= minb || TexCoords.x >= maxb - || TexCoords.y <= minb || TexCoords.y >= maxb) { + bool drawDebugBorders = + TexCoords.x <= minb || TexCoords.x >= maxb + || TexCoords.y <= minb || TexCoords.y >= maxb; + if (drawDebugBorders) { color = vec4(1,0,0,1); } else { color = texture(image, vec2(x, y));