refactor: extract window out of engine
This commit is contained in:
parent
03e8e11111
commit
eb428d11d6
18 changed files with 58 additions and 586 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <engine/layer/layer_stack.hpp>
|
||||
#include <engine/time/timer.hpp>
|
||||
#include <input/input.hpp>
|
||||
#include <ui/ui.hpp>
|
||||
|
||||
namespace lt {
|
||||
|
||||
|
@ -11,6 +8,8 @@ class Renderer;
|
|||
class Window;
|
||||
class Event;
|
||||
class GraphicsContext;
|
||||
class UserInterface;
|
||||
class LayerStack;
|
||||
|
||||
extern Scope<class Application> create_application();
|
||||
|
||||
|
@ -25,7 +24,7 @@ public:
|
|||
|
||||
auto operator=(Application &&) -> Application & = delete;
|
||||
|
||||
virtual ~Application() = default;
|
||||
virtual ~Application();
|
||||
|
||||
[[nodiscard]] auto sanity_check() const -> bool;
|
||||
|
||||
|
|
|
@ -1,32 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
// core
|
||||
#include <engine/core/application.hpp>
|
||||
#include <engine/core/window.hpp>
|
||||
|
||||
// debug
|
||||
#include <engine/layer/layer.hpp>
|
||||
#include <engine/layer/layer_stack.hpp>
|
||||
#include <engine/time/timer.hpp>
|
||||
#include <imgui.h>
|
||||
#include <logger/logger.hpp>
|
||||
|
||||
// graphics
|
||||
#include <renderer/framebuffer.hpp>
|
||||
#include <renderer/graphics_context.hpp>
|
||||
#include <renderer/renderer.hpp>
|
||||
#include <renderer/texture.hpp>
|
||||
|
||||
// layer
|
||||
#include <engine/layer/layer.hpp>
|
||||
#include <engine/layer/layer_stack.hpp>
|
||||
|
||||
// time
|
||||
#include <engine/time/timer.hpp>
|
||||
|
||||
// base
|
||||
|
||||
|
||||
// third party
|
||||
#include <imgui.h>
|
||||
|
||||
// entry point
|
||||
#ifdef LIGHT_ENTRY_POINT
|
||||
#include <engine/core/entrypoint.hpp>
|
||||
#endif
|
||||
|
|
|
@ -1,244 +0,0 @@
|
|||
#include <GLFW/glfw3.h>
|
||||
#include <engine/events/char.hpp>
|
||||
#include <engine/events/event.hpp>
|
||||
#include <engine/events/keyboard.hpp>
|
||||
#include <engine/events/mouse.hpp>
|
||||
#include <engine/events/window.hpp>
|
||||
#include <renderer/graphics_context.hpp>
|
||||
#include <engine/platform/os/windows/w_window.hpp>
|
||||
|
||||
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> Window::create(std::function<void(Event &)> callback)
|
||||
{
|
||||
return create_scope<wWindow>(callback);
|
||||
}
|
||||
|
||||
wWindow::wWindow(std::function<void(Event &)> 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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
|
||||
MouseMovedEvent event(xpos, ypos);
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* mouse button */
|
||||
glfwSetMouseButtonCallback(m_handle, [](GLFWwindow *window, int button, int action, int mods) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
|
||||
SetCharEvent event(character);
|
||||
callback(event);
|
||||
});
|
||||
|
||||
//============================== KEYBOARD_EVENTS ==============================//
|
||||
|
||||
//============================== WINDOW_EVENTS ==============================//
|
||||
/* window position */
|
||||
glfwSetWindowPosCallback(m_handle, [](GLFWwindow *window, int xpos, int ypos) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
WindowMovedEvent event(xpos, ypos);
|
||||
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* window size */
|
||||
glfwSetWindowSizeCallback(m_handle, [](GLFWwindow *window, int width, int height) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
WindowResizedEvent event(width, height);
|
||||
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* window close */
|
||||
glfwSetWindowCloseCallback(m_handle, [](GLFWwindow *window) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
WindowClosedEvent event;
|
||||
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* window focus */
|
||||
glfwSetWindowFocusCallback(m_handle, [](GLFWwindow *window, int focus) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
|
||||
if (focus == GLFW_TRUE)
|
||||
{
|
||||
WindowGainFocusEvent event;
|
||||
callback(event);
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowLostFocusEvent event;
|
||||
callback(event);
|
||||
}
|
||||
});
|
||||
//============================== WINDOW_EVENTS ==============================// }
|
||||
}
|
||||
} // namespace lt
|
|
@ -1,45 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
#include <engine/core/window.hpp>
|
||||
|
||||
struct GLFWwindow;
|
||||
|
||||
namespace lt {
|
||||
|
||||
class Event;
|
||||
class WindowResizedEvent;
|
||||
|
||||
class wWindow: public Window
|
||||
{
|
||||
public:
|
||||
wWindow(std::function<void(Event &)> 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<void(Event &)> m_event_callback;
|
||||
|
||||
void on_window_resize(const WindowResizedEvent &event);
|
||||
|
||||
void bind_glfw_events();
|
||||
};
|
||||
|
||||
} // namespace lt
|
|
@ -1,18 +1,20 @@
|
|||
#include <asset_manager/asset_manager.hpp>
|
||||
#include <debug/assertions.hpp>
|
||||
#include <engine/core/application.hpp>
|
||||
#include <engine/core/window.hpp>
|
||||
#include <engine/layer/layer.hpp>
|
||||
#include <engine/layer/layer_stack.hpp>
|
||||
#include <engine/time/timer.hpp>
|
||||
#include <input/events/event.hpp>
|
||||
#include <input/events/keyboard.hpp>
|
||||
#include <input/events/window.hpp>
|
||||
#include <input/input.hpp>
|
||||
#include <ranges>
|
||||
#include <renderer/blender.hpp>
|
||||
#include <renderer/graphics_context.hpp>
|
||||
#include <renderer/render_command.hpp>
|
||||
#include <renderer/renderer.hpp>
|
||||
#include <ui/ui.hpp>
|
||||
#include <window/linux/window.hpp>
|
||||
|
||||
namespace lt {
|
||||
|
||||
|
@ -70,6 +72,13 @@ Application::Application(): m_window(nullptr)
|
|||
m_layer_stack = create_scope<LayerStack>();
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
|
@ -1,244 +0,0 @@
|
|||
#include <GLFW/glfw3.h>
|
||||
#include <engine/events/char.hpp>
|
||||
#include <engine/events/event.hpp>
|
||||
#include <engine/events/keyboard.hpp>
|
||||
#include <engine/events/mouse.hpp>
|
||||
#include <engine/events/window.hpp>
|
||||
#include <renderer/graphics_context.hpp>
|
||||
#include <engine/platform/os/windows/w_window.hpp>
|
||||
|
||||
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> Window::create(std::function<void(Event &)> callback)
|
||||
{
|
||||
return create_scope<wWindow>(callback);
|
||||
}
|
||||
|
||||
wWindow::wWindow(std::function<void(Event &)> 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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
|
||||
MouseMovedEvent event(xpos, ypos);
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* mouse button */
|
||||
glfwSetMouseButtonCallback(m_handle, [](GLFWwindow *window, int button, int action, int mods) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
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<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
|
||||
SetCharEvent event(character);
|
||||
callback(event);
|
||||
});
|
||||
|
||||
//============================== KEYBOARD_EVENTS ==============================//
|
||||
|
||||
//============================== WINDOW_EVENTS ==============================//
|
||||
/* window position */
|
||||
glfwSetWindowPosCallback(m_handle, [](GLFWwindow *window, int xpos, int ypos) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
WindowMovedEvent event(xpos, ypos);
|
||||
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* window size */
|
||||
glfwSetWindowSizeCallback(m_handle, [](GLFWwindow *window, int width, int height) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
WindowResizedEvent event(width, height);
|
||||
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* window close */
|
||||
glfwSetWindowCloseCallback(m_handle, [](GLFWwindow *window) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
WindowClosedEvent event;
|
||||
|
||||
callback(event);
|
||||
});
|
||||
|
||||
/* window focus */
|
||||
glfwSetWindowFocusCallback(m_handle, [](GLFWwindow *window, int focus) {
|
||||
std::function<void(Event &)> callback = *(std::function<void(Event &)> *)
|
||||
glfwGetWindowUserPointer(window);
|
||||
|
||||
if (focus == GLFW_TRUE)
|
||||
{
|
||||
WindowGainFocusEvent event;
|
||||
callback(event);
|
||||
}
|
||||
else
|
||||
{
|
||||
WindowLostFocusEvent event;
|
||||
callback(event);
|
||||
}
|
||||
});
|
||||
//============================== WINDOW_EVENTS ==============================// }
|
||||
}
|
||||
} // namespace lt
|
|
@ -3,6 +3,7 @@
|
|||
#include <ecs/components.hpp>
|
||||
#include <ecs/scene.hpp>
|
||||
#include <engine/utils/serializer.hpp>
|
||||
#include <input/input.hpp>
|
||||
#include <input/key_codes.hpp>
|
||||
#include <mirror/editor_layer.hpp>
|
||||
#include <ui/ui.hpp>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
//
|
||||
#include <mirror/editor_layer.hpp>
|
||||
#include <window/window.hpp>
|
||||
|
||||
//
|
||||
#include <engine/engine.hpp>
|
||||
|
|
12
modules/window/CMakeLists.txt
Normal file
12
modules/window/CMakeLists.txt
Normal file
|
@ -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
|
||||
)
|
|
@ -1,6 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <engine/core/window.hpp>
|
||||
#include <window/window.hpp>
|
||||
|
||||
struct GLFWwindow;
|
||||
|
0
modules/window/include/window/mac/window.hpp
Normal file
0
modules/window/include/window/mac/window.hpp
Normal file
|
@ -1,8 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <renderer/graphics_context.hpp>
|
||||
|
||||
namespace lt {
|
||||
|
||||
|
@ -22,15 +20,13 @@ class Window
|
|||
public:
|
||||
static Scope<Window> create(const std::function<void(Event &)> &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
|
0
modules/window/include/window/windows/window.hpp
Normal file
0
modules/window/include/window/windows/window.hpp
Normal file
|
@ -1,14 +1,17 @@
|
|||
#include <GLFW/glfw3.h>
|
||||
#include <engine/os/linux/l_window.hpp>
|
||||
#include <input/events/char.hpp>
|
||||
#include <input/events/event.hpp>
|
||||
#include <input/events/keyboard.hpp>
|
||||
#include <input/events/mouse.hpp>
|
||||
#include <input/events/window.hpp>
|
||||
#include <renderer/graphics_context.hpp>
|
||||
#include <window/linux/window.hpp>
|
||||
|
||||
namespace lt {
|
||||
|
||||
Window::~Window()
|
||||
{
|
||||
}
|
||||
|
||||
auto Window::create(const std::function<void(Event &)> &callback) -> Scope<Window>
|
||||
{
|
||||
return create_scope<lWindow>(callback);
|
||||
|
@ -29,7 +32,6 @@ lWindow::lWindow(std::function<void(Event &)> 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();
|
||||
}
|
0
modules/window/src/mac/window.cpp
Normal file
0
modules/window/src/mac/window.cpp
Normal file
0
modules/window/src/windows/window.cpp
Normal file
0
modules/window/src/windows/window.cpp
Normal file
Loading…
Add table
Reference in a new issue