Files
XCEngine/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h

85 lines
3.5 KiB
C++

#pragma once
#include <XCEngine/Rendering/Execution/CameraFrameColorSource.h>
#include <XCEngine/Rendering/Execution/CameraFrameStage.h>
#include <XCEngine/Rendering/Planning/CameraRenderRequest.h>
#include <memory>
namespace XCEngine {
namespace Rendering {
struct CameraFrameFullscreenStagePlan {
bool requested = false;
bool usesGraphManagedOutputColor = false;
CameraFrameColorSource source = CameraFrameColorSource::ExplicitSurface;
};
struct CameraFrameColorChainPlan {
bool usesGraphManagedSceneColor = false;
CameraFrameFullscreenStagePlan postProcess = {};
CameraFrameFullscreenStagePlan finalOutput = {};
};
struct CameraFramePlan {
static RenderSurface BuildGraphManagedIntermediateSurfaceTemplate(
const RenderSurface& surface);
CameraRenderRequest request = {};
ShadowCasterRenderRequest shadowCaster = {};
DirectionalShadowRenderPlan directionalShadow = {};
PostProcessRenderRequest postProcess = {};
FinalOutputRenderRequest finalOutput = {};
ResolvedFinalColorPolicy finalColorPolicy = {};
RenderPassSequence* preScenePasses = nullptr;
RenderPassSequence* postScenePasses = nullptr;
RenderPassSequence* overlayPasses = nullptr;
CameraFrameColorChainPlan colorChain = {};
RenderSurface graphManagedSceneSurface = {};
static CameraFramePlan FromRequest(const CameraRenderRequest& request);
bool IsValid() const;
void ConfigureGraphManagedSceneSurface();
void ClearOwnedPostProcessSequence();
void SetOwnedPostProcessSequence(std::shared_ptr<RenderPassSequence> sequence);
const std::shared_ptr<RenderPassSequence>& GetOwnedPostProcessSequence() const {
return m_ownedPostProcessSequence;
}
void ClearOwnedFinalOutputSequence();
void SetOwnedFinalOutputSequence(std::shared_ptr<RenderPassSequence> sequence);
const std::shared_ptr<RenderPassSequence>& GetOwnedFinalOutputSequence() const {
return m_ownedFinalOutputSequence;
}
bool UsesGraphManagedSceneColor() const;
bool UsesGraphManagedOutputColor(CameraFrameStage stage) const;
CameraFrameColorSource ResolveStageColorSource(CameraFrameStage stage) const;
bool IsFullscreenStageRequested(CameraFrameStage stage) const;
bool RequestFullscreenStage(
CameraFrameStage stage,
CameraFrameColorSource source,
bool usesGraphManagedOutputColor = false);
void ClearFullscreenStage(CameraFrameStage stage);
bool IsPostProcessStageValid() const;
bool IsFinalOutputStageValid() const;
bool HasFrameStage(CameraFrameStage stage) const;
RenderPassSequence* GetPassSequence(CameraFrameStage stage) const;
const CameraFrameFullscreenStagePlan* GetFullscreenStagePlan(CameraFrameStage stage) const;
const FullscreenPassRenderRequest* GetFullscreenPassRequest(CameraFrameStage stage) const;
const ScenePassRenderRequest* GetScenePassRequest(CameraFrameStage stage) const;
const ObjectIdRenderRequest* GetObjectIdRequest(CameraFrameStage stage) const;
const RenderSurface* GetSharedStageOutputSurface(CameraFrameStage stage) const;
const RenderSurface& GetMainSceneSurface() const;
const RenderSurface& GetFinalCompositedSurface() const;
bool RequiresIntermediateSceneColor() const;
private:
void RefreshGraphManagedSceneSurfaceState();
std::shared_ptr<RenderPassSequence> m_ownedPostProcessSequence = {};
std::shared_ptr<RenderPassSequence> m_ownedFinalOutputSequence = {};
};
} // namespace Rendering
} // namespace XCEngine