From ac0875103dfb722a3c9dcaf15215db613337aafd Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Fri, 29 Sep 2023 22:23:01 +0700 Subject: [PATCH] IT SPINS --- .gitignore | 1 + Godot/Scenes/Player.tscn | 156 ++++++++++++------------- game/Makefile | 8 +- game/README.org | 1 + game/assets/idle.png | Bin 0 -> 1438 bytes game/assets/jump.png | Bin 0 -> 1021 bytes game/assets/land.png | Bin 0 -> 1500 bytes game/assets/run.png | Bin 0 -> 3254 bytes game/assets/walk.png | Bin 0 -> 2444 bytes game/lib.h | 117 +++++++++++++++++++ game/shaders/main.frag | 10 ++ game/shaders/main.vert | 13 +++ game/tenchu.c | 238 ++++++++++++++++++++++++++------------- 13 files changed, 383 insertions(+), 161 deletions(-) create mode 100644 game/assets/idle.png create mode 100644 game/assets/jump.png create mode 100644 game/assets/land.png create mode 100644 game/assets/run.png create mode 100644 game/assets/walk.png create mode 100644 game/lib.h create mode 100644 game/shaders/main.frag create mode 100644 game/shaders/main.vert diff --git a/.gitignore b/.gitignore index c55a259..0e53370 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .godot/ /Assets/ /game/tenchu +/game/.idea/ diff --git a/Godot/Scenes/Player.tscn b/Godot/Scenes/Player.tscn index b1f3ea9..4e3ee85 100644 --- a/Godot/Scenes/Player.tscn +++ b/Godot/Scenes/Player.tscn @@ -47,84 +47,6 @@ tracks/2/keys = { "values": [0, 1, 2, 3, 4, 5, 5, 6, 7] } -[sub_resource type="Animation" id="Animation_1l7dh"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:frame") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [0] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:texture") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [ExtResource("1_h6xei")] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath(".:hframes") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [10] -} - -[sub_resource type="Animation" id="Animation_dl063"] -resource_name = "Walk" -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:texture") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [ExtResource("1_h6xei")] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath(".:hframes") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [8] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath(".:frame") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), -"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), -"update": 1, -"values": [0, 1, 2, 3, 4, 5, 6] -} - [sub_resource type="Animation" id="Animation_2yfkp"] resource_name = "Jump" tracks/0/type = "value" @@ -164,6 +86,45 @@ tracks/2/keys = { "values": [0, 1, 2] } +[sub_resource type="Animation" id="Animation_1l7dh"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:texture") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_h6xei")] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:hframes") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [10] +} + [sub_resource type="Animation" id="Animation_oejr4"] resource_name = "Run" length = 0.75 @@ -204,6 +165,45 @@ tracks/2/keys = { "values": [0, 1, 2, 3, 4, 5, 6, 7] } +[sub_resource type="Animation" id="Animation_dl063"] +resource_name = "Walk" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:texture") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [ExtResource("1_h6xei")] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:hframes") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6] +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_6srtp"] _data = { "Idle": SubResource("Animation_vrt4p"), diff --git a/game/Makefile b/game/Makefile index 375b380..2ca327b 100644 --- a/game/Makefile +++ b/game/Makefile @@ -1,8 +1,8 @@ P=tenchu -OBJECTS= +OBJECTS=-l:libcglm.so CFLAGS=-g -Wall -Wextra -O0 -LDLIBS=-lglfw -lOpenGL -INCLUDES=-I./libs/glad/include/ +LDLIBS=-lglfw -lOpenGL -lm +INCLUDES=-Ilibs/glad/include/ -Ilibs/ CC=gcc RM=rm -vf @@ -18,3 +18,5 @@ run: build clean: $(RM) $(P) +.PHONY: all +all: build diff --git a/game/README.org b/game/README.org index db0f386..155bc4a 100644 --- a/game/README.org +++ b/game/README.org @@ -19,3 +19,4 @@ gcc -Ilibs/glad/include/ -c libs/glad/src/glad.c * Terms VBO - vertex buffer objects VAO - vertex array object +EBO - element buffer objects diff --git a/game/assets/idle.png b/game/assets/idle.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf0c430a8cdd6b2418cdb6c35eb528bf38bc103 GIT binary patch literal 1438 zcmZ`(eK?Z~6n~fR$}K7LSefyMqO1=^O@_?3iKmA7EMhnAaFLYjmFTWibxW#4gw0sial6{GMohW0g#y_ax$RPQqBq^C++qK&QfaxVk>aaDD-71{#s$7ZntMM?z}#YF$cJ_4(ME=5W)oA}K7 zKcRapdwadyCJKkC(iu_{CJI>>JjCs7Vx{OzkU& z>I7{?8rW`yRIqeHYFI+baL;FniXFfLnu551J;P4((<+IFVKEGVNrE?K$x}vRjS8N4 zW~ZZr8qRW%)G;M8NM|twDU}N?VZO<46Ykh>5<;gVy=Ar;!&^Z)kmJ;QdBGt#4wqyH z_UxAQ5Oo3-l>w$|cD{Z(6kVbo=~Sc!IJ?nsfBbDo8Fpjz;aF8mEr4P$sbAZ=!l*)U z*&T&BG?fIat5wsobP-dJd8+Xq#;CGwGPQQhE=~vG2h22O;BK(oai(3G7>si0<7D5z_ zw&P-7Mf~{FJ(1mH6DpFN-uQ+ADk6oSwq?Es*a@SqX5&WmN$=hyJ#cj&+@lEbTYOYQAFX8_J?b-rx*WjLucp={74?QYlNas99`2fjk-Jb3;3n zW8;87BSs5eelVN2)fXB0>Ch}AgsFJ{zP`G&m$WiXMRk%6&VOi*g}I9}s55GT6r^Z= zRBNvO3{^V6OFwUMw5*FYXU$&KH(4FzV>ZMlz!?ks%tNgSn#Qt@>4eckZ%r@tb7r0LPG`;caLV+IoBOW}hlUHEdtXC2Jh@WEm z?3Wn@7BxwnLwq5+AffrvwOLYwSok|p6C=YGY8#%url?19l}@C2*ATCo=Ih=ui*OVu zx;bLCGD|7MHzkCIZ@gRVjmEQ7U} zLs5iSL^ysQndjn_Z_)cK!3y?8`13c+Y_To1lzKf`rD(zM^$i(L=C%6^9Hexzmp9TP7J z3x2D_5a!4t4@Lw;++IjPL?TE)*M!XouFOAKKtr?u-6Zv(YkUXdi)sf zak0Mh>nO11+UfNJza4o$n<0Rk1Z07%>MV|KH|Cnd*}PH={w!JoU_k}q;T@2{2S2OR zD+a#QyBe@rHR$i1USRL^qA`5(r#B^2wb1c{XQEaxHcV>?NY(}bx#42)8SNHPEAhx+ zwgbTUmm?2ozQJTIB3(a3CTazbJxT1)Zea|u@~8|2{NOX;WZ4432(zCtQ7d>^3MYza z`pO61;cUJh#UB&2?YppT6D78R|4^6h|6#?IDsW4&75XzcI( zI|u+6TJ`se!ZF#4lOpqh+0S5p*beUt&(-{yaUWs}2=GNDGqzgZXbL{yCx91`EdrAH za5aCX+;6jxRN?`E{`@|6r*cN^Po;%Do_#4@uM~^*CnFzWVt7lNu6Os9ze}qfq(y&z zAN~3LRNk#6AiixSnJ2yu4LOwnk>Ay7)+Q(!7+wzKMJ61R2SEE47DYJB3DHoS125zG z=NfjWa)C7$d|>gvJRb?fU-ZQUv9Iw_V7=DGio;H>%!gN%iq-8`MjGM)49-BT&x$2f zCLY@o5T)$9hFE?0!P#ULO;mw=BX5G;-Lu&+QdMkLz^zYNPI6;W(H&45@yQ*hzGvh%)2y re59^(3$vL{@`WG>f*=TjXb=AZ>!Ac3Jx|zZ00000NkvXXu0mjfKxWs7 literal 0 HcmV?d00001 diff --git a/game/assets/land.png b/game/assets/land.png new file mode 100644 index 0000000000000000000000000000000000000000..2c24d6f4357ea83410f70d7fd04f5f77d36e323c GIT binary patch literal 1500 zcmZ`(c{J2}6rbS{W2x*>ae5=$WV|G@{V3aTh>@|yj1p0{q{&!jBIjj&mhfcI3rEw# zSfVC0<(ZPPq%vihC>}BlW-y?f66-h0knKKI`5_j_}FecV-Gx-bX?qJr{p zK|>(WHmPo*ATK==bCGUR0Zm4`pMhOwrG_(ac=d^&;s`cuczD`3a`2UekIYSi!vEhE_2gXUZ z`>2lA0aVUl!ipl4)M2G7&jk5- zueX+{Q<$RXgv^4)z7J56y{nwDTSZwLnds}I^b+R)xVg)oy3(v|zyYCV7jcl{V&`eH zR<{#p__VAnX<$KShGU_|+1i_^Y~F*;c^AEn#V&j7CST{#FtLYZ?zhKk-Ij#JNP( z0#rfL*Ot#*>Q^=%>3MH6XcTBxXbiDG@Fysm(P9h(sEC_y+^!6nanw)#nvb76OcW$m<%w>4#SF}U6? zU{5N6f*MeM5tjKeBh?%Cg;(DoU$P~Pfbxv8JqVlK6rBSfu8cg;TA(KLf6!HWVP3ia>!?%Bg zr!k$`xxOQaTe2s*&BU&(qC1oCXiBAn>$l@^t}2&aYq8$^?S4Tr<@tD`6H7WC zc&)=Z)T#7X3O5U_WHeguvNI@JejLy+hL92bmcyjF!hGCjpG-4Ayy zN%xK*Oj;}g15ohn=jPth?HF$`4>CKR~#|pOGo;Zn#Bt(0*3Jr z7c+#-+>V%CZ`$6*aKHl+8zHKVzWGp)VWSBDvJ-9nWcDR_kj1y73x#o9vS?jEPbL!E zC-Q11@w)sm?2~FutFt^j`I~dUCCN|s0~Wam-|BB-J)6m&)7Gyub1_jq$N^8Ks^f_B zG4ayxW2?#p^YbLa#vXQhYR)a;gt4hu90y1e1cL8TX?D4*=ow-8u{LQVISfmC*~Aeh zO600g?G$ut5L*)=9n`mCx^2CNfeHH%VT!kOp^^al51BJYu&<_ zd3BNjmEo}7p3TiqK}7Q|Z70)kXDr_zJ7Or!$XoQZ~kYxLu?(@_xT#dDwzVc3n=W^8ylyaMDlb zU2c$pm(XK1UK42TKTk5v8%yXN5+8>59J`N}m7O{n=;UA38v!*Poeg&GiPPr=CIoHn zl+f*^uer=Ylf|#^MZbS0gu+wg$J-oycQRlC$^4?!q4%iVEn!j#o!l`}DLh~lk4t5A urjx%H1FaTxt0ohAmlSPm_kZleXTci)B8?P-SwXx1Fr!?3Tv|`!vi<>k{PDv8 literal 0 HcmV?d00001 diff --git a/game/assets/run.png b/game/assets/run.png new file mode 100644 index 0000000000000000000000000000000000000000..615b2229f81fa53516db0910b73d045122d5c768 GIT binary patch literal 3254 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 T2VBy}Mn5?M3{*#fppG literal 0 HcmV?d00001 diff --git a/game/lib.h b/game/lib.h new file mode 100644 index 0000000..c9261f0 --- /dev/null +++ b/game/lib.h @@ -0,0 +1,117 @@ +#ifndef TENCHU_LIB_H +#define TENCHU_LIB_H + +#include + +void checkCode(int code, char* errorMsg) { + if (code < 0) { + fprintf(stderr, "Application Error %i: %s\n", code, errorMsg); + exit(1); + } +} + +void* checkPtr(void *ptr, char* errorMsg) { + if (ptr == NULL) { + fprintf(stderr, "Application Error: %s\n", errorMsg); + exit(1); + } + return ptr; +} + +void checkShader(unsigned int shader, int statusFlag, char* actionName) { + int success; + glGetShaderiv(shader, statusFlag, &success); + if (success < 0) { + fprintf(stderr, "%s Error %i\n", actionName, success); + exit(1); + } +} + +char* loadText(char* path) { + char* buffer = NULL; + long length; + FILE* f = fopen(path, "rb"); + if (f) { + fseek(f, 0, SEEK_END); + length = ftell(f); + fseek(f, 0, SEEK_SET); + buffer = calloc(length, sizeof(char)); + if (buffer) { + fread(buffer, 1, length, f); + } + fclose(f); + } + return buffer; +} + +void checkCompileErrors(unsigned int object, char* type) +{ + int success; + char infoLog[1024]; + if (strcmp("PROGRAM", type)) + { + glGetShaderiv(object, GL_COMPILE_STATUS, &success); + if (!success) + { + glGetShaderInfoLog(object, 1024, NULL, infoLog); + fprintf(stderr, "| ERROR::SHADER: Compile-time error: Type: %s \n %s\n", type, infoLog); + } + } + else + { + glGetProgramiv(object, GL_LINK_STATUS, &success); + if (!success) + { + glGetProgramInfoLog(object, 1024, NULL, infoLog); + fprintf(stderr, "| ERROR::Shader: Link-time error: Type: %s \n %s\n", type, infoLog); + } + } +} + +unsigned int compileShaderProgram(char* vertSrcPath, char* fragSrcPath, char* geoSrcPath) { + unsigned int vertShader, fragShader, geoShader; + + char* vertSrc = loadText(vertSrcPath); + vertShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertShader, 1, (const GLchar* const*)&vertSrc, NULL); + glCompileShader(vertShader); + checkCompileErrors(vertShader, "VERTEX"); + + char* fragSrc = loadText(fragSrcPath); + + fragShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragShader, 1, (const GLchar* const*)&fragSrc, NULL); + glCompileShader(fragShader); + checkCompileErrors(fragShader, "FRAGMENT"); + + char* geoSrc = NULL; + if (geoSrcPath != NULL) { + geoSrc = loadText(geoSrcPath); + geoShader = glCreateShader(GL_GEOMETRY_SHADER); + glShaderSource(geoShader, 1, (const GLchar* const*)&geoSrc, NULL); + glCompileShader(geoShader); + checkCompileErrors(geoShader, "GEOMETRY"); + } + + unsigned int program = glCreateProgram(); + glAttachShader(program, vertShader); + glAttachShader(program, fragShader); + if (geoSrcPath != NULL) { + glAttachShader(program, geoShader); + } + + glLinkProgram(program); + checkCompileErrors(program, "PROGRAM"); + + glDeleteShader(vertShader); + glDeleteShader(fragShader); + free(vertSrc); + free(fragSrc); + if (geoSrc != NULL) { + free(geoSrc); + } + + return program; +} + +#endif diff --git a/game/shaders/main.frag b/game/shaders/main.frag new file mode 100644 index 0000000..1b565a4 --- /dev/null +++ b/game/shaders/main.frag @@ -0,0 +1,10 @@ +#version 330 core +in vec2 TexCoords; +out vec4 color; + +uniform sampler2D image; +uniform vec3 spriteColor; + +void main() { + color = vec4(spriteColor, 1.0f) * texture(image, TexCoords); +} diff --git a/game/shaders/main.vert b/game/shaders/main.vert new file mode 100644 index 0000000..7afc638 --- /dev/null +++ b/game/shaders/main.vert @@ -0,0 +1,13 @@ +#version 330 core +layout (location = 0) in vec4 vertex; + +out vec2 TexCoords; + +uniform mat4 model; +uniform mat4 projection; + +void main() { + TexCoords = vertex.zw; + // gl_Position = model * vec4(vertex.xy, 0.0, 1.0); + gl_Position = projection * model * vec4(vertex.xy, 0.0, 1.0); +} diff --git a/game/tenchu.c b/game/tenchu.c index f2de21b..ca5373c 100644 --- a/game/tenchu.c +++ b/game/tenchu.c @@ -3,82 +3,62 @@ #include #include "glad/glad.h" #include +#include "cglm/cglm.h" +#include "lib.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +#define PI 3.14159f int SCREEN_WIDTH = 1024; int SCREEN_HEIGHT = 768; -void checkCode(int code, char* errorMsg) { - if (code < 0) { - fprintf(stderr, "Application Error %i: %s\n", code, errorMsg); - exit(1); - } -} +struct State { + float camX; + float camY; + float px; + float py; +}; -void* checkPtr(void *ptr, char* errorMsg) { - if (ptr == NULL) { - fprintf(stderr, "Application Error: %s\n", errorMsg); - exit(1); - } - return ptr; -} - -void checkShader(unsigned int shader, int statusFlag, char* actionName) { - int success; - glGetShaderiv(shader, statusFlag, &success); - if (success < 0) { - fprintf(stderr, "%s Error %i\n", actionName, success); - exit(1); - } -} - -void framebuffer_size_callback(GLFWwindow* window, int width, int height) -{ +void framebuffer_size_callback(GLFWwindow* window, int width, int height) { (void)window; glViewport(0, 0, width, height); SCREEN_WIDTH = width; SCREEN_HEIGHT = height; } -void processInput(GLFWwindow *window) -{ - if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) +void processInput(GLFWwindow *window, struct State* state) { + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, true); -} + } -const char* vertSrc = - "#version 330 core\n" - "layout (location = 0) in vec3 aPos;\n" - "\n" - "void main()\n" - "{\n" - " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" - "}\n"; - -unsigned int compileVertShader() { - unsigned int vertexShader; - vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, &vertSrc, NULL); - glCompileShader(vertexShader); - checkShader(vertexShader, GL_COMPILE_STATUS, "Vertex Shader"); - return vertexShader; -} - -const char* fragSrc = - "#version 330 core\n" - "out vec4 FragColor;\n" - "\n" - "void main()\n" - "{\n" - " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" - "}\n"; - -unsigned int compileFragShader() { - unsigned int fragmentShader; - fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, &fragSrc, NULL); - glCompileShader(fragmentShader); - checkShader(fragmentShader, GL_COMPILE_STATUS, "Fragment Shader"); - return fragmentShader; + float amount = 1.0f; + if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS) { + state->camY -= amount; + } + if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS) { + state->camY += amount; + } + if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS) { + state->camX -= amount; + } + if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS) { + state->camX += amount; + } + amount = 1.1f; + if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { + state->py -= amount; + } + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { + state->py += amount; + } + if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { + state->px -= amount; + } + if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { + state->px += amount; + } } int main(void) { @@ -101,45 +81,143 @@ int main(void) { glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - unsigned int vertexShader = compileVertShader(); - unsigned int fragmentShader = compileFragShader(); - unsigned int shaderProgram = glCreateProgram(); - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - glLinkProgram(shaderProgram); - checkShader(vertexShader, GL_LINK_STATUS, "Shader Program"); + unsigned int shaderProgram = + compileShaderProgram("shaders/main.vert", "shaders/main.frag", NULL); - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); + glEnable(GL_FRAMEBUFFER_SRGB); + glDisable(0x809D); + glEnable(GL_BLEND); + // CHECK: Do we need this? + // glEnable(GL_DEPTH_TEST); + // glDepthFunc(GL_GREATER); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); float vertices[] = { - -0.5f, -0.5f, 0.0f, - 0.5f, -0.5f, 0.0f, - 0.0f, 0.5f, 0.0f + // pos // tex + 0.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + + 0.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 0.0f }; unsigned int VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); - glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); - glEnableVertexAttribArray(0); + glBindVertexArray(VAO); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); + mat4 camOrtho; + glm_ortho(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -1.0f, 1.0f, camOrtho); + + unsigned int textureID; + int width, height, channels; + char* data = (char*)stbi_load("assets/idle.png", &width, &height, &channels, 4); + if (data == NULL) { + fprintf(stderr, "Could not load texture"); + return -1; + } + + glGenTextures(1, &textureID); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, textureID); + // // set Texture wrap and filter modes + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, width, height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, data); + + stbi_image_free(data); + // glBindTexture(GL_TEXTURE_2D, 0); + + // float deltaTime = 0.0f; + // float lastFrame = 0.0f; + struct State state = {0}; while (!glfwWindowShouldClose(window)) { - processInput(window); + + float currentFrame = glfwGetTime(); + // deltaTime = currentFrame - lastFrame; + // lastFrame = currentFrame; + + processInput(window, &state); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); + + // vec4 vec = {1.0f, 0.0f, 0.0f, 1.0f}; + mat4 model; + mat4 projection; + glm_mat4_identity(model); + glm_mat4_identity(projection); + // glm_ortho(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, -1.0f, 1.0f, projection); + // glm_perspective(60.0f, 3.0f / 4.0f , 1.0f, 200.0f, projection); + // glm_scale(model, (vec3){4.0f, 0.5f, 1.0f}); + float pivotx = 0.5f; + float pivoty = 0.5f; + glm_translate(model, (vec3){pivotx, pivoty, 0.0f}); + glm_rotate(model, currentFrame, (vec3){0.0f, 0.0f, 1.0f}); + glm_scale(model, (vec3){400.0f, 50.0f, 0.0f}); + glm_translate(model, (vec3){-pivotx, -pivoty, 0.0f}); + // glm_translate(model, (vec3){-255.5f, 0.f, 0.0f}); + // glm_translate(model, (vec3){200.0f, 200.0f, 0.0f}); + // glm_translate(model, (vec3){-1.8f, -2.0f, 0.0f}); + // glm_translate(model, (vec3){-1.8f, -2.0f, 0.0f}); + // glm_translate(); + // 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; + float hh = (SCREEN_HEIGHT / 2.f) / worldUnitSizeInPixels; + + glm_ortho(-hw, hw, hh, -hh, -1.0f, 1.0f, projection); + glm_translate(projection, (vec3){0.0f + state.camX, 0.0f + state.camY, 0.0f}); + // float proj = ortho(-hw, hw, -hh, hh, ...); + // // or + // float proj = ortho(-hw, hw, hh, -hh, ...); + + mat4 final; + glm_mat4_identity(final); + glm_mat4_mul(final, projection, final); + glm_mat4_mul(final, model, final); + + // printf("X:%f Y:%f Z:%f\n", final[3][0], final[3][1], final[3][2]); + + GLint location = glGetUniformLocation(shaderProgram, "model"); + glUniformMatrix4fv(location, 1, GL_FALSE, model[0]); + + location = glGetUniformLocation(shaderProgram, "projection"); + glUniformMatrix4fv(location, 1, GL_FALSE, projection[0]); + // glm_mat4_identity(model); + + location = glGetUniformLocation(shaderProgram, "spriteColor"); + glUniform3f(location, 1.0f, 1.0f, 1.0f); + + glUniform1i(glGetUniformLocation(shaderProgram, "image"), 0); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, textureID); + glBindVertexArray(VAO); - glDrawArrays(GL_TRIANGLES, 0, 3); + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + glDrawArrays(GL_TRIANGLES, 0, 6); + // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + // glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + glBindVertexArray(0); glfwSwapBuffers(window); glfwPollEvents();