Rudimentary implementation of the translate,Rotate,Scale tools

This commit is contained in:
Nigel Barink 2023-05-13 18:10:24 +02:00
parent daf26c304b
commit ceb485018f
4 changed files with 139 additions and 22 deletions

View File

@ -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();

View File

@ -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();
/* /*

View File

@ -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]);
} }

View File

@ -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);
} }