Files
XCEngine/new_editor/app/Rendering/Viewport/ViewportRenderTargetInternal.cpp

96 lines
3.0 KiB
C++

#include "Rendering/Viewport/ViewportRenderTargetInternal.h"
#include <algorithm>
#include <cmath>
namespace XCEngine::UI::Editor::App {
bool ViewportRequiresObjectIdResources(ViewportKind kind) {
return kind == ViewportKind::Scene;
}
std::uint32_t ClampViewportPixelCoordinate(float value, std::uint32_t extent) {
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));
}
bool CanReuseViewportResources(const ViewportResourceReuseQuery& query) {
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;
}
if (!ViewportRequiresObjectIdResources(query.kind)) {
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;
}
::XCEngine::RHI::TextureDesc BuildViewportTextureDesc(
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;
}
::XCEngine::RHI::ResourceViewDesc BuildViewportTextureViewDesc(
::XCEngine::RHI::Format format) {
::XCEngine::RHI::ResourceViewDesc desc = {};
desc.format = static_cast<std::uint32_t>(format);
desc.dimension = ::XCEngine::RHI::ResourceViewDimension::Texture2D;
return desc;
}
::XCEngine::Rendering::RenderSurface BuildViewportRenderSurface(
std::uint32_t width,
std::uint32_t height,
::XCEngine::RHI::RHIResourceView* colorView,
::XCEngine::RHI::RHIResourceView* depthView,
::XCEngine::RHI::ResourceStates colorStateBefore,
::XCEngine::RHI::ResourceStates colorStateAfter) {
::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