Skip to content

Commit 9409130

Browse files
authored
Added buttons to select gizmo operations from the toolbar (#493)
1 parent c63a12d commit 9409130

File tree

9 files changed

+125
-60
lines changed

9 files changed

+125
-60
lines changed

Resources/Editor/Textures/Move.png

1.31 KB
Loading
2.86 KB
Loading
1.94 KB
Loading

Sources/Overload/OvEditor/include/OvEditor/Core/EditorActions.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ namespace tinyxml2
2525

2626
namespace OvEditor::Core
2727
{
28+
enum class EGizmoOperation;
29+
2830
/**
2931
* A set of editor actions
3032
*/
@@ -149,6 +151,19 @@ namespace OvEditor::Core
149151
void NextFrame();
150152
#pragma endregion
151153

154+
#pragma region SCENE_VIEW
155+
/**
156+
* Sets the gizmo operation to use
157+
* @param p_operation
158+
*/
159+
void SetGizmoOperation(EGizmoOperation p_operation);
160+
161+
/**
162+
* Returns the current gizmo operation
163+
*/
164+
EGizmoOperation GetGizmoOperation() const;
165+
#pragma endregion
166+
152167
#pragma region ACTOR_CREATION_DESTRUCTION
153168
/**
154169
* Create an actor with the given component type
@@ -394,6 +409,7 @@ namespace OvEditor::Core
394409
OvTools::Eventing::Event<OvCore::ECS::Actor&> ActorSelectedEvent;
395410
OvTools::Eventing::Event<OvCore::ECS::Actor&> ActorUnselectedEvent;
396411
OvTools::Eventing::Event<EEditorMode> EditorModeChangedEvent;
412+
OvTools::Eventing::Event<EGizmoOperation> EditorOperationChanged;
397413
OvTools::Eventing::Event<> PlayEvent;
398414

399415
private:

Sources/Overload/OvEditor/include/OvEditor/Panels/SceneView.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <OvEditor/Core/GizmoBehaviour.h>
1010
#include <OvEditor/Panels/AViewControllable.h>
1111
#include <OvEditor/Rendering/PickingRenderPass.h>
12+
#include <OvTools/Eventing/Event.h>
1213

1314
namespace OvEditor::Panels
1415
{
@@ -42,6 +43,17 @@ namespace OvEditor::Panels
4243
*/
4344
virtual OvCore::SceneSystem::Scene* GetScene();
4445

46+
/**
47+
* Set the gizmo operation
48+
* @param p_operation
49+
*/
50+
void SetGizmoOperation(Core::EGizmoOperation p_operation);
51+
52+
/**
53+
* Returns the current gizmo operation
54+
*/
55+
Core::EGizmoOperation GetGizmoOperation() const;
56+
4557
protected:
4658
virtual OvCore::Rendering::SceneRenderer::SceneDescriptor CreateSceneDescriptor() override;
4759

Sources/Overload/OvEditor/src/OvEditor/Core/EditorActions.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <OvCore/ECS/Components/CPhysicalSphere.h>
2121

2222
#include <OvEditor/Core/EditorActions.h>
23+
#include <OvEditor/Core/GizmoBehaviour.h>
2324
#include <OvEditor/Panels/AssetView.h>
2425
#include <OvEditor/Panels/GameView.h>
2526
#include <OvEditor/Panels/Inspector.h>
@@ -493,6 +494,18 @@ void OvEditor::Core::EditorActions::NextFrame()
493494
SetEditorMode(EEditorMode::FRAME_BY_FRAME);
494495
}
495496

497+
void OvEditor::Core::EditorActions::SetGizmoOperation(OvEditor::Core::EGizmoOperation p_operation)
498+
{
499+
auto& sceneView = m_panelsManager.GetPanelAs<OvEditor::Panels::SceneView>("Scene View");
500+
sceneView.SetGizmoOperation(p_operation);
501+
}
502+
503+
OvEditor::Core::EGizmoOperation OvEditor::Core::EditorActions::GetGizmoOperation() const
504+
{
505+
auto& sceneView = m_panelsManager.GetPanelAs<OvEditor::Panels::SceneView>("Scene View");
506+
return sceneView.GetGizmoOperation();
507+
}
508+
496509
OvMaths::FVector3 OvEditor::Core::EditorActions::CalculateActorSpawnPoint(float p_distanceToCamera)
497510
{
498511
auto& sceneView = m_panelsManager.GetPanelAs<OvEditor::Panels::SceneView>("Scene View");

Sources/Overload/OvEditor/src/OvEditor/Core/EditorResources.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ OvEditor::Core::EditorResources::EditorResources(const std::string& p_editorAsse
8989
{"Stop", CreateTexture<LINEAR>(texturesFolder / "Stop.png")},
9090
{"Next", CreateTexture<LINEAR>(texturesFolder / "Next.png")},
9191
{"Refresh", CreateTexture<LINEAR>(texturesFolder / "Refresh.png")},
92+
{"Move", CreateTexture<LINEAR>(texturesFolder / "Move.png")},
93+
{"Rotate", CreateTexture<LINEAR>(texturesFolder / "Rotate.png")},
94+
{"Scale", CreateTexture<LINEAR>(texturesFolder / "Scale.png")},
9295
{"File", CreateTexture<LINEAR>(texturesFolder / "File.png")},
9396
{"Folder", CreateTexture<LINEAR>(texturesFolder / "Folder.png")},
9497
{"Texture", CreateTexture<LINEAR>(texturesFolder / "Texture.png")},

Sources/Overload/OvEditor/src/OvEditor/Panels/SceneView.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,17 @@ void OvEditor::Panels::SceneView::Update(float p_deltaTime)
8383
{
8484
if (EDITOR_CONTEXT(inputManager)->IsKeyPressed(EKey::KEY_W))
8585
{
86-
m_currentOperation = OvEditor::Core::EGizmoOperation::TRANSLATE;
86+
SetGizmoOperation(Core::EGizmoOperation::TRANSLATE);
8787
}
8888

8989
if (EDITOR_CONTEXT(inputManager)->IsKeyPressed(EKey::KEY_E))
9090
{
91-
m_currentOperation = OvEditor::Core::EGizmoOperation::ROTATE;
91+
SetGizmoOperation(Core::EGizmoOperation::ROTATE);
9292
}
9393

9494
if (EDITOR_CONTEXT(inputManager)->IsKeyPressed(EKey::KEY_R))
9595
{
96-
m_currentOperation = OvEditor::Core::EGizmoOperation::SCALE;
96+
SetGizmoOperation(Core::EGizmoOperation::SCALE);
9797
}
9898
}
9999
}
@@ -122,6 +122,17 @@ OvCore::SceneSystem::Scene* OvEditor::Panels::SceneView::GetScene()
122122
return m_sceneManager.GetCurrentScene();
123123
}
124124

125+
void OvEditor::Panels::SceneView::SetGizmoOperation(OvEditor::Core::EGizmoOperation p_operation)
126+
{
127+
m_currentOperation = p_operation;
128+
EDITOR_EVENT(EditorOperationChanged).Invoke(m_currentOperation);
129+
}
130+
131+
OvEditor::Core::EGizmoOperation OvEditor::Panels::SceneView::GetGizmoOperation() const
132+
{
133+
return m_currentOperation;
134+
}
135+
125136
OvCore::Rendering::SceneRenderer::SceneDescriptor OvEditor::Panels::SceneView::CreateSceneDescriptor()
126137
{
127138
auto descriptor = AViewControllable::CreateSceneDescriptor();

Sources/Overload/OvEditor/src/OvEditor/Panels/Toolbar.cpp

Lines changed: 67 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,80 +4,90 @@
44
* @licence: MIT
55
*/
66

7-
#include <OvUI/Widgets/Layout/Spacing.h>
8-
9-
#include "OvEditor/Panels/Toolbar.h"
10-
#include "OvEditor/Core/EditorActions.h"
11-
127
#include <OvCore/Global/ServiceLocator.h>
138
#include <OvCore/ResourceManagement/TextureManager.h>
149

10+
#include <OvEditor/Core/EditorActions.h>
11+
#include <OvEditor/Core/GizmoBehaviour.h>
12+
#include <OvEditor/Panels/Toolbar.h>
13+
14+
#include <OvUI/Widgets/Layout/Spacing.h>
15+
16+
namespace
17+
{
18+
OvUI::Types::Color GetButtonTint(bool p_selected)
19+
{
20+
return p_selected ?
21+
OvUI::Types::Color::Yellow :
22+
OvUI::Types::Color::White;
23+
}
24+
}
25+
1526
OvEditor::Panels::Toolbar::Toolbar
1627
(
1728
const std::string& p_title,
1829
bool p_opened,
1930
const OvUI::Settings::PanelWindowSettings& p_windowSettings
2031
) : PanelWindow(p_title, p_opened, p_windowSettings)
2132
{
22-
std::string iconFolder = ":Textures/Icons/";
33+
using namespace OvUI::Widgets;
34+
using namespace OvUI::Widgets::Buttons;
2335

36+
const auto iconSize = OvMaths::FVector2{ 20, 20 };
2437
auto& textureManager = OvCore::Global::ServiceLocator::Get<OvCore::ResourceManagement::TextureManager>();
38+
auto& editorResources = EDITOR_CONTEXT(editorResources);
2539

26-
m_playButton = &CreateWidget<OvUI::Widgets::Buttons::ButtonImage>(EDITOR_CONTEXT(editorResources)->GetTexture("Play")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 });
27-
m_pauseButton = &CreateWidget<OvUI::Widgets::Buttons::ButtonImage>(EDITOR_CONTEXT(editorResources)->GetTexture("Pause")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 });
28-
m_stopButton = &CreateWidget<OvUI::Widgets::Buttons::ButtonImage>(EDITOR_CONTEXT(editorResources)->GetTexture("Stop")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 });
29-
m_nextButton = &CreateWidget<OvUI::Widgets::Buttons::ButtonImage>(EDITOR_CONTEXT(editorResources)->GetTexture("Next")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 });
40+
auto& translate = CreateWidget<ButtonImage>(editorResources->GetTexture("Move")->GetTexture().GetID(), iconSize);
41+
translate.lineBreak = false;
42+
translate.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::TRANSLATE)); };
3043

