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 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; } } }