aboutsummaryrefslogtreecommitdiff
path: root/source/main.cpp
diff options
context:
space:
mode:
authorhnOsmium0001 <[email protected]>2022-04-09 13:29:41 -0700
committerhnOsmium0001 <[email protected]>2022-04-09 13:29:41 -0700
commit906557f094e407ce21d429ef647bc75fe3179cf1 (patch)
tree5e6aaed6537a0328318b6cd6561f6a76bf8aa27d /source/main.cpp
parente47a98793e58a5dbbe76bfed27e59408e43538e4 (diff)
More work on editor
Diffstat (limited to 'source/main.cpp')
-rw-r--r--source/main.cpp85
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;
}