using XCEngine; using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { internal sealed class UniversalMainSceneBlock { private const string kMainLightShadowsKeyword = "XC_MAIN_LIGHT_SHADOWS"; private readonly DrawObjectsPass m_drawOpaqueObjectsPass = new DrawObjectsPass( RenderPassEvent.RenderOpaques, SceneRenderPhase.Opaque, RendererListDesc.CreateDefault( RendererListType.Opaque)); private readonly DrawSkyboxPass m_drawSkyboxPass = new DrawSkyboxPass(); private readonly DrawObjectsPass m_drawTransparentObjectsPass = new DrawObjectsPass( RenderPassEvent.RenderTransparents, SceneRenderPhase.Transparent, RendererListDesc.CreateDefault( RendererListType.Transparent)); public void ConfigureRenderSceneSetup( RenderSceneSetupContext context) { if (context == null) { return; } context.SetEnvironmentNone(); context.ClearGlobalShaderKeywords(); Camera camera = context.camera; if (ShouldUseSkyboxEnvironment( context, camera)) { if (camera.hasSkyboxMaterial) { context.UseCameraSkyboxMaterial(); } else { context.SetProceduralSkybox( camera.skyboxTopColor, camera.skyboxHorizonColor, camera.skyboxBottomColor); } } context.SetGlobalShaderKeyword( kMainLightShadowsKeyword, context.hasMainDirectionalShadow); } public void EnqueueRenderPasses( ScriptableRenderer renderer, UniversalMainSceneData mainScene) { if (renderer == null || mainScene == null) { return; } if (mainScene.renderOpaque) { EnqueueOpaquePasses( renderer, mainScene); } if (mainScene.renderSkybox) { EnqueueSkyboxPasses( renderer, mainScene); } if (mainScene.renderTransparent) { EnqueueTransparentPasses( renderer, mainScene); } } private void EnqueueOpaquePasses( ScriptableRenderer renderer, UniversalMainSceneData mainScene) { m_drawOpaqueObjectsPass.Configure( mainScene.opaquePassEvent, SceneRenderPhase.Opaque, mainScene.opaqueRendererListDesc, mainScene.opaqueDrawingSettings); renderer.EnqueuePass(m_drawOpaqueObjectsPass); } private void EnqueueSkyboxPasses( ScriptableRenderer renderer, UniversalMainSceneData mainScene) { m_drawSkyboxPass.Configure( mainScene.skyboxPassEvent); renderer.EnqueuePass(m_drawSkyboxPass); } private void EnqueueTransparentPasses( ScriptableRenderer renderer, UniversalMainSceneData mainScene) { m_drawTransparentObjectsPass.Configure( mainScene.transparentPassEvent, SceneRenderPhase.Transparent, mainScene.transparentRendererListDesc, mainScene.transparentDrawingSettings); renderer.EnqueuePass( m_drawTransparentObjectsPass); } private static bool ShouldUseSkyboxEnvironment( RenderSceneSetupContext context, Camera camera) { if (context == null || camera == null || !context.hasMainSceneDepthAttachment || (context.clearFlags & RenderClearFlags.Color) == 0 || !camera.skyboxEnabled) { return false; } return camera.projectionType == CameraProjectionType.Perspective; } } }