refactor(srp): finalize universal package split and data-drive default scene passes
This commit is contained in:
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
using XCEngine;
|
||||
|
||||
namespace XCEngine.Rendering.Universal
|
||||
{
|
||||
public enum RenderEnvironmentMode
|
||||
{
|
||||
None = 0,
|
||||
ProceduralSkybox = 1,
|
||||
MaterialSkybox = 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
using XCEngine;
|
||||
using XCEngine.Rendering;
|
||||
|
||||
namespace XCEngine.Rendering.Universal
|
||||
{
|
||||
internal sealed class UniversalRenderPipeline
|
||||
: RendererBackedRenderPipeline
|
||||
{
|
||||
public UniversalRenderPipeline(
|
||||
UniversalRenderPipelineAsset asset)
|
||||
: base(asset)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user