2026-04-19 02:38:48 +08:00
|
|
|
using XCEngine;
|
2026-04-18 13:51:09 +08:00
|
|
|
|
2026-04-19 02:38:48 +08:00
|
|
|
namespace XCEngine.Rendering
|
2026-04-17 21:53:52 +08:00
|
|
|
{
|
2026-04-26 17:14:32 +08:00
|
|
|
// SRP v1 managed recording surface. Scene draws still delegate to the
|
2026-04-26 02:12:06 +08:00
|
|
|
// native SceneDrawBackend, and raster-pass recording is limited to the
|
|
|
|
|
// fullscreen PostProcess / FinalOutput stages.
|
2026-04-17 21:53:52 +08:00
|
|
|
public sealed class ScriptableRenderContext
|
|
|
|
|
{
|
|
|
|
|
private readonly ulong m_nativeHandle;
|
|
|
|
|
|
|
|
|
|
internal ScriptableRenderContext(ulong nativeHandle)
|
|
|
|
|
{
|
|
|
|
|
m_nativeHandle = nativeHandle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public CameraFrameStage stage =>
|
|
|
|
|
(CameraFrameStage)InternalCalls.Rendering_ScriptableRenderContext_GetStage(
|
|
|
|
|
m_nativeHandle);
|
|
|
|
|
|
2026-04-21 00:53:35 +08:00
|
|
|
public int rendererIndex =>
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_GetRendererIndex(
|
|
|
|
|
m_nativeHandle);
|
|
|
|
|
|
2026-04-27 15:21:57 +08:00
|
|
|
public ulong framePlanId =>
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_GetFramePlanId(
|
|
|
|
|
m_nativeHandle);
|
|
|
|
|
|
2026-04-20 18:54:04 +08:00
|
|
|
public RenderGraphTextureHandle sourceColorTexture =>
|
|
|
|
|
RenderGraphTextureHandle.FromNativeIndex(
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
|
|
|
|
|
m_nativeHandle));
|
|
|
|
|
|
|
|
|
|
public RenderGraphTextureHandle primaryColorTarget =>
|
|
|
|
|
RenderGraphTextureHandle.FromNativeIndex(
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle(
|
|
|
|
|
m_nativeHandle));
|
|
|
|
|
|
|
|
|
|
public RenderGraphTextureHandle depthTarget =>
|
|
|
|
|
RenderGraphTextureHandle.FromNativeIndex(
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_GetDepthTargetHandle(
|
|
|
|
|
m_nativeHandle));
|
|
|
|
|
|
2026-04-26 17:14:32 +08:00
|
|
|
internal bool RecordScene()
|
2026-04-20 18:54:04 +08:00
|
|
|
{
|
2026-04-26 17:14:32 +08:00
|
|
|
return DrawOpaqueRenderers() &&
|
2026-04-20 23:02:49 +08:00
|
|
|
DrawSkybox() &&
|
2026-04-26 17:14:32 +08:00
|
|
|
DrawTransparentRenderers();
|
2026-04-20 18:54:04 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-26 17:14:32 +08:00
|
|
|
internal bool RecordScenePhase(
|
2026-04-20 18:54:04 +08:00
|
|
|
SceneRenderPhase scenePhase)
|
|
|
|
|
{
|
|
|
|
|
return InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_RecordScenePhase(
|
|
|
|
|
m_nativeHandle,
|
|
|
|
|
(int)scenePhase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DrawRenderers(
|
|
|
|
|
RendererListType rendererListType)
|
2026-04-20 22:46:19 +08:00
|
|
|
{
|
|
|
|
|
return DrawRenderers(
|
|
|
|
|
rendererListType,
|
|
|
|
|
DrawingSettings.CreateDefault());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DrawRenderers(
|
|
|
|
|
RendererListType rendererListType,
|
|
|
|
|
DrawingSettings drawingSettings)
|
2026-04-20 22:05:38 +08:00
|
|
|
{
|
|
|
|
|
return DrawRenderers(
|
|
|
|
|
RendererListDesc.CreateDefault(
|
2026-04-20 22:46:19 +08:00
|
|
|
rendererListType),
|
|
|
|
|
drawingSettings);
|
2026-04-20 22:05:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DrawRenderers(
|
|
|
|
|
RendererListDesc rendererListDesc)
|
2026-04-20 22:46:19 +08:00
|
|
|
{
|
|
|
|
|
return DrawRenderers(
|
|
|
|
|
rendererListDesc,
|
|
|
|
|
DrawingSettings.CreateDefault());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DrawRenderers(
|
2026-04-27 01:33:25 +08:00
|
|
|
RendererListDesc rendererListDesc,
|
|
|
|
|
DrawingSettings drawingSettings)
|
|
|
|
|
{
|
|
|
|
|
return DrawRenderers(
|
|
|
|
|
ResolveSceneRenderPhase(rendererListDesc),
|
|
|
|
|
rendererListDesc,
|
|
|
|
|
drawingSettings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal bool DrawRenderers(
|
2026-04-20 22:46:19 +08:00
|
|
|
SceneRenderPhase scenePhase,
|
|
|
|
|
RendererListDesc rendererListDesc,
|
|
|
|
|
DrawingSettings drawingSettings)
|
2026-04-20 18:54:04 +08:00
|
|
|
{
|
2026-04-20 23:21:04 +08:00
|
|
|
RenderStateBlock renderStateBlock =
|
|
|
|
|
drawingSettings.renderStateBlock;
|
2026-04-20 18:54:04 +08:00
|
|
|
return InternalCalls
|
2026-04-20 22:05:38 +08:00
|
|
|
.Rendering_ScriptableRenderContext_DrawRenderersByDesc(
|
2026-04-20 18:54:04 +08:00
|
|
|
m_nativeHandle,
|
|
|
|
|
(int)scenePhase,
|
2026-04-20 22:46:19 +08:00
|
|
|
ref rendererListDesc,
|
|
|
|
|
drawingSettings.overrideMaterialPath ??
|
2026-04-20 22:58:08 +08:00
|
|
|
string.Empty,
|
|
|
|
|
drawingSettings.shaderPassName ??
|
2026-04-20 23:21:04 +08:00
|
|
|
string.Empty,
|
|
|
|
|
ref renderStateBlock);
|
2026-04-20 18:54:04 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-20 23:02:49 +08:00
|
|
|
public bool DrawSkybox()
|
|
|
|
|
{
|
|
|
|
|
return RecordScenePhase(
|
|
|
|
|
SceneRenderPhase.Skybox);
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-20 18:54:04 +08:00
|
|
|
public bool DrawOpaqueRenderers()
|
|
|
|
|
{
|
|
|
|
|
return DrawRenderers(
|
2026-04-20 22:05:38 +08:00
|
|
|
RendererListDesc.CreateDefault(
|
|
|
|
|
RendererListType.Opaque));
|
2026-04-20 18:54:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DrawTransparentRenderers()
|
|
|
|
|
{
|
|
|
|
|
return DrawRenderers(
|
2026-04-20 22:05:38 +08:00
|
|
|
RendererListDesc.CreateDefault(
|
|
|
|
|
RendererListType.Transparent));
|
2026-04-20 18:54:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public RenderGraphTextureHandle CreateTransientTexture(
|
|
|
|
|
string name,
|
|
|
|
|
RenderGraphTextureDesc desc)
|
|
|
|
|
{
|
|
|
|
|
return RenderGraphTextureHandle.FromNativeIndex(
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_CreateTransientTexture(
|
|
|
|
|
m_nativeHandle,
|
|
|
|
|
name,
|
|
|
|
|
ref desc));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public RenderGraphTextureHandle
|
|
|
|
|
CreateFullscreenTransientColorTexture(
|
|
|
|
|
string name)
|
|
|
|
|
{
|
|
|
|
|
return RenderGraphTextureHandle.FromNativeIndex(
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_CreateFullscreenTransientColorTexture(
|
|
|
|
|
m_nativeHandle,
|
|
|
|
|
name));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public RenderGraphTextureHandle
|
|
|
|
|
CreateFullscreenTransientDepthTexture(
|
|
|
|
|
string name)
|
|
|
|
|
{
|
|
|
|
|
return RenderGraphTextureHandle.FromNativeIndex(
|
|
|
|
|
InternalCalls
|
|
|
|
|
.Rendering_ScriptableRenderContext_CreateFullscreenTransientDepthTexture(
|
|
|
|
|
m_nativeHandle,
|
|
|
|
|
name));
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-26 23:32:09 +08:00
|
|
|
// Public RenderGraph raster authoring entry point. Built-in fullscreen
|
|
|
|
|
// kernels are internal URP implementation details, not public context
|
|
|
|
|
// shortcuts.
|
2026-04-20 18:54:04 +08:00
|
|
|
public RenderGraphRasterPassBuilder AddRasterPass(
|
|
|
|
|
string passName)
|
|
|
|
|
{
|
|
|
|
|
return new RenderGraphRasterPassBuilder(
|
|
|
|
|
this,
|
|
|
|
|
passName);
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-19 14:19:57 +08:00
|
|
|
internal ulong nativeHandle =>
|
|
|
|
|
m_nativeHandle;
|
2026-04-27 01:33:25 +08:00
|
|
|
|
|
|
|
|
private static SceneRenderPhase ResolveSceneRenderPhase(
|
|
|
|
|
RendererListDesc rendererListDesc)
|
|
|
|
|
{
|
|
|
|
|
switch (rendererListDesc.type)
|
|
|
|
|
{
|
|
|
|
|
case RendererListType.Transparent:
|
|
|
|
|
return SceneRenderPhase.Transparent;
|
|
|
|
|
case RendererListType.Opaque:
|
|
|
|
|
case RendererListType.ShadowCaster:
|
|
|
|
|
case RendererListType.AllVisible:
|
|
|
|
|
default:
|
|
|
|
|
return SceneRenderPhase.Opaque;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-17 21:53:52 +08:00
|
|
|
}
|
|
|
|
|
}
|
2026-04-19 02:38:48 +08:00
|
|
|
|