Files
XCEngine/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs

293 lines
9.3 KiB
C#

using System;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class RendererBackedRenderPipelineAsset
: ScriptableRenderPipelineAsset
{
public ScriptableRendererData[] rendererDataList =
Array.Empty<ScriptableRendererData>();
public int defaultRendererIndex = 0;
private readonly ScriptableRendererDataCollection
m_rendererDataCollection;
private int m_rendererDataRuntimeStateHash;
private bool m_rendererDataRuntimeStateHashResolved;
protected RendererBackedRenderPipelineAsset()
{
m_rendererDataCollection =
new ScriptableRendererDataCollection();
}
protected override ScriptableRenderPipeline CreatePipeline()
{
return CreateRendererBackedPipeline();
}
protected override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
ApplyResolvedRendererIndex(
context,
ResolveRendererIndex(context));
ConfigureRendererCameraRequest(
new RendererCameraRequestContext(context));
ApplyResolvedRendererIndex(
context,
context != null
? context.rendererIndex
: -1);
ScriptableRendererData resolvedRendererData =
ResolveRendererData(context);
if (resolvedRendererData != null)
{
resolvedRendererData
.ConfigureCameraRenderRequestInstance(
context);
}
}
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
if (UsesExplicitFullscreenStagePlanning() &&
context != null)
{
// Renderer-backed SRP owns fullscreen stage planning explicitly.
context.ClearFullscreenStage(
CameraFrameStage.PostProcess);
context.ClearFullscreenStage(
CameraFrameStage.FinalOutput);
}
ScriptableRendererData resolvedRendererData =
ResolveRendererData(context);
if (resolvedRendererData != null)
{
resolvedRendererData
.ConfigureCameraFramePlanInstance(
context);
}
}
protected override bool ConfigureDirectionalShadowExecutionState(
DirectionalShadowExecutionContext context)
{
ScriptableRendererData resolvedRendererData =
ResolveRendererData(context);
return resolvedRendererData != null &&
resolvedRendererData
.ConfigureDirectionalShadowExecutionStateInstance(
context);
}
protected override bool ConfigureRenderSceneSetup(
RenderSceneSetupContext context)
{
ScriptableRendererData resolvedRendererData =
ResolveRendererData(context);
return resolvedRendererData != null &&
resolvedRendererData
.ConfigureRenderSceneSetupInstance(
context);
}
protected override void ReleaseRuntimeResources()
{
m_rendererDataCollection.ReleaseRuntimeResources(
ref rendererDataList,
ref defaultRendererIndex,
CreateDefaultRendererData);
}
protected override void SynchronizeRuntimeResourceVersion()
{
m_rendererDataCollection.Synchronize(
ref rendererDataList,
ref defaultRendererIndex,
ref m_rendererDataRuntimeStateHash,
ref m_rendererDataRuntimeStateHashResolved,
CreateDefaultRendererData,
SetDirty);
}
protected virtual ScriptableRenderPipeline
CreateRendererBackedPipeline()
{
return new RendererBackedRenderPipeline(this);
}
protected virtual void ConfigureRendererCameraRequest(
RendererCameraRequestContext context)
{
}
protected virtual int ResolveRendererIndex(
CameraRenderRequestContext context)
{
return ResolveSelectedRendererIndex();
}
protected virtual ScriptableRendererData
CreateDefaultRendererData()
{
return null;
}
protected virtual ScriptableRendererData[]
CreateDefaultRendererDataList()
{
ScriptableRendererData defaultRendererData =
CreateDefaultRendererData();
return defaultRendererData != null
? new ScriptableRendererData[]
{
defaultRendererData
}
: Array.Empty<ScriptableRendererData>();
}
protected virtual ScriptableRendererDataComposition
CreateDefaultRendererDataComposition()
{
ScriptableRendererData[] defaultRendererDataList =
CreateDefaultRendererDataList() ??
Array.Empty<ScriptableRendererData>();
return new ScriptableRendererDataComposition(
defaultRendererDataList,
defaultRendererDataList.Length > 0
? 0
: -1);
}
protected virtual bool UsesExplicitFullscreenStagePlanning()
{
return true;
}
protected void ResetRendererDataToDefault()
{
ScriptableRendererDataComposition composition =
CreateDefaultRendererDataComposition();
rendererDataList = composition.rendererDataList;
defaultRendererIndex =
composition.defaultRendererIndex;
}
internal ScriptableRendererData GetDefaultRendererData()
{
return m_rendererDataCollection.GetDefaultRendererData(
ref rendererDataList,
ref defaultRendererIndex,
CreateDefaultRendererData);
}
internal ScriptableRenderer GetDefaultRenderer()
{
return ResolveSelectedRenderer();
}
internal ScriptableRendererData ResolveSelectedRendererData()
{
return GetDefaultRendererData();
}
internal ScriptableRenderer ResolveSelectedRenderer()
{
ScriptableRendererData rendererData =
ResolveSelectedRendererData();
return rendererData != null
? rendererData.GetRendererInstance()
: null;
}
internal ScriptableRendererData GetRendererData(
int rendererIndex)
{
return m_rendererDataCollection.GetRendererData(
ref rendererDataList,
ref defaultRendererIndex,
rendererIndex,
CreateDefaultRendererData);
}
internal ScriptableRenderer ResolveRenderer(
int rendererIndex)
{
ScriptableRendererData rendererData =
GetRendererData(rendererIndex);
return rendererData != null
? rendererData.GetRendererInstance()
: null;
}
private int ResolveSelectedRendererIndex()
{
return m_rendererDataCollection
.ResolveDefaultRendererIndex(
ref rendererDataList,
ref defaultRendererIndex,
CreateDefaultRendererData);
}
private ScriptableRendererData ResolveRendererData(
CameraRenderRequestContext context)
{
return GetRendererData(
context != null
? context.rendererIndex
: -1);
}
private ScriptableRendererData ResolveRendererData(
ScriptableRenderPipelinePlanningContext context)
{
return GetRendererData(
context != null
? context.rendererIndex
: -1);
}
private ScriptableRendererData ResolveRendererData(
RenderSceneSetupContext context)
{
return GetRendererData(
context != null
? context.rendererIndex
: -1);
}
private ScriptableRendererData ResolveRendererData(
DirectionalShadowExecutionContext context)
{
return GetRendererData(
context != null
? context.rendererIndex
: -1);
}
private void ApplyResolvedRendererIndex(
CameraRenderRequestContext context,
int rendererIndex)
{
if (context == null)
{
return;
}
context.rendererIndex =
m_rendererDataCollection
.ResolveRendererIndexWithFallback(
ref rendererDataList,
ref defaultRendererIndex,
rendererIndex,
CreateDefaultRendererData);
}
}
}