Files
XCEngine/editor/src/panels/ViewportPanelContent.h

85 lines
2.6 KiB
C++

#pragma once
#include "Core/IEditorContext.h"
#include "Viewport/IViewportHostService.h"
#include <imgui.h>
#include <string>
namespace XCEngine {
namespace Editor {
struct ViewportPanelContentResult {
EditorViewportFrame frame;
ImVec2 availableSize = ImVec2(0.0f, 0.0f);
ImVec2 itemMin = ImVec2(0.0f, 0.0f);
ImVec2 itemMax = ImVec2(0.0f, 0.0f);
bool hasViewportArea = false;
bool hovered = false;
bool focused = false;
};
inline void DrawViewportStatusMessage(const std::string& message) {
if (message.empty()) {
return;
}
ImDrawList* drawList = ImGui::GetWindowDrawList();
if (drawList == nullptr) {
return;
}
const ImVec2 min = ImGui::GetItemRectMin();
const ImVec2 max = ImGui::GetItemRectMax();
const ImVec2 textSize = ImGui::CalcTextSize(message.c_str());
const ImVec2 textPos(
min.x + ((max.x - min.x) - textSize.x) * 0.5f,
min.y + ((max.y - min.y) - textSize.y) * 0.5f);
drawList->AddText(textPos, ImGui::GetColorU32(ImGuiCol_TextDisabled), message.c_str());
}
inline ViewportPanelContentResult RenderViewportPanelContent(IEditorContext& context, EditorViewportKind kind) {
ViewportPanelContentResult result = {};
result.availableSize = ImGui::GetContentRegionAvail();
result.focused = ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows);
IViewportHostService* viewportHostService = context.GetViewportHostService();
if (result.availableSize.x <= 1.0f || result.availableSize.y <= 1.0f) {
ImGui::Dummy(ImVec2(0.0f, 0.0f));
return result;
}
result.hasViewportArea = true;
if (viewportHostService == nullptr) {
ImGui::Dummy(result.availableSize);
result.itemMin = ImGui::GetItemRectMin();
result.itemMax = ImGui::GetItemRectMax();
result.hovered = ImGui::IsMouseHoveringRect(result.itemMin, result.itemMax, true);
DrawViewportStatusMessage("Viewport host is unavailable");
return result;
}
result.frame = viewportHostService->RequestViewport(kind, result.availableSize);
if (result.frame.hasTexture) {
ImGui::Image(result.frame.textureId, result.availableSize);
} else {
ImGui::Dummy(result.availableSize);
}
result.itemMin = ImGui::GetItemRectMin();
result.itemMax = ImGui::GetItemRectMax();
result.hovered = ImGui::IsMouseHoveringRect(result.itemMin, result.itemMax, true);
DrawViewportStatusMessage(
result.frame.statusText.empty() && !result.frame.hasTexture
? "Viewport is initializing"
: result.frame.statusText);
return result;
}
} // namespace Editor
} // namespace XCEngine