using System; using XCEngine; using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { public class UniversalRendererData : ScriptableRendererData { public UniversalMainSceneData mainScene; public ShadowCasterBlockData shadowCaster; public DepthPrepassBlockData depthPrepass; public UniversalRendererData() : this(true) { } protected UniversalRendererData( bool initializeDefaultRendererFeatures) { mainScene = UniversalMainSceneData.CreateDefault(); shadowCaster = ShadowCasterBlockData.CreateDefault(); depthPrepass = DepthPrepassBlockData.CreateDefault(); if (initializeDefaultRendererFeatures) { ResetRendererFeaturesToDefault(); } } protected override ScriptableRenderer CreateRenderer() { return new UniversalRenderer(this); } protected override int ComputeRuntimeStateHash() { int hash = base.ComputeRuntimeStateHash(); hash = AppendMainSceneRuntimeStateHash( hash, GetMainSceneInstance()); hash = AppendShadowCasterRuntimeStateHash( hash, GetShadowCasterBlockInstance()); hash = AppendDepthPrepassRuntimeStateHash( hash, GetDepthPrepassBlockInstance()); return hash; } protected override ScriptableRendererFeature[] CreateDefaultRendererFeatures() { return UniversalDefaultRendererFeatureFactory .CreateDefaultRendererFeatures(); } internal UniversalMainSceneData GetMainSceneInstance() { if (mainScene == null) { mainScene = UniversalMainSceneData.CreateDefault(); } return mainScene; } internal ShadowCasterBlockData GetShadowCasterBlockInstance() { if (shadowCaster == null) { shadowCaster = ShadowCasterBlockData.CreateDefault(); } return shadowCaster; } internal DepthPrepassBlockData GetDepthPrepassBlockInstance() { if (depthPrepass == null) { depthPrepass = DepthPrepassBlockData.CreateDefault(); } return depthPrepass; } private static int AppendMainSceneRuntimeStateHash( int hash, UniversalMainSceneData data) { hash = RuntimeStateHashUtility.Combine(hash, data != null); if (data == null) { return hash; } hash = RuntimeStateHashUtility.Combine(hash, data.renderOpaque); hash = RuntimeStateHashUtility.Combine( hash, (int)data.opaquePassEvent); hash = RuntimeStateHashUtility.Combine( hash, data.opaqueRendererListDesc); hash = RuntimeStateHashUtility.Combine( hash, data.opaqueDrawingSettings); hash = RuntimeStateHashUtility.Combine(hash, data.renderSkybox); hash = RuntimeStateHashUtility.Combine( hash, (int)data.skyboxPassEvent); hash = RuntimeStateHashUtility.Combine( hash, data.renderTransparent); hash = RuntimeStateHashUtility.Combine( hash, (int)data.transparentPassEvent); hash = RuntimeStateHashUtility.Combine( hash, data.transparentRendererListDesc); hash = RuntimeStateHashUtility.Combine( hash, data.transparentDrawingSettings); return hash; } private static int AppendShadowCasterRuntimeStateHash( int hash, ShadowCasterBlockData data) { hash = RuntimeStateHashUtility.Combine(hash, data != null); if (data == null) { return hash; } hash = RuntimeStateHashUtility.Combine(hash, data.enabled); hash = RuntimeStateHashUtility.Combine( hash, (int)data.passEvent); hash = RuntimeStateHashUtility.Combine( hash, data.rendererListDesc); hash = RuntimeStateHashUtility.Combine( hash, data.drawingSettings); return hash; } private static int AppendDepthPrepassRuntimeStateHash( int hash, DepthPrepassBlockData data) { hash = RuntimeStateHashUtility.Combine(hash, data != null); if (data == null) { return hash; } hash = RuntimeStateHashUtility.Combine(hash, data.enabled); hash = RuntimeStateHashUtility.Combine( hash, (int)data.passEvent); hash = RuntimeStateHashUtility.Combine( hash, data.rendererListDesc); hash = RuntimeStateHashUtility.Combine( hash, data.drawingSettings); return hash; } } }