diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index db218ad..a33fd7c 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -10,6 +10,7 @@ add_subdirectory(./camera) add_subdirectory(./input) add_subdirectory(./ui) +add_subdirectory(./window) add_subdirectory(./renderer) add_subdirectory(./ecs) add_subdirectory(./engine) diff --git a/modules/engine/CMakeLists.txt b/modules/engine/CMakeLists.txt index 35ac9f5..e1a373d 100644 --- a/modules/engine/CMakeLists.txt +++ b/modules/engine/CMakeLists.txt @@ -5,7 +5,6 @@ if(NOT WIN32) debug/instrumentor.cpp layer/layer.cpp layer/layer_stack.cpp - os/linux/l_window.cpp time/timer.cpp utils/serializer.cpp ) @@ -16,24 +15,25 @@ else() debug/instrumentor.cpp layer/layer.cpp layer/layer_stack.cpp - os/windows/w_window.cpp time/timer.cpp utils/serializer.cpp ) endif() -target_link_libraries( - engine - PUBLIC renderer - PUBLIC glad - PUBLIC logger - PUBLIC opengl::opengl - PUBLIC glfw - PUBLIC ui - PUBLIC asset_parser - PUBLIC asset_manager - PUBLIC yaml-cpp::yaml-cpp - PUBLIC EnTT::EnTT - PUBLIC lt_debug - PUBLIC ecs +target_link_libraries(engine +PUBLIC + renderer + logger + ui + asset_parser + asset_manager + lt_debug + ecs + window + + glad + + opengl::opengl + yaml-cpp::yaml-cpp + EnTT::EnTT ) diff --git a/modules/engine/include/engine/core/application.hpp b/modules/engine/include/engine/core/application.hpp index 81af177..c2d66bf 100644 --- a/modules/engine/include/engine/core/application.hpp +++ b/modules/engine/include/engine/core/application.hpp @@ -1,9 +1,6 @@ #pragma once -#include #include -#include -#include namespace lt { @@ -11,6 +8,8 @@ class Renderer; class Window; class Event; class GraphicsContext; +class UserInterface; +class LayerStack; extern Scope create_application(); @@ -25,7 +24,7 @@ public: auto operator=(Application &&) -> Application & = delete; - virtual ~Application() = default; + virtual ~Application(); [[nodiscard]] auto sanity_check() const -> bool; diff --git a/modules/engine/include/engine/engine.hpp b/modules/engine/include/engine/engine.hpp index de45fdc..50cc2e6 100644 --- a/modules/engine/include/engine/engine.hpp +++ b/modules/engine/include/engine/engine.hpp @@ -1,32 +1,16 @@ #pragma once -// core #include -#include - -// debug +#include +#include +#include +#include #include - -// graphics #include #include #include #include -// layer -#include -#include - -// time -#include - -// base - - -// third party -#include - -// entry point #ifdef LIGHT_ENTRY_POINT #include #endif diff --git a/modules/engine/include/engine/os/windows/w_window.cpp b/modules/engine/include/engine/os/windows/w_window.cpp deleted file mode 100644 index 712fd56..0000000 --- a/modules/engine/include/engine/os/windows/w_window.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" -{ - // Force Machine to use Dedicated Graphics - __declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001; // NVidia - __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; // AMD -} - -namespace lt { - -Scope Window::create(std::function callback) -{ - return create_scope(callback); -} - -wWindow::wWindow(std::function callback) - : m_handle(nullptr) - , m_event_callback(callback) -{ - // init glfw - lt_assert(glfwInit(), "wWindow::wWindow: failed to initialize 'glfw'"); - - // create window - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); - - m_handle = glfwCreateWindow(1u, 1u, "", nullptr, nullptr); - lt_assert(m_handle, "wWindow::wWindow: glfwCreateWindow: failed to create 'GLFWwindow'"); - - // bind event stuff - glfwSetWindowUserPointer(m_handle, &m_event_callback); - bind_glfw_events(); - - // create graphics context - m_graphics_context = GraphicsContext::create(GraphicsAPI::DirectX, m_handle); - lt_assert(m_graphics_context, "wWindow::wWindow: failed to create 'GraphicsContext'"); -} - -wWindow::~wWindow() -{ - glfwDestroyWindow(m_handle); -} - -void wWindow::poll_events() -{ - glfwPollEvents(); -} - -void wWindow::on_event(const Event &event) -{ - switch (event.get_event_type()) - { - /* closed */ - case EventType::WindowClosed: b_Closed = true; break; - - /* resized */ - case EventType::WindowResized: on_window_resize((const WindowResizedEvent &)event); break; - } -} - -void wWindow::on_window_resize(const WindowResizedEvent &event) -{ - m_properties.size = event.get_size(); -} - -void wWindow:: - set_properties(const WindowProperties &properties, bool overrideVisiblity /* = false */) -{ - // save the visibility status and re-assign if 'overrideVisibility' is false - bool visible = overrideVisiblity ? properties.visible : m_properties.visible; - m_properties = properties; - m_properties.visible = visible; - - // set properties - set_title(properties.title); - set_size(properties.size); - set_v_sync(properties.vsync); - set_visibility(visible); -} - -void wWindow::set_title(const std::string &title) -{ - m_properties.title = title; - - glfwSetWindowTitle(m_handle, m_properties.title.c_str()); -} - -void wWindow::set_size(const glm::uvec2 &size, bool additive /* = false */) -{ - m_properties.size.x = size.x == 0u ? m_properties.size.x : - additive ? m_properties.size.x + size.x : - size.x; - m_properties.size.y = size.y == 0u ? m_properties.size.y : - additive ? m_properties.size.y + size.y : - size.y; - - - glfwSetWindowSize(m_handle, size.x, size.y); -} - -void wWindow::set_v_sync(bool vsync, bool toggle /* = false */) -{ - m_properties.vsync = toggle ? !m_properties.vsync : vsync; - - glfwSwapInterval(m_properties.vsync); -} - -void wWindow::set_visibility(bool visible, bool toggle) -{ - m_properties.visible = toggle ? !m_properties.visible : visible; - - if (m_properties.visible) - glfwShowWindow(m_handle); - else - glfwHideWindow(m_handle); -} - -void wWindow::bind_glfw_events() -{ - //============================== MOUSE_EVENTS ==============================// - /* cursor position */ - glfwSetCursorPosCallback(m_handle, [](GLFWwindow *window, double xpos, double ypos) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - MouseMovedEvent event(xpos, ypos); - callback(event); - }); - - /* mouse button */ - glfwSetMouseButtonCallback(m_handle, [](GLFWwindow *window, int button, int action, int mods) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - if (action == GLFW_PRESS) - { - ButtonPressedEvent event(button); - callback(event); - } - else if (action == GLFW_RELEASE) - { - ButtonReleasedEvent event(button); - callback(event); - } - }); - - /* scroll */ - glfwSetScrollCallback(m_handle, [](GLFWwindow *window, double xoffset, double yoffset) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - WheelScrolledEvent event(yoffset); - callback(event); - }); - //============================== MOUSE_EVENTS ==============================// - - //============================== KEYBOARD_EVENTS ==============================// - /* key */ - glfwSetKeyCallback( - m_handle, - [](GLFWwindow *window, int key, int scancode, int action, int mods) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - if (action == GLFW_PRESS) - { - KeyPressedEvent event(key); - callback(event); - } - else if (action == GLFW_RELEASE) - { - KeyReleasedEvent event(key); - callback(event); - } - } - ); - /* char */ - glfwSetCharCallback(m_handle, [](GLFWwindow *window, unsigned int character) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - SetCharEvent event(character); - callback(event); - }); - - //============================== KEYBOARD_EVENTS ==============================// - - //============================== WINDOW_EVENTS ==============================// - /* window position */ - glfwSetWindowPosCallback(m_handle, [](GLFWwindow *window, int xpos, int ypos) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - WindowMovedEvent event(xpos, ypos); - - callback(event); - }); - - /* window size */ - glfwSetWindowSizeCallback(m_handle, [](GLFWwindow *window, int width, int height) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - WindowResizedEvent event(width, height); - - callback(event); - }); - - /* window close */ - glfwSetWindowCloseCallback(m_handle, [](GLFWwindow *window) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - WindowClosedEvent event; - - callback(event); - }); - - /* window focus */ - glfwSetWindowFocusCallback(m_handle, [](GLFWwindow *window, int focus) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - if (focus == GLFW_TRUE) - { - WindowGainFocusEvent event; - callback(event); - } - else - { - WindowLostFocusEvent event; - callback(event); - } - }); - //============================== WINDOW_EVENTS ==============================// } -} -} // namespace lt diff --git a/modules/engine/include/engine/os/windows/w_window.hpp b/modules/engine/include/engine/os/windows/w_window.hpp deleted file mode 100644 index 13ae641..0000000 --- a/modules/engine/include/engine/os/windows/w_window.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - - -#include - -struct GLFWwindow; - -namespace lt { - -class Event; -class WindowResizedEvent; - -class wWindow: public Window -{ -public: - wWindow(std::function callback); - - ~wWindow(); - - void poll_events() override; - - void on_event(const Event &event) override; - - void set_properties(const WindowProperties &properties, bool overrideVisibility = false) - override; - - void set_title(const std::string &title) override; - - void set_size(const glm::uvec2 &size, bool additive = false) override; - - void set_v_sync(bool vsync, bool toggle = false) override; - - void set_visibility(bool visible, bool toggle = false) override; - -private: - GLFWwindow *m_handle; - - std::function m_event_callback; - - void on_window_resize(const WindowResizedEvent &event); - - void bind_glfw_events(); -}; - -} // namespace lt diff --git a/modules/engine/src/core/application.cpp b/modules/engine/src/core/application.cpp index d3474c0..b3205b3 100644 --- a/modules/engine/src/core/application.cpp +++ b/modules/engine/src/core/application.cpp @@ -1,18 +1,20 @@ #include #include #include -#include #include +#include #include #include #include #include +#include #include #include #include #include #include #include +#include namespace lt { @@ -70,6 +72,13 @@ Application::Application(): m_window(nullptr) m_layer_stack = create_scope(); } +Application::~Application() +{ + /** This is required to make forward-declarations possible: + * https://stackoverflow.com/questions/34072862/why-is-error-invalid-application-of-sizeof-to-an-incomplete-type-using-uniqu + */ +} + void Application::game_loop() { m_window->set_visibility(true); diff --git a/modules/engine/src/os/windows/w_window.cpp b/modules/engine/src/os/windows/w_window.cpp deleted file mode 100644 index 712fd56..0000000 --- a/modules/engine/src/os/windows/w_window.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" -{ - // Force Machine to use Dedicated Graphics - __declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001; // NVidia - __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; // AMD -} - -namespace lt { - -Scope Window::create(std::function callback) -{ - return create_scope(callback); -} - -wWindow::wWindow(std::function callback) - : m_handle(nullptr) - , m_event_callback(callback) -{ - // init glfw - lt_assert(glfwInit(), "wWindow::wWindow: failed to initialize 'glfw'"); - - // create window - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); - - m_handle = glfwCreateWindow(1u, 1u, "", nullptr, nullptr); - lt_assert(m_handle, "wWindow::wWindow: glfwCreateWindow: failed to create 'GLFWwindow'"); - - // bind event stuff - glfwSetWindowUserPointer(m_handle, &m_event_callback); - bind_glfw_events(); - - // create graphics context - m_graphics_context = GraphicsContext::create(GraphicsAPI::DirectX, m_handle); - lt_assert(m_graphics_context, "wWindow::wWindow: failed to create 'GraphicsContext'"); -} - -wWindow::~wWindow() -{ - glfwDestroyWindow(m_handle); -} - -void wWindow::poll_events() -{ - glfwPollEvents(); -} - -void wWindow::on_event(const Event &event) -{ - switch (event.get_event_type()) - { - /* closed */ - case EventType::WindowClosed: b_Closed = true; break; - - /* resized */ - case EventType::WindowResized: on_window_resize((const WindowResizedEvent &)event); break; - } -} - -void wWindow::on_window_resize(const WindowResizedEvent &event) -{ - m_properties.size = event.get_size(); -} - -void wWindow:: - set_properties(const WindowProperties &properties, bool overrideVisiblity /* = false */) -{ - // save the visibility status and re-assign if 'overrideVisibility' is false - bool visible = overrideVisiblity ? properties.visible : m_properties.visible; - m_properties = properties; - m_properties.visible = visible; - - // set properties - set_title(properties.title); - set_size(properties.size); - set_v_sync(properties.vsync); - set_visibility(visible); -} - -void wWindow::set_title(const std::string &title) -{ - m_properties.title = title; - - glfwSetWindowTitle(m_handle, m_properties.title.c_str()); -} - -void wWindow::set_size(const glm::uvec2 &size, bool additive /* = false */) -{ - m_properties.size.x = size.x == 0u ? m_properties.size.x : - additive ? m_properties.size.x + size.x : - size.x; - m_properties.size.y = size.y == 0u ? m_properties.size.y : - additive ? m_properties.size.y + size.y : - size.y; - - - glfwSetWindowSize(m_handle, size.x, size.y); -} - -void wWindow::set_v_sync(bool vsync, bool toggle /* = false */) -{ - m_properties.vsync = toggle ? !m_properties.vsync : vsync; - - glfwSwapInterval(m_properties.vsync); -} - -void wWindow::set_visibility(bool visible, bool toggle) -{ - m_properties.visible = toggle ? !m_properties.visible : visible; - - if (m_properties.visible) - glfwShowWindow(m_handle); - else - glfwHideWindow(m_handle); -} - -void wWindow::bind_glfw_events() -{ - //============================== MOUSE_EVENTS ==============================// - /* cursor position */ - glfwSetCursorPosCallback(m_handle, [](GLFWwindow *window, double xpos, double ypos) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - MouseMovedEvent event(xpos, ypos); - callback(event); - }); - - /* mouse button */ - glfwSetMouseButtonCallback(m_handle, [](GLFWwindow *window, int button, int action, int mods) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - if (action == GLFW_PRESS) - { - ButtonPressedEvent event(button); - callback(event); - } - else if (action == GLFW_RELEASE) - { - ButtonReleasedEvent event(button); - callback(event); - } - }); - - /* scroll */ - glfwSetScrollCallback(m_handle, [](GLFWwindow *window, double xoffset, double yoffset) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - WheelScrolledEvent event(yoffset); - callback(event); - }); - //============================== MOUSE_EVENTS ==============================// - - //============================== KEYBOARD_EVENTS ==============================// - /* key */ - glfwSetKeyCallback( - m_handle, - [](GLFWwindow *window, int key, int scancode, int action, int mods) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - if (action == GLFW_PRESS) - { - KeyPressedEvent event(key); - callback(event); - } - else if (action == GLFW_RELEASE) - { - KeyReleasedEvent event(key); - callback(event); - } - } - ); - /* char */ - glfwSetCharCallback(m_handle, [](GLFWwindow *window, unsigned int character) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - SetCharEvent event(character); - callback(event); - }); - - //============================== KEYBOARD_EVENTS ==============================// - - //============================== WINDOW_EVENTS ==============================// - /* window position */ - glfwSetWindowPosCallback(m_handle, [](GLFWwindow *window, int xpos, int ypos) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - WindowMovedEvent event(xpos, ypos); - - callback(event); - }); - - /* window size */ - glfwSetWindowSizeCallback(m_handle, [](GLFWwindow *window, int width, int height) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - WindowResizedEvent event(width, height); - - callback(event); - }); - - /* window close */ - glfwSetWindowCloseCallback(m_handle, [](GLFWwindow *window) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - WindowClosedEvent event; - - callback(event); - }); - - /* window focus */ - glfwSetWindowFocusCallback(m_handle, [](GLFWwindow *window, int focus) { - std::function callback = *(std::function *) - glfwGetWindowUserPointer(window); - - if (focus == GLFW_TRUE) - { - WindowGainFocusEvent event; - callback(event); - } - else - { - WindowLostFocusEvent event; - callback(event); - } - }); - //============================== WINDOW_EVENTS ==============================// } -} -} // namespace lt diff --git a/modules/mirror/src/editor_layer.cpp b/modules/mirror/src/editor_layer.cpp index 0e58b07..6d8f2c5 100644 --- a/modules/mirror/src/editor_layer.cpp +++ b/modules/mirror/src/editor_layer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/modules/mirror/src/mirror.cpp b/modules/mirror/src/mirror.cpp index 49fc46e..7f6c3d0 100644 --- a/modules/mirror/src/mirror.cpp +++ b/modules/mirror/src/mirror.cpp @@ -2,6 +2,7 @@ // #include +#include // #include diff --git a/modules/window/CMakeLists.txt b/modules/window/CMakeLists.txt new file mode 100644 index 0000000..9fe6c0a --- /dev/null +++ b/modules/window/CMakeLists.txt @@ -0,0 +1,12 @@ +if (NOT WIN32) + add_library_module(window linux/window.cpp) +else() + add_library_module(window windows/window.cpp) +endif() + +target_link_libraries(window PUBLIC + glfw + logger + lt_debug + input +) diff --git a/modules/engine/include/engine/os/linux/l_window.hpp b/modules/window/include/window/linux/window.hpp similarity index 96% rename from modules/engine/include/engine/os/linux/l_window.hpp rename to modules/window/include/window/linux/window.hpp index a4181f7..d0eae34 100644 --- a/modules/engine/include/engine/os/linux/l_window.hpp +++ b/modules/window/include/window/linux/window.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include struct GLFWwindow; diff --git a/modules/window/include/window/mac/window.hpp b/modules/window/include/window/mac/window.hpp new file mode 100644 index 0000000..e69de29 diff --git a/modules/engine/include/engine/core/window.hpp b/modules/window/include/window/window.hpp similarity index 90% rename from modules/engine/include/engine/core/window.hpp rename to modules/window/include/window/window.hpp index 42359ad..df52220 100644 --- a/modules/engine/include/engine/core/window.hpp +++ b/modules/window/include/window/window.hpp @@ -1,8 +1,6 @@ #pragma once - #include -#include namespace lt { @@ -22,15 +20,13 @@ class Window public: static Scope create(const std::function &callback); - Window(): m_properties {} - { - } + Window() = default; Window(const Window &) = delete; Window &operator=(const Window &) = delete; - virtual ~Window() = default; + virtual ~Window(); virtual void poll_events() = 0; @@ -88,9 +84,9 @@ public: virtual auto get_handle() -> void * = 0; protected: - WindowProperties m_properties; + WindowProperties m_properties {}; - bool b_Closed { false }; + bool b_Closed {}; }; } // namespace lt diff --git a/modules/window/include/window/windows/window.hpp b/modules/window/include/window/windows/window.hpp new file mode 100644 index 0000000..e69de29 diff --git a/modules/engine/src/os/linux/l_window.cpp b/modules/window/src/linux/window.cpp similarity index 98% rename from modules/engine/src/os/linux/l_window.cpp rename to modules/window/src/linux/window.cpp index bc63057..ef34e3f 100644 --- a/modules/engine/src/os/linux/l_window.cpp +++ b/modules/window/src/linux/window.cpp @@ -1,14 +1,17 @@ #include -#include #include #include #include #include #include -#include +#include namespace lt { +Window::~Window() +{ +} + auto Window::create(const std::function &callback) -> Scope { return create_scope(callback); @@ -29,7 +32,6 @@ lWindow::lWindow(std::function callback) m_handle = glfwCreateWindow(1u, 1u, "", nullptr, nullptr); lt_assert(m_handle, "lWindow::lWindow: failed to create 'GLFWwindow'"); - // bind event stuff glfwSetWindowUserPointer(m_handle, &m_event_callback); bind_glfw_events(); } diff --git a/modules/window/src/mac/window.cpp b/modules/window/src/mac/window.cpp new file mode 100644 index 0000000..e69de29 diff --git a/modules/window/src/windows/window.cpp b/modules/window/src/windows/window.cpp new file mode 100644 index 0000000..e69de29