31-
CreateWidget<OvUI::Widgets::Layout::Spacing>(0).lineBreak = false;
32-
auto& refreshButton = CreateWidget<OvUI::Widgets::Buttons::ButtonImage>(EDITOR_CONTEXT(editorResources)->GetTexture("Refresh")->GetTexture().GetID(), OvMaths::FVector2{ 20, 20 });
44+
auto& rotate = CreateWidget<ButtonImage>(editorResources->GetTexture("Rotate")->GetTexture().GetID(), iconSize);
45+
rotate.lineBreak = false;
46+
rotate.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::ROTATE)); };
3347

34-
m_playButton->lineBreak = false;
35-
m_pauseButton->lineBreak = false;
36-
m_stopButton->lineBreak = false;
37-
m_nextButton->lineBreak = false;
38-
refreshButton.lineBreak = false;
48+
auto& scale = CreateWidget<ButtonImage>(editorResources->GetTexture("Scale")->GetTexture().GetID(), iconSize);
49+
scale.lineBreak = false;
50+
scale.ClickedEvent += []() { EDITOR_EXEC(SetGizmoOperation(OvEditor::Core::EGizmoOperation::SCALE)); };
3951

40-
m_playButton->ClickedEvent += EDITOR_BIND(StartPlaying);
41-
m_pauseButton->ClickedEvent += EDITOR_BIND(PauseGame);
42-
m_stopButton->ClickedEvent += EDITOR_BIND(StopPlaying);
43-
m_nextButton->ClickedEvent += EDITOR_BIND(NextFrame);
44-
refreshButton.ClickedEvent += EDITOR_BIND(RefreshScripts);
52+
auto updateGizmoOperation = [&translate, &rotate, &scale](Core::EGizmoOperation p_operation) {
53+
using enum Core::EGizmoOperation;
54+
translate.tint = GetButtonTint(p_operation == TRANSLATE);
55+
rotate.tint = GetButtonTint(p_operation == ROTATE);
56+
scale.tint = GetButtonTint(p_operation == SCALE);
57+
};
4558

