diff --git a/include/Engine/Core/System.h b/include/Engine/Core/System.h index dc7c879a..ec57f5fc 100644 --- a/include/Engine/Core/System.h +++ b/include/Engine/Core/System.h @@ -34,7 +34,7 @@ protected: const std::string m_ComponentType; - virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cUniformScale, double dt) = 0; + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cComponent, double dt) = 0; }; class ImpureSystem : public virtual System diff --git a/include/Engine/Editor/EditorWidgetSystem.h b/include/Engine/Editor/EditorWidgetSystem.h index 2350d24b..f3e4e4db 100644 --- a/include/Engine/Editor/EditorWidgetSystem.h +++ b/include/Engine/Editor/EditorWidgetSystem.h @@ -1,6 +1,41 @@ #ifndef EditorWidgetSystem_h__ #define EditorWidgetSystem_h__ +#include +#include "../GLM.h" +#include "../Core/System.h" +#include "../Rendering/IRenderer.h" +#include "../Rendering/Util/ScreenCoords.h" +#include "../Core/EMouseMove.h" +#include "../Core/EMousePress.h" +#include "../Core/EMouseRelease.h" +class EditorWidgetSystem : public ImpureSystem, PureSystem +{ +public: + EditorWidgetSystem(World* world, EventBroker* eventBroker, IRenderer* renderer); + + virtual void Update(double dt) override; + virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cEditorWidget, double dt) override; + + void debugPrintVector(const char* name, glm::vec3 axisNDC); + + void debugPrintVector(const char* name, glm::vec4 axisNDC); + void debugPrintVector(const char* name, glm::vec2 axisNDC); +private: + IRenderer* m_Renderer; + + // State + EntityWrapper m_PickEntity = EntityWrapper::Invalid; + PickData m_PickData; + glm::vec2 m_MouseDelta; + + EventRelay m_EMouseMove; + bool OnMouseMove(const Events::MouseMove& e); + EventRelay m_EMousePress; + bool OnMousePress(const Events::MousePress& e); + EventRelay m_EMouseRelease; + bool OnMouseRelease(const Events::MouseRelease& e); +}; #endif diff --git a/include/Engine/GLM.h b/include/Engine/GLM.h index 32729845..3143c905 100644 --- a/include/Engine/GLM.h +++ b/include/Engine/GLM.h @@ -7,4 +7,5 @@ #include #include #include -#include \ No newline at end of file +#include +#include \ No newline at end of file diff --git a/resources/Schema/Entities/EditorWidgetTranslate.xml b/resources/Schema/Entities/EditorWidgetTranslate.xml index e2cfd69a..75d96a51 100644 --- a/resources/Schema/Entities/EditorWidgetTranslate.xml +++ b/resources/Schema/Entities/EditorWidgetTranslate.xml @@ -6,15 +6,14 @@ Models/TranslationWidgetOrigin.obj - - - - + + + Models/TranslationWidgetX.obj @@ -24,7 +23,9 @@ - + + + Models/TranslationWidgetY.obj @@ -34,7 +35,9 @@ - + + + Models/TranslationWidgetZ.obj @@ -44,7 +47,9 @@ - + + + Models/WidgetPlaneX.obj @@ -54,7 +59,9 @@ - + + + Models/WidgetPlaneY.obj @@ -64,7 +71,9 @@ - + + + Models/WidgetPlaneZ.obj diff --git a/src/Engine/Editor/EditorGUI.cpp b/src/Engine/Editor/EditorGUI.cpp index f65386aa..d5638d31 100644 --- a/src/Engine/Editor/EditorGUI.cpp +++ b/src/Engine/Editor/EditorGUI.cpp @@ -76,6 +76,7 @@ void EditorGUI::drawTools() void EditorGUI::drawEntities(World* world) { if (!ImGui::Begin("Entities")) { + ImGui::End(); return; } diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index 596f8154..613f0edb 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -1,6 +1,7 @@ #include "Editor/EditorSystem.h" #include "Core/UniformScaleSystem.h" #include "Editor/EditorRenderSystem.h" +#include "Editor/EditorWidgetSystem.h" EditorSystem::EditorSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame) : System(world, eventBroker) @@ -10,6 +11,7 @@ EditorSystem::EditorSystem(World* world, EventBroker* eventBroker, IRenderer* re m_EditorWorld = new World(); m_EditorWorldSystemPipeline = new SystemPipeline(m_EditorWorld, eventBroker); m_EditorWorldSystemPipeline->AddSystem(0); + m_EditorWorldSystemPipeline->AddSystem(0, m_Renderer); m_EditorWorldSystemPipeline->AddSystem(1, m_Renderer, m_RenderFrame); m_Camera = importEntity(EntityWrapper(m_EditorWorld, EntityID_Invalid), "Schema/Entities/Empty.xml"); diff --git a/src/Engine/Editor/EditorWidgetSystem.cpp b/src/Engine/Editor/EditorWidgetSystem.cpp new file mode 100644 index 00000000..3a200e0f --- /dev/null +++ b/src/Engine/Editor/EditorWidgetSystem.cpp @@ -0,0 +1,76 @@ +#include "Editor/EditorWidgetSystem.h" + +EditorWidgetSystem::EditorWidgetSystem(World* world, EventBroker* eventBroker, IRenderer* renderer) + : System(world, eventBroker) + , PureSystem("EditorWidget") + , m_Renderer(renderer) +{ + EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &EditorWidgetSystem::OnMouseMove); + EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorWidgetSystem::OnMousePress); + EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorWidgetSystem::OnMouseRelease); +} + +void EditorWidgetSystem::Update(double dt) +{ + // Pick at current mouse position +} + +void EditorWidgetSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cEditorWidget, double dt) +{ + if (!m_PickEntity.Valid() || m_PickEntity != entity) { + return; + } + + EntityWrapper moveEntity = entity.Parent(); + if (!moveEntity.Valid()) { + moveEntity = entity; + } + + ComponentWrapper::SubscriptProxy& type = cEditorWidget["Type"]; + if ((ComponentInfo::EnumType)type == type.Enum("Translate")) { + auto camera = m_PickData.Camera; + glm::vec3 axis = cEditorWidget["Axis"]; + glm::vec2 axisScreen = camera->WorldToScreen(axis, m_Renderer->Resolution()) - camera->WorldToScreen(glm::vec3(0, 0, 0), m_Renderer->Resolution()); + float dot = glm::dot(m_MouseDelta, glm::normalize(axisScreen)) / glm::length(axisScreen); + glm::vec3 worldMovement = dot * axis; + (glm::vec3&)moveEntity["Transform"]["Position"] += worldMovement; + } + + m_MouseDelta = glm::vec2(0); +} + +void EditorWidgetSystem::debugPrintVector(const char* name, glm::vec2 axisNDC) +{ + ImGui::Text("%s: (%f, %f)", name, axisNDC.x, axisNDC.y); +} +void EditorWidgetSystem::debugPrintVector(const char* name, glm::vec4 axisNDC) +{ + ImGui::Text("%s: (%f, %f, %f, %f)", name, axisNDC.x, axisNDC.y, axisNDC.z, axisNDC.w); +} +void EditorWidgetSystem::debugPrintVector(const char* name, glm::vec3 axisNDC) +{ + ImGui::Text("%s: (%f, %f, %f)", name, axisNDC.x, axisNDC.y, axisNDC.z); +} + +bool EditorWidgetSystem::OnMouseMove(const Events::MouseMove& e) +{ + m_MouseDelta = glm::vec2((float)e.DeltaX, (float)-e.DeltaY); + return false; +} + +bool EditorWidgetSystem::OnMousePress(const Events::MousePress & e) +{ + if (e.Button == GLFW_MOUSE_BUTTON_2) { + m_PickData = m_Renderer->Pick(glm::vec2(e.X, e.Y)); + if (m_PickData.Entity != EntityID_Invalid && m_PickData.World == m_World) { + m_PickEntity = EntityWrapper(m_World, m_PickData.Entity); + } + } + return true; +} + +bool EditorWidgetSystem::OnMouseRelease(const Events::MouseRelease& e) +{ + m_PickEntity = EntityWrapper::Invalid; + return true; +} \ No newline at end of file