refactor(srp): finalize universal package split and data-drive default scene passes

This commit is contained in:
2026-04-20 23:40:00 +08:00
parent 7fe922d1c9
commit 36c0614c14
36 changed files with 461 additions and 506 deletions

View File

@@ -1,112 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class CameraData
{
internal static readonly CameraData Default =
new CameraData(
Matrix4x4.Identity,
Matrix4x4.Identity,
Matrix4x4.Identity,
new Vector3(0.0f, 0.0f, 0.0f),
new Vector3(1.0f, 0.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, 0.0f, 1.0f),
new Color(0.0f, 0.0f, 0.0f, 1.0f),
RenderClearFlags.All,
true,
60.0f * 0.017453292519943295f,
5.0f,
1.0f,
0.1f,
1000.0f,
0,
0);
internal CameraData(
Matrix4x4 view,
Matrix4x4 projection,
Matrix4x4 viewProjection,
Vector3 worldPosition,
Vector3 worldRight,
Vector3 worldUp,
Vector3 worldForward,
Color clearColor,
RenderClearFlags clearFlags,
bool perspectiveProjection,
float verticalFovRadians,
float orthographicSize,
float aspectRatio,
float nearClipPlane,
float farClipPlane,
int viewportWidth,
int viewportHeight)
{
this.view = view;
this.projection = projection;
this.viewProjection = viewProjection;
this.worldPosition = worldPosition;
this.worldRight = worldRight;
this.worldUp = worldUp;
this.worldForward = worldForward;
this.clearColor = clearColor;
this.clearFlags = clearFlags;
this.perspectiveProjection = perspectiveProjection;
this.verticalFovRadians = verticalFovRadians;
this.orthographicSize = orthographicSize;
this.aspectRatio = aspectRatio;
this.nearClipPlane = nearClipPlane;
this.farClipPlane = farClipPlane;
this.viewportWidth = viewportWidth;
this.viewportHeight = viewportHeight;
}
public Matrix4x4 view { get; }
public Matrix4x4 projection { get; }
public Matrix4x4 viewProjection { get; }
public Vector3 worldPosition { get; }
public Vector3 worldRight { get; }
public Vector3 worldUp { get; }
public Vector3 worldForward { get; }
public Color clearColor { get; }
public RenderClearFlags clearFlags { get; }
public bool perspectiveProjection { get; }
public bool isPerspectiveProjection =>
perspectiveProjection;
public bool isOrthographicProjection =>
!perspectiveProjection;
public bool clearsColor =>
(clearFlags & RenderClearFlags.Color) != 0;
public bool clearsDepth =>
(clearFlags & RenderClearFlags.Depth) != 0;
public float verticalFovRadians { get; }
public float orthographicSize { get; }
public float aspectRatio { get; }
public float nearClipPlane { get; }
public float farClipPlane { get; }
public int viewportWidth { get; }
public int viewportHeight { get; }
}
}

View File

@@ -1,70 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
internal sealed class ColorScalePostProcessPass
: ScriptableRenderPass
{
private readonly ColorScalePostProcessRendererFeature m_feature;
public ColorScalePostProcessPass(
ColorScalePostProcessRendererFeature feature)
{
m_feature = feature;
renderPassEvent =
RenderPassEvent.BeforeRenderingPostProcessing;
}
protected override bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
return context != null &&
renderingData != null &&
renderingData.isPostProcessStage &&
m_feature != null &&
RecordColorScaleFullscreenPass(
context,
m_feature.colorScale);
}
}
public sealed class ColorScalePostProcessRendererFeature
: ScriptableRendererFeature
{
private ColorScalePostProcessPass m_pass;
public Vector4 colorScale = new Vector4(
1.0f,
1.0f,
1.0f,
1.0f);
public override void Create()
{
m_pass =
new ColorScalePostProcessPass(this);
}
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
if (renderer == null ||
renderingData == null ||
!renderingData.isPostProcessStage)
{
return;
}
if (m_pass == null)
{
CreateInstance();
}
renderer.EnqueuePass(m_pass);
}
}
}

View File

@@ -1,43 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class DirectionalLightData
{
internal static readonly DirectionalLightData Default =
new DirectionalLightData(
false,
false,
new Vector3(0.0f, 0.0f, -1.0f),
new Color(1.0f, 1.0f, 1.0f, 1.0f),
1.0f);
internal DirectionalLightData(
bool enabled,
bool castsShadows,
Vector3 direction,
Color color,
float intensity)
{
this.enabled = enabled;
this.castsShadows = castsShadows;
this.direction = direction;
this.color = color;
this.intensity = intensity;
}
public bool enabled { get; }
public bool castsShadows { get; }
public Vector3 direction { get; }
public Color color { get; }
public float intensity { get; }
public bool isValid =>
enabled;
}
}

View File

@@ -1,86 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class DirectionalShadowData
{
internal static readonly DirectionalShadowData Default =
new DirectionalShadowData(
false,
Matrix4x4.Identity,
0.0f,
0.1f,
0.0f,
0,
0,
0.0f,
0.0f,
0.0f,
0.0f,
0.0f,
0);
internal DirectionalShadowData(
bool enabled,
Matrix4x4 viewProjection,
float orthographicHalfExtent,
float nearClipPlane,
float farClipPlane,
int mapWidth,
int mapHeight,
float worldTexelSize,
float receiverDepthBias,
float normalBiasScale,
float shadowStrength,
float depthBiasFactor,
int depthBiasUnits)
{
this.enabled = enabled;
this.viewProjection = viewProjection;
this.orthographicHalfExtent =
orthographicHalfExtent;
this.nearClipPlane = nearClipPlane;
this.farClipPlane = farClipPlane;
this.mapWidth = mapWidth;
this.mapHeight = mapHeight;
this.worldTexelSize = worldTexelSize;
this.receiverDepthBias = receiverDepthBias;
this.normalBiasScale = normalBiasScale;
this.shadowStrength = shadowStrength;
this.depthBiasFactor = depthBiasFactor;
this.depthBiasUnits = depthBiasUnits;
}
public bool enabled { get; }
public Matrix4x4 viewProjection { get; }
public float orthographicHalfExtent { get; }
public float nearClipPlane { get; }
public float farClipPlane { get; }
public int mapWidth { get; }
public int mapHeight { get; }
public float worldTexelSize { get; }
public float receiverDepthBias { get; }
public float normalBiasScale { get; }
public float shadowStrength { get; }
public float depthBiasFactor { get; }
public int depthBiasUnits { get; }
public bool hasShadowMap =>
enabled &&
mapWidth > 0 &&
mapHeight > 0;
}
}

