From 4d03b0d3ee43cb8593eed2cacfaff205ab83b7e7 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Mon, 4 Sep 2023 01:57:39 +0300 Subject: [PATCH] square board and properly fit inside window --- .gitignore | 1 + cudoku.c | 19 ++++++++++++++----- cudoku.h | 2 +- main.c | 28 ++++++++++++++++++++++++---- shader.c | 5 +++++ shader.h | 1 + shaders/board_v.glsl | 4 +++- 7 files changed, 49 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 6e9453f..4e98cef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ compile_commands.json *.o cudoku +.cache diff --git a/cudoku.c b/cudoku.c index 1a357f9..19c9772 100644 --- a/cudoku.c +++ b/cudoku.c @@ -3,10 +3,10 @@ #include "shader.h" static const float quad_vertices[] = { - -0.5f, 1.0f, 0.0f, // top left - 0.5f, 1.0f, 0.0f, // top right - -0.5f, -1.0f, 0.0f, // bottom left - 0.5f, -1.0f, 0.0f, // bottom right + -1.0f, 1.0f, 0.0f, // top left + 1.0f, 1.0f, 0.0f, // top right + -1.0f, -1.0f, 0.0f, // bottom left + 1.0f, -1.0f, 0.0f, // bottom right }; static const int quad_indices[] = { @@ -34,9 +34,18 @@ unsigned int prepare_bg_rect() { return vao; } -void draw_bg_rect(Shader shader, unsigned int vao) { +void draw_bg_rect(Shader shader, unsigned int vao, float x_scale, float y_scale) { use_shader(shader); + float mat[4][4] = { + {x_scale, 0, 0, 0}, + {0, y_scale, 0, 0}, + {0, 0, 1, 0}, + {0, 0, 0, 1}, + }; + + set_mat4(shader, "transform", (float *)mat); + glBindVertexArray(vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); diff --git a/cudoku.h b/cudoku.h index 37e32e1..27a475c 100644 --- a/cudoku.h +++ b/cudoku.h @@ -3,4 +3,4 @@ #include "shader.h" unsigned int prepare_bg_rect(Shader shader); -void draw_bg_rect(Shader shader, unsigned int vao); +void draw_bg_rect(Shader shader, unsigned int vao, float x_scale, float y_scale); diff --git a/main.c b/main.c index 7130b3d..4643cef 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,7 @@ #include #include +#include #include "x11.h" #include "cudoku.h" @@ -12,6 +13,18 @@ // Simply port the js algo for sudoku generation // Maybe after the game works fine we can use some winapi to add windows support +void scale_bg_rect(int width, int height, float *x, float *y) { + if (width > height) { + float ratio = (float)height / (float)width; + *x = ratio; + *y = 1.f; + } else { + float ratio = (float)width / (float)height; + *x = 1.f; + *y = ratio; + } +} + Display *display; Window window; @@ -19,7 +32,11 @@ int main() { int res = init_x11(&display, &window); if (res < 0) return 1; + // 900 is the initial width and height int width = 900, height = 900; + // scale factors for the entire board to nicely fit as a square inside + // the window + float x_scale = 1.f, y_scale = 1.f; Shader board_shader = create_shader("shaders/board_v.glsl", "shaders/board_f.glsl"); unsigned int board_vao = prepare_bg_rect(board_shader); @@ -37,18 +54,21 @@ int main() { width = xce.width; height = xce.height; resize_x11_window(display, window); + scale_bg_rect(xce.width, xce.height, &x_scale, &y_scale); } - } else if (xev.type == KeyPress && XLookupKeysym(&xev.xkey, 0) == XK_Escape) { - quit = true; - break; + } else if (xev.type == KeyPress) { + if (XLookupKeysym(&xev.xkey, 0) == XK_Escape || XLookupKeysym(&xev.xkey, 0) == XK_q) { + quit = true; + break; + } } } glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); - draw_bg_rect(board_shader, board_vao); + draw_bg_rect(board_shader, board_vao, x_scale, y_scale); glXSwapBuffers(display, window); } diff --git a/shader.c b/shader.c index 93ffa17..cfeb986 100644 --- a/shader.c +++ b/shader.c @@ -81,3 +81,8 @@ void use_shader(Shader shader) { glUseProgram(shader.program); } +void set_mat4(Shader shader, const char *name, float *mat4) { + int loc = glGetUniformLocation(shader.program, name); + glUniformMatrix4fv(loc, 1, GL_FALSE, mat4); +} + diff --git a/shader.h b/shader.h index e336edb..d237775 100644 --- a/shader.h +++ b/shader.h @@ -7,3 +7,4 @@ typedef struct Shader { void read_shader_file(const char *path, char **buf); Shader create_shader(const char *vertex_path, const char *fragment_path); void use_shader(Shader shader); +void set_mat4(Shader shader, const char *name, float *mat); diff --git a/shaders/board_v.glsl b/shaders/board_v.glsl index eaac65d..c978545 100644 --- a/shaders/board_v.glsl +++ b/shaders/board_v.glsl @@ -1,6 +1,8 @@ #version 330 core layout (location = 0) in vec3 aPos; +uniform mat4 transform; + void main() { - gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); + gl_Position = transform * vec4(aPos, 1.0f); }