Rudimentary implementation of the translate,Rotate,Scale tools
This commit is contained in:
parent
daf26c304b
commit
ceb485018f
@ -118,6 +118,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImGuizmo::OPERATION activeOperation = ImGuizmo::OPERATION::TRANSLATE;
|
||||||
|
|
||||||
void OnUI() override {
|
void OnUI() override {
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { ImGui::GetWindowWidth(), 7 });
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, { ImGui::GetWindowWidth(), 7 });
|
||||||
ImGui::BeginMainMenuBar();
|
ImGui::BeginMainMenuBar();
|
||||||
@ -280,6 +282,49 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
ImGui::Begin("RuntimeControls");
|
ImGui::Begin("RuntimeControls");
|
||||||
|
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Text(ICON_MD_TRANSFORM);
|
||||||
|
|
||||||
|
auto spacing = 10;
|
||||||
|
float buttonWidth = 75.0f;
|
||||||
|
float buttonHeight = 30;
|
||||||
|
float ColorIntensity = 0.5f;
|
||||||
|
float ColorIntensityHovered = 0.75;
|
||||||
|
float ColorIntensityActive = 0.85;
|
||||||
|
float yPadding = 6.f;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{0, yPadding });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.0f,ColorIntensity ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.0f,ColorIntensityHovered ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.0f,ColorIntensityActive ,0.0f ,1.0f });
|
||||||
|
ImGui::SameLine(0, spacing);
|
||||||
|
if (ImGui::Button("Translate", { buttonWidth,buttonHeight }))
|
||||||
|
activeOperation = ImGuizmo::OPERATION::TRANSLATE;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 0, yPadding });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ ColorIntensity, 0.0f ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ ColorIntensityHovered, 0.0f ,0.0f ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ ColorIntensityActive, 0.0f ,0.0f ,1.0f });
|
||||||
|
ImGui::SameLine(0, spacing);
|
||||||
|
if (ImGui::Button("Rotate", { buttonWidth,buttonHeight }))
|
||||||
|
activeOperation = ImGuizmo::OPERATION::ROTATE;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{ 0, yPadding });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{ 0.0f, 0.0f ,ColorIntensity ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{ 0.0f, 0.0f ,ColorIntensityHovered ,1.0f });
|
||||||
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{ 0.0f, 0.0f ,ColorIntensityActive ,1.0f });
|
||||||
|
ImGui::SameLine(0, spacing);
|
||||||
|
if (ImGui::Button("Scale", { buttonWidth,buttonHeight }))
|
||||||
|
activeOperation = ImGuizmo::OPERATION::SCALE;
|
||||||
|
|
||||||
|
ImGui::PopStyleColor(9);
|
||||||
|
ImGui::PopStyleVar(3);
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
ImGui::SameLine((ImGui::GetWindowContentRegionMax().x / 2) - (90));
|
ImGui::SameLine((ImGui::GetWindowContentRegionMax().x / 2) - (90));
|
||||||
auto color = ImVec4{ 0.001 * 12 , 0.001 * 201 , 0.001 * 69, 1.0f };
|
auto color = ImVec4{ 0.001 * 12 , 0.001 * 201 , 0.001 * 69, 1.0f };
|
||||||
ImGui::PushStyleColor(ImGuiCol_Button, color);
|
ImGui::PushStyleColor(ImGuiCol_Button, color);
|
||||||
@ -325,32 +370,40 @@ public:
|
|||||||
| ImGuiWindowFlags_NoCollapse;
|
| ImGuiWindowFlags_NoCollapse;
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0,0 });
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2{ 0,0 });
|
||||||
ImGui::Begin("SceneView",nullptr,viewportWindowFlags);
|
ImGui::Begin("SceneView",nullptr,viewportWindowFlags);
|
||||||
spdlog::info( "Editor Resolution {0}x{1}", (float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight());
|
|
||||||
|
|
||||||
ImGui::Image((ImTextureID)(intptr_t)renderer.getCurrentFrameBuffer().GetColourAttachment(),
|
ImGui::Image((ImTextureID)(intptr_t)renderer.getCurrentFrameBuffer().GetColourAttachment(),
|
||||||
ImVec2{(float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight()});
|
ImVec2{(float)ImGui::GetWindowWidth(),(float)ImGui::GetWindowHeight()});
|
||||||
|
|
||||||
ImGuizmo::Enable(true);
|
|
||||||
|
|
||||||
|
//ImGuizmo::ViewManipulate(glm::value_ptr(cameraView), 1, ImGui::GetWindowPos(), { 90,90 }, 0x22CCCCCCC);
|
||||||
|
|
||||||
|
|
||||||
|
if(Selected.isValid()){
|
||||||
|
|
||||||
|
|
||||||
ImGuizmo::SetOrthographic(false);
|
ImGuizmo::SetOrthographic(false);
|
||||||
ImGuizmo::SetDrawlist();
|
ImGuizmo::SetDrawlist();
|
||||||
|
|
||||||
ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, ImGui::GetContentRegionMax().x, ImGui::GetContentRegionMax().y);
|
ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, ImGui::GetWindowWidth(), ImGui::GetWindowHeight());
|
||||||
/*
|
|
||||||
const auto& projection = camera.projection;
|
const auto& ProjMatrix = camera->projection;
|
||||||
glm::mat4& view = glm::mat4(1.0f);
|
glm::mat4& cameraView = glm::inverse(((EditorCamera*)camera)->view);
|
||||||
ImGuizmo::DrawGrid();
|
glm::mat4 cameraDelta = glm::mat4(1.0f);
|
||||||
ImGuizmo::ViewManipulate();
|
|
||||||
|
|
||||||
|
|
||||||
if(selected != nullptr && selected->isValid()){
|
|
||||||
auto& tc = selected->GetComponent<YoggieEngine::TransformComponent>();
|
|
||||||
glm::mat4 transform = tc.GetTransform();
|
|
||||||
|
|
||||||
ImGuizmo::Manipulate();
|
|
||||||
|
auto& tc = Selected.GetComponent<YoggieEngine::TransformComponent>();
|
||||||
|
glm::mat4& transform = tc.GetTransform();
|
||||||
|
ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(ProjMatrix), activeOperation, ImGuizmo::WORLD, glm::value_ptr(transform), nullptr, nullptr);
|
||||||
|
if(ImGuizmo::IsUsing())
|
||||||
|
tc.Decompose(transform);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
ImGui::PopStyleVar();
|
ImGui::PopStyleVar();
|
||||||
|
@ -27,7 +27,7 @@ namespace YoggieEngine {
|
|||||||
config.MergeMode = true;
|
config.MergeMode = true;
|
||||||
config.GlyphMinAdvanceX = 18.0f;
|
config.GlyphMinAdvanceX = 18.0f;
|
||||||
static const ImWchar icon_ranges[] = { ICON_MIN_MD , ICON_MAX_MD, 0 };
|
static const ImWchar icon_ranges[] = { ICON_MIN_MD , ICON_MAX_MD, 0 };
|
||||||
io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/MaterialIcons-Regular.ttf", 18, &config, icon_ranges);
|
io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/MaterialIcons-Regular.ttf", 24, &config, icon_ranges);
|
||||||
|
|
||||||
ImGui::StyleColorsDark();
|
ImGui::StyleColorsDark();
|
||||||
/*
|
/*
|
||||||
|
@ -38,6 +38,8 @@ namespace YoggieEngine {
|
|||||||
void Render(Scene& scene, Camera MainCamera) {
|
void Render(Scene& scene, Camera MainCamera) {
|
||||||
|
|
||||||
MainCamera.projection = glm::perspective(glm::radians(65.0f), ((float)width/(float)height), 0.0001f, 1000.0f);
|
MainCamera.projection = glm::perspective(glm::radians(65.0f), ((float)width/(float)height), 0.0001f, 1000.0f);
|
||||||
|
int oldviewport[4];
|
||||||
|
glGetIntegerv(GL_VIEWPORT, oldviewport);
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
|
||||||
@ -205,7 +207,7 @@ namespace YoggieEngine {
|
|||||||
|
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
glViewport(oldviewport[0], oldviewport[1], oldviewport[2], oldviewport[3]);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
#include <glm/gtx/quaternion.hpp>
|
#include <glm/gtx/quaternion.hpp>
|
||||||
|
|
||||||
namespace YoggieEngine {
|
namespace YoggieEngine {
|
||||||
struct IdentifierComponent {
|
struct IdentifierComponent {
|
||||||
std::string name;
|
std::string name;
|
||||||
@ -8,15 +11,74 @@ namespace YoggieEngine {
|
|||||||
|
|
||||||
|
|
||||||
struct TransformComponent {
|
struct TransformComponent {
|
||||||
glm::vec3 Position = glm::vec3(0.0f);
|
glm::vec3 Position = glm::vec3(0.0f, 0.0f, 0.0f);
|
||||||
glm::vec3 Rotation = glm::vec3(0.0f);
|
glm::vec3 Rotation = glm::vec3(0.0f , 0.0f, 0.0f);
|
||||||
glm::vec3 Scale = glm::vec3(1.0f);
|
glm::vec3 Scale = glm::vec3(1.0f);
|
||||||
|
|
||||||
glm::mat4 LocalTransform = glm::mat4(1.0f);
|
glm::mat4 LocalTransform = glm::mat4(1.0f);
|
||||||
|
|
||||||
glm::mat4 GetTransform() const {
|
glm::mat4 GetTransform() const {
|
||||||
glm::mat4 rotation = glm::toMat4(glm::quat(Rotation));
|
|
||||||
return glm::translate(glm::mat4(1.0f), Position) * rotation * glm::scale(glm::mat4(1.0f), Scale);
|
|
||||||
|
|
||||||
|
return glm::translate(glm::mat4(1.0f), Position) * glm::toMat4(glm::quat(Rotation)) * glm::scale(glm::mat4(1.0f), Scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Decompose(glm::mat4 transformationMatrix) {
|
||||||
|
glm::mat4& tm = transformationMatrix;
|
||||||
|
|
||||||
|
|
||||||
|
auto& a = tm[0][0];
|
||||||
|
auto& b = tm[1][0];
|
||||||
|
auto& c = tm[2][0];
|
||||||
|
auto& d = tm[3][0];
|
||||||
|
|
||||||
|
auto& e = tm[0][1];
|
||||||
|
auto& f = tm[1][1];
|
||||||
|
auto& g = tm[2][1];
|
||||||
|
auto& h = tm[3][1];
|
||||||
|
|
||||||
|
auto& i = tm[0][2];
|
||||||
|
auto& j = tm[1][2];
|
||||||
|
auto& k = tm[2][2];
|
||||||
|
auto& l = tm[3][2];
|
||||||
|
|
||||||
|
Position = glm::vec3(d, h, l);
|
||||||
|
d = 0;
|
||||||
|
h = 0;
|
||||||
|
l = 0;
|
||||||
|
|
||||||
|
auto sx = glm::sqrt(a*a + e*e + i*i);
|
||||||
|
auto sy = glm::sqrt(b*b + f*f + j*j);
|
||||||
|
auto sz = glm::sqrt(c*c + g*g + k*k);
|
||||||
|
|
||||||
|
Scale = glm::vec3(sx, sy, sz);
|
||||||
|
|
||||||
|
a/= sx;
|
||||||
|
e /= sx;
|
||||||
|
i /= sx;
|
||||||
|
|
||||||
|
b /= sy;
|
||||||
|
f /= sy;
|
||||||
|
j /= sy;
|
||||||
|
|
||||||
|
c /= sz;
|
||||||
|
g /= sz;
|
||||||
|
k /= sz;
|
||||||
|
|
||||||
|
|
||||||
|
auto w = glm::sqrt(1 + tm[0][0] + tm[1][1] + tm[2][2]) / 2;
|
||||||
|
|
||||||
|
|
||||||
|
auto x = (tm[2][1] - tm[1][2]) / (4 * w);
|
||||||
|
auto y = (tm[0][2] - tm[2][0]) / (4 * w);
|
||||||
|
auto z = (tm[1][0] - tm[0][1]) / (4 * w);
|
||||||
|
|
||||||
|
|
||||||
|
auto rot = glm::quat(w, x, y, z);
|
||||||
|
Rotation = glm::eulerAngles(rot);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user