View File

@@ -1,19 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public sealed class DisableDirectionalShadowRendererFeature
: ScriptableRendererFeature
{
public override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
if (HasDirectionalShadow(context))
{
ClearDirectionalShadow(context);
}
}
}
}

View File

@@ -1,44 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class EnvironmentData
{
internal static readonly EnvironmentData Default =
new EnvironmentData(
RenderEnvironmentMode.None,
new Color(0.18f, 0.36f, 0.74f, 1.0f),
new Color(0.78f, 0.84f, 0.92f, 1.0f),
new Color(0.92f, 0.93f, 0.95f, 1.0f));
internal EnvironmentData(
RenderEnvironmentMode mode,
Color skyboxTopColor,
Color skyboxHorizonColor,
Color skyboxBottomColor)
{
this.mode = mode;
this.skyboxTopColor = skyboxTopColor;
this.skyboxHorizonColor = skyboxHorizonColor;
this.skyboxBottomColor = skyboxBottomColor;
}
public RenderEnvironmentMode mode { get; }
public Color skyboxTopColor { get; }
public Color skyboxHorizonColor { get; }
public Color skyboxBottomColor { get; }
public bool hasProceduralSkybox =>
mode == RenderEnvironmentMode.ProceduralSkybox;
public bool hasMaterialSkybox =>
mode == RenderEnvironmentMode.MaterialSkybox;
public bool hasSkybox =>
hasProceduralSkybox || hasMaterialSkybox;
}
}

View File

@@ -1,42 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class FinalColorData
{
internal static readonly FinalColorData Default =
new FinalColorData(
FinalColorSettings.CreateDefault(),
false,
false);
internal FinalColorData(
FinalColorSettings settings,
bool hasPipelineDefaults,
bool hasCameraOverrides)
{
this.settings = settings;
this.hasPipelineDefaults = hasPipelineDefaults;
this.hasCameraOverrides = hasCameraOverrides;
}
public FinalColorSettings settings { get; }
public bool hasPipelineDefaults { get; }
public bool hasCameraOverrides { get; }
public bool requiresProcessing =>
settings.outputTransferMode !=
FinalColorOutputTransferMode.Disabled ||
settings.exposureMode !=
FinalColorExposureMode.Disabled ||
settings.toneMappingMode !=
FinalColorToneMappingMode.Disabled ||
settings.finalColorScale.x != 1.0f ||
settings.finalColorScale.y != 1.0f ||
settings.finalColorScale.z != 1.0f ||
settings.finalColorScale.w != 1.0f;
}
}

View File

@@ -1,38 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class LightingData
{
internal static readonly LightingData Default =
new LightingData(
DirectionalLightData.Default,
false,
0);
internal LightingData(
DirectionalLightData mainDirectionalLight,
bool hasMainDirectionalShadow,
int additionalLightCount)
{
this.mainDirectionalLight =
mainDirectionalLight ?? DirectionalLightData.Default;
this.hasMainDirectionalShadow =
hasMainDirectionalShadow;
this.additionalLightCount = additionalLightCount;
}
public DirectionalLightData mainDirectionalLight { get; }
public bool hasMainDirectionalShadow { get; }
public int additionalLightCount { get; }
public bool hasMainDirectionalLight =>
mainDirectionalLight.enabled;
public bool hasAdditionalLights =>
additionalLightCount > 0;
}
}

View File

@@ -1,15 +0,0 @@
using System;
using XCEngine;
namespace XCEngine.Rendering.Universal
{
[Flags]
public enum RenderClearFlags
{
None = 0,
Color = 1 << 0,
Depth = 1 << 1,
All = Color | Depth
}
}

View File

@@ -1,12 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public enum RenderEnvironmentMode
{
None = 0,
ProceduralSkybox = 1,
MaterialSkybox = 2
}
}

View File

@@ -1,23 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public enum RenderPassEvent
{
BeforeRenderingOpaques = 100,
RenderOpaques = 110,
AfterRenderingOpaques = 120,
BeforeRenderingSkybox = 200,
RenderSkybox = 210,
AfterRenderingSkybox = 220,
BeforeRenderingTransparents = 300,
RenderTransparents = 310,
AfterRenderingTransparents = 320,
BeforeRenderingPostProcessing = 400,
AfterRenderingPostProcessing = 420,
BeforeRenderingFinalOutput = 500,
AfterRenderingFinalOutput = 520
}
}

View File

@@ -1,24 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public class RendererBackedRenderPipeline
: RendererDrivenRenderPipeline
{
private readonly RendererBackedRenderPipelineAsset m_asset;
public RendererBackedRenderPipeline(
RendererBackedRenderPipelineAsset asset)
{
m_asset = asset;
}
protected override ScriptableRenderer ResolveRenderer(
RendererRecordingContext context)
{
return m_asset != null
? m_asset.ResolveSelectedRenderer()
: null;
}
}
}

View File

