From ce5e07879cdcdc7330a454fcc1fb114a40b70514 Mon Sep 17 00:00:00 2001 From: atdunbg Date: Fri, 2 Oct 2026 23:30:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Gizmo=20=E6=97=A0=E6=B3=95=E6=8B=96?= =?UTF-8?q?=E5=8A=A8=20+=20Dynamic=20=E6=8F=90=E7=A4=BA=E8=A1=8C=E9=A1=B6?= =?UTF-8?q?=E8=A7=86=E5=8F=A3=E6=8A=96=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Editor::Draw 每帧首调 ImGuizmo::BeginFrame():不调则 mbOverGizmoHotspot hover 一次杆后永久置位(仅 BeginFrame 清零), GetMoveType 恒返 MT_NONE → 杆可见但永远抓不住 - Dynamic 刚体提示改 drawlist 叠加(Image 内左下角、纯英文): TextDisabled 占布局行 → 滚动条出现/消失循环 → avail 抖动 → 渲染分辨率每帧重报(视口疯狂顶动);且默认字体无中文字形 --- App/editor/Editor.cpp | 6 ++++++ App/editor/ViewportPanel.cpp | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/App/editor/Editor.cpp b/App/editor/Editor.cpp index f1d2d3c..1de78bc 100644 --- a/App/editor/Editor.cpp +++ b/App/editor/Editor.cpp @@ -17,6 +17,7 @@ #include #include // DockBuilder*(内部 API) +#include #include @@ -38,6 +39,11 @@ void Editor::Init(const EditorContext& ctx) void Editor::Draw() { + // ImGuizmo 每帧首调(官方约定):内部会清 mbOverGizmoHotspot 等 + // 帧级状态——不调则 hover 过一次杆后 hotspot 永久置位,GetMoveType + // 恒返 MT_NONE → 杆可见但永远抓不住(只能看不能拖) + ImGuizmo::BeginFrame(); + // host 窗口:铺满主视口,承载菜单栏 + DockSpace ImGuiViewport* viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(viewport->Pos); diff --git a/App/editor/ViewportPanel.cpp b/App/editor/ViewportPanel.cpp index 997ed71..78a29a1 100644 --- a/App/editor/ViewportPanel.cpp +++ b/App/editor/ViewportPanel.cpp @@ -167,13 +167,19 @@ std::optional ViewportPanel::Draw(const EditorContext &ctx, } // Dynamic 刚体提示:物理每帧把姿态写回 Transform,拖拽即刻 - // 被覆盖(Static/Kinematic 编辑器权威,可直接拖) + // 被覆盖(Static/Kinematic 编辑器权威,可直接拖)。 + // 用 drawlist 叠加而非 ImGui::TextDisabled:后者在 Image 下方 + // 占一行布局 → 滚动条出现/消失循环 → avail 抖动 → 渲染分辨率 + // 每帧重报(视口疯狂顶动);且默认字体无中文字形(显示 ?) if (selected != entt::null) { if (const auto *rb = reg.try_get(selected); rb != nullptr && rb->type == ECS::RigidBodyComponent::BodyType::Dynamic) { - ImGui::TextDisabled( - "(Dynamic body: transform 由物理每帧覆盖)"); + const ImVec2 imgMin = ImGui::GetItemRectMin(); + ImGui::GetWindowDrawList()->AddText( + ImVec2(imgMin.x + 8.0f, imgMin.y + size.y - 20.0f), + IM_COL32(255, 255, 255, 160), + "(Dynamic body: transform driven by physics)"); } }