summaryrefslogtreecommitdiff
path: root/src/window.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-12-11 10:49:50 -0500
committerFreya Murphy <freya@freyacat.org>2025-12-11 10:51:40 -0500
commitfa8fa6784559ed0fc8d780e36880273f77e272c4 (patch)
tree7456a4e9148d47e409ba837bafdc6238b6c757db /src/window.c
parentadd ubos (diff)
downloadvoxel-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.c90
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;
}