feat: add camera viewport rect render areas
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "Scene/Scene.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
@@ -40,6 +41,20 @@ RenderClearFlags ResolveClearFlags(const Components::CameraComponent& camera, si
|
||||
}
|
||||
}
|
||||
|
||||
Math::RectInt ResolveCameraRenderArea(
|
||||
const Components::CameraComponent& camera,
|
||||
const RenderSurface& surface) {
|
||||
const Math::Rect viewportRect = camera.GetViewportRect();
|
||||
const float surfaceWidth = static_cast<float>(surface.GetWidth());
|
||||
const float surfaceHeight = static_cast<float>(surface.GetHeight());
|
||||
|
||||
const int32_t left = static_cast<int32_t>(std::floor(viewportRect.x * surfaceWidth));
|
||||
const int32_t top = static_cast<int32_t>(std::floor(viewportRect.y * surfaceHeight));
|
||||
const int32_t right = static_cast<int32_t>(std::ceil((viewportRect.x + viewportRect.width) * surfaceWidth));
|
||||
const int32_t bottom = static_cast<int32_t>(std::ceil((viewportRect.y + viewportRect.height) * surfaceHeight));
|
||||
return Math::RectInt(left, top, right - left, bottom - top);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
SceneRenderer::SceneRenderer() = default;
|
||||
@@ -101,9 +116,13 @@ std::vector<CameraRenderRequest> SceneRenderer::BuildRenderRequests(
|
||||
request.camera = camera;
|
||||
request.context = context;
|
||||
request.surface = surface;
|
||||
request.surface.SetRenderArea(ResolveCameraRenderArea(*camera, surface));
|
||||
request.cameraDepth = camera->GetDepth();
|
||||
request.clearFlags = ResolveClearFlags(*camera, cameraIndex);
|
||||
requests.push_back(request);
|
||||
if (request.surface.GetRenderAreaWidth() > 0 &&
|
||||
request.surface.GetRenderAreaHeight() > 0) {
|
||||
requests.push_back(request);
|
||||
}
|
||||
}
|
||||
|
||||
return requests;
|
||||
|
||||
Reference in New Issue
Block a user