diff options
| author | Freya Murphy <freya@freyacat.org> | 2025-12-11 10:49:50 -0500 |
|---|---|---|
| committer | Freya Murphy <freya@freyacat.org> | 2025-12-11 10:51:40 -0500 |
| commit | fa8fa6784559ed0fc8d780e36880273f77e272c4 (patch) | |
| tree | 7456a4e9148d47e409ba837bafdc6238b6c757db /src/window.c | |
| parent | add ubos (diff) | |
| download | voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.tar.gz voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.tar.bz2 voxel-fa8fa6784559ed0fc8d780e36880273f77e272c4.zip | |
i did a lot
Diffstat (limited to 'src/window.c')
| -rw-r--r-- | src/window.c | 90 |
1 files changed, 59 insertions, 31 deletions
diff --git a/src/window.c b/src/window.c index c7e83c6..559dcc2 100644 --- a/src/window.c +++ b/src/window.c @@ -1,14 +1,15 @@ #include <GL/glew.h> #include <GLFW/glfw3.h> #include <string.h> +#include <threads.h> #include "voxel.h" #include "window.h" Window window; -double delta_time; +_Atomic double delta_time; -static void key_callback(GLFWwindow *, int key, int, int action, int) +static void key_callback(GLFWwindow *, i32 key, i32, i32 action, i32) { switch (action) { case GLFW_PRESS: @@ -29,7 +30,7 @@ static void mouse_move_callback(GLFWwindow *, double xpos, double ypos) window.mouse_y = ypos; } -static void mouse_button_callback(GLFWwindow *, int button, int action, int) +static void mouse_button_callback(GLFWwindow *, i32 button, i32 action, i32) { switch (action) { case GLFW_PRESS: @@ -42,59 +43,69 @@ static void mouse_button_callback(GLFWwindow *, int button, int action, int) } } -static void framebuffer_callback(GLFWwindow *, int width, int height) +static void framebuffer_callback(GLFWwindow *, i32 width, i32 height) { window.width = width; window.height = height; - glViewport(0, 0, width, height); + window.resize = true; } -int window_init(void) +VOXEL_RESULT window_init(void) { if (glfwInit() == GLFW_FALSE) { ERROR("GLFW failed to initalize"); - return 1; + return VOXEL_ERROR; } memset(&window, 0, sizeof(Window)); delta_time = 0; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - window.monitor = glfwGetPrimaryMonitor(); - window.window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE, - window.monitor, NULL); + window.window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE, NULL, NULL); if (window.window == NULL) { ERROR("failed to create window"); - return 1; + return VOXEL_ERROR; } + glfwSetKeyCallback(window.window, key_callback); + glfwSetCursorPosCallback(window.window, mouse_move_callback); + glfwSetMouseButtonCallback(window.window, mouse_button_callback); + glfwSetFramebufferSizeCallback(window.window, framebuffer_callback); + + mtx_init(&window.lock, mtx_plain); + + return VOXEL_OK; +} + +VOXEL_RESULT window_init_gl(void) +{ glfwMakeContextCurrent(window.window); + +#ifndef USE_VSYNC glfwSwapInterval(0); +#endif glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { ERROR("GLEW failed to initalize"); - return 1; + return VOXEL_ERROR; } - glfwSetKeyCallback(window.window, key_callback); - glfwSetCursorPosCallback(window.window, mouse_move_callback); - glfwSetMouseButtonCallback(window.window, mouse_button_callback); - glfwSetFramebufferSizeCallback(window.window, framebuffer_callback); - - return 0; + return VOXEL_OK; } bool window_closed(void) { - return glfwWindowShouldClose(window.window) == GLFW_TRUE; + return window.close || glfwWindowShouldClose(window.window) == GLFW_TRUE; } void window_update(void) { + mtx_lock(&window.lock); + // reset "pressed" memset(&window.key_pressed, 0, sizeof(window.key_pressed)); memset(&window.btn_pressed, 0, sizeof(window.btn_pressed)); @@ -110,6 +121,8 @@ void window_update(void) ERROR("OpenGL error: %d", error); glfwPollEvents(); + + mtx_unlock(&window.lock); } void window_swap(void) @@ -119,29 +132,44 @@ void window_swap(void) void window_close(void) { + mtx_lock(&window.lock); glfwDestroyWindow(window.window); glfwTerminate(); + mtx_destroy(&window.lock); } -int window_grab_cursor(void); -int window_release_cursor(void); - -bool key_down(int key) +bool key_down(i32 key) { - return window.key_down[key]; + bool down; + mtx_lock(&window.lock); + down = window.key_down[key]; + mtx_unlock(&window.lock); + return down; } -bool key_pressed(int key) +bool key_pressed(i32 key) { - return window.key_pressed[key]; + bool pressed; + mtx_lock(&window.lock); + pressed = window.key_pressed[key]; + mtx_unlock(&window.lock); + return pressed; } -bool btn_down(int btn) +bool btn_down(i32 btn) { - return window.btn_down[btn]; + bool down; + mtx_lock(&window.lock); + down = window.btn_down[btn]; + mtx_unlock(&window.lock); + return down; } -bool btn_pressed(int btn) +bool btn_pressed(i32 btn) { - return window.btn_pressed[btn]; + bool pressed; + mtx_lock(&window.lock); + pressed = window.btn_pressed[btn]; + mtx_unlock(&window.lock); + return pressed; } |