IT SPINS
This commit is contained in:
		
							parent
							
								
									043ba26281
								
							
						
					
					
						commit
						ac0875103d
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -2,3 +2,4 @@ | ||||
| .godot/ | ||||
| /Assets/ | ||||
| /game/tenchu | ||||
| /game/.idea/ | ||||
|  | ||||
| @ -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"), | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								game/assets/idle.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								game/assets/idle.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								game/assets/jump.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								game/assets/jump.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1021 B | 
							
								
								
									
										
											BIN
										
									
								
								game/assets/land.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								game/assets/land.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								game/assets/run.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								game/assets/run.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 3.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								game/assets/walk.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								game/assets/walk.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										117
									
								
								game/lib.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								game/lib.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | ||||
| #ifndef TENCHU_LIB_H | ||||
| #define TENCHU_LIB_H | ||||
| 
 | ||||
| #include <string.h> | ||||
| 
 | ||||
| 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 | ||||
							
								
								
									
										10
									
								
								game/shaders/main.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								game/shaders/main.frag
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
| } | ||||
							
								
								
									
										13
									
								
								game/shaders/main.vert
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								game/shaders/main.vert
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
| } | ||||
							
								
								
									
										238
									
								
								game/tenchu.c
									
									
									
									
									
								
							
							
						
						
									
										238
									
								
								game/tenchu.c
									
									
									
									
									
								
							| @ -3,82 +3,62 @@ | ||||
| #include <stdbool.h> | ||||
| #include "glad/glad.h" | ||||
| #include <GLFW/glfw3.h> | ||||
| #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(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user