@@ -1,296 +0,0 @@
using System;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class RendererBackedRenderPipelineAsset
: ScriptableRenderPipelineAsset
{
public ScriptableRendererData[] rendererDataList =
Array.Empty<ScriptableRendererData>();
public int defaultRendererIndex = 0;
private int m_rendererDataRuntimeStateHash;
private bool m_rendererDataRuntimeStateHashResolved;
protected RendererBackedRenderPipelineAsset()
{
}
protected override ScriptableRenderPipeline CreatePipeline()
{
return CreateRendererBackedPipeline();
}
protected override void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
ConfigureRendererCameraRequest(
new RendererCameraRequestContext(context));
ScriptableRendererData resolvedRendererData =
ResolveSelectedRendererData();
if (resolvedRendererData != null)
{
resolvedRendererData
.ConfigureCameraRenderRequestInstance(
context);
}
}
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
ScriptableRendererData resolvedRendererData =
ResolveSelectedRendererData();
if (resolvedRendererData != null)
{
resolvedRendererData
.ConfigureCameraFramePlanInstance(
context);
}
}
protected override string GetPipelineRendererAssetKey()
{
ScriptableRendererData resolvedRendererData =
ResolveSelectedRendererData();
return resolvedRendererData != null
? resolvedRendererData
.GetPipelineRendererAssetKeyInstance()
: string.Empty;
}
protected override void ReleaseRuntimeResources()
{
ReleaseRendererDataRuntimeResources();
}
protected override void SynchronizeRuntimeResourceVersion()
{
int runtimeStateHash =
ComputeRendererDataRuntimeStateHash();
if (!m_rendererDataRuntimeStateHashResolved)
{
m_rendererDataRuntimeStateHash =
runtimeStateHash;
m_rendererDataRuntimeStateHashResolved = true;
return;
}
if (runtimeStateHash ==
m_rendererDataRuntimeStateHash)
{
return;
}
m_rendererDataRuntimeStateHash =
runtimeStateHash;
SetDirty();
}
protected virtual ScriptableRenderPipeline
CreateRendererBackedPipeline()
{
return new RendererBackedRenderPipeline(this);
}
protected virtual void ConfigureRendererCameraRequest(
RendererCameraRequestContext context)
{
}
protected virtual ScriptableRendererData
CreateDefaultRendererData()
{
return null;
}
internal ScriptableRendererData GetDefaultRendererData()
{
return ResolveSelectedRendererData();
}
internal ScriptableRenderer GetDefaultRenderer()
{
return ResolveSelectedRenderer();
}
internal ScriptableRendererData ResolveSelectedRendererData()
{
return ResolveRendererDataByResolvedIndex(
ResolveSelectedRendererIndex());
}
internal ScriptableRenderer ResolveSelectedRenderer()
{
ScriptableRendererData rendererData =
ResolveSelectedRendererData();
return rendererData != null
? rendererData.GetRendererInstance()
: null;
}
internal ScriptableRendererData GetRendererData(
int rendererIndex)
{
return ResolveRendererDataByResolvedIndex(
ResolveRendererIndex(rendererIndex));
}
internal ScriptableRenderer GetRenderer(
int rendererIndex)
{
ScriptableRendererData rendererData =
GetRendererData(rendererIndex);
return rendererData != null
? rendererData.GetRendererInstance()
: null;
}
protected internal void ReleaseRendererDataRuntimeResources()
{
EnsureRendererDataList();
for (int i = 0; i < rendererDataList.Length; ++i)
{
ScriptableRendererData rendererData =
rendererDataList[i];
if (rendererData == null ||
WasRendererDataReleasedEarlier(i))
{
continue;
}
rendererData.ReleaseRuntimeResourcesInstance();
}
}
private void EnsureRendererDataList()
{
if (rendererDataList != null &&
rendererDataList.Length > 0)
{
return;
}
ScriptableRendererData defaultRendererData =
CreateDefaultRendererData();
rendererDataList =
defaultRendererData != null
? new ScriptableRendererData[]
{
defaultRendererData
}
: Array.Empty<ScriptableRendererData>();
defaultRendererIndex = 0;
}
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 ComputeRendererDataRuntimeStateHash()
{
unchecked
{
int hash = 17;
hash =
(hash * 31) +
ResolveSelectedRendererIndex();
if (rendererDataList == null)
{
return hash;
}
hash = (hash * 31) + rendererDataList.Length;
for (int i = 0; i < rendererDataList.Length; ++i)
{
ScriptableRendererData rendererData =
rendererDataList[i];
if (rendererData != null)
{
hash =
(hash * 31) +
rendererData
.GetRuntimeStateVersionInstance();
}
}
return hash;
}
}
private ScriptableRendererData ResolveRendererDataByResolvedIndex(
int resolvedRendererIndex)
{
EnsureRendererDataList();
if (resolvedRendererIndex < 0)
{
return null;
}
if (rendererDataList[resolvedRendererIndex] == null)
{
rendererDataList[resolvedRendererIndex] =
CreateDefaultRendererData();
}
return rendererDataList[resolvedRendererIndex];
}
private int ResolveSelectedRendererIndex()
{
return ResolveRendererIndex(defaultRendererIndex);
}
private int ResolveRendererIndex(
int rendererIndex)
{
EnsureRendererDataList();
if (rendererDataList.Length == 0)
{
return -1;
}
if (rendererIndex < 0 ||
rendererIndex >= rendererDataList.Length)
{
return ResolveDefaultRendererIndex();
}
return rendererIndex;
}
private int ResolveDefaultRendererIndex()
{
EnsureRendererDataList();
if (rendererDataList.Length == 0)
{
return -1;
}
if (defaultRendererIndex < 0 ||
defaultRendererIndex >= rendererDataList.Length)
{
defaultRendererIndex = 0;
}
return defaultRendererIndex;
}
}
}

View File

@@ -1,28 +0,0 @@
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public sealed class RendererCameraRequestContext
{
private readonly CameraRenderRequestContext m_requestContext;
internal RendererCameraRequestContext(
CameraRenderRequestContext requestContext)
{
m_requestContext = requestContext;
}
public int renderedBaseCameraCount =>
m_requestContext != null
? m_requestContext.renderedBaseCameraCount
: 0;
public int renderedRequestCount =>
m_requestContext != null
? m_requestContext.renderedRequestCount
: 0;
internal CameraRenderRequestContext requestContext =>
m_requestContext;
}
}

View File

@@ -1,53 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class RendererDrivenRenderPipeline
: ScriptableRenderPipeline
{
protected RendererDrivenRenderPipeline()
{
}
protected sealed override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return SupportsRendererRecording(
new RendererRecordingContext(stage));
}
protected sealed override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
if (context == null)
{
return false;
}
return RecordRenderer(
new RendererRecordingContext(context));
}
protected virtual bool SupportsRendererRecording(
RendererRecordingContext context)
{
ScriptableRenderer renderer =
ResolveRenderer(context);
return renderer != null &&
renderer.SupportsRendererRecordingInstance(context);
}
protected virtual bool RecordRenderer(
RendererRecordingContext context)
{
ScriptableRenderer renderer =
ResolveRenderer(context);
return renderer != null &&
renderer.RecordRendererInstance(context);
}
protected abstract ScriptableRenderer ResolveRenderer(
RendererRecordingContext context);
}
}

