Align SRP boundaries and editor windowing

This commit is contained in:
2026-04-26 17:14:32 +08:00
parent a8256b05cd
commit b8599a8aff
38 changed files with 696 additions and 650 deletions

View File

@@ -134,16 +134,6 @@ namespace Gameplay
}
}
internal enum SceneInjectionKind
{
BeforeOpaque,
AfterOpaque,
BeforeSkybox,
AfterSkybox,
BeforeTransparent,
AfterTransparent
}
internal enum ScenePhaseKind
{
Opaque,
@@ -157,51 +147,6 @@ namespace Gameplay
ShaderVector
}
internal sealed class SceneInjectionPass : ScriptableRenderPass
{
private readonly SceneInjectionKind m_injectionKind;
public SceneInjectionPass(
RenderPassEvent passEvent,
SceneInjectionKind injectionKind)
{
renderPassEvent = passEvent;
m_injectionKind = injectionKind;
}
protected override bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
return context != null &&
renderingData != null &&
renderingData.isMainSceneStage &&
RecordInjection(context);
}
private bool RecordInjection(
ScriptableRenderContext context)
{
switch (m_injectionKind)
{
case SceneInjectionKind.BeforeOpaque:
return context.RecordBeforeOpaqueInjection();
case SceneInjectionKind.AfterOpaque:
return context.RecordAfterOpaqueInjection();
case SceneInjectionKind.BeforeSkybox:
return context.RecordBeforeSkyboxInjection();
case SceneInjectionKind.AfterSkybox:
return context.RecordAfterSkyboxInjection();
case SceneInjectionKind.BeforeTransparent:
return context.RecordBeforeTransparentInjection();
case SceneInjectionKind.AfterTransparent:
return context.RecordAfterTransparentInjection();
default:
return false;
}
}
}
internal sealed class ScenePhasePass : ScriptableRenderPass
{
private readonly ScenePhaseKind m_phaseKind;
@@ -239,11 +184,11 @@ namespace Gameplay
switch (m_phaseKind)
{
case ScenePhaseKind.Opaque:
return context.RecordOpaqueScenePhase();
return context.DrawOpaqueRenderers();
case ScenePhaseKind.Skybox:
return context.RecordSkyboxScenePhase();
return context.DrawSkybox();
case ScenePhaseKind.Transparent:
return context.RecordTransparentScenePhase();
return context.DrawTransparentRenderers();
default:
return false;
}
@@ -368,56 +313,26 @@ namespace Gameplay
internal sealed class DefaultSceneFeature : ScriptableRendererFeature
{
private readonly SceneInjectionPass m_beforeOpaquePass;
private readonly ScenePhasePass m_opaquePass;
private readonly SceneInjectionPass m_afterOpaquePass;
private readonly SceneInjectionPass m_beforeSkyboxPass;
private readonly ScenePhasePass m_skyboxPass;
private readonly SceneInjectionPass m_afterSkyboxPass;
private readonly SceneInjectionPass m_beforeTransparentPass;
private readonly ScenePhasePass m_transparentPass;
private readonly SceneInjectionPass m_afterTransparentPass;
public DefaultSceneFeature(
Action onOpaqueRecorded = null)
{
m_beforeOpaquePass =
new SceneInjectionPass(
RenderPassEvent.BeforeRenderingOpaques,
SceneInjectionKind.BeforeOpaque);
m_opaquePass =
new ScenePhasePass(
RenderPassEvent.RenderOpaques,
ScenePhaseKind.Opaque,
onOpaqueRecorded);
m_afterOpaquePass =
new SceneInjectionPass(
RenderPassEvent.AfterRenderingOpaques,
SceneInjectionKind.AfterOpaque);
m_beforeSkyboxPass =
new SceneInjectionPass(
RenderPassEvent.BeforeRenderingSkybox,
SceneInjectionKind.BeforeSkybox);
m_skyboxPass =
new ScenePhasePass(
RenderPassEvent.RenderSkybox,
ScenePhaseKind.Skybox);
m_afterSkyboxPass =
new SceneInjectionPass(
RenderPassEvent.AfterRenderingSkybox,
SceneInjectionKind.AfterSkybox);
m_beforeTransparentPass =
new SceneInjectionPass(
RenderPassEvent.BeforeRenderingTransparents,
SceneInjectionKind.BeforeTransparent);
m_transparentPass =
new ScenePhasePass(
RenderPassEvent.RenderTransparents,
ScenePhaseKind.Transparent);
m_afterTransparentPass =
new SceneInjectionPass(
RenderPassEvent.AfterRenderingTransparents,
SceneInjectionKind.AfterTransparent);
}
public override void AddRenderPasses(
@@ -431,15 +346,60 @@ namespace Gameplay
return;
}
renderer.EnqueuePass(m_beforeOpaquePass);
renderer.EnqueuePass(m_opaquePass);
renderer.EnqueuePass(m_afterOpaquePass);
renderer.EnqueuePass(m_beforeSkyboxPass);
renderer.EnqueuePass(m_skyboxPass);
renderer.EnqueuePass(m_afterSkyboxPass);
renderer.EnqueuePass(m_beforeTransparentPass);
renderer.EnqueuePass(m_transparentPass);
renderer.EnqueuePass(m_afterTransparentPass);
}
}
internal sealed class DefaultShadowCasterFeature
: ScriptableRendererFeature
{
private readonly DrawObjectsPass m_shadowCasterPass =
new DrawObjectsPass(
RenderPassEvent.BeforeRenderingShadows,
SceneRenderPhase.Opaque,
RendererListDesc.CreateDefault(
RendererListType.ShadowCaster));
public override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
if (context != null)
{
context.RequestShadowCasterStage();
}
}
public override void ConfigureDirectionalShadowExecutionState(
DirectionalShadowExecutionContext context)
{
if (context == null)
{
return;
}
if (context.hasPlannedMainDirectionalShadow)
{
context.UseDefaultMainDirectionalShadowExecution();
return;
}
context.ClearDirectionalShadowExecution();
}
public override void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)
{
if (renderer == null ||
renderingData == null ||
!renderingData.isShadowCasterStage)
{
return;
}
renderer.EnqueuePass(m_shadowCasterPass);
}
}
@@ -570,6 +530,7 @@ namespace Gameplay
Vector4 firstVectorPayload,
Vector4 secondVectorPayload)
{
AddFeature(new DefaultSceneFeature());
AddFeature(
new FullscreenFeature(
new FullscreenPass(
@@ -1076,7 +1037,9 @@ namespace Gameplay
finalColorData.requiresProcessing;
}
RecordCallCount++;
return context.RecordScene();
return context.DrawOpaqueRenderers() &&
context.DrawSkybox() &&
context.DrawTransparentRenderers();
}
}
@@ -1106,6 +1069,7 @@ namespace Gameplay
{
public CameraDataObservationRenderer()
{
AddFeature(new DefaultShadowCasterFeature());
AddFeature(new CameraDataObservationFeature());
}
}
@@ -1765,6 +1729,8 @@ namespace Gameplay
{
public static int CreatePipelineCallCount;
public Vector4 postProcessScale = new Vector4(1.03f, 0.98f, 0.94f, 1.0f);
private ManagedUniversalRenderPipelineProbeRendererData
m_rendererData;
public ManagedUniversalRenderPipelineProbeAsset()
{
@@ -1774,20 +1740,35 @@ namespace Gameplay
protected override ScriptableRenderPipeline CreatePipeline()
{
CreatePipelineCallCount++;
rendererDataList = CreateRendererDataList();
ApplyPostProcessScale();
return base.CreatePipeline();
}
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
ApplyPostProcessScale();
base.ConfigureCameraFramePlan(context);
}
private ScriptableRendererData[] CreateRendererDataList()
{
ManagedUniversalRenderPipelineProbeRendererData rendererData =
m_rendererData =
ProbeScriptableObjectFactory
.Create<ManagedUniversalRenderPipelineProbeRendererData>();
rendererData.postProcessScale =
postProcessScale;
ApplyPostProcessScale();
return ProbeScriptableObjectFactory
.CreateRendererDataList(
rendererData);
m_rendererData);
}
private void ApplyPostProcessScale()
{
if (m_rendererData != null)
{
m_rendererData.postProcessScale =
postProcessScale;
}
}
}

