feat: Gizmo local/world 空间切换 + Ctrl 吸附 + Inspector 轴色手输行
- GizmoState.localSpace(默认 local,模型轴旋转直观),T 键切换 Manipulate 的 LOCAL/WORLD 模式;无父层级两模式 world 矩阵同源, decompose 写回链路不变 - Ctrl 按住吸附(UE Grid Snap 语义):平移 0.25m / 旋转 15° / 缩放 0.1x;ImGuizmo 约定旋转 snap 单位为弧度 - 视口左上角 drawlist 叠加状态提示(Space/Snap,不占布局行) - Inspector Transform 三行升级 UE 风轴色输入行(对齐 Gizmo 轴色): 拖拽粗调 + Ctrl+Click 键入精确值
This commit is contained in:
@@ -28,6 +28,40 @@ namespace
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// UE 风变换行:label + 三轴色 DragFloat(轴色对齐 Gizmo:X 红 /
|
||||
// Y 绿 / Z 蓝)。拖拽粗调;Ctrl+Click 进输入框键入精确值。
|
||||
// 任一轴变化返回 true
|
||||
bool DragVec3Row(const char* label, glm::vec3& v, float speed,
|
||||
float mn = -3.4e38f, float mx = 3.4e38f)
|
||||
{
|
||||
ImGui::TextUnformatted(label);
|
||||
ImGui::SameLine(72.0f); // 固定标签列宽 → 三行输入框对齐
|
||||
ImGui::PushID(label);
|
||||
|
||||
constexpr ImVec4 axisCol[3] = {
|
||||
{0.72f, 0.24f, 0.24f, 1.00f}, // X 红
|
||||
{0.30f, 0.68f, 0.34f, 1.00f}, // Y 绿
|
||||
{0.24f, 0.40f, 0.88f, 1.00f}, // Z 蓝
|
||||
};
|
||||
const float boxW =
|
||||
(ImGui::GetContentRegionAvail().x
|
||||
- 2.0f * ImGui::GetStyle().ItemInnerSpacing.x) / 3.0f;
|
||||
|
||||
bool changed = false;
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
ImGui::PushStyleColor(ImGuiCol_FrameBg, axisCol[i]);
|
||||
ImGui::SetNextItemWidth(boxW);
|
||||
changed |= ImGui::DragFloat(
|
||||
i == 0 ? "##x" : i == 1 ? "##y" : "##z",
|
||||
&v[i], speed, mn, mx, "%.2f");
|
||||
ImGui::PopStyleColor();
|
||||
if (i < 2) ImGui::SameLine();
|
||||
}
|
||||
ImGui::PopID();
|
||||
return changed;
|
||||
}
|
||||
}
|
||||
|
||||
void InspectorPanel::Draw(const EditorContext& ctx, entt::entity selected)
|
||||
@@ -91,17 +125,17 @@ void InspectorPanel::Draw(const EditorContext& ctx, entt::entity selected)
|
||||
if (ImGui::CollapsingHeader("Transform", ImGuiTreeNodeFlags_DefaultOpen))
|
||||
{
|
||||
glm::vec3 pos = t->GetPosition();
|
||||
if (ImGui::DragFloat3("position", &pos.x, 0.05f))
|
||||
if (DragVec3Row("position", pos, 0.05f))
|
||||
{
|
||||
t->SetPosition(pos);
|
||||
}
|
||||
glm::vec3 rot = t->GetRotation(); // 欧拉角(度)
|
||||
if (ImGui::DragFloat3("rotation", &rot.x, 0.5f))
|
||||
glm::vec3 rot = t->GetRotation(); // 派生欧拉(度)
|
||||
if (DragVec3Row("rotation", rot, 0.5f))
|
||||
{
|
||||
t->SetRotation(rot);
|
||||
}
|
||||
glm::vec3 scl = t->GetScale();
|
||||
if (ImGui::DragFloat3("scale", &scl.x, 0.02f, 0.001f, 100.0f))
|
||||
if (DragVec3Row("scale", scl, 0.02f, 0.001f, 100.0f))
|
||||
{
|
||||
t->SetScale(scl);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user