View File

@@ -1,48 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public sealed class RendererRecordingContext
{
private readonly ScriptableRenderContext m_renderContext;
private readonly RenderingData m_renderingData;
internal RendererRecordingContext(
CameraFrameStage stage)
: this(
null,
new RenderingData(stage))
{
}
internal RendererRecordingContext(
ScriptableRenderContext renderContext)
: this(
renderContext,
renderContext != null
? new RenderingData(renderContext)
: new RenderingData(CameraFrameStage.MainScene))
{
}
private RendererRecordingContext(
ScriptableRenderContext renderContext,
RenderingData renderingData)
{
m_renderContext = renderContext;
m_renderingData =
renderingData ??
new RenderingData(CameraFrameStage.MainScene);
}
public CameraFrameStage stage =>
m_renderingData.stage;
public RenderingData renderingData =>
m_renderingData;
internal ScriptableRenderContext renderContext =>
m_renderContext;
}
}

View File

@@ -1,92 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public sealed class RenderingData
{
internal RenderingData(CameraFrameStage stage)
: this(
stage,
CameraData.Default,
LightingData.Default,
ShadowData.Default,
EnvironmentData.Default,
FinalColorData.Default,
StageColorData.Default)
{
}
internal RenderingData(ScriptableRenderContext context)
: this(
context != null
? context.stage
: CameraFrameStage.MainScene,
context != null
? RenderingDataResolver.ResolveCameraData(context)
: CameraData.Default,
context != null
? RenderingDataResolver.ResolveLightingData(context)
: LightingData.Default,
context != null
? RenderingDataResolver.ResolveShadowData(context)
: ShadowData.Default,
context != null
? RenderingDataResolver.ResolveEnvironmentData(context)
: EnvironmentData.Default,
context != null
? RenderingDataResolver.ResolveFinalColorData(context)
: FinalColorData.Default,
context != null
? RenderingDataResolver.ResolveStageColorData(context)
: StageColorData.Default)
{
}
private RenderingData(
CameraFrameStage stage,
CameraData cameraData,
LightingData lightingData,
ShadowData shadowData,
EnvironmentData environmentData,
FinalColorData finalColorData,
StageColorData stageColorData)
{
this.stage = stage;
this.cameraData = cameraData ?? CameraData.Default;
this.lightingData =
lightingData ?? LightingData.Default;
this.shadowData =
shadowData ?? ShadowData.Default;
this.environmentData =
environmentData ?? EnvironmentData.Default;
this.finalColorData =
finalColorData ?? FinalColorData.Default;
this.stageColorData =
stageColorData ?? StageColorData.Default;
}
public CameraFrameStage stage { get; }
public CameraData cameraData { get; }
public LightingData lightingData { get; }
public ShadowData shadowData { get; }
public EnvironmentData environmentData { get; }
public FinalColorData finalColorData { get; }
public StageColorData stageColorData { get; }
public bool isMainSceneStage =>
stage == CameraFrameStage.MainScene;
public bool isPostProcessStage =>
stage == CameraFrameStage.PostProcess;
public bool isFinalOutputStage =>
stage == CameraFrameStage.FinalOutput;
}
}

View File

