From d817c3084dc56947de23383717bc3386748af4a3 Mon Sep 17 00:00:00 2001 From: Thraix Date: Tue, 23 May 2023 13:02:21 +0200 Subject: [PATCH] Improvement to coordinate system - Flip coordinate system for SwapChain passthrough - Normalize MouseMoveEvent coordination - Add RemoveSystem to Ecs --- CopiumEngine/res/shaders/passthrough.vert | 1 + CopiumEngine/src/copium/core/Application.cpp | 31 +++---------------- CopiumEngine/src/copium/core/Application.h | 4 --- CopiumEngine/src/copium/core/Scene.cpp | 2 -- CopiumEngine/src/copium/core/Window.cpp | 21 +++++++++---- CopiumEngine/src/copium/core/Window.h | 3 ++ CopiumEngine/src/copium/ecs/ECSManager.h | 6 ++++ CopiumEngine/src/copium/ecs/SystemPool.cpp | 16 ++++++++++ CopiumEngine/src/copium/ecs/SystemPool.h | 2 ++ .../src/copium/example/MouseFollowSystem.h | 6 ++-- .../src/copium/example/RenderSystem.h | 3 +- CopiumEngine/src/copium/renderer/Renderer.cpp | 12 +++---- 12 files changed, 59 insertions(+), 48 deletions(-) diff --git a/CopiumEngine/res/shaders/passthrough.vert b/CopiumEngine/res/shaders/passthrough.vert index 86866a7..40e2c27 100644 --- a/CopiumEngine/res/shaders/passthrough.vert +++ b/CopiumEngine/res/shaders/passthrough.vert @@ -8,4 +8,5 @@ void main() { gl_Position = vec4(inPosition, 0.0, 1.0); outTexCoord = inPosition * 0.5 + 0.5; + outTexCoord.y = 1.0 - outTexCoord.y; } \ No newline at end of file diff --git a/CopiumEngine/src/copium/core/Application.cpp b/CopiumEngine/src/copium/core/Application.cpp index d5e6b33..ae13e4c 100644 --- a/CopiumEngine/src/copium/core/Application.cpp +++ b/CopiumEngine/src/copium/core/Application.cpp @@ -19,13 +19,13 @@ namespace Copium { const std::vector vertices = { Vertex{{-0.5f, 0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, - Vertex{{ 0.5f, 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, - Vertex{{ 0.5f, 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, Vertex{{-0.5f, 0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}, + Vertex{{ 0.5f, 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, + Vertex{{ 0.5f, 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, Vertex{{-0.5f, 0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, - Vertex{{ 0.5f, 0.0f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, - Vertex{{ 0.5f, 0.0f, 0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, Vertex{{-0.5f, 0.0f, 0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}, + Vertex{{ 0.5f, 0.0f, 0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, + Vertex{{ 0.5f, 0.0f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, }; const std::vector indices = { @@ -77,14 +77,6 @@ namespace Copium Vulkan::GetSwapChain().SubmitToGraphicsQueue(*commandBuffer); Vulkan::GetSwapChain().EndPresent(); - if (timer.Elapsed() >= 1.0) - { - fps = frameCounter; - frameCounter = 0; - timer.Start(); // Not quite accurate since the elapsed time might me 1.1, then we lose 0.1 precision - } - frameCounter++; - return !glfwWindowShouldClose(Vulkan::GetWindow().GetWindow()); } @@ -101,16 +93,6 @@ namespace Copium return EventResult::Continue; } - case EventType::MouseMove: - { - const MouseMoveEvent& mouseMoveEvent = static_cast(event); - - float aspect = Vulkan::GetSwapChain().GetExtent().width / (float)Vulkan::GetSwapChain().GetExtent().height; - mousePos = {(mouseMoveEvent.GetPos().x / Vulkan::GetSwapChain().GetExtent().width - 0.5) * 2.0 * aspect, - -(mouseMoveEvent.GetPos().y / Vulkan::GetSwapChain().GetExtent().height - 0.5) * 2.0}; - - return EventResult::Continue; - } case EventType::MousePress: { const MousePressEvent& mousePressEvent = static_cast(event); @@ -231,11 +213,8 @@ namespace Copium float aspect = fb.GetWidth() / (float)fb.GetHeight(); { - glm::mat4 projection = glm::perspective(glm::radians(45.0f), aspect, 0.1f, 10.0f); - projection[1][1] *= -1; - UniformBuffer& uniformBuffer = descriptorSet->GetUniformBuffer("ubo"); - uniformBuffer.Set("projection", projection); + uniformBuffer.Set("projection", glm::perspective(glm::radians(45.0f), aspect, 0.1f, 10.0f)); uniformBuffer.Set("view", glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f))); uniformBuffer.Set("model", glm::rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 1.0f, 0.0f))); uniformBuffer.Set("lightPos", (glm::vec3)(glm::rotate(glm::mat4{1.0f}, time * glm::radians(45.0f), glm::vec3(0, 1, 0)) * glm::vec4{0.3, 0.1, 0, 1})); diff --git a/CopiumEngine/src/copium/core/Application.h b/CopiumEngine/src/copium/core/Application.h index e397f2a..5f7fb62 100644 --- a/CopiumEngine/src/copium/core/Application.h +++ b/CopiumEngine/src/copium/core/Application.h @@ -30,10 +30,6 @@ namespace Copium std::unique_ptr meshPassthrough; std::unique_ptr commandBuffer; - glm::vec2 mousePos; - int fps; - int frameCounter; - public: Application(); ~Application(); diff --git a/CopiumEngine/src/copium/core/Scene.cpp b/CopiumEngine/src/copium/core/Scene.cpp index 60e635c..097fdac 100644 --- a/CopiumEngine/src/copium/core/Scene.cpp +++ b/CopiumEngine/src/copium/core/Scene.cpp @@ -52,8 +52,6 @@ namespace Copium entityMouse.AddComponent(AssetRef{AssetManager::LoadAsset("fox2.meta")}, glm::vec2{0.0f, 0.0f}, glm::vec2{1.0f, 1.0f}); entityMouse.AddComponent(); - glm::vec2 pos = glm::vec2{-aspect + 0.01, 0.94}; - Entity entityText = Entity::Create(ecs.get()); entityText.AddComponent(glm::vec2{-aspect + 0.01, 0.94}, glm::vec2{1.0}); entityText.AddComponent(AssetRef{AssetManager::LoadAsset("font.meta")}, std::to_string(0) + " fps", 0.06f); diff --git a/CopiumEngine/src/copium/core/Window.cpp b/CopiumEngine/src/copium/core/Window.cpp index bc146bd..f76666f 100644 --- a/CopiumEngine/src/copium/core/Window.cpp +++ b/CopiumEngine/src/copium/core/Window.cpp @@ -14,6 +14,7 @@ namespace Copium { Window::Window(const std::string& windowName, int width, int height, WindowMode mode) + : width{width}, height{height} { InitializeWindow(windowName, width, height, mode); InitializeSurface(); @@ -46,6 +47,8 @@ namespace Copium GLFWmonitor* monitor = glfwGetPrimaryMonitor(); const GLFWvidmode* mode = glfwGetVideoMode(monitor); window = glfwCreateWindow(mode->width, mode->height, windowName.c_str(), monitor, nullptr); + width = mode->width; + height = mode->height; break; } case WindowMode::BorderlessWindowed: @@ -54,6 +57,8 @@ namespace Copium glfwWindowHint(GLFW_DECORATED, false); window = glfwCreateWindow(mode->width, mode->height, windowName.c_str(), nullptr, nullptr); + width = mode->width; + height = mode->height; break; } case WindowMode::Windowed: @@ -85,11 +90,14 @@ namespace Copium { if (width == 0 || height == 0) return; + Window* window = (Window*)glfwGetWindowUserPointer(glfwWindow); + window->width = width; + window->height = height; Vulkan::GetSwapChain().ResizeFramebuffer(); EventDispatcher::QueueEvent(WindowResizeEvent{width, height}); } - void Window::KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) + void Window::KeyCallback(GLFWwindow* glfwWindow, int key, int scancode, int action, int mods) { if (action == GLFW_PRESS) EventDispatcher::QueueEvent(KeyPressEvent(key)); @@ -97,7 +105,7 @@ namespace Copium EventDispatcher::QueueEvent(KeyReleaseEvent(key)); } - void Window::MouseButtonCallback(GLFWwindow* window, int button, int action, int mods) + void Window::MouseButtonCallback(GLFWwindow* glfwWindow, int button, int action, int mods) { if (action == GLFW_PRESS) EventDispatcher::QueueEvent(MousePressEvent{button}); @@ -105,17 +113,18 @@ namespace Copium EventDispatcher::QueueEvent(MouseReleaseEvent{button}); } - void Window::MouseMoveCallback(GLFWwindow* window, double xpos, double ypos) + void Window::MouseMoveCallback(GLFWwindow* glfwWindow, double xpos, double ypos) { - EventDispatcher::QueueEvent(MouseMoveEvent{glm::vec2{xpos, ypos}}); // TODO: Convert to Vulkan coordinates + Window* window = (Window*)glfwGetWindowUserPointer(glfwWindow); + EventDispatcher::QueueEvent(MouseMoveEvent{glm::vec2{xpos / window->width * 2.0 - 1.0, -(ypos / window->height * 2.0 - 1.0)}}); } - void Window::WindowFocusCallback(GLFWwindow* window, int focused) + void Window::WindowFocusCallback(GLFWwindow* glfwWindow, int focused) { EventDispatcher::QueueEvent(WindowFocusEvent{focused == GLFW_TRUE}); } - void Window::MouseScrollCallback(GLFWwindow* window, double xoffset, double yoffset) + void Window::MouseScrollCallback(GLFWwindow* glfwWindow, double xoffset, double yoffset) { EventDispatcher::QueueEvent(MouseScrollEvent{(int)xoffset, (int)yoffset}); } diff --git a/CopiumEngine/src/copium/core/Window.h b/CopiumEngine/src/copium/core/Window.h index 4f7871a..e89db90 100644 --- a/CopiumEngine/src/copium/core/Window.h +++ b/CopiumEngine/src/copium/core/Window.h @@ -17,6 +17,9 @@ namespace Copium GLFWwindow* window; VkSurfaceKHR surface; + int width; + int height; + public: Window(const std::string& windowName, int width, int height, WindowMode mode); ~Window(); diff --git a/CopiumEngine/src/copium/ecs/ECSManager.h b/CopiumEngine/src/copium/ecs/ECSManager.h index 1069b9c..242abf8 100644 --- a/CopiumEngine/src/copium/ecs/ECSManager.h +++ b/CopiumEngine/src/copium/ecs/ECSManager.h @@ -33,6 +33,12 @@ namespace Copium return systemPool->AddSystem(typeid(SystemClass), new SystemClass{args...}); } + template + void RemoveSystem() + { + systemPool->MoveSystemBefore(typeid(SystemClass)); + } + void UpdateSystems(); void UpdateSystems(const Signal& signal); diff --git a/CopiumEngine/src/copium/ecs/SystemPool.cpp b/CopiumEngine/src/copium/ecs/SystemPool.cpp index eb7ea15..4a2a06e 100644 --- a/CopiumEngine/src/copium/ecs/SystemPool.cpp +++ b/CopiumEngine/src/copium/ecs/SystemPool.cpp @@ -19,11 +19,27 @@ namespace Copium SystemOrderer SystemPool::AddSystem(const std::type_index& systemId, SystemBase* system) { system->manager = manager; + CP_ASSERT(systems.find(systemId) == systems.end(), "System already exist in Ecs"); systems.emplace(systemId, system); systemOrder.emplace_back(system); return SystemOrderer{systemId, this}; } + void SystemPool::RemoveSystem(const std::type_index& systemId) + { + auto it = systems.find(systemId); + if (it == systems.end()) + { + CP_WARN("System does not exist in Ecs"); + return; + } + + auto itOrder = std::find(systemOrder.begin(), systemOrder.end(), it->second); + delete it->second; + systems.erase(it); + systemOrder.erase(itOrder); + } + void SystemPool::Update() { for (auto& system : systemOrder) diff --git a/CopiumEngine/src/copium/ecs/SystemPool.h b/CopiumEngine/src/copium/ecs/SystemPool.h index b0abe1c..622b784 100644 --- a/CopiumEngine/src/copium/ecs/SystemPool.h +++ b/CopiumEngine/src/copium/ecs/SystemPool.h @@ -24,7 +24,9 @@ namespace Copium public: SystemPool(ECSManager* manager); ~SystemPool(); + SystemOrderer AddSystem(const std::type_index& systemId, SystemBase* system); + void RemoveSystem(const std::type_index& systemId); void Update(); void Update(const Signal& signal); diff --git a/CopiumEngine/src/copium/example/MouseFollowSystem.h b/CopiumEngine/src/copium/example/MouseFollowSystem.h index fd14c18..851aaa6 100644 --- a/CopiumEngine/src/copium/example/MouseFollowSystem.h +++ b/CopiumEngine/src/copium/example/MouseFollowSystem.h @@ -7,6 +7,8 @@ #include "copium/event/MouseMoveEvent.h" #include "copium/example/Components.h" +#include + namespace Copium { class MouseFollowSystem : public System @@ -21,8 +23,8 @@ namespace Copium { const MouseMoveEvent& mouseMoveEvent = static_cast(eventSignal.GetEvent()); float aspect = Vulkan::GetSwapChain().GetExtent().width / (float)Vulkan::GetSwapChain().GetExtent().height; - transform.position = {(mouseMoveEvent.GetPos().x / Vulkan::GetSwapChain().GetExtent().width - 0.5) * 2.0 * aspect, - -(mouseMoveEvent.GetPos().y / Vulkan::GetSwapChain().GetExtent().height - 0.5) * 2.0}; + // TODO: Get projectionViewMatrix from camera + transform.position = glm::inverse(glm::ortho(-aspect, aspect, -1.0f, 1.0f)) * glm::vec4{mouseMoveEvent.GetPos().x, mouseMoveEvent.GetPos().y, 0.0f, 0.0f}; transform.position -= transform.size * glm::vec2{0.5f}; } } diff --git a/CopiumEngine/src/copium/example/RenderSystem.h b/CopiumEngine/src/copium/example/RenderSystem.h index 236e789..45414d7 100644 --- a/CopiumEngine/src/copium/example/RenderSystem.h +++ b/CopiumEngine/src/copium/example/RenderSystem.h @@ -47,8 +47,7 @@ namespace Copium { float aspect = Vulkan::GetSwapChain().GetExtent().width / (float)Vulkan::GetSwapChain().GetExtent().height; UniformBuffer& uniformBuffer = descriptorSet->GetUniformBuffer("ubo"); - uniformBuffer.Set("projection", glm::ortho(-aspect, aspect, 1.0f, -1.0f)); - // uniformBuffer.Set("view", glm::translate(glm::mat4(1), glm::vec3(0.1 * glm::sin(4 * time), 0.1 * glm::cos(4 * time), 0.0))); + uniformBuffer.Set("projection", glm::ortho(-aspect, aspect, -1.0f, 1.0f)); uniformBuffer.Set("view", glm::mat4(1)); uniformBuffer.Update(); diff --git a/CopiumEngine/src/copium/renderer/Renderer.cpp b/CopiumEngine/src/copium/renderer/Renderer.cpp index 9f81e52..b7d43c2 100644 --- a/CopiumEngine/src/copium/renderer/Renderer.cpp +++ b/CopiumEngine/src/copium/renderer/Renderer.cpp @@ -32,9 +32,9 @@ namespace Copium { AllocateQuad(); AddVertex(pos, color, -1, glm::vec2{0, 0}, RendererVertex::TYPE_QUAD); - AddVertex(glm::vec2{pos.x + size.x, pos.y}, color, -1, glm::vec2{0, 0}, RendererVertex::TYPE_QUAD); - AddVertex(pos + size, color, -1, glm::vec2{0, 0}, RendererVertex::TYPE_QUAD); AddVertex(glm::vec2{pos.x, pos.y + size.y}, color, -1, glm::vec2{0, 0}, RendererVertex::TYPE_QUAD); + AddVertex(pos + size, color, -1, glm::vec2{0, 0}, RendererVertex::TYPE_QUAD); + AddVertex(glm::vec2{pos.x + size.x, pos.y}, color, -1, glm::vec2{0, 0}, RendererVertex::TYPE_QUAD); } @@ -43,9 +43,9 @@ namespace Copium AllocateQuad(); int texIndex = AllocateSampler(sampler); AddVertex(pos, glm::vec3{1,1,1}, texIndex, texCoord1, RendererVertex::TYPE_QUAD); - AddVertex(glm::vec2{pos.x + size.x, pos.y}, glm::vec3{1, 1, 1}, texIndex, glm::vec2{texCoord2.x, texCoord1.y}, RendererVertex::TYPE_QUAD); - AddVertex(pos + size, glm::vec3{1,1,1}, texIndex, texCoord2, RendererVertex::TYPE_QUAD); AddVertex(glm::vec2{pos.x, pos.y + size.y}, glm::vec3{1, 1, 1}, texIndex, glm::vec2{texCoord1.x, texCoord2.y}, RendererVertex::TYPE_QUAD); + AddVertex(pos + size, glm::vec3{1,1,1}, texIndex, texCoord2, RendererVertex::TYPE_QUAD); + AddVertex(glm::vec2{pos.x + size.x, pos.y}, glm::vec3{1, 1, 1}, texIndex, glm::vec2{texCoord2.x, texCoord1.y}, RendererVertex::TYPE_QUAD); } glm::vec2 Renderer::Text(const std::string& str, const glm::vec2& position, const Font& font, float size, const glm::vec3& color) @@ -75,9 +75,9 @@ namespace Copium AllocateQuad(); int texIndex = AllocateSampler(font); AddVertex(offset + glm::vec2{glyph.boundingBox.l * size, glyph.boundingBox.b * size}, color, texIndex, glyph.texCoordBoundingBox.lb, RendererVertex::TYPE_TEXT); - AddVertex(offset + glm::vec2{glyph.boundingBox.r * size, glyph.boundingBox.b * size}, color, texIndex, glm::vec2{glyph.texCoordBoundingBox.r, glyph.texCoordBoundingBox.b}, RendererVertex::TYPE_TEXT); - AddVertex(offset + glm::vec2{glyph.boundingBox.r * size, glyph.boundingBox.t * size}, color, texIndex, glyph.texCoordBoundingBox.rt, RendererVertex::TYPE_TEXT); AddVertex(offset + glm::vec2{glyph.boundingBox.l * size, glyph.boundingBox.t * size}, color, texIndex, glm::vec2{glyph.texCoordBoundingBox.l, glyph.texCoordBoundingBox.t}, RendererVertex::TYPE_TEXT); + AddVertex(offset + glm::vec2{glyph.boundingBox.r * size, glyph.boundingBox.t * size}, color, texIndex, glyph.texCoordBoundingBox.rt, RendererVertex::TYPE_TEXT); + AddVertex(offset + glm::vec2{glyph.boundingBox.r * size, glyph.boundingBox.b * size}, color, texIndex, glm::vec2{glyph.texCoordBoundingBox.r, glyph.texCoordBoundingBox.b}, RendererVertex::TYPE_TEXT); offset.x += glyph.advance * size; } return offset;