diff options
Diffstat (limited to 'source/main.cpp')
-rw-r--r-- | source/main.cpp | 85 |
1 files changed, 54 insertions, 31 deletions
diff --git a/source/main.cpp b/source/main.cpp index a2ba5b2..f7cde70 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -2,16 +2,18 @@ #include "AppConfig.hpp" #include "EditorNotification.hpp" +#include "Shader.hpp" #define GLFW_INCLUDE_NONE #include <GLFW/glfw3.h> +#include <filesystem> #include <backends/imgui_impl_glfw.h> #include <backends/imgui_impl_opengl3.h> #include <glad/glad.h> #include <imgui.h> +#include <cstdlib> #include <cxxopts.hpp> -#include <iostream> #include <string> namespace fs = std::filesystem; @@ -24,7 +26,7 @@ static void GlfwMouseCallback(GLFWwindow* window, int button, int action, int mo if (ImGui::GetIO().WantCaptureMouse) { return; } - + App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); app->HandleMouse(button, action); } @@ -33,7 +35,7 @@ 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); } @@ -42,7 +44,7 @@ static void GlfwKeyCallback(GLFWwindow* window, int key, int scancode, int actio if (ImGui::GetIO().WantCaptureKeyboard) { return; } - + GLFWkeyboard* keyboard = glfwGetLastActiveKeyboard(); if (keyboard) { App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); @@ -51,33 +53,51 @@ static void GlfwKeyCallback(GLFWwindow* window, int key, int scancode, int actio } int main(int argc, char* argv[]) { - constexpr const char* kGameDataDir = "game-data-directory"; - + constexpr auto kGameDataDir = "game-data-directory"; + constexpr auto kGameAssetDir = "game-asset-directory"; + cxxopts::Options options(std::string(AppConfig::kAppName), ""); // clang-format off options.add_options() + (kGameAssetDir, "Directory in which assets are looked up from. Can be relative paths to the executable.", cxxopts::value<std::string>()->default_value(".")) (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); - + + { + auto assetDir = args[kGameAssetDir].as<std::string>(); + + fs::path assetDirPath(assetDir); + if (!fs::exists(assetDirPath)) { + fprintf(stderr, "Invalid asset directory.\n"); + return -4; + } + + AppConfig::assetDir = std::move(assetDir); + AppConfig::assetDirPath = std::move(assetDirPath); + } + if (args.count(kGameDataDir) > 0) { auto dataDir = args[kGameDataDir].as<std::string>(); + fs::path dataDirPath(dataDir); - if (!fs::exists(dataDir)) { - fs::create_directories(dataDir); - } + fs::create_directories(dataDir); + AppConfig::dataDir = std::move(dataDir); + AppConfig::dataDirPath = std::move(dataDirPath); } else { + // TODO platform default path AppConfig::dataDir = "."; + AppConfig::dataDirPath = fs::path("."); } - + if (!glfwInit()) { return -1; } - + glfwSetErrorCallback(&GlfwErrorCallback); - + // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) // GL ES 2.0 + GLSL 100 @@ -98,45 +118,48 @@ int main(int argc, char* argv[]) { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); #endif - + App app; - + GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui Command Palette Example", nullptr, nullptr); if (window == nullptr) { return -2; } - + glfwSetWindowUserPointer(window, &app); - + // Window callbacks are retained by ImGui GLFW backend glfwSetKeyCallback(window, &GlfwKeyCallback); glfwSetMouseButtonCallback(window, &GlfwMouseCallback); glfwSetCursorPosCallback(window, &GlfwMouseMotionCallback); - + glfwMakeContextCurrent(window); glfwSwapInterval(1); - + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { return -3; } - + IMGUI_CHECKVERSION(); ImGui::CreateContext(); - + ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init(glsl_version); - + + ShaderManager::instance = new ShaderManager(); + ShaderManager::instance->DiscoverShaders(); + app.Init(); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); - + ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); - + app.Show(); ImGui::ShowNotifications(); - + ImGui::Render(); int display_w, display_h; glfwGetFramebufferSize(window, &display_w, &display_h); @@ -145,18 +168,18 @@ int main(int argc, char* argv[]) { 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(); - + ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); - + ImGui::DestroyContext(); - + glfwDestroyWindow(window); glfwTerminate(); - + return 0; } |