227 lines
7.6 KiB
C#
227 lines
7.6 KiB
C#
using XCEngine;
|
|
|
|
namespace XCEngine.Rendering
|
|
{
|
|
// SRP v1 managed recording surface. Scene draws still delegate to the
|
|
// native SceneDrawBackend; RenderGraph raster authoring can record scene
|
|
// and fullscreen stages through the Unity-style managed surface.
|
|
public sealed class ScriptableRenderContext
|
|
{
|
|
private readonly ulong m_nativeHandle;
|
|
|
|
internal ScriptableRenderContext(ulong nativeHandle)
|
|
{
|
|
m_nativeHandle = nativeHandle;
|
|
}
|
|
|
|
internal CameraFrameStage stage =>
|
|
(CameraFrameStage)InternalCalls.Rendering_ScriptableRenderContext_GetStage(
|
|
m_nativeHandle);
|
|
|
|
internal int rendererIndex =>
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_GetRendererIndex(
|
|
m_nativeHandle);
|
|
|
|
internal ulong framePlanId =>
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_GetFramePlanId(
|
|
m_nativeHandle);
|
|
|
|
internal string passName =>
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_GetPassName(
|
|
m_nativeHandle) ?? string.Empty;
|
|
|
|
internal RenderGraphTextureHandle sourceColorTexture =>
|
|
RenderGraphTextureHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
|
|
m_nativeHandle));
|
|
|
|
internal RenderGraphTextureHandle primaryColorTarget =>
|
|
RenderGraphTextureHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle(
|
|
m_nativeHandle));
|
|
|
|
internal RenderGraphTextureHandle depthTarget =>
|
|
RenderGraphTextureHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_GetDepthTargetHandle(
|
|
m_nativeHandle));
|
|
|
|
internal bool RecordScene()
|
|
{
|
|
return DrawOpaqueRenderers() &&
|
|
DrawSkybox() &&
|
|
DrawTransparentRenderers();
|
|
}
|
|
|
|
internal bool RecordScenePhase(
|
|
SceneRenderPhase scenePhase)
|
|
{
|
|
return InternalCalls
|
|
.Rendering_ScriptableRenderContext_RecordScenePhase(
|
|
m_nativeHandle,
|
|
(int)scenePhase);
|
|
}
|
|
|
|
public bool DrawRenderers(
|
|
RendererListType rendererListType)
|
|
{
|
|
return DrawRenderers(
|
|
rendererListType,
|
|
DrawingSettings.CreateDefault());
|
|
}
|
|
|
|
public bool DrawRenderers(
|
|
RendererListType rendererListType,
|
|
DrawingSettings drawingSettings)
|
|
{
|
|
return DrawRenderers(
|
|
RendererListDesc.CreateDefault(
|
|
rendererListType),
|
|
drawingSettings);
|
|
}
|
|
|
|
public bool DrawRenderers(
|
|
RendererListDesc rendererListDesc)
|
|
{
|
|
return DrawRenderers(
|
|
rendererListDesc,
|
|
DrawingSettings.CreateDefault());
|
|
}
|
|
|
|
public bool DrawRenderers(
|
|
RendererListDesc rendererListDesc,
|
|
DrawingSettings drawingSettings)
|
|
{
|
|
return DrawRenderers(
|
|
ResolveSceneRenderPhase(rendererListDesc),
|
|
rendererListDesc,
|
|
drawingSettings);
|
|
}
|
|
|
|
internal bool DrawRenderers(
|
|
SceneRenderPhase scenePhase,
|
|
RendererListDesc rendererListDesc,
|
|
DrawingSettings drawingSettings)
|
|
{
|
|
RenderStateBlock renderStateBlock =
|
|
drawingSettings.renderStateBlock;
|
|
return InternalCalls
|
|
.Rendering_ScriptableRenderContext_DrawRenderersByDesc(
|
|
m_nativeHandle,
|
|
(int)scenePhase,
|
|
ref rendererListDesc,
|
|
drawingSettings.overrideMaterialPath ??
|
|
string.Empty,
|
|
drawingSettings.shaderPassName ??
|
|
string.Empty,
|
|
ref renderStateBlock);
|
|
}
|
|
|
|
public bool DrawSkybox()
|
|
{
|
|
return RecordScenePhase(
|
|
SceneRenderPhase.Skybox);
|
|
}
|
|
|
|
public bool DrawOpaqueRenderers()
|
|
{
|
|
return DrawRenderers(
|
|
RendererListDesc.CreateDefault(
|
|
RendererListType.Opaque));
|
|
}
|
|
|
|
public bool DrawTransparentRenderers()
|
|
{
|
|
return DrawRenderers(
|
|
RendererListDesc.CreateDefault(
|
|
RendererListType.Transparent));
|
|
}
|
|
|
|
internal RenderGraphTextureHandle CreateTransientTexture(
|
|
string name,
|
|
RenderGraphTextureDesc desc)
|
|
{
|
|
return RenderGraphTextureHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_CreateTransientTexture(
|
|
m_nativeHandle,
|
|
name,
|
|
ref desc));
|
|
}
|
|
|
|
internal RenderGraphTextureHandle
|
|
CreateFullscreenTransientColorTexture(
|
|
string name)
|
|
{
|
|
return RenderGraphTextureHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_CreateFullscreenTransientColorTexture(
|
|
m_nativeHandle,
|
|
name));
|
|
}
|
|
|
|
internal RenderGraphTextureHandle
|
|
CreateFullscreenTransientDepthTexture(
|
|
string name)
|
|
{
|
|
return RenderGraphTextureHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_CreateFullscreenTransientDepthTexture(
|
|
m_nativeHandle,
|
|
name));
|
|
}
|
|
|
|
internal RendererListHandle CreateRendererList(
|
|
RendererListDesc rendererListDesc,
|
|
DrawingSettings drawingSettings)
|
|
{
|
|
RenderStateBlock renderStateBlock =
|
|
drawingSettings.renderStateBlock;
|
|
return RendererListHandle.FromNativeIndex(
|
|
InternalCalls
|
|
.Rendering_ScriptableRenderContext_CreateRendererList(
|
|
m_nativeHandle,
|
|
ref rendererListDesc,
|
|
drawingSettings.overrideMaterialPath ??
|
|
string.Empty,
|
|
drawingSettings.shaderPassName ?? string.Empty,
|
|
ref renderStateBlock));
|
|
}
|
|
|
|
// Internal backing entry point for public RenderGraph raster authoring.
|
|
// Built-in fullscreen kernels are URP implementation details, not
|
|
// public context shortcuts.
|
|
internal RenderGraphRasterPassBuilder AddRasterPass(
|
|
string passName)
|
|
{
|
|
return new RenderGraphRasterPassBuilder(
|
|
this,
|
|
passName);
|
|
}
|
|
|
|
internal ulong nativeHandle =>
|
|
m_nativeHandle;
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|