2026-04-15 22:47:42 +08:00
|
|
|
#include "Rendering/Viewport/ViewportRenderTargetInternal.h"
|
2026-04-12 23:13:00 +08:00
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <cmath>
|
|
|
|
|
|
|
|
|
|
namespace XCEngine::UI::Editor::App {
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
bool ViewportRequiresObjectIdResources(ViewportKind kind) {
|
2026-04-15 08:24:06 +08:00
|
|
|
return kind == ViewportKind::Scene;
|
2026-04-12 23:13:00 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
std::uint32_t ClampViewportPixelCoordinate(float value, std::uint32_t extent) {
|
2026-04-12 23:13:00 +08:00
|
|
|
if (extent == 0u) {
|
|
|
|
|
return 0u;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const float maxCoordinate = static_cast<float>(extent - 1u);
|
|
|
|
|
const float clamped = (std::max)(0.0f, (std::min)(value, maxCoordinate));
|
|
|
|
|
return static_cast<std::uint32_t>(std::floor(clamped));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
bool CanReuseViewportResources(const ViewportResourceReuseQuery& query) {
|
2026-04-12 23:13:00 +08:00
|
|
|
if (query.requestedWidth == 0u || query.requestedHeight == 0u) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (query.width != query.requestedWidth || query.height != query.requestedHeight) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!query.resources.hasColorTexture ||
|
|
|
|
|
!query.resources.hasColorView ||
|
|
|
|
|
!query.resources.hasDepthTexture ||
|
|
|
|
|
!query.resources.hasDepthView ||
|
|
|
|
|
!query.resources.hasTextureDescriptor) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 08:24:06 +08:00
|
|
|
if (!ViewportRequiresObjectIdResources(query.kind)) {
|
2026-04-12 23:13:00 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return query.resources.hasObjectIdTexture &&
|
|
|
|
|
query.resources.hasObjectIdDepthTexture &&
|
|
|
|
|
query.resources.hasObjectIdDepthView &&
|
|
|
|
|
query.resources.hasObjectIdView &&
|
|
|
|
|
query.resources.hasObjectIdShaderView &&
|
|
|
|
|
query.resources.hasDepthShaderView &&
|
|
|
|
|
query.resources.hasSelectionMaskTexture &&
|
|
|
|
|
query.resources.hasSelectionMaskView &&
|
|
|
|
|
query.resources.hasSelectionMaskShaderView;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
::XCEngine::RHI::TextureDesc BuildViewportTextureDesc(
|
2026-04-12 23:13:00 +08:00
|
|
|
std::uint32_t width,
|
|
|
|
|
std::uint32_t height,
|
|
|
|
|
::XCEngine::RHI::Format format) {
|
|
|
|
|
::XCEngine::RHI::TextureDesc desc = {};
|
|
|
|
|
desc.width = width;
|
|
|
|
|
desc.height = height;
|
|
|
|
|
desc.depth = 1;
|
|
|
|
|
desc.mipLevels = 1;
|
|
|
|
|
desc.arraySize = 1;
|
|
|
|
|
desc.format = static_cast<std::uint32_t>(format);
|
|
|
|
|
desc.textureType = static_cast<std::uint32_t>(::XCEngine::RHI::TextureType::Texture2D);
|
|
|
|
|
desc.sampleCount = 1;
|
|
|
|
|
desc.sampleQuality = 0;
|
|
|
|
|
desc.flags = 0;
|
|
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
::XCEngine::RHI::ResourceViewDesc BuildViewportTextureViewDesc(
|
2026-04-12 23:13:00 +08:00
|
|
|
::XCEngine::RHI::Format format) {
|
|
|
|
|
::XCEngine::RHI::ResourceViewDesc desc = {};
|
|
|
|
|
desc.format = static_cast<std::uint32_t>(format);
|
|
|
|
|
desc.dimension = ::XCEngine::RHI::ResourceViewDimension::Texture2D;
|
|
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 22:47:42 +08:00
|
|
|
::XCEngine::Rendering::RenderSurface BuildViewportRenderSurface(
|
2026-04-12 23:13:00 +08:00
|
|
|
std::uint32_t width,
|
|
|
|
|
std::uint32_t height,
|
|
|
|
|
::XCEngine::RHI::RHIResourceView* colorView,
|
|
|
|
|
::XCEngine::RHI::RHIResourceView* depthView,
|
|
|
|
|
::XCEngine::RHI::ResourceStates colorStateBefore,
|
2026-04-15 22:47:42 +08:00
|
|
|
::XCEngine::RHI::ResourceStates colorStateAfter) {
|
2026-04-12 23:13:00 +08:00
|
|
|
::XCEngine::Rendering::RenderSurface surface(width, height);
|
|
|
|
|
surface.SetColorAttachment(colorView);
|
|
|
|
|
surface.SetDepthAttachment(depthView);
|
|
|
|
|
surface.SetColorStateBefore(colorStateBefore);
|
|
|
|
|
surface.SetColorStateAfter(colorStateAfter);
|
|
|
|
|
return surface;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace XCEngine::UI::Editor::App
|