293 lines
9.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|