2026-04-19 02:38:48 +08:00
|
|
|
using XCEngine;
|
|
|
|
|
using XCEngine.Rendering;
|
|
|
|
|
|
2026-04-19 14:04:19 +08:00
|
|
|
namespace XCEngine.Rendering.Universal
|
2026-04-19 00:05:29 +08:00
|
|
|
{
|
2026-04-19 14:04:19 +08:00
|
|
|
public class UniversalRenderPipelineAsset
|
2026-04-19 15:33:03 +08:00
|
|
|
: ScriptableRenderPipelineAsset
|
2026-04-19 00:05:29 +08:00
|
|
|
{
|
2026-04-20 00:04:24 +08:00
|
|
|
public ScriptableRendererData[] rendererDataList =
|
|
|
|
|
new ScriptableRendererData[]
|
|
|
|
|
{
|
|
|
|
|
new UniversalRendererData()
|
|
|
|
|
};
|
|
|
|
|
public int defaultRendererIndex = 0;
|
2026-04-19 00:05:29 +08:00
|
|
|
|
2026-04-19 15:33:03 +08:00
|
|
|
protected override ScriptableRenderPipeline CreatePipeline()
|
|
|
|
|
{
|
2026-04-20 00:16:32 +08:00
|
|
|
return GetDefaultRendererData() != null
|
|
|
|
|
? new UniversalRenderPipeline(this)
|
2026-04-19 15:33:03 +08:00
|
|
|
: null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void ConfigureCameraRenderRequest(
|
|
|
|
|
CameraRenderRequestContext context)
|
|
|
|
|
{
|
|
|
|
|
ScriptableRendererData resolvedRendererData =
|
2026-04-20 00:16:32 +08:00
|
|
|
GetDefaultRendererData();
|
2026-04-19 15:33:03 +08:00
|
|
|
if (resolvedRendererData != null)
|
|
|
|
|
{
|
|
|
|
|
resolvedRendererData.ConfigureCameraRenderRequestInstance(
|
|
|
|
|
context);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-19 23:32:41 +08:00
|
|
|
protected override string GetPipelineRendererAssetKey()
|
|
|
|
|
{
|
2026-04-20 00:04:24 +08:00
|
|
|
ScriptableRendererData resolvedRendererData =
|
2026-04-20 00:16:32 +08:00
|
|
|
GetDefaultRendererData();
|
2026-04-20 00:04:24 +08:00
|
|
|
return resolvedRendererData != null
|
|
|
|
|
? resolvedRendererData.GetPipelineRendererAssetKeyInstance()
|
|
|
|
|
: string.Empty;
|
2026-04-19 23:32:41 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-20 01:14:37 +08:00
|
|
|
protected override void ReleaseRuntimeResources()
|
|
|
|
|
{
|
|
|
|
|
ReleaseRendererDataRuntimeResources();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-20 00:16:32 +08:00
|
|
|
internal ScriptableRendererData GetDefaultRendererData()
|
|
|
|
|
{
|
|
|
|
|
return GetRendererData(defaultRendererIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal ScriptableRenderer GetDefaultRenderer()
|
2026-04-19 00:05:29 +08:00
|
|
|
{
|
2026-04-20 00:16:32 +08:00
|
|
|
return GetRenderer(defaultRendererIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal ScriptableRendererData GetRendererData(
|
|
|
|
|
int rendererIndex)
|
|
|
|
|
{
|
|
|
|
|
EnsureRendererDataList();
|
|
|
|
|
int resolvedRendererIndex =
|
|
|
|
|
ResolveRendererIndex(rendererIndex);
|
|
|
|
|
if (rendererDataList[resolvedRendererIndex] == null)
|
2026-04-20 00:04:24 +08:00
|
|
|
{
|
2026-04-20 00:16:32 +08:00
|
|
|
rendererDataList[resolvedRendererIndex] =
|
|
|
|
|
new UniversalRendererData();
|
2026-04-20 00:04:24 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-20 00:16:32 +08:00
|
|
|
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)
|
2026-04-20 00:04:24 +08:00
|
|
|
{
|
2026-04-20 00:16:32 +08:00
|
|
|
return;
|
2026-04-20 00:04:24 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-20 00:16:32 +08:00
|
|
|
rendererDataList =
|
|
|
|
|
new ScriptableRendererData[]
|
|
|
|
|
{
|
|
|
|
|
new UniversalRendererData()
|
|
|
|
|
};
|
|
|
|
|
defaultRendererIndex = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-20 01:14:37 +08:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-20 00:16:32 +08:00
|
|
|
private int ResolveRendererIndex(
|
|
|
|
|
int rendererIndex)
|
|
|
|
|
{
|
|
|
|
|
EnsureRendererDataList();
|
|
|
|
|
if (rendererIndex < 0 ||
|
|
|
|
|
rendererIndex >= rendererDataList.Length)
|
2026-04-19 00:05:29 +08:00
|
|
|
{
|
2026-04-20 00:16:32 +08:00
|
|
|
return ResolveDefaultRendererIndex();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rendererIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int ResolveDefaultRendererIndex()
|
|
|
|
|
{
|
|
|
|
|
EnsureRendererDataList();
|
|
|
|
|
if (defaultRendererIndex < 0 ||
|
|
|
|
|
defaultRendererIndex >= rendererDataList.Length)
|
|
|
|
|
{
|
|
|
|
|
defaultRendererIndex = 0;
|
2026-04-19 00:05:29 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-20 00:16:32 +08:00
|
|
|
return defaultRendererIndex;
|
2026-04-19 00:05:29 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-19 02:38:48 +08:00
|
|
|
|