refactor(rendering): move scene request shadow planning behind pipeline assets
This commit is contained in:
@@ -1,12 +1,66 @@
|
||||
#include <XCEngine/Rendering/RenderPipelineAsset.h>
|
||||
|
||||
#include "Components/CameraComponent.h"
|
||||
#include "Components/LightComponent.h"
|
||||
#include "Rendering/Execution/CameraFramePlan.h"
|
||||
#include "Rendering/Extraction/RenderSceneUtility.h"
|
||||
#include "Rendering/Planning/Internal/CameraFrameFullscreenStagePlanner.h"
|
||||
#include "Rendering/Planning/Internal/DirectionalShadowPlanning.h"
|
||||
#include "Rendering/Planning/CameraRenderRequest.h"
|
||||
#include "Rendering/Planning/SceneRenderRequestPlanner.h"
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
|
||||
void ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
|
||||
CameraRenderRequest& request,
|
||||
size_t renderedBaseCameraCount,
|
||||
size_t renderedRequestCount,
|
||||
const DirectionalShadowPlanningSettings& directionalShadowSettings) {
|
||||
if (request.scene == nullptr ||
|
||||
request.camera == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Internal::ShouldPlanDirectionalShadowForCamera(
|
||||
*request.camera,
|
||||
renderedBaseCameraCount,
|
||||
renderedRequestCount)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Components::LightComponent* const mainDirectionalLight =
|
||||
FindMainDirectionalLight(
|
||||
*request.scene,
|
||||
request.camera->GetCullingMask());
|
||||
if (mainDirectionalLight == nullptr ||
|
||||
!mainDirectionalLight->GetCastsShadows()) {
|
||||
return;
|
||||
}
|
||||
|
||||
DirectionalShadowPlanningSettings effectiveShadowSettings =
|
||||
Internal::SanitizeDirectionalShadowPlanningSettings(
|
||||
directionalShadowSettings);
|
||||
if (mainDirectionalLight->GetOverridesDirectionalShadowSettings()) {
|
||||
effectiveShadowSettings.sampling =
|
||||
mainDirectionalLight->GetDirectionalShadowSamplingSettings();
|
||||
effectiveShadowSettings.casterBias =
|
||||
mainDirectionalLight->GetDirectionalShadowCasterBiasSettings();
|
||||
}
|
||||
|
||||
const float viewportAspect = request.surface.GetRenderAreaHeight() > 0
|
||||
? static_cast<float>(request.surface.GetRenderAreaWidth()) /
|
||||
static_cast<float>(request.surface.GetRenderAreaHeight())
|
||||
: 1.0f;
|
||||
request.directionalShadow =
|
||||
Internal::BuildDirectionalShadowRenderPlan(
|
||||
*request.scene,
|
||||
*request.camera,
|
||||
*mainDirectionalLight,
|
||||
effectiveShadowSettings,
|
||||
viewportAspect);
|
||||
}
|
||||
|
||||
void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy(
|
||||
CameraFramePlan& plan,
|
||||
const FinalColorSettings& pipelineDefaults) {
|
||||
@@ -19,6 +73,18 @@ void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy(
|
||||
Internal::PlanCameraFrameFullscreenStages(plan);
|
||||
}
|
||||
|
||||
void RenderPipelineAsset::ConfigureCameraRenderRequest(
|
||||
CameraRenderRequest& request,
|
||||
size_t renderedBaseCameraCount,
|
||||
size_t renderedRequestCount,
|
||||
const DirectionalShadowPlanningSettings& directionalShadowSettings) const {
|
||||
ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
|
||||
request,
|
||||
renderedBaseCameraCount,
|
||||
renderedRequestCount,
|
||||
directionalShadowSettings);
|
||||
}
|
||||
|
||||
void RenderPipelineAsset::ConfigureCameraFramePlan(CameraFramePlan& plan) const {
|
||||
ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy(
|
||||
plan,
|
||||
|
||||
Reference in New Issue
Block a user