Expose native camera frame planning controls to managed pipeline assets and renderer features. Allow managed planning to override fullscreen stage heuristics while keeping CameraFramePlan as the native execution contract. Add scripting coverage, probe assets, and archive the phase plan after build, test, and editor smoke validation.
175 lines
5.0 KiB
C#
175 lines
5.0 KiB
C#
using XCEngine;
|
|
using XCEngine.Rendering;
|
|
|
|
namespace XCEngine.Rendering.Universal
|
|
{
|
|
public class UniversalRenderPipelineAsset
|
|
: ScriptableRenderPipelineAsset
|
|
{
|
|
public ScriptableRendererData[] rendererDataList =
|
|
new ScriptableRendererData[]
|
|
{
|
|
new UniversalRendererData()
|
|
};
|
|
public int defaultRendererIndex = 0;
|
|
|
|
protected override ScriptableRenderPipeline CreatePipeline()
|
|
{
|
|
return GetDefaultRendererData() != null
|
|
? new UniversalRenderPipeline(this)
|
|
: null;
|
|
}
|
|
|
|
protected override void ConfigureCameraRenderRequest(
|
|
CameraRenderRequestContext context)
|
|
{
|
|
ScriptableRendererData resolvedRendererData =
|
|
GetDefaultRendererData();
|
|
if (resolvedRendererData != null)
|
|
{
|
|
resolvedRendererData.ConfigureCameraRenderRequestInstance(
|
|
context);
|
|
}
|
|
}
|
|
|
|
protected override void ConfigureCameraFramePlan(
|
|
ScriptableRenderPipelinePlanningContext context)
|
|
{
|
|
ScriptableRendererData resolvedRendererData =
|
|
GetDefaultRendererData();
|
|
if (resolvedRendererData != null)
|
|
{
|
|
resolvedRendererData.ConfigureCameraFramePlanInstance(
|
|
context);
|
|
}
|
|
}
|
|
|
|
protected override string GetPipelineRendererAssetKey()
|
|
{
|
|
ScriptableRendererData resolvedRendererData =
|
|
GetDefaultRendererData();
|
|
return resolvedRendererData != null
|
|
? resolvedRendererData.GetPipelineRendererAssetKeyInstance()
|
|
: string.Empty;
|
|
}
|
|
|
|
protected override void ReleaseRuntimeResources()
|
|
{
|
|
ReleaseRendererDataRuntimeResources();
|
|
}
|
|
|
|
internal ScriptableRendererData GetDefaultRendererData()
|
|
{
|
|
return GetRendererData(defaultRendererIndex);
|
|
}
|
|
|
|
internal ScriptableRenderer GetDefaultRenderer()
|
|
{
|
|
return GetRenderer(defaultRendererIndex);
|
|
}
|
|
|
|
internal ScriptableRendererData GetRendererData(
|
|
int rendererIndex)
|
|
{
|
|
EnsureRendererDataList();
|
|
int resolvedRendererIndex =
|
|
ResolveRendererIndex(rendererIndex);
|
|
if (rendererDataList[resolvedRendererIndex] == null)
|
|
{
|
|
rendererDataList[resolvedRendererIndex] =
|
|
new UniversalRendererData();
|
|
}
|
|
|
|
return rendererDataList[resolvedRendererIndex];
|
|
}
|
|
|
|
internal ScriptableRenderer GetRenderer(
|
|
int rendererIndex)
|
|
{
|
|
ScriptableRendererData rendererData =
|
|
GetRendererData(rendererIndex);
|
|
return rendererData != null
|
|
? rendererData.GetRendererInstance()
|
|
: null;
|
|
}
|
|
|
|
private void EnsureRendererDataList()
|
|
{
|
|
if (rendererDataList != null &&
|
|
rendererDataList.Length > 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
rendererDataList =
|
|
new ScriptableRendererData[]
|
|
{
|
|
new UniversalRendererData()
|
|
};
|
|
defaultRendererIndex = 0;
|
|
}
|
|
|
|
protected void ReleaseRendererDataRuntimeResources()
|
|
{
|
|
EnsureRendererDataList();
|
|
|
|
for (int i = 0; i < rendererDataList.Length; ++i)
|
|
{
|
|
ScriptableRendererData rendererData =
|
|
rendererDataList[i];
|
|
if (rendererData == null ||
|
|
WasRendererDataReleasedEarlier(i))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
rendererData.ReleaseRuntimeResourcesInstance();
|
|
}
|
|
}
|
|
|
|
private bool WasRendererDataReleasedEarlier(
|
|
int rendererDataIndex)
|
|
{
|
|
ScriptableRendererData rendererData =
|
|
rendererDataList[rendererDataIndex];
|
|
for (int i = 0; i < rendererDataIndex; ++i)
|
|
{
|
|
if (object.ReferenceEquals(
|
|
rendererDataList[i],
|
|
rendererData))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private int ResolveRendererIndex(
|
|
int rendererIndex)
|
|
{
|
|
EnsureRendererDataList();
|
|
if (rendererIndex < 0 ||
|
|
rendererIndex >= rendererDataList.Length)
|
|
{
|
|
return ResolveDefaultRendererIndex();
|
|
}
|
|
|
|
return rendererIndex;
|
|
}
|
|
|
|
private int ResolveDefaultRendererIndex()
|
|
{
|
|
EnsureRendererDataList();
|
|
if (defaultRendererIndex < 0 ||
|
|
defaultRendererIndex >= rendererDataList.Length)
|
|
{
|
|
defaultRendererIndex = 0;
|
|
}
|
|
|
|
return defaultRendererIndex;
|
|
}
|
|
}
|
|
}
|
|
|