From 2f08607c75a86c06b46daadd1adfec9d1588ffde Mon Sep 17 00:00:00 2001 From: MegaMech <7255464+MegaMech@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:26:08 -0600 Subject: [PATCH] Gizmo rot and scale collision working --- src/engine/editor/Gizmo.cpp | 17 +++++++++++++++-- src/engine/editor/Gizmo.h | 4 ++++ src/engine/editor/ObjectPicker.cpp | 21 ++++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/engine/editor/Gizmo.cpp b/src/engine/editor/Gizmo.cpp index 1b5b7dc5d..4987242f0 100644 --- a/src/engine/editor/Gizmo.cpp +++ b/src/engine/editor/Gizmo.cpp @@ -38,7 +38,7 @@ void Gizmo::Load() { BlueCollision.Pos = &Pos; BlueCollision.Model = (Gfx*)"__OTR__editor/gizmo/translate_handle_blue"; - /* Rotate handle Collision */ + /* Rotate handle collision */ RedRotateCollision.Pos = &Pos; RedRotateCollision.Model = (Gfx*)"__OTR__editor/gizmo/rot_handle_red"; @@ -48,7 +48,16 @@ void Gizmo::Load() { BlueRotateCollision.Pos = &Pos; BlueRotateCollision.Model = (Gfx*)"__OTR__editor/gizmo/rot_handle_blue"; -// GenerateCollisionMesh(&RedCollision, (Gfx*)(handle_Cylinder_mesh), 1); + /* Scale handle collision */ + RedScaleCollision.Pos = &Pos; + RedScaleCollision.Model = (Gfx*)"__OTR__editor/gizmo/scale_handle_red"; + + GreenScaleCollision.Pos = &Pos; + GreenScaleCollision.Model = (Gfx*)"__OTR__editor/gizmo/scale_handle_green"; + + BlueScaleCollision.Pos = &Pos; + BlueScaleCollision.Model = (Gfx*)"__OTR__editor/gizmo/scale_handle_blue"; + GenerateCollisionMesh(&RedCollision, (Gfx*)LOAD_ASSET_RAW(RedCollision.Model), 1.0f); GenerateCollisionMesh(&GreenCollision, (Gfx*)LOAD_ASSET_RAW(GreenCollision.Model), 1.0f); GenerateCollisionMesh(&BlueCollision, (Gfx*)LOAD_ASSET_RAW(BlueCollision.Model), 1.0f); @@ -56,6 +65,10 @@ void Gizmo::Load() { GenerateCollisionMesh(&RedRotateCollision, (Gfx*)LOAD_ASSET_RAW(RedRotateCollision.Model), 1.0f); GenerateCollisionMesh(&GreenRotateCollision, (Gfx*)LOAD_ASSET_RAW(GreenRotateCollision.Model), 1.0f); GenerateCollisionMesh(&BlueRotateCollision, (Gfx*)LOAD_ASSET_RAW(BlueRotateCollision.Model), 1.0f); + + GenerateCollisionMesh(&RedScaleCollision, (Gfx*)LOAD_ASSET_RAW(RedScaleCollision.Model), 1.0f); + GenerateCollisionMesh(&GreenScaleCollision, (Gfx*)LOAD_ASSET_RAW(GreenScaleCollision.Model), 1.0f); + GenerateCollisionMesh(&BlueScaleCollision, (Gfx*)LOAD_ASSET_RAW(BlueScaleCollision.Model), 1.0f); } void Gizmo::Tick() { diff --git a/src/engine/editor/Gizmo.h b/src/engine/editor/Gizmo.h index ec5a864dc..47ef99549 100644 --- a/src/engine/editor/Gizmo.h +++ b/src/engine/editor/Gizmo.h @@ -60,6 +60,10 @@ public: GameObject GreenRotateCollision; GameObject BlueRotateCollision; + GameObject RedScaleCollision; + GameObject GreenScaleCollision; + GameObject BlueScaleCollision; + MtxF Mtx_RedX; MtxF Mtx_GreenY; MtxF Mtx_BlueZ; diff --git a/src/engine/editor/ObjectPicker.cpp b/src/engine/editor/ObjectPicker.cpp index de8c5907c..395b15ec6 100644 --- a/src/engine/editor/ObjectPicker.cpp +++ b/src/engine/editor/ObjectPicker.cpp @@ -98,9 +98,24 @@ void ObjectPicker::DragHandle() { } }; - tryHandle(Gizmo::GizmoHandle::Z_Axis, eGizmo.Mtx_RedX, eGizmo.RedCollision.Triangles); - tryHandle(Gizmo::GizmoHandle::X_Axis, eGizmo.Mtx_GreenY, eGizmo.GreenCollision.Triangles); - tryHandle(Gizmo::GizmoHandle::Y_Axis, eGizmo.Mtx_BlueZ, eGizmo.BlueCollision.Triangles); + switch(static_cast(CVarGetInteger("eGizmoMode", 0))) { + case Gizmo::TranslationMode::Move: + tryHandle(Gizmo::GizmoHandle::Z_Axis, eGizmo.Mtx_RedX, eGizmo.RedCollision.Triangles); + tryHandle(Gizmo::GizmoHandle::X_Axis, eGizmo.Mtx_GreenY, eGizmo.GreenCollision.Triangles); + tryHandle(Gizmo::GizmoHandle::Y_Axis, eGizmo.Mtx_BlueZ, eGizmo.BlueCollision.Triangles); + break; + case Gizmo::TranslationMode::Rotate: + tryHandle(Gizmo::GizmoHandle::Z_Axis, eGizmo.Mtx_RedX, eGizmo.RedRotateCollision.Triangles); + tryHandle(Gizmo::GizmoHandle::X_Axis, eGizmo.Mtx_GreenY, eGizmo.GreenRotateCollision.Triangles); + tryHandle(Gizmo::GizmoHandle::Y_Axis, eGizmo.Mtx_BlueZ, eGizmo.BlueRotateCollision.Triangles); + break; + case Gizmo::TranslationMode::Scale: + tryHandle(Gizmo::GizmoHandle::Z_Axis, eGizmo.Mtx_RedX, eGizmo.RedScaleCollision.Triangles); + tryHandle(Gizmo::GizmoHandle::X_Axis, eGizmo.Mtx_GreenY, eGizmo.GreenScaleCollision.Triangles); + tryHandle(Gizmo::GizmoHandle::Y_Axis, eGizmo.Mtx_BlueZ, eGizmo.BlueScaleCollision.Triangles); + break; + + } if (closestHandle != Gizmo::GizmoHandle::None && closestClickPos.has_value()) { eGizmo.SelectedHandle = closestHandle;