From 041853a4a0ab85dd924fde481ae8dbd4bdd7ef64 Mon Sep 17 00:00:00 2001 From: Chewico Date: Wed, 11 Feb 2026 01:49:59 +0100 Subject: [PATCH] Gizmo working --- .../DeerCore/Scripting/InternalAPI/Entity.cpp | 5 ++ .../DeerCore/Scripting/InternalAPI/Entity.h | 2 + .../DeerCore/Scripting/InternalAPI/Math.cpp | 12 ++++ .../src/DeerCore/Scripting/InternalAPI/Math.h | 4 ++ .../Scripting/Registry/EntityRegistry.cpp | 2 + .../Scripting/Registry/MathRegistry.cpp | 6 ++ Deer/src/DeerRender/Core/Engine.cpp | 1 + .../DeerRender/FrameBuffer/FrameBuffer.cpp | 31 ++++----- Deer/src/DeerRender/ImGui/ImGuiLayer.cpp | 3 +- .../DeerRender/Scripting/ImGuiRegistry.cpp | 4 ++ .../Scripting/InternalAPI/ImGUI.cpp | 69 ++++++++++++++++++- .../DeerRender/Scripting/InternalAPI/ImGUI.h | 6 ++ .../Scripting/InternalAPI/Resources.cpp | 6 +- .../EntityManipulation/MeshProperties.as | 44 ++++++------ .../EntityManipulation/ShaderProperties.as | 53 +++++--------- Editor/Scripts/Previewer/Previewer.as | 4 +- Editor/Scripts/Viewport/Viewport.as | 18 ++++- imgui.ini | 10 +-- 18 files changed, 187 insertions(+), 93 deletions(-) diff --git a/Deer/src/DeerCore/Scripting/InternalAPI/Entity.cpp b/Deer/src/DeerCore/Scripting/InternalAPI/Entity.cpp index c83d9ff..25167da 100644 --- a/Deer/src/DeerCore/Scripting/InternalAPI/Entity.cpp +++ b/Deer/src/DeerCore/Scripting/InternalAPI/Entity.cpp @@ -67,6 +67,11 @@ namespace Deer { getContextEntity(handle).destroy(); } + glm::mat4 Scripting::entity_getWorldMatrix(EntityHandle& handle) { + Entity& entity = getContextEntity(handle); + return entity.getWorldMatrix(); + } + int Scripting::entity_getNetworkBehaviour(EntityHandle& handle) { return (int)getContextEntityComponent(handle).networkBehaviour; } diff --git a/Deer/src/DeerCore/Scripting/InternalAPI/Entity.h b/Deer/src/DeerCore/Scripting/InternalAPI/Entity.h index 1f42a73..c8e514b 100644 --- a/Deer/src/DeerCore/Scripting/InternalAPI/Entity.h +++ b/Deer/src/DeerCore/Scripting/InternalAPI/Entity.h @@ -32,6 +32,8 @@ namespace Deer { void entity_destroy(EntityHandle&); CScriptArray* entity_getChildrens(EntityHandle&); + glm::mat4 entity_getWorldMatrix(EntityHandle&); + int entity_getNetworkBehaviour(EntityHandle&); void entity_setNetworkBehaviour(int, EntityHandle&); int entity_getForcedNetworkBehaviour(EntityHandle&); diff --git a/Deer/src/DeerCore/Scripting/InternalAPI/Math.cpp b/Deer/src/DeerCore/Scripting/InternalAPI/Math.cpp index 06443c5..777ab14 100644 --- a/Deer/src/DeerCore/Scripting/InternalAPI/Math.cpp +++ b/Deer/src/DeerCore/Scripting/InternalAPI/Math.cpp @@ -7,6 +7,18 @@ namespace Deer { new (mem) glm::vec3(); } + void mat4_constructor(void* mem) { + new (mem) glm::mat4(1.0f); + } + + glm::mat4 mat4_getRelativeMatrix(glm::mat4& other, glm::mat4& self) { + return glm::inverse(other) * self; + } + + glm::vec3 mat4_getPosition(glm::mat4& matrix) { + return glm::vec3(matrix[3][0], matrix[3][1], matrix[3][2]); + } + void vec3_constructor_params(float x, float y, float z, void* mem) { new (mem) glm::vec3(x, y, z); } diff --git a/Deer/src/DeerCore/Scripting/InternalAPI/Math.h b/Deer/src/DeerCore/Scripting/InternalAPI/Math.h index 8991141..a9e5bc1 100644 --- a/Deer/src/DeerCore/Scripting/InternalAPI/Math.h +++ b/Deer/src/DeerCore/Scripting/InternalAPI/Math.h @@ -10,6 +10,10 @@ namespace Deer { void vec3_constructor(void*); void vec3_constructor_params(float, float, float, void*); + void mat4_constructor(void*); + glm::mat4 mat4_getRelativeMatrix(glm::mat4&, glm::mat4&); + glm::vec3 mat4_getPosition(glm::mat4&); + glm::vec3 vec3_add(glm::vec3&, glm::vec3&); glm::vec3 vec3_sub(const glm::vec3&, glm::vec3&); glm::vec3 vec3_neg(glm::vec3&); diff --git a/Deer/src/DeerCore/Scripting/Registry/EntityRegistry.cpp b/Deer/src/DeerCore/Scripting/Registry/EntityRegistry.cpp index 1a380a1..2c2ac17 100644 --- a/Deer/src/DeerCore/Scripting/Registry/EntityRegistry.cpp +++ b/Deer/src/DeerCore/Scripting/Registry/EntityRegistry.cpp @@ -31,6 +31,8 @@ namespace Deer { REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Entity", "bool opEquals(const Entity &in) const", entity_opEquals); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Entity", "array@ getChildrens()", entity_getChildrens); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Entity", "mat4 getWorldMatrix()", entity_getWorldMatrix); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Entity", "EntityNetworkBehaviour get_networkBehaviour() const property", entity_getNetworkBehaviour); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Entity", "void set_networkBehaviour(EntityNetworkBehaviour) property", entity_setNetworkBehaviour); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Entity", "EntityNetworkBehaviour getForcedNetworkBehaviour()", entity_getForcedNetworkBehaviour); diff --git a/Deer/src/DeerCore/Scripting/Registry/MathRegistry.cpp b/Deer/src/DeerCore/Scripting/Registry/MathRegistry.cpp index 39cc4ae..d08f946 100644 --- a/Deer/src/DeerCore/Scripting/Registry/MathRegistry.cpp +++ b/Deer/src/DeerCore/Scripting/Registry/MathRegistry.cpp @@ -20,6 +20,9 @@ namespace Deer { REGISTER_EXT_OBJECT_CONSTRUCTOR(scriptEngine, "vec3", "void f()", vec3_constructor); REGISTER_EXT_OBJECT_CONSTRUCTOR(scriptEngine, "vec3", "void f(float, float = 0, float = 0)", vec3_constructor_params); + scriptEngine->RegisterObjectType("mat4", sizeof(glm::mat4), asOBJ_VALUE | asOBJ_POD | asGetTypeTraits() | asOBJ_APP_CLASS_ALLFLOATS | asOBJ_APP_CLASS_MORE_CONSTRUCTORS); + REGISTER_EXT_OBJECT_CONSTRUCTOR(scriptEngine, "mat4", "void f()", mat4_constructor); + scriptEngine->RegisterObjectType("quat", sizeof(glm::quat), asOBJ_VALUE | asOBJ_POD | asGetTypeTraits() | asOBJ_APP_CLASS_ALLFLOATS | asOBJ_APP_CLASS_MORE_CONSTRUCTORS); scriptEngine->RegisterObjectProperty("quat", "float x", asOFFSET(glm::quat, x)); scriptEngine->RegisterObjectProperty("quat", "float y", asOFFSET(glm::quat, y)); @@ -58,6 +61,9 @@ namespace Deer { REGISTER_EXT_OBJECT_METHOD(scriptEngine, "quat", "void setEuler(vec3)", quat_setEuler); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "quat", "vec3 getEuler() const", quat_getEuler); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "mat4", "mat4 getRelativeMatrix(mat4&in) const", mat4_getRelativeMatrix); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "mat4", "vec3 getPosition() const", mat4_getPosition); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "Transform", "vec3 relative(vec3)", transform_relative); } diff --git a/Deer/src/DeerRender/Core/Engine.cpp b/Deer/src/DeerRender/Core/Engine.cpp index e02e976..c617ee4 100644 --- a/Deer/src/DeerRender/Core/Engine.cpp +++ b/Deer/src/DeerRender/Core/Engine.cpp @@ -7,6 +7,7 @@ #include "DeerRender/Universe.h" #include "DeerRender/Window.h" #include "DeerRender/World.h" + #include "imgui.h" #include "DeerRender/Render/RenderCommand.h" diff --git a/Deer/src/DeerRender/FrameBuffer/FrameBuffer.cpp b/Deer/src/DeerRender/FrameBuffer/FrameBuffer.cpp index 6eca93f..baf29ed 100644 --- a/Deer/src/DeerRender/FrameBuffer/FrameBuffer.cpp +++ b/Deer/src/DeerRender/FrameBuffer/FrameBuffer.cpp @@ -1,23 +1,20 @@ #include "DeerRender/FrameBuffer.h" namespace Deer { - Scope ResourceBuilder::buildResource(const FrameBufferData& baseData) { - TextureBufferType tbt; - switch (baseData.frameBufferType) - { - case FrameBufferData::FrameBufferType::RGBA8 : - tbt = TextureBufferType::RGBA8; - break; - - default: - break; - } + Scope ResourceBuilder::buildResource(const FrameBufferData& baseData) { + TextureBufferType tbt; + switch (baseData.frameBufferType) { + case FrameBufferData::FrameBufferType::RGBA8: + tbt = TextureBufferType::RGBA8; + break; - FrameBufferSpecification spec(baseData.sizeX, baseData.sizeY, {tbt}, baseData.samples); - + default: + break; + } - Scope frameBuffer = Scope(FrameBuffer::create(spec)); - return frameBuffer; + FrameBufferSpecification spec(baseData.sizeX, baseData.sizeY, {tbt}, baseData.samples); - } -} \ No newline at end of file + Scope frameBuffer = Scope(FrameBuffer::create(spec)); + return frameBuffer; + } +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerRender/ImGui/ImGuiLayer.cpp b/Deer/src/DeerRender/ImGui/ImGuiLayer.cpp index 2abd86a..68f9d00 100755 --- a/Deer/src/DeerRender/ImGui/ImGuiLayer.cpp +++ b/Deer/src/DeerRender/ImGui/ImGuiLayer.cpp @@ -105,7 +105,7 @@ namespace Deer { } void ImGuiLayer::shutdown() { - } + } bool ImGuiLayer::onKeyPressedEvent(KeyPressedEvent& e) { ImGuiIO& io = ImGui::GetIO(); @@ -127,7 +127,6 @@ namespace Deer { ImGuiIO& io = ImGui::GetIO(); io.AddKeyEvent((ImGuiKey)e.getKeyCode(), ImGui::IsKeyPressed(ImGuiKey_LeftSuper) || ImGui::IsKeyPressed(ImGuiKey_RightSuper)); - return false; } diff --git a/Deer/src/DeerRender/Scripting/ImGuiRegistry.cpp b/Deer/src/DeerRender/Scripting/ImGuiRegistry.cpp index 3c43fa2..1da6a2e 100644 --- a/Deer/src/DeerRender/Scripting/ImGuiRegistry.cpp +++ b/Deer/src/DeerRender/Scripting/ImGuiRegistry.cpp @@ -75,6 +75,10 @@ namespace Deer { REGISTER_GLOBAL_FUNC(scriptEngine, "void drawFrameBuffer(FrameBuffer texture, int, int)", Scripting::drawFrameBuffer); REGISTER_GLOBAL_FUNC(scriptEngine, "void drawFrameBufferCentered(FrameBuffer texture, int, int)", Scripting::drawFrameBufferCentered); + REGISTER_GLOBAL_FUNC(scriptEngine, "bool manipulationTransform(WorldCamera&in, mat4&in, mat4&out, bool local)", Scripting::manipulationTransform); + REGISTER_GLOBAL_FUNC(scriptEngine, "bool manipulationRotation(WorldCamera&in, mat4&in, mat4&out, bool local)", Scripting::manipulationRotation); + REGISTER_GLOBAL_FUNC(scriptEngine, "bool manipulationScale(WorldCamera&in, mat4&in, mat4&out, bool local)", Scripting::manipulationScale); + // Input state REGISTER_GLOBAL_FUNC(scriptEngine, "bool isKeyDown(key)", Scripting::isKeyDown); REGISTER_GLOBAL_FUNC(scriptEngine, "bool isKeyPressed(key)", Scripting::isKeyPressed); diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.cpp b/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.cpp index 8ee46a5..d74d60f 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.cpp +++ b/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.cpp @@ -3,14 +3,18 @@ #include "DeerCore/Scripting/Helpers.h" #include "DeerRender/Texture.h" -#include "glm/glm.hpp" #include "DeerRender/ImGuiLayer.h" #include "DeerRender/Scripting/InternalAPI/ImGUI.h" +#include "DeerRender/World.h" + #include "angelscript.h" +#include "glm/glm.hpp" +#include "glm/gtc/type_ptr.hpp" #include "imgui.h" #include "scriptany.h" +#include "ImGuizmo.h" #include namespace Deer { @@ -299,6 +303,69 @@ namespace Deer { ImVec2(0, 1), ImVec2(1, 0)); } + bool manipulationTransform(WorldCamera& camera, glm::mat4& objMatrix, glm::mat4& outMatrix, bool local) { + ImGuizmo::SetOrthographic(false); + ImGuizmo::SetDrawlist(); + + ImVec2 window_pos = ImGui::GetItemRectMin(); + ImVec2 window_size = ImGui::GetItemRectSize(); + ImGuizmo::SetRect(window_pos.x, window_pos.y, window_size.x, window_size.y); + + glm::mat4 cameraProjection = camera.camera.getMatrix(); + cameraProjection[2][2] *= -1.0f; + cameraProjection[2][3] *= -1.0f; + + glm::mat4 cameraView = glm::inverse(camera.transform.getMatrix()); + outMatrix = objMatrix; + + ImGuizmo::MODE mode = local ? ImGuizmo::MODE::LOCAL : ImGuizmo::MODE::WORLD; + ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(cameraProjection), ImGuizmo::OPERATION::TRANSLATE, mode, glm::value_ptr(outMatrix)); + + return ImGuizmo::IsUsing(); + } + + bool manipulationScale(WorldCamera& camera, glm::mat4& objMatrix, glm::mat4& outMatrix, bool local) { + ImGuizmo::SetOrthographic(false); + ImGuizmo::SetDrawlist(); + + ImVec2 window_pos = ImGui::GetItemRectMin(); + ImVec2 window_size = ImGui::GetItemRectSize(); + ImGuizmo::SetRect(window_pos.x, window_pos.y, window_size.x, window_size.y); + + glm::mat4 cameraProjection = camera.camera.getMatrix(); + cameraProjection[2][2] *= -1.0f; + cameraProjection[2][3] *= -1.0f; + + glm::mat4 cameraView = glm::inverse(camera.transform.getMatrix()); + outMatrix = objMatrix; + + ImGuizmo::MODE mode = local ? ImGuizmo::MODE::LOCAL : ImGuizmo::MODE::WORLD; + ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(cameraProjection), ImGuizmo::OPERATION::SCALE, mode, glm::value_ptr(outMatrix)); + + return ImGuizmo::IsUsing(); + } + + bool manipulationRotation(WorldCamera& camera, glm::mat4& objMatrix, glm::mat4& outMatrix, bool local) { + ImGuizmo::SetOrthographic(false); + ImGuizmo::SetDrawlist(); + + ImVec2 window_pos = ImGui::GetItemRectMin(); + ImVec2 window_size = ImGui::GetItemRectSize(); + ImGuizmo::SetRect(window_pos.x, window_pos.y, window_size.x, window_size.y); + + glm::mat4 cameraProjection = camera.camera.getMatrix(); + cameraProjection[2][2] *= -1.0f; + cameraProjection[2][3] *= -1.0f; + + glm::mat4 cameraView = glm::inverse(camera.transform.getMatrix()); + outMatrix = objMatrix; + + ImGuizmo::MODE mode = local ? ImGuizmo::MODE::LOCAL : ImGuizmo::MODE::WORLD; + ImGuizmo::Manipulate(glm::value_ptr(cameraView), glm::value_ptr(cameraProjection), ImGuizmo::OPERATION::ROTATE, mode, glm::value_ptr(outMatrix)); + + return ImGuizmo::IsUsing(); + } + void drawIconCentered(Resource texture, int size) { if (!texture.isValid()) { ImGui::TextColored(ImVec4(0.5, 0, 0, 1), "Invalid texture"); diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.h b/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.h index 35d65f8..0f09959 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.h +++ b/Deer/src/DeerRender/Scripting/InternalAPI/ImGUI.h @@ -9,6 +9,7 @@ class asIScriptFunction; class CScriptAny; namespace Deer { + struct WorldCamera; namespace Scripting { namespace DragDropPayload { @@ -42,6 +43,10 @@ namespace Deer { void drawFrameBuffer(Resource frameBuffer, int sizeX, int sizeY); void drawFrameBufferCentered(Resource frameBuffer, int sizeX, int sizeY); + bool manipulationTransform(WorldCamera&, glm::mat4&, glm::mat4&, bool local); + bool manipulationScale(WorldCamera&, glm::mat4&, glm::mat4&, bool local); + bool manipulationRotation(WorldCamera&, glm::mat4&, glm::mat4&, bool local); + int getIconId(const std::string& name); // Layout & panel @@ -117,5 +122,6 @@ namespace Deer { void openPopup(std::string&, CScriptAny*); void closePopup(); + } // namespace Scripting } // namespace Deer diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp index 4befd10..422fcea 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp +++ b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp @@ -9,11 +9,11 @@ #include "scriptarray.h" #include "scriptstdstring.h" -#include "DeerRender/Shader.h" +#include "DeerRender/Components.h" #include "DeerRender/Mesh.h" #include "DeerRender/Render/Render.h" #include "DeerRender/Render/RenderUtils.h" -#include "DeerRender/Components.h" +#include "DeerRender/Shader.h" #include "glm/glm.hpp" #include "glm/matrix.hpp" @@ -97,8 +97,8 @@ namespace Deer { return frameBuffer.getData().getSpecification().height; } void frameBuffer_clearRGBA(int r, int g, int b, int a, Resource& frameBuffer) { - int data[] = {r, g, b, a}; frameBuffer.getData().clear(); + uint8_t data[] = {(uint8_t)r, (uint8_t)g, (uint8_t)b, (uint8_t)a}; frameBuffer.getData().clearBuffer(0, data); } bool frameBuffer_isValid(Resource& frameBuffer) { diff --git a/Editor/Scripts/EntityManipulation/MeshProperties.as b/Editor/Scripts/EntityManipulation/MeshProperties.as index fc78f48..f9ae5f5 100644 --- a/Editor/Scripts/EntityManipulation/MeshProperties.as +++ b/Editor/Scripts/EntityManipulation/MeshProperties.as @@ -11,42 +11,40 @@ class MeshComponentRender { if (!entity.hasComponent()) return; + ImGui::title("Mesh Component"); + ImGui::space(10, 10); + ImGui::text("Mesh : "); + ImGui::sameline(); + if (meshComponent.hasMesh) { + ImGui::text(meshComponent.meshResource.name); + } else { + ImGui::text("Empty"); + } + // Mesh icon if (meshComponent.hasMesh) { - ImGui::drawIcon(StudioAPI::loadIcon("object3d.png"), 32); + FrameBuffer frameBuffer = Previewer::getMeshPreview(meshComponent.meshResource); + ImGui::drawFrameBufferCentered(frameBuffer, 128, 128); } else { - ImGui::drawIcon(StudioAPI::loadIcon("empty.png"), 32); + ImGui::drawIconCentered(StudioAPI::loadIcon("empty.png"), 128); } ImGui::dragDropTarget("MESH", ReciverFunction(this.setMesh)); - if (meshComponent.hasMesh) { - ImGui::sameline(); - ImGui::space(); - ImGui::sameline(); - - GPUMesh mesh = meshComponent.get_meshResource(); - ImGui::titleCenterY(mesh.name, 32); - ImGui::dragDropTarget("MESH", ReciverFunction(this.setMesh)); - } - - ImGui::space(0, 20); - - if (ImGui::button("Clear")) { - meshComponent.clear(); - } - - ImGui::sameline(); - ImGui::space(0, 20); - ImGui::sameline(); - - bool active = meshComponent.get_isActive(); + ImGui::space(10, 10); + bool active = meshComponent.isActive; if (meshComponent.get_hasMesh()) { active = ImGui::checkbox("Active", active); meshComponent.set_isActive(active); } else { ImGui::checkboxDisabled("Active", active); } + + ImGui::sameline(); + + if (ImGui::buttonEnd("Clear")) { + meshComponent.clear(); + } } void setMesh(any@ meshData) { diff --git a/Editor/Scripts/EntityManipulation/ShaderProperties.as b/Editor/Scripts/EntityManipulation/ShaderProperties.as index 0cc071a..51b7ca6 100644 --- a/Editor/Scripts/EntityManipulation/ShaderProperties.as +++ b/Editor/Scripts/EntityManipulation/ShaderProperties.as @@ -25,51 +25,30 @@ class ShaderComponentRender { if (!entity.hasComponent()) return; - // Shader icon + ImGui::title("Shader Component"); + ImGui::space(10, 10); + ImGui::text("Shader : "); + ImGui::sameline(); if (shaderComponent.hasShader) { - ImGui::drawIcon(StudioAPI::loadIcon("shader.png"), 32); + ImGui::text(shaderComponent.shader.name); } else { - ImGui::drawIcon(StudioAPI::loadIcon("empty.png"), 32); + ImGui::text("Empty"); + } + + // Mesh icon + if (shaderComponent.hasShader) { + FrameBuffer frameBuffer = Previewer::getShaderPreview(shaderComponent.shader); + ImGui::drawFrameBufferCentered(frameBuffer, 128, 128); + } else { + ImGui::drawIconCentered(StudioAPI::loadIcon("empty.png"), 128); } ImGui::dragDropTarget("SHADER", ReciverFunction(this.setShader)); - if (shaderComponent.hasShader) { - ImGui::sameline(); - ImGui::space(); - ImGui::sameline(); - - Shader shader = shaderComponent.shader; - ImGui::titleCenterY(shader.name, 32); - ImGui::dragDropTarget("SHADER", ReciverFunction(this.setShader)); - } - - ImGui::space(); - - // Texture icon - Texture texture = shaderComponent.texture; - if (texture.isValid()) { - ImGui::drawIcon(texture, 32); - } else { - ImGui::drawIcon(StudioAPI::loadIcon("empty.png"), 32); - } - - ImGui::dragDropTarget("TEXTURE", ReciverFunction(this.setTexture)); - - if (texture.isValid()) { - ImGui::sameline(); - ImGui::space(); - ImGui::sameline(); - - ImGui::titleCenterY(texture.name, 32); - ImGui::dragDropTarget("TEXTURE", ReciverFunction(this.setTexture)); - } - - ImGui::space(0, 20); - - if (ImGui::button("Clear")) { + if (ImGui::buttonEnd("Clear")) { shaderComponent.clear(); } + } void remove() { diff --git a/Editor/Scripts/Previewer/Previewer.as b/Editor/Scripts/Previewer/Previewer.as index 9c140e2..b6ed864 100644 --- a/Editor/Scripts/Previewer/Previewer.as +++ b/Editor/Scripts/Previewer/Previewer.as @@ -1,7 +1,7 @@ namespace Previewer { FrameBuffer getMeshPreview(GPUMesh mesh) { FrameBuffer frame = Resource::createFrameBuffer(mesh.path, 128, 128); - frame.clearRGBA(0, 0, 0, 255); + frame.clearRGBA(0, 0, 0, 0); WorldCamera wcamera; wcamera.transform.position = vec3(0, 1, -3.5); @@ -29,4 +29,4 @@ namespace Previewer { frame.drawMesh(mesh, shader, transform, wcamera); return frame; } -} \ No newline at end of file +} diff --git a/Editor/Scripts/Viewport/Viewport.as b/Editor/Scripts/Viewport/Viewport.as index af9c303..6c78c9f 100644 --- a/Editor/Scripts/Viewport/Viewport.as +++ b/Editor/Scripts/Viewport/Viewport.as @@ -21,23 +21,35 @@ class ViewportPanel : Panel { return; frameBuffer.resize(x, y); - frameBuffer.clearRGBA(0, 0, 0, 255); + frameBuffer.clearRGBA(20, 30, 45, 255); sceneCamera.camera.aspect = float(x) / y; World::render(frameBuffer, sceneCamera); ImGui::drawFrameBufferCentered(frameBuffer, x, y); + + if(ActiveEntity::entity != World::getRoot()) { + mat4 entityTransform = ActiveEntity::entity.getWorldMatrix(); + + if (ImGui::manipulationTransform(sceneCamera, entityTransform, entityTransform, false)) { + mat4 parentTransform = ActiveEntity::entity.parent.getWorldMatrix(); + + mat4 relativeMatrix = entityTransform.getRelativeMatrix(parentTransform); + ActiveEntity::entity.getComponent().position = relativeMatrix.getPosition(); + } + } + if (!ImGui::isPanelActive()) return; - if (ImGui::isMouseDragging(key::MouseLeft) && !ImGui::isKeyDown(key::MouseMiddle)) { + if (ImGui::isMouseDragging(key::MouseRight) && !ImGui::isKeyDown(key::MouseMiddle)) { pitch += ImGui::getMouseDeltaY() * 0.1; yaw += ImGui::getMouseDeltaX() * 0.1; sceneCamera.transform.rotation.setEuler(vec3(pitch, yaw, 0)); } - if (ImGui::isMouseDragging(key::MouseMiddle) && !ImGui::isKeyDown(key::MouseLeft)) { + if (ImGui::isMouseDragging(key::MouseMiddle) && !ImGui::isKeyDown(key::MouseRight)) { vec3 panDir = vec3(); panDir.x -= ImGui::getMouseDeltaX(); diff --git a/imgui.ini b/imgui.ini index 1bcba21..8a47787 100644 --- a/imgui.ini +++ b/imgui.ini @@ -10,13 +10,13 @@ Collapsed=0 [Window][ViewportPanel] Pos=561,26 -Size=1574,853 +Size=1500,853 Collapsed=0 DockId=0x00000005,0 [Window][PropertiesPanel] -Pos=2137,26 -Size=423,853 +Pos=2063,26 +Size=497,853 Collapsed=0 DockId=0x00000006,0 @@ -37,7 +37,7 @@ DockSpace ID=0x0AC2E849 Window=0xD0388BC8 Pos=0,26 Size=2560,1345 Split=Y DockNode ID=0x00000003 Parent=0x0AC2E849 SizeRef=1920,493 Split=X DockNode ID=0x00000001 Parent=0x00000003 SizeRef=559,985 Selected=0x16E3C1E7 DockNode ID=0x00000002 Parent=0x00000003 SizeRef=1359,985 Split=X - DockNode ID=0x00000005 Parent=0x00000002 SizeRef=934,493 CentralNode=1 Selected=0x0F5FFC8C - DockNode ID=0x00000006 Parent=0x00000002 SizeRef=423,493 Selected=0x9876A79B + DockNode ID=0x00000005 Parent=0x00000002 SizeRef=1500,493 CentralNode=1 Selected=0x0F5FFC8C + DockNode ID=0x00000006 Parent=0x00000002 SizeRef=497,493 Selected=0x9876A79B DockNode ID=0x00000004 Parent=0x0AC2E849 SizeRef=1920,490 Selected=0x018A0F9B