#include "viewport_panel.hpp" #include void ViewportPanel::onUpdate(const sophia::FrameInfo&) { const struct { const char* label; GizmoMode mode; } modes[] = {{"Move", GizmoMode::Move}, {"Rotate", GizmoMode::Rotate}, {"Scale", GizmoMode::Scale}}; for (const auto& entry : modes) { if (ImGui::RadioButton(entry.label, gizmoMode == entry.mode)) { gizmoMode = entry.mode; } ImGui::SameLine(); } ImGui::Checkbox("Grid", &showGrid); ImGui::Separator(); const ImVec2 origin = ImGui::GetCursorScreenPos(); const ImVec2 size = ImGui::GetContentRegionAvail(); const ImVec2 end(origin.x + size.x, origin.y + size.y); ImDrawList* drawList = ImGui::GetWindowDrawList(); drawList->AddRectFilled(origin, end, IM_COL32(24, 26, 32, 255)); if (showGrid) { constexpr float GRID_STEP = 40.0f; const ImU32 gridColor = IM_COL32(255, 255, 255, 18); for (float x = GRID_STEP; x < size.x; x += GRID_STEP) { drawList->AddLine(ImVec2(origin.x + x, origin.y), ImVec2(origin.x + x, end.y), gridColor); } for (float y = GRID_STEP; y < size.y; y += GRID_STEP) { drawList->AddLine(ImVec2(origin.x, origin.y + y), ImVec2(end.x, origin.y + y), gridColor); } } ImGui::SetCursorScreenPos(ImVec2(origin.x + 8.0f, origin.y + 8.0f)); ImGui::TextDisabled("%.0f x %.0f", size.x, size.y); }