EditorWidgetSystem that takes care of moving widgets around
This commit is contained in:
@@ -34,7 +34,7 @@ protected:
|
|||||||
|
|
||||||
const std::string m_ComponentType;
|
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
|
class ImpureSystem : public virtual System
|
||||||
|
|||||||
@@ -1,6 +1,41 @@
|
|||||||
#ifndef EditorWidgetSystem_h__
|
#ifndef EditorWidgetSystem_h__
|
||||||
#define EditorWidgetSystem_h__
|
#define EditorWidgetSystem_h__
|
||||||
|
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
#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<EditorWidgetSystem, Events::MouseMove> m_EMouseMove;
|
||||||
|
bool OnMouseMove(const Events::MouseMove& e);
|
||||||
|
EventRelay<EditorWidgetSystem, Events::MousePress> m_EMousePress;
|
||||||
|
bool OnMousePress(const Events::MousePress& e);
|
||||||
|
EventRelay<EditorWidgetSystem, Events::MouseRelease> m_EMouseRelease;
|
||||||
|
bool OnMouseRelease(const Events::MouseRelease& e);
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,4 +7,5 @@
|
|||||||
#include <glm/gtx/rotate_vector.hpp>
|
#include <glm/gtx/rotate_vector.hpp>
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
#include <glm/gtx/quaternion.hpp>
|
#include <glm/gtx/quaternion.hpp>
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
#include <glm/gtx/projection.hpp>
|
||||||
@@ -6,15 +6,14 @@
|
|||||||
<Resource>Models/TranslationWidgetOrigin.obj</Resource>
|
<Resource>Models/TranslationWidgetOrigin.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
<c:UniformScale>
|
|
||||||
<Scale X="0.200000003" Y="0.200000003" Z="0.200000003"/>
|
|
||||||
</c:UniformScale>
|
|
||||||
</Components>
|
</Components>
|
||||||
|
|
||||||
<Children>
|
<Children>
|
||||||
<Entity name="X">
|
<Entity name="X">
|
||||||
<Components>
|
<Components>
|
||||||
<c:EditorWidget/>
|
<c:EditorWidget>
|
||||||
|
<Axis X="1" Y="0" Z="0"/>
|
||||||
|
</c:EditorWidget>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/TranslationWidgetX.obj</Resource>
|
<Resource>Models/TranslationWidgetX.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
@@ -24,7 +23,9 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="Y">
|
<Entity name="Y">
|
||||||
<Components>
|
<Components>
|
||||||
<c:EditorWidget/>
|
<c:EditorWidget>
|
||||||
|
<Axis X="0" Y="1" Z="0"/>
|
||||||
|
</c:EditorWidget>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/TranslationWidgetY.obj</Resource>
|
<Resource>Models/TranslationWidgetY.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
@@ -34,7 +35,9 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="Z">
|
<Entity name="Z">
|
||||||
<Components>
|
<Components>
|
||||||
<c:EditorWidget/>
|
<c:EditorWidget>
|
||||||
|
<Axis X="0" Y="0" Z="1"/>
|
||||||
|
</c:EditorWidget>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/TranslationWidgetZ.obj</Resource>
|
<Resource>Models/TranslationWidgetZ.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
@@ -44,7 +47,9 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="XPlane">
|
<Entity name="XPlane">
|
||||||
<Components>
|
<Components>
|
||||||
<c:EditorWidget/>
|
<c:EditorWidget>
|
||||||
|
<Axis X="0" Y="1" Z="1"/>
|
||||||
|
</c:EditorWidget>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/WidgetPlaneX.obj</Resource>
|
<Resource>Models/WidgetPlaneX.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
@@ -54,7 +59,9 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="YPlane">
|
<Entity name="YPlane">
|
||||||
<Components>
|
<Components>
|
||||||
<c:EditorWidget/>
|
<c:EditorWidget>
|
||||||
|
<Axis X="1" Y="0" Z="1"/>
|
||||||
|
</c:EditorWidget>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/WidgetPlaneY.obj</Resource>
|
<Resource>Models/WidgetPlaneY.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
@@ -64,7 +71,9 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="ZPlane">
|
<Entity name="ZPlane">
|
||||||
<Components>
|
<Components>
|
||||||
<c:EditorWidget/>
|
<c:EditorWidget>
|
||||||
|
<Axis X="1" Y="1" Z="0"/>
|
||||||
|
</c:EditorWidget>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/WidgetPlaneZ.obj</Resource>
|
<Resource>Models/WidgetPlaneZ.obj</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ void EditorGUI::drawTools()
|
|||||||
void EditorGUI::drawEntities(World* world)
|
void EditorGUI::drawEntities(World* world)
|
||||||
{
|
{
|
||||||
if (!ImGui::Begin("Entities")) {
|
if (!ImGui::Begin("Entities")) {
|
||||||
|
ImGui::End();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "Editor/EditorSystem.h"
|
#include "Editor/EditorSystem.h"
|
||||||
#include "Core/UniformScaleSystem.h"
|
#include "Core/UniformScaleSystem.h"
|
||||||
#include "Editor/EditorRenderSystem.h"
|
#include "Editor/EditorRenderSystem.h"
|
||||||
|
#include "Editor/EditorWidgetSystem.h"
|
||||||
|
|
||||||
EditorSystem::EditorSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame)
|
EditorSystem::EditorSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame)
|
||||||
: System(world, eventBroker)
|
: System(world, eventBroker)
|
||||||
@@ -10,6 +11,7 @@ EditorSystem::EditorSystem(World* world, EventBroker* eventBroker, IRenderer* re
|
|||||||
m_EditorWorld = new World();
|
m_EditorWorld = new World();
|
||||||
m_EditorWorldSystemPipeline = new SystemPipeline(m_EditorWorld, eventBroker);
|
m_EditorWorldSystemPipeline = new SystemPipeline(m_EditorWorld, eventBroker);
|
||||||
m_EditorWorldSystemPipeline->AddSystem<UniformScaleSystem>(0);
|
m_EditorWorldSystemPipeline->AddSystem<UniformScaleSystem>(0);
|
||||||
|
m_EditorWorldSystemPipeline->AddSystem<EditorWidgetSystem>(0, m_Renderer);
|
||||||
m_EditorWorldSystemPipeline->AddSystem<EditorRenderSystem>(1, m_Renderer, m_RenderFrame);
|
m_EditorWorldSystemPipeline->AddSystem<EditorRenderSystem>(1, m_Renderer, m_RenderFrame);
|
||||||
|
|
||||||
m_Camera = importEntity(EntityWrapper(m_EditorWorld, EntityID_Invalid), "Schema/Entities/Empty.xml");
|
m_Camera = importEntity(EntityWrapper(m_EditorWorld, EntityID_Invalid), "Schema/Entities/Empty.xml");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user