1#include "TransformComponent.h"
3#include "imgui/imgui/imgui.h"
4#include "common/maths/Vec.h"
6#include <glm/gtc/type_ptr.hpp>
10 void TransformComponent::updateTransformImGUI()
12 if (ImGui::IsKeyPressed((ImGuiKey)90))
13 m_CurrentGizmoOperation = ImGuizmo::TRANSLATE;
14 if (ImGui::IsKeyPressed((ImGuiKey)69))
15 m_CurrentGizmoOperation = ImGuizmo::ROTATE;
16 if (ImGui::IsKeyPressed((ImGuiKey)82))
17 m_CurrentGizmoOperation = ImGuizmo::SCALE;
18 if (ImGui::RadioButton(
"Translate", m_CurrentGizmoOperation == ImGuizmo::TRANSLATE))
19 m_CurrentGizmoOperation = ImGuizmo::TRANSLATE;
21 if (ImGui::RadioButton(
"Rotate", m_CurrentGizmoOperation == ImGuizmo::ROTATE))
22 m_CurrentGizmoOperation = ImGuizmo::ROTATE;
24 if (ImGui::RadioButton(
"Scale", m_CurrentGizmoOperation == ImGuizmo::SCALE))
25 m_CurrentGizmoOperation = ImGuizmo::SCALE;
27 ImGuizmo::DecomposeMatrixToComponents(&m_Transform[0][0], &m_Position.x, &m_Rotation.x, &m_Scale.x);
28 ImGui::Text(
"Position");
29 ImGui::SliderFloat3(
"##Position", &m_Position.x, -500.0f, 500.0f);
30 ImGui::Text(
"Rotation");
31 ImGui::SliderFloat3(
"##Rotation", &m_Rotation.x, -180.0f, 180.0f);
33 ImGui::SliderFloat3(
"##Scale", &m_Scale.x, 0.0f, 100.0f,
"%.2f");
35 ImGui::Text(
"Fix Scale");
37 ImGui::Checkbox(
"##FixScale", &m_FixScale);
38 ImGuizmo::RecomposeMatrixFromComponents(&m_Position.x, &m_Rotation.x, &m_Scale.x, &m_Transform[0][0]);
40 if (m_CurrentGizmoOperation != ImGuizmo::SCALE)
42 if (ImGui::RadioButton(
"Local", m_CurrentGizmoMode == ImGuizmo::LOCAL))
43 m_CurrentGizmoMode = ImGuizmo::LOCAL;
45 if (ImGui::RadioButton(
"World", m_CurrentGizmoMode == ImGuizmo::WORLD))
46 m_CurrentGizmoMode = ImGuizmo::WORLD;
48 if (ImGui::IsKeyPressed((ImGuiKey)83))
49 m_UsingSnap = !m_UsingSnap;
50 ImGui::Checkbox(
"", &m_UsingSnap);
53 switch (m_CurrentGizmoOperation)
55 case ImGuizmo::TRANSLATE:
56 ImGui::InputFloat3(
"Snap", &m_Snap[0]);
58 case ImGuizmo::ROTATE:
59 ImGui::InputFloat(
"Angle Snap", &m_Snap[0]);
62 ImGui::InputFloat(
"Scale Snap", &m_Snap[0]);
76 void TransformComponent::ImGuiRender()
78 Maths::Vec3 prevScale = m_Scale;
80 updateTransformImGUI();
85 if (m_Scale.x != prevScale.x)
87 m_Scale.y = m_Scale.x;
88 m_Scale.z = m_Scale.x;
91 if (m_Scale.y != prevScale.y)
93 m_Scale.x = m_Scale.y;
94 m_Scale.z = m_Scale.y;
97 if (m_Scale.z != prevScale.z)
99 m_Scale.x = m_Scale.z;
100 m_Scale.y = m_Scale.z;
104 float epsilon = 0.0001f;
105 if (m_Scale.x < epsilon)
107 if (m_Scale.y < epsilon)
109 if (m_Scale.z < epsilon)
113 void TransformComponent::Draw(
Camera* camera)
117 void TransformComponent::DrawGizmo(
Camera* camera)
119 ImGuizmo::RecomposeMatrixFromComponents(&m_Position.x, &m_Rotation.x, &m_Scale.x, glm::value_ptr(m_Transform));
120 ImGuizmo::SetOrthographic(
false);
122 glm::mat4 cameraProjection = camera->GetProjectionMatrix();
123 glm::mat4 cameraView = camera->GetViewMatrix();
125 float windowWidth = camera->GetViewportWidth();
126 float windowHeight = camera->GetViewportHeight();
128 ImGuizmo::SetRect(0, 0, windowWidth, windowHeight);
130 ImGuizmo::SetDrawlist();
131 ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(cameraProjection), m_CurrentGizmoOperation,
132 m_CurrentGizmoMode, glm::value_ptr(m_Transform), NULL, NULL);
134 ImGuizmo::DecomposeMatrixToComponents(glm::value_ptr(m_Transform), &m_Position.x, &m_Rotation.x, &m_Scale.x);
A class that represents the camera.