View File

@@ -109,6 +109,54 @@ namespace Gameplay
public bool HasRenderPassEventUnityNumericOrder;
public bool HasRenderPassEventEngineExtensionOrder;
private static bool HasMethod(
System.Type type,
string name,
BindingFlags flags)
{
if (type == null)
{
return false;
}
MethodInfo[] methods = type.GetMethods(flags);
for (int i = 0; i < methods.Length; ++i)
{
MethodInfo method = methods[i];
if (method != null &&
method.Name == name)
{
return true;
}
}
return false;
}
private static bool HasProperty(
System.Type type,
string name,
BindingFlags flags)
{
if (type == null)
{
return false;
}
PropertyInfo[] properties = type.GetProperties(flags);
for (int i = 0; i < properties.Length; ++i)
{
PropertyInfo property = properties[i];
if (property != null &&
property.Name == name)
{
return true;
}
}
return false;
}
public void Start()
{
const BindingFlags PublicInstanceMethodFlags =
@@ -334,38 +382,38 @@ namespace Gameplay
HasScriptableObjectType =
scriptableObjectType != null;
HasScriptableObjectCreateInstance =
scriptableObjectType != null &&
scriptableObjectType.GetMethod(
HasMethod(
scriptableObjectType,
"CreateInstance",
BindingFlags.Static |
BindingFlags.Public) != null;
BindingFlags.Public);
HasRenderPipelineAssetScriptableObjectBase =
scriptableObjectType != null &&
pipelineAssetType.BaseType == scriptableObjectType;
HasPlanningContextType =
contextType.Assembly.GetType(
"XCEngine.Rendering.ScriptableRenderPipelinePlanningContext") != null;
typeof(ScriptableRenderPipelinePlanningContext) != null;
HasRendererFeatureConfigureCameraFramePlan =
rendererFeatureType.GetMethod(
HasMethod(
rendererFeatureType,
"ConfigureCameraFramePlan",
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic) != null;
BindingFlags.NonPublic);
HasRendererRecordingContextType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererRecordingContext, XCEngine.RenderPipelines.Universal") != null;
universalAssembly.GetType(
"XCEngine.Rendering.Universal.RendererRecordingContext") != null;
HasRendererCameraRequestContextType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererCameraRequestContext, XCEngine.RenderPipelines.Universal") != null;
universalAssembly.GetType(
"XCEngine.Rendering.Universal.RendererCameraRequestContext") != null;
HasRendererBackedRenderPipelineAssetType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererBackedRenderPipelineAsset, XCEngine.RenderPipelines.Universal") != null;
universalAssembly.GetType(
"XCEngine.Rendering.Universal.RendererBackedRenderPipelineAsset") != null;
HasRendererBackedRenderPipelineType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererBackedRenderPipeline, XCEngine.RenderPipelines.Universal") != null;
universalAssembly.GetType(
"XCEngine.Rendering.Universal.RendererBackedRenderPipeline") != null;
HasRendererDrivenRenderPipelineType =
System.Type.GetType(
"XCEngine.Rendering.Universal.RendererDrivenRenderPipeline, XCEngine.RenderPipelines.Universal") != null;
universalAssembly.GetType(
"XCEngine.Rendering.Universal.RendererDrivenRenderPipeline") != null;
HasRendererDataScriptableObjectBase =
scriptableObjectType != null &&
rendererDataType.BaseType == scriptableObjectType;
@@ -373,31 +421,36 @@ namespace Gameplay
scriptableObjectType != null &&
rendererFeatureType.BaseType == scriptableObjectType;
HasRendererDataSetupRenderer =
rendererDataType.GetMethod(
HasMethod(
rendererDataType,
"SetupRenderer",
BindingFlags.Instance |
BindingFlags.NonPublic) != null;
BindingFlags.NonPublic);
HasRendererDataSetDirty =
rendererDataType.GetMethod(
HasMethod(
rendererDataType,
"SetDirty",
BindingFlags.Instance |
BindingFlags.NonPublic) != null;
BindingFlags.NonPublic);
HasRendererDataIsInvalidated =
rendererDataType.GetProperty(
HasProperty(
rendererDataType,
"isInvalidated",
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public) != null;
BindingFlags.Public);
HasRendererSupportsRendererRecording =
rendererType.GetMethod(
HasMethod(
rendererType,
"SupportsRendererRecording",
BindingFlags.Instance |
BindingFlags.NonPublic) != null;
BindingFlags.NonPublic);
HasRendererRecordRenderer =
rendererType.GetMethod(
HasMethod(
rendererType,
"RecordRenderer",
BindingFlags.Instance |
BindingFlags.NonPublic) != null;
BindingFlags.NonPublic);
HasPublicRendererSupportsStageRenderGraph =
rendererType.GetMethod(
"SupportsStageRenderGraph",