From 7352085dca54837fb60dbba4328ee0bc069bca16 Mon Sep 17 00:00:00 2001 From: onelin Date: Tue, 1 Apr 2025 11:45:43 +0200 Subject: Fetch GLFW3 if not installed locally --- CMakeLists.txt | 40 ++++++++++++++++++---- src/core/src/loop.c | 4 +-- src/ctrl/CMakeLists.txt | 2 +- src/ctrl/src/input.c | 3 ++ src/rendering/CMakeLists.txt | 7 ++-- src/rendering/include/engine/rendering/rendering.h | 3 -- src/rendering/include/engine/rendering/window.h | 4 ++- src/rendering/src/window.c | 12 ++++++- src/resources/CMakeLists.txt | 2 +- 9 files changed, 60 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb9659d..96d25e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,18 +108,46 @@ else() endif() ## Packages -set(GLFW_USE_WAYLAND ON) -find_package(glfw3 3.3 REQUIRED) +set(GLFW_BUILD_WAYLAND ON) +find_package(glfw3 3.4) find_package(OpenGL REQUIRED) + +set(BUILD_PACKAGES cglm stb) + +if(NOT glfw3_FOUND) + message(STATUS "Local GLFW3 installation not found, will be downloaded and built") + + set(GLFW3_PREFIX ${CMAKE_BINARY_DIR}/glfw3) + set(GLFW3_INCLUDE_DIR ${GLFW3_PREFIX}/include) + set(GLFW3_LIBRARY ${GLFW3_PREFIX}/lib/libglfw3.a) + + # Build only the library + set(GLFW_BUILD_DOCS OFF CACHE BOOL "") + set(GLFW_BUILD_TESTS OFF CACHE BOOL "") + set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "") + + # Download and build + FetchContent_Declare(glfw3 + GIT_REPOSITORY "https://github.com/glfw/glfw.git" + GIT_TAG 3.4 + ) + + # Set glfw specific include directory to the downloaded one + set(GLFW_INCLUDE_DIR "${CMAKE_BINARY_DIR}/glfw3-src/include") + + list(APPEND BUILD_PACKAGES glfw3) +endif() + FetchContent_Declare(cglm - GIT_REPOSITORY https://github.com/recp/cglm.git + GIT_REPOSITORY "https://github.com/recp/cglm.git" GIT_TAG v0.9.6 ) FetchContent_Declare(stb - GIT_REPOSITORY https://github.com/nothings/stb.git + GIT_REPOSITORY "https://github.com/nothings/stb.git" GIT_TAG master - ) -FetchContent_MakeAvailable(cglm stb) +) + +FetchContent_MakeAvailable("${BUILD_PACKAGES}") ## Glad # TODO: make sure the glad command is run before building diff --git a/src/core/src/loop.c b/src/core/src/loop.c index 73131d5..cff8d64 100644 --- a/src/core/src/loop.c +++ b/src/core/src/loop.c @@ -319,7 +319,7 @@ i32 engine_run(Platform* p, StateType initial_state, void* state_arg) { //const f64 delta = (f64)dt / (f64)fps_cap; /* Events */ - glfwPollEvents(); + window_poll_events(); i_flush_bindings(dt, callbacks_len, callbacks, mem->data); /* Update */ @@ -389,7 +389,7 @@ i32 engine_run(Platform* p, StateType initial_state, void* state_arg) { ticks++; } while( - !glfwWindowShouldClose(p->window->window) + !window_should_close(p->window) && state != STATE_quit ); diff --git a/src/ctrl/CMakeLists.txt b/src/ctrl/CMakeLists.txt index a8525b0..1fcbfb6 100644 --- a/src/ctrl/CMakeLists.txt +++ b/src/ctrl/CMakeLists.txt @@ -7,5 +7,5 @@ add_library(daw_ctrl ) target_compile_options(daw_ctrl PUBLIC ${BUILD_OPTS}) -target_include_directories(daw_ctrl PRIVATE ${DAW_INCLUDE_DIRS}) +target_include_directories(daw_ctrl PRIVATE ${DAW_INCLUDE_DIRS} ${GLFW_INCLUDE_DIR}) target_link_libraries(daw_ctrl PRIVATE cglm glfw) diff --git a/src/ctrl/src/input.c b/src/ctrl/src/input.c index 5a08543..844fd2c 100644 --- a/src/ctrl/src/input.c +++ b/src/ctrl/src/input.c @@ -1,6 +1,9 @@ #include #include +#undef GLFW_INCLUDE_NONE +#include + #include #include #include diff --git a/src/rendering/CMakeLists.txt b/src/rendering/CMakeLists.txt index 237f147..a00f3b1 100644 --- a/src/rendering/CMakeLists.txt +++ b/src/rendering/CMakeLists.txt @@ -22,9 +22,12 @@ set_property(SOURCE src/window.c APPEND PROPERTY OBJECT_DEPENDS ${GLAD_HEADER}) set_property(SOURCE src/rendering.c APPEND PROPERTY OBJECT_DEPENDS ${GLAD_HEADER}) target_compile_options(daw_rendering PUBLIC ${BUILD_OPTS}) -target_include_directories(daw_rendering PRIVATE ${DAW_INCLUDE_DIRS}) +target_include_directories(daw_rendering PRIVATE + ${DAW_INCLUDE_DIRS} + ${GLFW_INCLUDE_DIR} +) target_link_libraries(daw_rendering PRIVATE OpenGL::GL cglm glfw - ) +) diff --git a/src/rendering/include/engine/rendering/rendering.h b/src/rendering/include/engine/rendering/rendering.h index 7120182..d338778 100644 --- a/src/rendering/include/engine/rendering/rendering.h +++ b/src/rendering/include/engine/rendering/rendering.h @@ -9,9 +9,6 @@ extern "C" { #include #include -#define GLFW_INCLUDE_NONE -#include - #include /* Definitions */ diff --git a/src/rendering/include/engine/rendering/window.h b/src/rendering/include/engine/rendering/window.h index e5d3528..c902cad 100644 --- a/src/rendering/include/engine/rendering/window.h +++ b/src/rendering/include/engine/rendering/window.h @@ -9,7 +9,7 @@ extern "C" { #include #ifndef ENGINE_RENDERING_WINDOW_H_EXCLUDE_EXTERNS -extern void* window_poll_events; +extern void (*window_poll_events)(void); extern u64 (*get_time)(void); #endif @@ -41,6 +41,8 @@ Window* init_window_glfw(const char* windowtitle, ivec2 windowsize, const u32 fl void destroy_window(Window* w); void window_resize(Window* window, int width, int height); +bool window_should_close(Window* w); + // Renderer intializer(s) void init_render_opengl(Window* w, const u32 flags); diff --git a/src/rendering/src/window.c b/src/rendering/src/window.c index a5e7db6..9f5e861 100644 --- a/src/rendering/src/window.c +++ b/src/rendering/src/window.c @@ -21,7 +21,7 @@ extern Platform* GLOBAL_PLATFORM; -void *window_poll_events = NULL; +void (*window_poll_events)(void) = NULL; /* wrapper to get time in ms */ u64 (*get_time)(void) = NULL; @@ -279,3 +279,13 @@ void get_mousepos(double *x, double *y) { } } + +bool window_should_close(Window* w) { + switch(w->framework) { + case WINDOW_FRAMEWORK_GLFW: + return glfwWindowShouldClose(w->window); + break; + default: + return false; + } +} diff --git a/src/resources/CMakeLists.txt b/src/resources/CMakeLists.txt index 9934cc1..00e2cbc 100644 --- a/src/resources/CMakeLists.txt +++ b/src/resources/CMakeLists.txt @@ -14,7 +14,7 @@ add_library(daw_resources ) target_compile_options(daw_resources PUBLIC ${BUILD_OPTS}) -target_include_directories(daw_resources PRIVATE ${DAW_INCLUDE_DIRS}) +target_include_directories(daw_resources PRIVATE ${DAW_INCLUDE_DIRS} stb) target_link_libraries(daw_resources PRIVATE assimp cglm -- cgit v1.3