using System; using XCEngine; using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { public abstract class ScriptableRendererData : Object { private ScriptableRendererFeature[] m_rendererFeatures; private ScriptableRenderer m_rendererInstance; protected ScriptableRendererData() { } internal ScriptableRenderer CreateRendererInstance() { return GetRendererInstance(); } internal ScriptableRenderer GetRendererInstance() { if (m_rendererInstance == null) { m_rendererInstance = CreateRenderer(); } return m_rendererInstance; } internal ScriptableRendererFeature[] CreateRendererFeaturesInstance() { return GetRendererFeatures(); } internal string GetPipelineRendererAssetKeyInstance() { return GetPipelineRendererAssetKey(); } internal void ReleaseRuntimeResourcesInstance() { if (m_rendererInstance != null) { m_rendererInstance.ReleaseRuntimeResourcesInstance(); m_rendererInstance = null; m_rendererFeatures = null; ReleaseRuntimeResources(); return; } if (m_rendererFeatures != null) { for (int i = 0; i < m_rendererFeatures.Length; ++i) { ScriptableRendererFeature rendererFeature = m_rendererFeatures[i]; if (rendererFeature != null) { rendererFeature.ReleaseRuntimeResourcesInstance(); } } m_rendererFeatures = null; } ReleaseRuntimeResources(); } internal void ConfigureCameraRenderRequestInstance( CameraRenderRequestContext context) { ConfigureCameraRenderRequest(context); ScriptableRendererFeature[] rendererFeatures = GetRendererFeatures(); for (int i = 0; i < rendererFeatures.Length; ++i) { ScriptableRendererFeature rendererFeature = rendererFeatures[i]; if (rendererFeature == null || !rendererFeature.isActive) { continue; } rendererFeature.ConfigureCameraRenderRequest( context); } } internal void ConfigureCameraFramePlanInstance( ScriptableRenderPipelinePlanningContext context) { ConfigureCameraFramePlan(context); ScriptableRendererFeature[] rendererFeatures = GetRendererFeatures(); for (int i = 0; i < rendererFeatures.Length; ++i) { ScriptableRendererFeature rendererFeature = rendererFeatures[i]; if (rendererFeature == null || !rendererFeature.isActive) { continue; } rendererFeature.ConfigureCameraFramePlan( context); } } protected virtual ScriptableRenderer CreateRenderer() { return null; } protected virtual void ConfigureCameraRenderRequest( CameraRenderRequestContext context) { } protected virtual void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { } protected virtual string GetPipelineRendererAssetKey() { return string.Empty; } protected virtual ScriptableRendererFeature[] CreateRendererFeatures() { return Array.Empty(); } protected virtual void ReleaseRuntimeResources() { } protected bool HasDirectionalShadow( CameraRenderRequestContext context) { return context != null && InternalCalls .Rendering_CameraRenderRequestContext_GetHasDirectionalShadow( context.nativeHandle); } protected void ClearDirectionalShadow( CameraRenderRequestContext context) { if (context == null) { return; } InternalCalls .Rendering_CameraRenderRequestContext_ClearDirectionalShadow( context.nativeHandle); } private ScriptableRendererFeature[] GetRendererFeatures() { if (m_rendererFeatures == null) { m_rendererFeatures = CreateRendererFeatures() ?? Array.Empty(); } return m_rendererFeatures; } } }