@@ -1,296 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
internal static class RenderingDataResolver
{
public static CameraData ResolveCameraData(
ScriptableRenderContext context)
{
if (context == null)
{
return CameraData.Default;
}
ulong nativeHandle = context.nativeHandle;
Matrix4x4 view;
Matrix4x4 projection;
Matrix4x4 viewProjection;
Vector3 worldPosition;
Vector3 worldRight;
Vector3 worldUp;
Vector3 worldForward;
Color clearColor;
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraView(
nativeHandle,
out view);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraProjection(
nativeHandle,
out projection);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraViewProjection(
nativeHandle,
out viewProjection);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraWorldPosition(
nativeHandle,
out worldPosition);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraWorldRight(
nativeHandle,
out worldRight);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraWorldUp(
nativeHandle,
out worldUp);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraWorldForward(
nativeHandle,
out worldForward);
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraClearColor(
nativeHandle,
out clearColor);
return new CameraData(
view,
projection,
viewProjection,
worldPosition,
worldRight,
worldUp,
worldForward,
clearColor,
(RenderClearFlags)InternalCalls
.Rendering_ScriptableRenderContext_GetCameraClearFlags(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraPerspectiveProjection(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraVerticalFovRadians(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraOrthographicSize(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraAspectRatio(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraNearClipPlane(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraFarClipPlane(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraViewportWidth(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetCameraViewportHeight(
nativeHandle));
}
public static LightingData ResolveLightingData(
ScriptableRenderContext context)
{
if (context == null)
{
return LightingData.Default;
}
ulong nativeHandle = context.nativeHandle;
Vector3 mainDirectionalLightDirection;
Color mainDirectionalLightColor;
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalLightDirection(
nativeHandle,
out mainDirectionalLightDirection);
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalLightColor(
nativeHandle,
out mainDirectionalLightColor);
return new LightingData(
new DirectionalLightData(
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalLightEnabled(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalLightCastsShadows(
nativeHandle),
mainDirectionalLightDirection,
mainDirectionalLightColor,
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalLightIntensity(
nativeHandle)),
InternalCalls
.Rendering_ScriptableRenderContext_GetHasMainDirectionalShadow(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetAdditionalLightCount(
nativeHandle));
}
public static ShadowData ResolveShadowData(
ScriptableRenderContext context)
{
if (context == null)
{
return ShadowData.Default;
}
ulong nativeHandle = context.nativeHandle;
Matrix4x4 viewProjection;
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowViewProjection(
nativeHandle,
out viewProjection);
return new ShadowData(
new DirectionalShadowData(
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowEnabled(
nativeHandle),
viewProjection,
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowOrthographicHalfExtent(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowNearClipPlane(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowFarClipPlane(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowMapWidth(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowMapHeight(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowWorldTexelSize(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowReceiverDepthBias(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowNormalBiasScale(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowStrength(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowDepthBiasFactor(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetMainDirectionalShadowDepthBiasUnits(
nativeHandle)));
}
public static EnvironmentData ResolveEnvironmentData(
ScriptableRenderContext context)
{
if (context == null)
{
return EnvironmentData.Default;
}
ulong nativeHandle = context.nativeHandle;
Color skyboxTopColor;
Color skyboxHorizonColor;
Color skyboxBottomColor;
InternalCalls
.Rendering_ScriptableRenderContext_GetEnvironmentSkyboxTopColor(
nativeHandle,
out skyboxTopColor);
InternalCalls
.Rendering_ScriptableRenderContext_GetEnvironmentSkyboxHorizonColor(
nativeHandle,
out skyboxHorizonColor);
InternalCalls
.Rendering_ScriptableRenderContext_GetEnvironmentSkyboxBottomColor(
nativeHandle,
out skyboxBottomColor);
return new EnvironmentData(
(RenderEnvironmentMode)InternalCalls
.Rendering_ScriptableRenderContext_GetEnvironmentMode(
nativeHandle),
skyboxTopColor,
skyboxHorizonColor,
skyboxBottomColor);
}
public static FinalColorData ResolveFinalColorData(
ScriptableRenderContext context)
{
if (context == null)
{
return FinalColorData.Default;
}
ulong nativeHandle = context.nativeHandle;
Vector4 finalColorScale;
InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorScale(
nativeHandle,
out finalColorScale);
FinalColorSettings settings =
FinalColorSettings.CreateDefault();
settings.outputTransferMode =
(FinalColorOutputTransferMode)InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorOutputTransferMode(
nativeHandle);
settings.exposureMode =
(FinalColorExposureMode)InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorExposureMode(
nativeHandle);
settings.exposureValue =
InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorExposureValue(
nativeHandle);
settings.toneMappingMode =
(FinalColorToneMappingMode)InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorToneMappingMode(
nativeHandle);
settings.finalColorScale =
finalColorScale;
return new FinalColorData(
settings,
InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides(
nativeHandle));
}
public static StageColorData ResolveStageColorData(
ScriptableRenderContext context)
{
if (context == null)
{
return StageColorData.Default;
}
ulong nativeHandle = context.nativeHandle;
return new StageColorData(
(CameraFrameColorSource)InternalCalls
.Rendering_ScriptableRenderContext_GetStageColorSource(
nativeHandle),
InternalCalls
.Rendering_ScriptableRenderContext_GetStageUsesGraphManagedOutputColor(
nativeHandle));
}
}
}

View File

@@ -1,247 +0,0 @@
using System;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class ScriptableRenderPass
{
private enum RecordedScenePhase
{
Opaque = 0,
Skybox = 1,
Transparent = 3
}
private enum RecordedSceneInjectionPoint
{
BeforeOpaque = 0,
AfterOpaque = 1,
BeforeSkybox = 2,
AfterSkybox = 3,
BeforeTransparent = 4,
AfterTransparent = 5
}
private enum RecordedFullscreenPassType
{
ColorScale = 0,
ShaderVector = 1
}
protected ScriptableRenderPass()
{
}
public RenderPassEvent renderPassEvent { get; protected set; } =
RenderPassEvent.BeforeRenderingOpaques;
public virtual bool SupportsStage(
CameraFrameStage stage)
{
CameraFrameStage resolvedStage;
return TryResolveStage(
renderPassEvent,
out resolvedStage) &&
resolvedStage == stage;
}
internal bool Record(
ScriptableRenderContext context,
RenderingData renderingData)
{
return RecordRenderGraph(
context,
renderingData);
}
protected abstract bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData);
protected bool RecordScene(
ScriptableRenderContext context)
{
return context != null &&
InternalCalls
.Rendering_ScriptableRenderContext_RecordScene(
context.nativeHandle);
}
protected bool RecordOpaqueScenePhase(
ScriptableRenderContext context)
{
return RecordScenePhaseInternal(
context,
RecordedScenePhase.Opaque);
}
protected bool RecordSkyboxScenePhase(
ScriptableRenderContext context)
{
return RecordScenePhaseInternal(
context,
RecordedScenePhase.Skybox);
}
protected bool RecordTransparentScenePhase(
ScriptableRenderContext context)
{
return RecordScenePhaseInternal(
context,
RecordedScenePhase.Transparent);
}
protected bool RecordBeforeOpaqueInjection(
ScriptableRenderContext context)
{
return RecordSceneInjectionPointInternal(
context,
RecordedSceneInjectionPoint.BeforeOpaque);
}
protected bool RecordAfterOpaqueInjection(
ScriptableRenderContext context)
{
return RecordSceneInjectionPointInternal(
context,
RecordedSceneInjectionPoint.AfterOpaque);
}
protected bool RecordBeforeSkyboxInjection(
ScriptableRenderContext context)
{
return RecordSceneInjectionPointInternal(
context,
RecordedSceneInjectionPoint.BeforeSkybox);
}
protected bool RecordAfterSkyboxInjection(
ScriptableRenderContext context)
{
return RecordSceneInjectionPointInternal(
context,
RecordedSceneInjectionPoint.AfterSkybox);
}
protected bool RecordBeforeTransparentInjection(
ScriptableRenderContext context)
{
return RecordSceneInjectionPointInternal(
context,
RecordedSceneInjectionPoint.BeforeTransparent);
}
protected bool RecordAfterTransparentInjection(
ScriptableRenderContext context)
{
return RecordSceneInjectionPointInternal(
context,
RecordedSceneInjectionPoint.AfterTransparent);
}
protected bool RecordColorScaleFullscreenPass(
ScriptableRenderContext context,
Vector4 colorScale)
{
return RecordFullscreenPassInternal(
context,
RecordedFullscreenPassType.ColorScale,
string.Empty,
string.Empty,
colorScale);
}
protected bool RecordShaderVectorFullscreenPass(
ScriptableRenderContext context,
string shaderPath,
Vector4 vectorPayload,
string passName = null)
{
if (string.IsNullOrEmpty(shaderPath))
{
throw new ArgumentException(
"Fullscreen shader path cannot be null or empty.",
nameof(shaderPath));
}
return RecordFullscreenPassInternal(
context,
RecordedFullscreenPassType.ShaderVector,
shaderPath,
passName ?? string.Empty,
vectorPayload);
}
internal static bool TryResolveStage(
RenderPassEvent passEvent,
out CameraFrameStage stage)
{
switch (passEvent)
{
case RenderPassEvent.BeforeRenderingOpaques:
case RenderPassEvent.RenderOpaques:
case RenderPassEvent.AfterRenderingOpaques:
case RenderPassEvent.BeforeRenderingSkybox:
case RenderPassEvent.RenderSkybox:
case RenderPassEvent.AfterRenderingSkybox:
case RenderPassEvent.BeforeRenderingTransparents:
case RenderPassEvent.RenderTransparents:
case RenderPassEvent.AfterRenderingTransparents:
stage = CameraFrameStage.MainScene;
return true;
case RenderPassEvent.BeforeRenderingPostProcessing:
case RenderPassEvent.AfterRenderingPostProcessing:
stage = CameraFrameStage.PostProcess;
return true;
case RenderPassEvent.BeforeRenderingFinalOutput:
case RenderPassEvent.AfterRenderingFinalOutput:
stage = CameraFrameStage.FinalOutput;
return true;
default:
stage = CameraFrameStage.MainScene;
return false;
}
}
private bool RecordScenePhaseInternal(
ScriptableRenderContext context,
RecordedScenePhase scenePhase)
{
return context != null &&
InternalCalls
.Rendering_ScriptableRenderContext_RecordScenePhase(
context.nativeHandle,
(int)scenePhase);
}
private bool RecordSceneInjectionPointInternal(
ScriptableRenderContext context,
RecordedSceneInjectionPoint injectionPoint)
{
return context != null &&
InternalCalls
.Rendering_ScriptableRenderContext_RecordSceneInjectionPoint(
context.nativeHandle,
(int)injectionPoint);
}
private bool RecordFullscreenPassInternal(
ScriptableRenderContext context,
RecordedFullscreenPassType passType,
string shaderPath,
string passName,
Vector4 vectorPayload)
{
return context != null &&
InternalCalls
.Rendering_ScriptableRenderContext_RecordFullscreenPass(
context.nativeHandle,
(int)passType,
shaderPath,
passName,
ref vectorPayload);
}
}
}

View File

@@ -1,199 +0,0 @@
using System.Collections.Generic;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class ScriptableRenderer
{
private readonly List<ScriptableRendererFeature> m_features =
new List<ScriptableRendererFeature>();
private readonly List<ScriptableRenderPass> m_activePassQueue =
new List<ScriptableRenderPass>();
private bool m_disposed;
protected ScriptableRenderer()
{
}
internal void ReleaseRuntimeResourcesInstance()
{
if (m_disposed)
{
return;
}
ReleaseRuntimeResources();
for (int i = 0; i < m_features.Count; ++i)
{
ScriptableRendererFeature feature = m_features[i];
if (feature != null)
{
feature.ReleaseRuntimeResourcesInstance();
}
}
m_features.Clear();
m_activePassQueue.Clear();
m_disposed = true;
}
public void EnqueuePass(
ScriptableRenderPass renderPass)
{
if (renderPass == null)
{
return;
}
int insertIndex = m_activePassQueue.Count;
while (insertIndex > 0 &&
m_activePassQueue[insertIndex - 1].renderPassEvent >
renderPass.renderPassEvent)
{
insertIndex--;
}
m_activePassQueue.Insert(
insertIndex,
renderPass);
}
protected void AddFeature(
ScriptableRendererFeature feature)
{
if (feature == null)
{
return;
}
m_features.Add(feature);
feature.CreateInstance();
}
protected virtual void AddRenderPasses(
RenderingData renderingData)
{
}
internal void AddFeatureInstance(
ScriptableRendererFeature feature)
{
AddFeature(feature);
}
internal bool SupportsRendererRecordingInstance(
RendererRecordingContext context)
{
return SupportsRendererRecording(context);
}
internal bool RecordRendererInstance(
RendererRecordingContext context)
{
return RecordRenderer(context);
}
protected virtual bool SupportsRendererRecording(
RendererRecordingContext context)
{
if (context == null)
{
return false;
}
RenderingData renderingData =
context.renderingData;
BuildPassQueue(renderingData);
for (int i = 0; i < m_activePassQueue.Count; ++i)
{
ScriptableRenderPass renderPass = m_activePassQueue[i];
if (renderPass != null &&
renderPass.SupportsStage(context.stage))
{
return true;
}
}
return false;
}
protected virtual bool RecordRenderer(
RendererRecordingContext context)
{
if (context == null ||
context.renderContext == null)
{
return false;
}
RenderingData renderingData =
context.renderingData;
BuildPassQueue(renderingData);
bool recordedAnyPass = false;
for (int i = 0; i < m_activePassQueue.Count; ++i)
{
ScriptableRenderPass renderPass = m_activePassQueue[i];
if (renderPass == null ||
!renderPass.SupportsStage(renderingData.stage))
{
continue;
}
if (!renderPass.Record(
context.renderContext,
renderingData))
{
return false;
}
recordedAnyPass = true;
}
return recordedAnyPass;
}
protected internal virtual bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return SupportsRendererRecording(
new RendererRecordingContext(stage));
}
protected internal virtual bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
return context != null &&
RecordRenderer(
new RendererRecordingContext(context));
}
private void BuildPassQueue(
RenderingData renderingData)
{
m_activePassQueue.Clear();
for (int i = 0; i < m_features.Count; ++i)
{
ScriptableRendererFeature feature = m_features[i];
if (feature == null || !feature.isActive)
{
continue;
}
feature.AddRenderPasses(
this,
renderingData);
}
AddRenderPasses(renderingData);
}
protected virtual void ReleaseRuntimeResources()
{
}
}
}

View File

@@ -1,274 +0,0 @@
using System;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class ScriptableRendererData : Object
{
private ScriptableRendererFeature[] m_rendererFeatures;
private ScriptableRenderer m_rendererInstance;
private bool m_rendererInvalidated;
private int m_runtimeStateVersion = 1;
protected ScriptableRendererData()
{
}
internal ScriptableRenderer CreateRendererInstance()
{
return GetRendererInstance();
}
internal ScriptableRenderer GetRendererInstance()
{
if (m_rendererInstance == null)
{
m_rendererInstance = CreateRenderer();
if (m_rendererInstance != null)
{
SetupRendererInstance(m_rendererInstance);
m_rendererInvalidated = false;
}
}
return m_rendererInstance;
}
internal ScriptableRendererFeature[] CreateRendererFeaturesInstance()
{
return GetRendererFeatures();
}
internal void SetupRendererInstance(
ScriptableRenderer renderer)
{
if (renderer == null)
{
return;
}
SetupRenderer(renderer);
}
internal void SetDirtyInstance()
{
SetDirty();
}
internal string GetPipelineRendererAssetKeyInstance()
{
return GetPipelineRendererAssetKey();
}
internal int GetRuntimeStateVersionInstance()
{
return m_runtimeStateVersion;
}
internal void ReleaseRuntimeResourcesInstance()
{
ReleaseRendererSetupCache();
ReleaseRuntimeResources();
m_rendererInvalidated = false;
}
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 SetupRenderer(
ScriptableRenderer renderer)
{
AddRendererFeatures(
renderer,
GetRendererFeatures());
}
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<ScriptableRendererFeature>();
}
protected virtual void ReleaseRuntimeResources()
{
}
protected bool isInvalidated
{
get
{
return m_rendererInvalidated;
}
}
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);
}
protected void SetDirty()
{
ReleaseRendererSetupCache();
m_rendererInvalidated = true;
unchecked
{
++m_runtimeStateVersion;
}
if (m_runtimeStateVersion <= 0)
{
m_runtimeStateVersion = 1;
}
}
protected void AddRendererFeature(
ScriptableRenderer renderer,
ScriptableRendererFeature rendererFeature)
{
if (renderer == null ||
rendererFeature == null)
{
return;
}
renderer.AddFeatureInstance(rendererFeature);
}
protected void AddRendererFeatures(
ScriptableRenderer renderer,
ScriptableRendererFeature[] rendererFeatures)
{
if (renderer == null ||
rendererFeatures == null)
{
return;
}
for (int i = 0; i < rendererFeatures.Length; ++i)
{
AddRendererFeature(
renderer,
rendererFeatures[i]);
}
}
private ScriptableRendererFeature[] GetRendererFeatures()
{
if (m_rendererFeatures == null)
{
m_rendererFeatures =
CreateRendererFeatures() ??
Array.Empty<ScriptableRendererFeature>();
}
return m_rendererFeatures;
}
private void ReleaseRendererSetupCache()
{
if (m_rendererInstance != null)
{
m_rendererInstance.ReleaseRuntimeResourcesInstance();
m_rendererInstance = null;
m_rendererFeatures = null;
return;
}
if (m_rendererFeatures == null)
{
return;
}
for (int i = 0; i < m_rendererFeatures.Length; ++i)
{
ScriptableRendererFeature rendererFeature =
m_rendererFeatures[i];
if (rendererFeature != null)
{
rendererFeature.ReleaseRuntimeResourcesInstance();
}
}
m_rendererFeatures = null;
}
}
}

View File

@@ -1,88 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public abstract class ScriptableRendererFeature
{
private bool m_disposed;
private bool m_runtimeCreated;
protected ScriptableRendererFeature()
{
}
public bool isActive { get; set; } = true;
internal void CreateInstance()
{
if (m_runtimeCreated)
{
return;
}
m_disposed = false;
Create();
m_runtimeCreated = true;
}
internal void ReleaseRuntimeResourcesInstance()
{
if (m_disposed)
{
return;
}
ReleaseRuntimeResources();
m_disposed = true;
m_runtimeCreated = false;
}
public virtual void Create()
{
}
public virtual void ConfigureCameraRenderRequest(
CameraRenderRequestContext context)
{
}
public virtual void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
}
public virtual void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
}
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);
}
protected virtual void ReleaseRuntimeResources()
{
}
}
}

View File

@@ -1,25 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class ShadowData
{
internal static readonly ShadowData Default =
new ShadowData(
DirectionalShadowData.Default);
internal ShadowData(
DirectionalShadowData mainDirectionalShadow)
{
this.mainDirectionalShadow =
mainDirectionalShadow ??
DirectionalShadowData.Default;
}
public DirectionalShadowData mainDirectionalShadow { get; }
public bool hasMainDirectionalShadow =>
mainDirectionalShadow.enabled;
}
}

View File

@@ -1,29 +0,0 @@
using XCEngine;
namespace XCEngine.Rendering.Universal
{
public sealed class StageColorData
{
internal static readonly StageColorData Default =
new StageColorData(
CameraFrameColorSource.ExplicitSurface,
false);
internal StageColorData(
CameraFrameColorSource source,
bool usesGraphManagedOutputColor)
{
this.source = source;
this.usesGraphManagedOutputColor =
usesGraphManagedOutputColor;
}
public CameraFrameColorSource source { get; }
public bool usesGraphManagedSourceColor =>
source != CameraFrameColorSource.ExplicitSurface;
public bool usesGraphManagedOutputColor { get; }
}
}

View File

@@ -1,15 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
internal sealed class UniversalRenderPipeline
: RendererBackedRenderPipeline
{
public UniversalRenderPipeline(
UniversalRenderPipelineAsset asset)
: base(asset)
{
}
}
}

View File

@@ -1,22 +0,0 @@
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public class UniversalRenderPipelineAsset
: RendererBackedRenderPipelineAsset
{
protected override ScriptableRenderPipeline
CreateRendererBackedPipeline()
{
return new UniversalRenderPipeline(this);
}
protected override ScriptableRendererData
CreateDefaultRendererData()
{
return new UniversalRendererData();
}
}
}

View File

@@ -1,163 +0,0 @@
using System;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
internal enum UniversalSceneRecordingKind
{
BeforeOpaqueInjection,
OpaqueScene,
AfterOpaqueInjection,
BeforeSkyboxInjection,
SkyboxScene,
AfterSkyboxInjection,
BeforeTransparentInjection,
TransparentScene,
AfterTransparentInjection
}
internal sealed class UniversalSceneRecordingPass : ScriptableRenderPass
{
private readonly UniversalSceneRecordingKind m_recordingKind;
public UniversalSceneRecordingPass(
RenderPassEvent passEvent,
UniversalSceneRecordingKind recordingKind)
{
renderPassEvent = passEvent;
m_recordingKind = recordingKind;
}
protected override bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
return context != null &&
renderingData != null &&
renderingData.isMainSceneStage &&
RecordSceneStep(context);
}
private bool RecordSceneStep(
ScriptableRenderContext context)
{
switch (m_recordingKind)
{
case UniversalSceneRecordingKind.BeforeOpaqueInjection:
return RecordBeforeOpaqueInjection(context);
case UniversalSceneRecordingKind.OpaqueScene:
return RecordOpaqueScenePhase(context);
case UniversalSceneRecordingKind.AfterOpaqueInjection:
return RecordAfterOpaqueInjection(context);
case UniversalSceneRecordingKind.BeforeSkyboxInjection:
return RecordBeforeSkyboxInjection(context);
case UniversalSceneRecordingKind.SkyboxScene:
return RecordSkyboxScenePhase(context);
case UniversalSceneRecordingKind.AfterSkyboxInjection:
return RecordAfterSkyboxInjection(context);
case UniversalSceneRecordingKind.BeforeTransparentInjection:
return RecordBeforeTransparentInjection(context);
case UniversalSceneRecordingKind.TransparentScene:
return RecordTransparentScenePhase(context);
case UniversalSceneRecordingKind.AfterTransparentInjection:
return RecordAfterTransparentInjection(context);
default:
return false;
}
}
}
internal sealed class UniversalSceneFeature : ScriptableRendererFeature
{
private readonly UniversalRendererData m_rendererData;
private readonly UniversalSceneRecordingPass m_beforeOpaquePass =
new UniversalSceneRecordingPass(
RenderPassEvent.BeforeRenderingOpaques,
UniversalSceneRecordingKind.BeforeOpaqueInjection);
private readonly UniversalSceneRecordingPass m_opaquePass =
new UniversalSceneRecordingPass(
RenderPassEvent.RenderOpaques,
UniversalSceneRecordingKind.OpaqueScene);
private readonly UniversalSceneRecordingPass m_afterOpaquePass =
new UniversalSceneRecordingPass(
RenderPassEvent.AfterRenderingOpaques,
UniversalSceneRecordingKind.AfterOpaqueInjection);
private readonly UniversalSceneRecordingPass m_beforeSkyboxPass =
new UniversalSceneRecordingPass(
RenderPassEvent.BeforeRenderingSkybox,
UniversalSceneRecordingKind.BeforeSkyboxInjection);
private readonly UniversalSceneRecordingPass m_skyboxPass =
new UniversalSceneRecordingPass(
RenderPassEvent.RenderSkybox,
UniversalSceneRecordingKind.SkyboxScene);
private readonly UniversalSceneRecordingPass m_afterSkyboxPass =
new UniversalSceneRecordingPass(
RenderPassEvent.AfterRenderingSkybox,
UniversalSceneRecordingKind.AfterSkyboxInjection);
private readonly UniversalSceneRecordingPass m_beforeTransparentPass =
new UniversalSceneRecordingPass(
RenderPassEvent.BeforeRenderingTransparents,
UniversalSceneRecordingKind.BeforeTransparentInjection);
private readonly UniversalSceneRecordingPass m_transparentPass =
new UniversalSceneRecordingPass(
RenderPassEvent.RenderTransparents,
UniversalSceneRecordingKind.TransparentScene);
private readonly UniversalSceneRecordingPass m_afterTransparentPass =
new UniversalSceneRecordingPass(
RenderPassEvent.AfterRenderingTransparents,
UniversalSceneRecordingKind.AfterTransparentInjection);
public UniversalSceneFeature(
UniversalRendererData rendererData)
{
m_rendererData = rendererData;
}
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
if (renderer == null ||
renderingData == null ||
!renderingData.isMainSceneStage ||
m_rendererData == null)
{
return;
}
if (m_rendererData.renderOpaque)
{
renderer.EnqueuePass(m_beforeOpaquePass);
renderer.EnqueuePass(m_opaquePass);
renderer.EnqueuePass(m_afterOpaquePass);
}
if (m_rendererData.renderSkybox)
{
renderer.EnqueuePass(m_beforeSkyboxPass);
renderer.EnqueuePass(m_skyboxPass);
renderer.EnqueuePass(m_afterSkyboxPass);
}
if (m_rendererData.renderTransparent)
{
renderer.EnqueuePass(m_beforeTransparentPass);
renderer.EnqueuePass(m_transparentPass);
renderer.EnqueuePass(m_afterTransparentPass);
}
}
}
public sealed class UniversalRenderer : ScriptableRenderer
{
public UniversalRenderer(
UniversalRendererData rendererData)
{
UniversalRendererData resolvedData =
rendererData ?? new UniversalRendererData();
AddFeature(new UniversalSceneFeature(resolvedData));
}
}
}

View File

@@ -1,32 +0,0 @@
using System;
using XCEngine;
using XCEngine.Rendering;
namespace XCEngine.Rendering.Universal
{
public class UniversalRendererData : ScriptableRendererData
{
public bool renderOpaque = true;
public bool renderSkybox = true;
public bool renderTransparent = true;
public ScriptableRendererFeature[] rendererFeatures =
Array.Empty<ScriptableRendererFeature>();
protected override ScriptableRenderer CreateRenderer()
{
return new UniversalRenderer(this);
}
protected override ScriptableRendererFeature[] CreateRendererFeatures()
{
return rendererFeatures ??
Array.Empty<ScriptableRendererFeature>();
}
protected override string GetPipelineRendererAssetKey()
{
return "BuiltinForward";
}
}
}