143 lines
4.4 KiB
C#
143 lines
4.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|