diff options
author | rtk0c <[email protected]> | 2022-04-08 22:30:12 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-04-08 22:30:12 -0700 |
commit | e7ef3f208c109357538b1f68af10bcd78db95c95 (patch) | |
tree | 066d614ae0f079e53602d7c0fd972998c546c8c1 /source/main.cpp | |
parent | f163e8f37123e651ea80b690793845b31ddb8639 (diff) |
Changeset: 3 More work
Diffstat (limited to 'source/main.cpp')
-rw-r--r-- | source/main.cpp | 190 |
1 files changed, 119 insertions, 71 deletions
diff --git a/source/main.cpp b/source/main.cpp index 8f61696..a2ba5b2 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,5 +1,8 @@ #include "App.hpp" +#include "AppConfig.hpp" +#include "EditorNotification.hpp" + #define GLFW_INCLUDE_NONE #include <GLFW/glfw3.h> @@ -7,108 +10,153 @@ #include <backends/imgui_impl_opengl3.h> #include <glad/glad.h> #include <imgui.h> +#include <cxxopts.hpp> #include <iostream> #include <string> -#define IMGUI_IMPL_OPENGL_LOADER_CUSTOM 1 -#include <backends/imgui_impl_glfw.cpp> -#include <backends/imgui_impl_opengl3.cpp> +namespace fs = std::filesystem; static void GlfwErrorCallback(int error, const char* description) { - fprintf(stderr, "Glfw Error %d: %s\n", error, description); + fprintf(stderr, "Glfw Error %d: %s\n", error, description); +} + +static void GlfwMouseCallback(GLFWwindow* window, int button, int action, int mods) { + if (ImGui::GetIO().WantCaptureMouse) { + return; + } + + App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); + app->HandleMouse(button, action); +} + +static void GlfwMouseMotionCallback(GLFWwindow* window, double xOff, double yOff) { + if (ImGui::GetIO().WantCaptureMouse) { + return; + } + + App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); + app->HandleMouseMotion(xOff, yOff); } static void GlfwKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { - GLFWkeyboard* keyboard = glfwGetLastActiveKeyboard(); - if (keyboard) { - App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); - app->HandleKey(keyboard, key, action); - } + if (ImGui::GetIO().WantCaptureKeyboard) { + return; + } + + GLFWkeyboard* keyboard = glfwGetLastActiveKeyboard(); + if (keyboard) { + App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); + app->HandleKey(keyboard, key, action); + } } -int main() { - if (!glfwInit()) { - return -1; - } +int main(int argc, char* argv[]) { + constexpr const char* kGameDataDir = "game-data-directory"; + + cxxopts::Options options(std::string(AppConfig::kAppName), ""); + // clang-format off + options.add_options() + (kGameDataDir, "Directory in which game data (such as saves and options) are saved to. Leave empty to use the default directory on each platform.", cxxopts::value<std::string>()) + ; + // clang-format on + auto args = options.parse(argc, argv); + + if (args.count(kGameDataDir) > 0) { + auto dataDir = args[kGameDataDir].as<std::string>(); + fs::path dataDirPath(dataDir); + if (!fs::exists(dataDir)) { + fs::create_directories(dataDir); + } + AppConfig::dataDir = std::move(dataDir); + } else { + AppConfig::dataDir = "."; + } + + if (!glfwInit()) { + return -1; + } - glfwSetErrorCallback(&GlfwErrorCallback); + glfwSetErrorCallback(&GlfwErrorCallback); - // Decide GL+GLSL versions + // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) - // GL ES 2.0 + GLSL 100 - const char* glsl_version = "#version 100"; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); - glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); #elif defined(__APPLE__) - // GL 3.2 + GLSL 150 - const char* glsl_version = "#version 150"; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac + // GL 3.2 + GLSL 150 + const char* glsl_version = "#version 150"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac #else - // GL 3.0 + GLSL 130 - const char* glsl_version = "#version 130"; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); #endif - App app; + App app; - GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui Command Palette Example", nullptr, nullptr); - if (window == nullptr) { - return -2; - } + GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui Command Palette Example", nullptr, nullptr); + if (window == nullptr) { + return -2; + } - glfwSetWindowUserPointer(window, &app); + glfwSetWindowUserPointer(window, &app); - // Window callbacks are retained by ImGui GLFW backend - glfwSetKeyCallback(window, &GlfwKeyCallback); + // Window callbacks are retained by ImGui GLFW backend + glfwSetKeyCallback(window, &GlfwKeyCallback); + glfwSetMouseButtonCallback(window, &GlfwMouseCallback); + glfwSetCursorPosCallback(window, &GlfwMouseMotionCallback); - glfwMakeContextCurrent(window); - glfwSwapInterval(1); + glfwMakeContextCurrent(window); + glfwSwapInterval(1); - if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { - return -3; - } + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { + return -3; + } - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); - ImGui_ImplGlfw_InitForOpenGL(window, true); - ImGui_ImplOpenGL3_Init(glsl_version); + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init(glsl_version); - app.Init(); - while (!glfwWindowShouldClose(window)) { - glfwPollEvents(); + app.Init(); + while (!glfwWindowShouldClose(window)) { + glfwPollEvents(); - ImGui_ImplOpenGL3_NewFrame(); - ImGui_ImplGlfw_NewFrame(); - ImGui::NewFrame(); + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); - app.Show(); + app.Show(); + ImGui::ShowNotifications(); - ImGui::Render(); - int display_w, display_h; - glfwGetFramebufferSize(window, &display_w, &display_h); - glViewport(0, 0, display_w, display_h); - auto clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); - glClear(GL_COLOR_BUFFER_BIT); - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + ImGui::Render(); + int display_w, display_h; + glfwGetFramebufferSize(window, &display_w, &display_h); + glViewport(0, 0, display_w, display_h); + auto clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); - glfwSwapBuffers(window); - } - app.Shutdown(); + glfwSwapBuffers(window); + } + app.Shutdown(); - ImGui_ImplOpenGL3_Shutdown(); - ImGui_ImplGlfw_Shutdown(); + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); - ImGui::DestroyContext(); + ImGui::DestroyContext(); - glfwDestroyWindow(window); - glfwTerminate(); + glfwDestroyWindow(window); + glfwTerminate(); - return 0; + return 0; } |