Files
XCEngine/editor/src/Viewport/SceneViewportOverlayRenderer.cpp

74 lines
2.3 KiB
C++
Raw Normal View History

#include "SceneViewportOverlayRenderer.h"
#include "SceneViewportOrientationGizmo.h"
#include <algorithm>
namespace XCEngine {
namespace Editor {
namespace {
2026-03-29 16:18:13 +08:00
ImU32 ToImGuiColor(const Math::Color& color) {
const auto toChannel = [](float value) -> int {
return static_cast<int>(std::clamp(value, 0.0f, 1.0f) * 255.0f + 0.5f);
};
return IM_COL32(
toChannel(color.r),
toChannel(color.g),
toChannel(color.b),
toChannel(color.a));
}
void DrawSceneMoveGizmo(
ImDrawList* drawList,
const ImVec2& viewportMin,
2026-03-29 16:18:13 +08:00
const SceneViewportMoveGizmoDrawData& moveGizmo) {
if (drawList == nullptr || !moveGizmo.visible) {
return;
}
const ImVec2 pivot(viewportMin.x + moveGizmo.pivot.x, viewportMin.y + moveGizmo.pivot.y);
2026-03-29 16:18:13 +08:00
drawList->AddCircleFilled(pivot, moveGizmo.pivotRadius + 1.0f, IM_COL32(20, 22, 24, 220), 20);
drawList->AddCircle(pivot, moveGizmo.pivotRadius + 1.0f, IM_COL32(255, 255, 255, 48), 20, 1.0f);
for (const SceneViewportMoveGizmoHandleDrawData& handle : moveGizmo.handles) {
if (!handle.visible) {
continue;
}
const ImU32 color = ToImGuiColor(handle.color);
const float thickness = handle.active ? 4.0f : (handle.hovered ? 3.0f : 2.0f);
const ImVec2 start(viewportMin.x + handle.start.x, viewportMin.y + handle.start.y);
const ImVec2 end(viewportMin.x + handle.end.x, viewportMin.y + handle.end.y);
2026-03-29 16:18:13 +08:00
drawList->AddLine(start, end, color, thickness);
drawList->AddCircleFilled(end, handle.active ? 6.5f : 5.5f, color, 20);
}
}
} // namespace
void DrawSceneViewportOverlay(
ImDrawList* drawList,
const SceneViewportOverlayData& overlay,
const ImVec2& viewportMin,
const ImVec2& viewportMax,
2026-03-29 16:18:13 +08:00
const ImVec2& viewportSize,
const SceneViewportMoveGizmoDrawData* moveGizmo) {
if (drawList == nullptr || viewportSize.x <= 1.0f || viewportSize.y <= 1.0f) {
return;
}
drawList->PushClipRect(viewportMin, viewportMax, true);
2026-03-29 16:18:13 +08:00
if (overlay.valid) {
DrawSceneViewportOrientationGizmo(drawList, overlay, viewportMin, viewportMax);
2026-03-29 16:18:13 +08:00
}
if (moveGizmo != nullptr) {
DrawSceneMoveGizmo(drawList, viewportMin, *moveGizmo);
2026-03-29 16:18:13 +08:00
}
drawList->PopClipRect();
}
} // namespace Editor
} // namespace XCEngine