From a9a9fa4e9efb5831a1cc16e43ee7a5dd1a89f541 Mon Sep 17 00:00:00 2001 From: seafork Date: Tue, 15 Nov 2022 19:27:21 -0500 Subject: [PATCH 1/5] add example for glfw3 and opengl3 --- .../example_glfw_opengl3/CmakeLists.txt | 90 ++++++++++ backend_test/example_glfw_opengl3/main.c | 169 ++++++++++++++++++ 2 files changed, 259 insertions(+) create mode 100644 backend_test/example_glfw_opengl3/CmakeLists.txt create mode 100644 backend_test/example_glfw_opengl3/main.c diff --git a/backend_test/example_glfw_opengl3/CmakeLists.txt b/backend_test/example_glfw_opengl3/CmakeLists.txt new file mode 100644 index 0000000..8ff9503 --- /dev/null +++ b/backend_test/example_glfw_opengl3/CmakeLists.txt @@ -0,0 +1,90 @@ +Project(cmimgui_glfw) +cmake_minimum_required(VERSION 3.1) +if(WIN32) # to mingw work as all the others + set(CMAKE_SHARED_LIBRARY_PREFIX "") +endif(WIN32) + +set (CMAKE_CXX_STANDARD 11) + +# general settings +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui/backends) + set(BAKENDS_FOLDER "../../imgui/backends/") +else() + set(BAKENDS_FOLDER "../../imgui/examples/") +endif() + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui/imgui_tables.cpp) + set(TABLES_SOURCE "../../imgui/imgui_tables.cpp") +else() + set(TABLES_SOURCE "") +endif() + +include_directories(../../imgui) +add_definitions("-DIMGUI_DISABLE_OBSOLETE_FUNCTIONS=1") + +include_directories(../../) +set(IMGUI_SOURCES +../../cimgui.cpp +../../imgui/imgui.cpp +../../imgui/imgui_draw.cpp +../../imgui/imgui_demo.cpp +../../imgui/imgui_widgets.cpp +${TABLES_SOURCE} +) + +set(IMGUI_SOURCES_sdl) +set(IMGUI_LIBRARIES ) + +if (WIN32) + add_definitions("-DIMGUI_IMPL_API=extern \"C\" __declspec\(dllexport\)") +else(WIN32) + add_definitions("-DIMGUI_IMPL_API=extern \"C\" ") +endif(WIN32) + +add_compile_definitions("IMGUI_IMPL_OPENGL_LOADER_GL3W") + +# optional adding freetype +option(IMGUI_FREETYPE "add Freetype2" OFF) + +if(IMGUI_FREETYPE) + FIND_PACKAGE(freetype REQUIRED PATHS ${FREETYPE_PATH}) + list(APPEND IMGUI_LIBRARIES freetype) + list(APPEND IMGUI_SOURCES ../../imgui/misc/freetype/imgui_freetype.cpp) + add_definitions("-DCIMGUI_FREETYPE=1") +endif(IMGUI_FREETYPE) + +# opengl3 +list(APPEND IMGUI_SOURCES ${BAKENDS_FOLDER}imgui_impl_opengl3.cpp) +include_directories(../../imgui/examples/libs/gl3w) +if(WIN32) + list(APPEND IMGUI_LIBRARIES opengl32) +else(WIN32) # Unix + list(APPEND IMGUI_LIBRARIES GL) +endif(WIN32) + +# GLFW +list(APPEND IMGUI_SOURCES ${BAKENDS_FOLDER}imgui_impl_glfw.cpp) +find_package(glfw3 REQUIRED) + +# alternatively, you can build from source. +# this tends to be quite the lifesaver on windows. +# set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) +# set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) +# set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +# add_subdirectory(${PROJECT_SOURCE_DIR}/deps/glfw) + + +add_library(cimgui SHARED ${IMGUI_SOURCES}) +target_link_libraries(cimgui ${IMGUI_LIBRARIES} glfw) + + +# using library +include_directories(../../generator/output/) +add_executable(${PROJECT_NAME} main.c) +target_compile_definitions(${PROJECT_NAME} PUBLIC -DCIMGUI_USE_OPENGL3 -DCIMGUI_USE_GLFW) +if (MINGW) + target_link_options(${PROJECT_NAME} PRIVATE "-mconsole") +endif() +target_link_libraries(${PROJECT_NAME} ${IMGUI_SDL_LIBRARY} cimgui) + + diff --git a/backend_test/example_glfw_opengl3/main.c b/backend_test/example_glfw_opengl3/main.c new file mode 100644 index 0000000..3a143f0 --- /dev/null +++ b/backend_test/example_glfw_opengl3/main.c @@ -0,0 +1,169 @@ +#define CIMGUI_DEFINE_ENUMS_AND_STRUCTS +#include "cimgui.h" +#include "cimgui_impl.h" +#include +#include +#ifdef _MSC_VER +#include +#endif +#include +#include + +#ifdef IMGUI_HAS_IMSTR +#define igBegin igBegin_Str +#define igSliderFloat igSliderFloat_Str +#define igCheckbox igCheckbox_Str +#define igColorEdit3 igColorEdit3_Str +#define igButton igButton_Str +#endif + +GLFWwindow *window; + +int main(int argc, char *argv[]) +{ + + if (!glfwInit()) + return -1; + + // Decide GL+GLSL versions + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + +#if __APPLE__ + // GL 3.2 Core + GLSL 150 + const char *glsl_version = "#version 150"; +#else + // GL 3.2 + GLSL 130 + const char *glsl_version = "#version 130"; +#endif + + // just an extra window hint for resize + glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); + + window = glfwCreateWindow(1024, 768, "Hello World!", NULL, NULL); + if (!window) + { + printf("Failed to create window! Terminating!\n"); + glfwTerminate(); + return -1; + } + + glfwMakeContextCurrent(window); + + // enable vsync + glfwSwapInterval(1); + + // check opengl version sdl uses + printf("opengl version: %s\n", (char *)glGetString(GL_VERSION)); + + // setup imgui + igCreateContext(NULL); + + // set docking + ImGuiIO *ioptr = igGetIO(); + ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + //ioptr->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls +#ifdef IMGUI_HAS_DOCK + ioptr->ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking + ioptr->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows +#endif + + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init(glsl_version); + + igStyleColorsDark(NULL); + // ImFontAtlas_AddFontDefault(io.Fonts, NULL); + + bool showDemoWindow = true; + bool showAnotherWindow = false; + ImVec4 clearColor; + clearColor.x = 0.45f; + clearColor.y = 0.55f; + clearColor.z = 0.60f; + clearColor.w = 1.00f; + + // main event loop + bool quit = false; + while (!glfwWindowShouldClose(window)) + { + + glfwPollEvents(); + + // start imgui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + igNewFrame(); + + if (showDemoWindow) + igShowDemoWindow(&showDemoWindow); + + // show a simple window that we created ourselves. + { + static float f = 0.0f; + static int counter = 0; + + igBegin("Hello, world!", NULL, 0); + igText("This is some useful text"); + igCheckbox("Demo window", &showDemoWindow); + igCheckbox("Another window", &showAnotherWindow); + + igSliderFloat("Float", &f, 0.0f, 1.0f, "%.3f", 0); + igColorEdit3("clear color", (float *)&clearColor, 0); + + ImVec2 buttonSize; + buttonSize.x = 0; + buttonSize.y = 0; + if (igButton("Button", buttonSize)) + counter++; + igSameLine(0.0f, -1.0f); + igText("counter = %d", counter); + + igText("Application average %.3f ms/frame (%.1f FPS)", + 1000.0f / igGetIO()->Framerate, igGetIO()->Framerate); + igEnd(); + } + + if (showAnotherWindow) + { + igBegin("imgui Another Window", &showAnotherWindow, 0); + igText("Hello from imgui"); + ImVec2 buttonSize; + buttonSize.x = 0; + buttonSize.y = 0; + if (igButton("Close me", buttonSize)) { + showAnotherWindow = false; + } + igEnd(); + } + + // render + igRender(); + glfwMakeContextCurrent(window); + glViewport(0, 0, (int)ioptr->DisplaySize.x, (int)ioptr->DisplaySize.y); + glClearColor(clearColor.x, clearColor.y, clearColor.z, clearColor.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(igGetDrawData()); +#ifdef IMGUI_HAS_DOCK + if (ioptr->ConfigFlags & ImGuiConfigFlags_ViewportsEnable) + { + GLFWwindow *backup_current_window = glfwGetCurrentContext(); + igUpdatePlatformWindows(); + igRenderPlatformWindowsDefault(NULL, NULL); + glfwMakeContextCurrent(backup_current_window); + } +#endif + glfwSwapBuffers(window); + } + + // clean up + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + igDestroyContext(NULL); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} From 08f24307b8cc660f50d80661cff73a301e63431f Mon Sep 17 00:00:00 2001 From: seafork <69231466+seafork@users.noreply.github.com> Date: Tue, 15 Nov 2022 19:44:24 -0500 Subject: [PATCH 2/5] cleaned up a comment --- backend_test/example_glfw_opengl3/CmakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend_test/example_glfw_opengl3/CmakeLists.txt b/backend_test/example_glfw_opengl3/CmakeLists.txt index 8ff9503..7f7be8a 100644 --- a/backend_test/example_glfw_opengl3/CmakeLists.txt +++ b/backend_test/example_glfw_opengl3/CmakeLists.txt @@ -71,7 +71,7 @@ find_package(glfw3 REQUIRED) # set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) # set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) # set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) -# add_subdirectory(${PROJECT_SOURCE_DIR}/deps/glfw) +# add_subdirectory() add_library(cimgui SHARED ${IMGUI_SOURCES}) From 75ec483e758226f27c25cc961644d95b4eb13b92 Mon Sep 17 00:00:00 2001 From: seafork <69231466+seafork@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:09:06 -0500 Subject: [PATCH 3/5] fixed compilation error on windows. --- backend_test/example_glfw_opengl3/CmakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend_test/example_glfw_opengl3/CmakeLists.txt b/backend_test/example_glfw_opengl3/CmakeLists.txt index 7f7be8a..113ae0f 100644 --- a/backend_test/example_glfw_opengl3/CmakeLists.txt +++ b/backend_test/example_glfw_opengl3/CmakeLists.txt @@ -73,8 +73,14 @@ find_package(glfw3 REQUIRED) # set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # add_subdirectory() +# imgui/glfw get confused if not statically built +# on windows. +IF (WIN32) + add_library(cimgui STATIC ${IMGUI_SOURCES}) +ELSE() + add_library(cimgui SHARED ${IMGUI_SOURCES}) +ENDIF() -add_library(cimgui SHARED ${IMGUI_SOURCES}) target_link_libraries(cimgui ${IMGUI_LIBRARIES} glfw) From 6a2b18fa65070529d95ae01fa7e919a50513a4b2 Mon Sep 17 00:00:00 2001 From: seafork <69231466+seafork@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:59:36 -0500 Subject: [PATCH 4/5] made glfw more portable --- .../example_glfw_opengl3/CmakeLists.txt | 199 +++++++++--------- 1 file changed, 103 insertions(+), 96 deletions(-) diff --git a/backend_test/example_glfw_opengl3/CmakeLists.txt b/backend_test/example_glfw_opengl3/CmakeLists.txt index 113ae0f..b64ee0b 100644 --- a/backend_test/example_glfw_opengl3/CmakeLists.txt +++ b/backend_test/example_glfw_opengl3/CmakeLists.txt @@ -1,96 +1,103 @@ -Project(cmimgui_glfw) -cmake_minimum_required(VERSION 3.1) -if(WIN32) # to mingw work as all the others - set(CMAKE_SHARED_LIBRARY_PREFIX "") -endif(WIN32) - -set (CMAKE_CXX_STANDARD 11) - -# general settings -if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui/backends) - set(BAKENDS_FOLDER "../../imgui/backends/") -else() - set(BAKENDS_FOLDER "../../imgui/examples/") -endif() - -if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui/imgui_tables.cpp) - set(TABLES_SOURCE "../../imgui/imgui_tables.cpp") -else() - set(TABLES_SOURCE "") -endif() - -include_directories(../../imgui) -add_definitions("-DIMGUI_DISABLE_OBSOLETE_FUNCTIONS=1") - -include_directories(../../) -set(IMGUI_SOURCES -../../cimgui.cpp -../../imgui/imgui.cpp -../../imgui/imgui_draw.cpp -../../imgui/imgui_demo.cpp -../../imgui/imgui_widgets.cpp -${TABLES_SOURCE} -) - -set(IMGUI_SOURCES_sdl) -set(IMGUI_LIBRARIES ) - -if (WIN32) - add_definitions("-DIMGUI_IMPL_API=extern \"C\" __declspec\(dllexport\)") -else(WIN32) - add_definitions("-DIMGUI_IMPL_API=extern \"C\" ") -endif(WIN32) - -add_compile_definitions("IMGUI_IMPL_OPENGL_LOADER_GL3W") - -# optional adding freetype -option(IMGUI_FREETYPE "add Freetype2" OFF) - -if(IMGUI_FREETYPE) - FIND_PACKAGE(freetype REQUIRED PATHS ${FREETYPE_PATH}) - list(APPEND IMGUI_LIBRARIES freetype) - list(APPEND IMGUI_SOURCES ../../imgui/misc/freetype/imgui_freetype.cpp) - add_definitions("-DCIMGUI_FREETYPE=1") -endif(IMGUI_FREETYPE) - -# opengl3 -list(APPEND IMGUI_SOURCES ${BAKENDS_FOLDER}imgui_impl_opengl3.cpp) -include_directories(../../imgui/examples/libs/gl3w) -if(WIN32) - list(APPEND IMGUI_LIBRARIES opengl32) -else(WIN32) # Unix - list(APPEND IMGUI_LIBRARIES GL) -endif(WIN32) - -# GLFW -list(APPEND IMGUI_SOURCES ${BAKENDS_FOLDER}imgui_impl_glfw.cpp) -find_package(glfw3 REQUIRED) - -# alternatively, you can build from source. -# this tends to be quite the lifesaver on windows. -# set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) -# set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) -# set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) -# add_subdirectory() - -# imgui/glfw get confused if not statically built -# on windows. -IF (WIN32) - add_library(cimgui STATIC ${IMGUI_SOURCES}) -ELSE() - add_library(cimgui SHARED ${IMGUI_SOURCES}) -ENDIF() - -target_link_libraries(cimgui ${IMGUI_LIBRARIES} glfw) - - -# using library -include_directories(../../generator/output/) -add_executable(${PROJECT_NAME} main.c) -target_compile_definitions(${PROJECT_NAME} PUBLIC -DCIMGUI_USE_OPENGL3 -DCIMGUI_USE_GLFW) -if (MINGW) - target_link_options(${PROJECT_NAME} PRIVATE "-mconsole") -endif() -target_link_libraries(${PROJECT_NAME} ${IMGUI_SDL_LIBRARY} cimgui) - - +Project(cmimgui_glfw) +cmake_minimum_required(VERSION 3.11) +if(WIN32) # to mingw work as all the others + set(CMAKE_SHARED_LIBRARY_PREFIX "") +endif(WIN32) + +set (CMAKE_CXX_STANDARD 11) + +# general settings +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui/backends) + set(BAKENDS_FOLDER "../../imgui/backends/") +else() + set(BAKENDS_FOLDER "../../imgui/examples/") +endif() + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui/imgui_tables.cpp) + set(TABLES_SOURCE "../../imgui/imgui_tables.cpp") +else() + set(TABLES_SOURCE "") +endif() + +include_directories(../../imgui) +add_definitions("-DIMGUI_DISABLE_OBSOLETE_FUNCTIONS=1") + +include_directories(../../) +set(IMGUI_SOURCES +../../cimgui.cpp +../../imgui/imgui.cpp +../../imgui/imgui_draw.cpp +../../imgui/imgui_demo.cpp +../../imgui/imgui_widgets.cpp +${TABLES_SOURCE} +) + +set(IMGUI_SOURCES_sdl) +set(IMGUI_LIBRARIES ) + +if (WIN32) + add_definitions("-DIMGUI_IMPL_API=extern \"C\" __declspec\(dllexport\)") +else(WIN32) + add_definitions("-DIMGUI_IMPL_API=extern \"C\" ") +endif(WIN32) + +add_compile_definitions("IMGUI_IMPL_OPENGL_LOADER_GL3W") + +# optional adding freetype +option(IMGUI_FREETYPE "add Freetype2" OFF) + +if(IMGUI_FREETYPE) + FIND_PACKAGE(freetype REQUIRED PATHS ${FREETYPE_PATH}) + list(APPEND IMGUI_LIBRARIES freetype) + list(APPEND IMGUI_SOURCES ../../imgui/misc/freetype/imgui_freetype.cpp) + add_definitions("-DCIMGUI_FREETYPE=1") +endif(IMGUI_FREETYPE) + +# opengl3 +list(APPEND IMGUI_SOURCES ${BAKENDS_FOLDER}imgui_impl_opengl3.cpp) +include_directories(../../imgui/examples/libs/gl3w) +if(WIN32) + list(APPEND IMGUI_LIBRARIES opengl32) +else(WIN32) # Unix + list(APPEND IMGUI_LIBRARIES GL) +endif(WIN32) + +# GLFW +list(APPEND IMGUI_SOURCES ${BAKENDS_FOLDER}imgui_impl_glfw.cpp) + +set(GLFW_VERSION 3.3.8) +include(FetchContent) + FetchContent_Declare( + glfw + URL https://github.com/glfw/glfw/archive/refs/tags/${GLFW_VERSION}.tar.gz) + +FetchContent_GetProperties(glfw) +if (NOT glfw_POPULATED) + set(FETCHCONTENT_QUIET NO) + FetchContent_Populate(glfw) + set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) + add_subdirectory(${glfw_SOURCE_DIR} ${glfw_BINARY_DIR}) +endif() + + +# glfw/imgui gets confused if it is not statically built. +IF (WIN32) + add_library(cimgui STATIC ${IMGUI_SOURCES}) +ELSE() + add_library(cimgui SHARED ${IMGUI_SOURCES}) +ENDIF() + +target_link_libraries(cimgui ${IMGUI_LIBRARIES} glfw) + + +# using library +include_directories(../../generator/output/) +add_executable(${PROJECT_NAME} main.c) +target_compile_definitions(${PROJECT_NAME} PUBLIC -DCIMGUI_USE_OPENGL3 -DCIMGUI_USE_GLFW) +if (MINGW) + target_link_options(${PROJECT_NAME} PRIVATE "-mconsole") +endif() +target_link_libraries(${PROJECT_NAME} ${IMGUI_SDL_LIBRARY} cimgui) + + From 3e823cd2ee2a1ff97c0fe0a64bd2161227ee3066 Mon Sep 17 00:00:00 2001 From: seafork Date: Tue, 15 Nov 2022 23:06:35 -0500 Subject: [PATCH 5/5] fixed misspelt cmake file --- .../example_glfw_opengl3/{CmakeLists.txt => CMakeLists.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backend_test/example_glfw_opengl3/{CmakeLists.txt => CMakeLists.txt} (100%) diff --git a/backend_test/example_glfw_opengl3/CmakeLists.txt b/backend_test/example_glfw_opengl3/CMakeLists.txt similarity index 100% rename from backend_test/example_glfw_opengl3/CmakeLists.txt rename to backend_test/example_glfw_opengl3/CMakeLists.txt