46-
EDITOR_EVENT(EditorModeChangedEvent) += [this](OvEditor::Core::EditorActions::EEditorMode p_newMode)
47-
{
48-
auto enable = [](OvUI::Widgets::Buttons::ButtonImage* p_button, bool p_enable)
49-
{
50-
p_button->disabled = !p_enable;
51-
p_button->tint = p_enable ? OvUI::Types::Color{ 1.0f, 1.0f, 1.0f, 1.0f} : OvUI::Types::Color{1.0f, 1.0f, 1.0f, 0.15f};
52-
};
53-
54-
switch (p_newMode)
55-
{
56-
case OvEditor::Core::EditorActions::EEditorMode::EDIT:
57-
enable(m_playButton, true);
58-
enable(m_pauseButton, false);
59-
enable(m_stopButton, false);
60-
enable(m_nextButton, false);
61-
break;
62-
case OvEditor::Core::EditorActions::EEditorMode::PLAY:
63-
enable(m_playButton, false);
64-
enable(m_pauseButton, true);
65-
enable(m_stopButton, true);
66-
enable(m_nextButton, true);
67-
break;
68-
case OvEditor::Core::EditorActions::EEditorMode::PAUSE:
69-
enable(m_playButton, true);
70-
enable(m_pauseButton, false);
71-
enable(m_stopButton, true);
72-
enable(m_nextButton, true);
73-
break;
74-
case OvEditor::Core::EditorActions::EEditorMode::FRAME_BY_FRAME:
75-
enable(m_playButton, true);
76-
enable(m_pauseButton, false);
77-
enable(m_stopButton, true);
78-
enable(m_nextButton, true);
79-
break;
80-
}
59+
updateGizmoOperation(EDITOR_EXEC(GetGizmoOperation()));
60+
61+
EDITOR_EVENT(EditorOperationChanged) += updateGizmoOperation;
62+
63+
CreateWidget<Layout::Spacing>().lineBreak = false;
64+
65+
m_playButton = &CreateWidget<ButtonImage>(editorResources->GetTexture("Play")->GetTexture().GetID(), iconSize);
66+
m_pauseButton = &CreateWidget<ButtonImage>(editorResources->GetTexture("Pause")->GetTexture().GetID(), iconSize);
67+
m_stopButton = &CreateWidget<ButtonImage>(editorResources->GetTexture("Stop")->GetTexture().GetID(), iconSize);
68+
m_nextButton = &CreateWidget<ButtonImage>(editorResources->GetTexture("Next")->GetTexture().GetID(), iconSize);
69+
70+
CreateWidget<Layout::Spacing>(0).lineBreak = false;
71+
auto& refreshButton = CreateWidget<ButtonImage>(editorResources->GetTexture("Refresh")->GetTexture().GetID(), iconSize);
72+
73+
m_playButton->lineBreak = false;
74+
m_pauseButton->lineBreak = false;
75+
m_stopButton->lineBreak = false;
76+
m_nextButton->lineBreak = false;
77+
refreshButton.lineBreak = false;
78+
79+
m_playButton->ClickedEvent += EDITOR_BIND(StartPlaying);
80+
m_pauseButton->ClickedEvent += EDITOR_BIND(PauseGame);
81+
m_stopButton->ClickedEvent += EDITOR_BIND(StopPlaying);
82+
m_nextButton->ClickedEvent += EDITOR_BIND(NextFrame);
83+
refreshButton.ClickedEvent += EDITOR_BIND(RefreshScripts);
84+
85+
EDITOR_EVENT(EditorModeChangedEvent) += [this](Core::EditorActions::EEditorMode p_mode) {
86+
using enum Core::EditorActions::EEditorMode;
87+
m_playButton->disabled = !(p_mode == EDIT || p_mode == FRAME_BY_FRAME || p_mode == PAUSE);
88+
m_pauseButton->disabled = !(p_mode == PLAY);
89+
m_stopButton->disabled = !(p_mode == PLAY || p_mode == FRAME_BY_FRAME || p_mode == PAUSE);
90+
m_nextButton->disabled = !(p_mode == PLAY || p_mode == FRAME_BY_FRAME || p_mode == PAUSE);
8191
};
8292

8393
EDITOR_EXEC(SetEditorMode(OvEditor::Core::EditorActions::EEditorMode::EDIT));

0 commit comments

Comments
 (0)