From 767ffb482f4a4d67814a0f543c0c5d57059728d8 Mon Sep 17 00:00:00 2001 From: TheGAzed Date: Thu, 27 Jun 2024 20:29:06 +0200 Subject: [PATCH] trying to add gui support --- .github/workflows/cmake-single-platform.yml | 6 +- .gitmodules | 3 + CMakeLists.txt | 4 +- external/CMakeLists.txt | 8 +- external/glew | 1 + program/CMakeLists.txt | 5 +- program/include/gui/graphics.h | 9 ++ program/include/gui/screen.h | 11 --- program/include/instance/expect.h | 3 +- program/source/gui/graphics.c | 104 ++++++++++++++++++++ program/source/gui/screen.c | 0 11 files changed, 132 insertions(+), 22 deletions(-) create mode 160000 external/glew create mode 100644 program/include/gui/graphics.h delete mode 100644 program/include/gui/screen.h create mode 100644 program/source/gui/graphics.c delete mode 100644 program/source/gui/screen.c diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index 81eeb19..d5a0534 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -42,8 +42,4 @@ jobs: working-directory: ${{github.workspace}}/build # Execute tests defined by the CMake configuration. # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: | - pwd - xxd ../test/puzzles/easy/1.kkr - ls -l ../test/puzzles/easy/ - ctest -C ${{env.BUILD_TYPE}} --rerun-failed --output-on-failure + run: ctest -C ${{env.BUILD_TYPE}} --rerun-failed --output-on-failure diff --git a/.gitmodules b/.gitmodules index b66d325..7528a61 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "external/glfw"] path = external/glfw url = git@github.com:glfw/glfw.git +[submodule "external/glew"] + path = external/glew + url = git@github.com:Perlmint/glew-cmake.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 745c952..0893766 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,9 @@ project(SLNOSLAV if (WIN32) add_compile_options(/W4) else() - add_compile_options(-std=c17 -pg -Wall -Wextra -Wpedantic) + set(CMAKE_CXX_FLAGS "-std=c17 -Wall -Wextra -Wpedantic -Wnodiscarded-qualifiers") + set(CMAKE_CXX_FLAGS_DEBUG "-g -pg") + set(CMAKE_CXX_FLAGS_RELEASE "-03") endif() add_subdirectory(external) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index d88e9ba..99dab2b 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -2,11 +2,11 @@ add_library(GREATEST_LIB INTERFACE "") target_include_directories(GREATEST_LIB INTERFACE greatest) -add_library(NUKLEAR_LIB INTERFACE "") +add_library(nuklear INTERFACE "") -set_target_properties(NUKLEAR_LIB PROPERTIES LINKER_LANGUAGE C) +target_include_directories(nuklear INTERFACE nuklear nuklear/demo/glfw_opengl3) -target_include_directories(NUKLEAR_LIB INTERFACE nuklear/src) +find_package(OpenGL REQUIRED) if (!WIN32) find_package(PkgConfig REQUIRED) @@ -15,6 +15,8 @@ if (!WIN32) find_package(Doxygen) endif() +add_subdirectory(glew) + set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) diff --git a/external/glew b/external/glew new file mode 160000 index 0000000..a5494db --- /dev/null +++ b/external/glew @@ -0,0 +1 @@ +Subproject commit a5494db414d62e7bcb19f9f8fd7ee660338ea08e diff --git a/program/CMakeLists.txt b/program/CMakeLists.txt index d8f399d..70ee2ad 100644 --- a/program/CMakeLists.txt +++ b/program/CMakeLists.txt @@ -4,6 +4,8 @@ add_library(PROGRAM_LIBRARY "") target_sources(PROGRAM_LIBRARY PRIVATE + source/gui/graphics.c + source/algorithms/depth_first_search.c source/algorithms/backtrack.c source/algorithms/arc_consistency.c @@ -21,5 +23,6 @@ target_sources(PROGRAM_LIBRARY ) target_include_directories(PROGRAM_LIBRARY PUBLIC include) +target_link_libraries(PROGRAM_LIBRARY PRIVATE glfw libglew_shared nuklear) -target_link_libraries(${PROJECT_NAME} PROGRAM_LIBRARY) +target_link_libraries(${PROJECT_NAME} PRIVATE PROGRAM_LIBRARY) diff --git a/program/include/gui/graphics.h b/program/include/gui/graphics.h new file mode 100644 index 0000000..db3e22b --- /dev/null +++ b/program/include/gui/graphics.h @@ -0,0 +1,9 @@ +#ifndef GUI_GRAPHICS_H +#define GUI_GRAPHICS_H + +#define WINDOW_WIDTH 200 +#define WINDOW_HEIGHT 250 + +void gui(void); + +#endif /* GUI_GRAPHICS_H */ \ No newline at end of file diff --git a/program/include/gui/screen.h b/program/include/gui/screen.h deleted file mode 100644 index bece6f4..0000000 --- a/program/include/gui/screen.h +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#define NK_PRIVATE -#define NK_INCLUDE_FIXED_TYPES -#define NK_INCLUDE_STANDARD_IO -#define NK_INCLUDE_DEFAULT_ALLOCATOR -#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT -#define NK_INCLUDE_FONT_BAKING -#define NK_INCLUDE_DEFAULT_FONT -#include \ No newline at end of file diff --git a/program/include/instance/expect.h b/program/include/instance/expect.h index 594bb4d..9a6ad47 100644 --- a/program/include/instance/expect.h +++ b/program/include/instance/expect.h @@ -6,7 +6,7 @@ #include typedef enum error_mode_type { - DEFAULT_E, ABORT_E, ASSERT_E, + DEFAULT_E, ABORT_E, ASSERT_E, EXIT_E, } error_mode_e; static error_mode_e error_mode = DEFAULT_E; @@ -41,6 +41,7 @@ static FILE * error_log = NULL; switch (error_mode) { \ case ABORT_E : { error_action; abort(); } \ case ASSERT_E : { error_action; assert(0 && assertion); } \ + case EXIT_E : { error_action; exit(EXIT_FAILURE); } \ default : { error_action; } \ } \ } \ diff --git a/program/source/gui/graphics.c b/program/source/gui/graphics.c new file mode 100644 index 0000000..caaf12c --- /dev/null +++ b/program/source/gui/graphics.c @@ -0,0 +1,104 @@ +#include + +#include + +#define MAX_VERTEX_BUFFER 512 * 1024 +#define MAX_ELEMENT_BUFFER 128 * 1024 +#define NK_INCLUDE_FIXED_TYPES +#define NK_INCLUDE_STANDARD_IO +#define NK_INCLUDE_STANDARD_VARARGS +#define NK_INCLUDE_DEFAULT_ALLOCATOR +#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT +#define NK_INCLUDE_FONT_BAKING +#define NK_INCLUDE_DEFAULT_FONT +#define NK_IMPLEMENTATION +#define NK_GLFW_GL3_IMPLEMENTATION +#define NK_KEYSTATE_BASED_INPUT +#include +#include + +#include + +static void error_callback(int number, const char * description) { + error_mode = DEFAULT_E; + expect(NULL, NO_ACTION, "Error %d: %s\n", number, description); +} + +void _glfw_initialize_window(GLFWwindow * window); +void _glew_initialize(void); +void _font_stash(struct nk_glfw * glfw); + +void _input(struct nk_glfw * glfw); +void _interface(struct nk_context * context); +void _draw(struct nk_glfw * glfw, GLFWwindow * window); + +void gui(void) { + static GLFWwindow * window; + _glfw_initialize_window(window); + struct nk_glfw glfw = { 0 }; + struct nk_context * context = nk_glfw3_init(&glfw, window, NK_GLFW3_INSTALL_CALLBACKS); + + _glew_initialize(); + _font_stash(&glfw); + + while (!glfwWindowShouldClose(window)) { + _input(&glfw); + _interface(context); + _draw(&glfw, window); + } + + nk_glfw3_shutdown(&glfw); + glfwTerminate(); +} + +void _glfw_initialize_window(GLFWwindow * window) { + error_mode = EXIT_E; + expect(window, NO_ACTION, "GLFWwindow pointer is NULL (%p)", (void*)window); + expect(glfwInit(), NO_ACTION, "GLFW failed to initialize"); + + glfwSetErrorCallback(error_callback); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Demo", NULL, NULL); + glfwMakeContextCurrent(window); +} + +void _glew_initialize(void) { + glewExperimental = GL_TRUE; + error_mode = EXIT_E; + expect(glewInit() == GLEW_OK, NO_ACTION, "GLEW setup failed"); +} + +void _font_stash(struct nk_glfw * glfw) { + struct nk_font_atlas *atlas; + nk_glfw3_font_stash_begin(glfw, &atlas); + nk_glfw3_font_stash_end(glfw); +} + +void _input(struct nk_glfw * glfw) { + glfwPollEvents(); + nk_glfw3_new_frame(glfw); +} + +void _interface(struct nk_context * context) { + if (nk_begin(context, "Anything window", nk_rect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT), NK_WINDOW_BORDER)) { + nk_layout_row_dynamic(context, 120, 1); + nk_label(context, "Hello world!", NK_TEXT_CENTERED); + + nk_layout_row_dynamic(context, 50, 1); + nk_label(context, "Hello world!", NK_TEXT_LEFT); + + nk_layout_row_static(context, 30, 80, 1); + if (nk_button_label(context, "AnyButton")) fprintf(stdout, "button pressed\n"); + } + nk_end(context); +} + +void _draw(struct nk_glfw * glfw, GLFWwindow * window) { + glViewport(0, 0, WINDOW_HEIGHT, WINDOW_WIDTH); + glClear(GL_COLOR_BUFFER_BIT); + nk_glfw3_render(glfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER); + glfwSwapBuffers(window); +} \ No newline at end of file diff --git a/program/source/gui/screen.c b/program/source/gui/screen.c deleted file mode 100644 index e69de29..0000000