46 lines
1.4 KiB
C++
46 lines
1.4 KiB
C++
#include "viewport_panel.hpp"
|
|
|
|
#include <imgui.h>
|
|
|
|
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);
|
|
}
|