refactor(srp): split universal managed pipeline assembly

This commit is contained in:
2026-04-19 05:03:56 +08:00
parent f45b34a03a
commit 5fa209ab5d
15 changed files with 231 additions and 44 deletions

View File

@@ -49,17 +49,34 @@ void Application::InitializeScriptingRuntime(const std::string& projectPath) {
settings.assemblyDirectory = assemblyDirectory;
settings.corlibDirectory = assemblyDirectory;
settings.coreAssemblyPath = assemblyDirectory / L"XCEngine.ScriptCore.dll";
settings.engineAssemblies.push_back(
::XCEngine::Scripting::MonoScriptRuntime::ManagedAssemblyDescriptor{
"XCEngine.RenderPipelines.Universal",
assemblyDirectory / L"XCEngine.RenderPipelines.Universal.dll"});
settings.appAssemblyPath = assemblyDirectory / L"GameScripts.dll";
std::error_code ec;
const bool hasCoreAssembly = fs::exists(settings.coreAssemblyPath, ec);
ec.clear();
bool hasEngineAssemblies = true;
for (const auto& assembly : settings.engineAssemblies) {
const bool hasAssembly = fs::exists(assembly.path, ec);
ec.clear();
hasEngineAssemblies = hasEngineAssemblies && hasAssembly;
}
const bool hasAppAssembly = fs::exists(settings.appAssemblyPath, ec);
ec.clear();
const bool hasCorlibAssembly = fs::exists(assemblyDirectory / L"mscorlib.dll", ec);
m_scriptRuntimeStatus.assembliesFound = hasCoreAssembly && hasAppAssembly && hasCorlibAssembly;
m_scriptRuntimeStatus.assembliesFound =
hasCoreAssembly &&
hasEngineAssemblies &&
hasAppAssembly &&
hasCorlibAssembly;
if (!hasCoreAssembly || !hasAppAssembly || !hasCorlibAssembly) {
if (!hasCoreAssembly ||
!hasEngineAssemblies ||
!hasAppAssembly ||
!hasCorlibAssembly) {
m_scriptRuntimeStatus.statusMessage =
"Script assemblies were not found in " + Platform::WideToUtf8(assemblyDirectory.wstring()) +
". Script class discovery is disabled until the managed assemblies are built.";

View File

@@ -250,6 +250,8 @@ EditorScriptAssemblyBuildResult EditorScriptAssemblyBuilder::RebuildProjectAssem
const fs::path outputDirectory = projectRoot / "Library" / "ScriptAssemblies";
const fs::path generatedDirectory = outputDirectory / "Generated";
const fs::path scriptCoreOutputPath = outputDirectory / "XCEngine.ScriptCore.dll";
const fs::path renderPipelinesUniversalOutputPath =
outputDirectory / "XCEngine.RenderPipelines.Universal.dll";
const fs::path gameScriptsOutputPath = outputDirectory / "GameScripts.dll";
const fs::path corlibOutputPath = outputDirectory / "mscorlib.dll";
const fs::path monoCorlibSourcePath = monoRoot / "binary" / "mscorlib.dll";
@@ -306,11 +308,33 @@ EditorScriptAssemblyBuildResult EditorScriptAssemblyBuilder::RebuildProjectAssem
return BuildFailure("Mono corlib was not found: " + ScriptBuilderPathToUtf8(monoCorlibSourcePath));
}
std::vector<fs::path> scriptCoreSources = CollectCSharpSourceFiles(scriptCoreSourceRoot);
const std::vector<fs::path> allScriptCoreSources =
CollectCSharpSourceFiles(scriptCoreSourceRoot);
std::vector<fs::path> scriptCoreSources;
std::vector<fs::path> renderPipelinesUniversalSources;
scriptCoreSources.reserve(allScriptCoreSources.size());
renderPipelinesUniversalSources.reserve(allScriptCoreSources.size());
for (const fs::path& sourcePath : allScriptCoreSources) {
const std::string relativePath =
sourcePath.lexically_relative(scriptCoreSourceRoot)
.generic_string();
if (relativePath.rfind("Rendering/Renderer/", 0) == 0 ||
relativePath.rfind("Rendering/FirstParty/", 0) == 0) {
renderPipelinesUniversalSources.push_back(sourcePath);
} else {
scriptCoreSources.push_back(sourcePath);
}
}
if (scriptCoreSources.empty()) {
return BuildFailure("No ScriptCore C# source files were found under: " +
ScriptBuilderPathToUtf8(scriptCoreSourceRoot));
}
if (renderPipelinesUniversalSources.empty()) {
return BuildFailure(
"No RenderPipelines.Universal C# source files were found under: " +
ScriptBuilderPathToUtf8(scriptCoreSourceRoot / "Rendering"));
}
std::vector<fs::path> projectScriptSources = CollectCSharpSourceFiles(projectRoot / "Assets");
std::string placeholderError;
@@ -333,6 +357,22 @@ EditorScriptAssemblyBuildResult EditorScriptAssemblyBuilder::RebuildProjectAssem
return BuildFailure("Failed to build XCEngine.ScriptCore.dll: " + compileError);
}
std::vector<fs::path> renderPipelinesUniversalReferences =
frameworkReferences;
renderPipelinesUniversalReferences.push_back(scriptCoreOutputPath);
if (!RunCSharpCompiler(
dotnetExecutable,
cscDllPath,
projectRoot,
renderPipelinesUniversalOutputPath,
renderPipelinesUniversalReferences,
renderPipelinesUniversalSources,
compileError)) {
return BuildFailure(
"Failed to build XCEngine.RenderPipelines.Universal.dll: " +
compileError);
}
// Mono can keep the project-local corlib mapped for the lifetime of the process.
// Once it exists in the output folder, reuse it across incremental rebuilds.
ec.clear();
@@ -350,6 +390,7 @@ EditorScriptAssemblyBuildResult EditorScriptAssemblyBuilder::RebuildProjectAssem
std::vector<fs::path> gameScriptReferences = frameworkReferences;
gameScriptReferences.push_back(scriptCoreOutputPath);
gameScriptReferences.push_back(renderPipelinesUniversalOutputPath);
if (!RunCSharpCompiler(
dotnetExecutable,
cscDllPath,

View File

@@ -36,6 +36,11 @@ set(XCENGINE_MONO_CORLIB_DIR "${XCENGINE_MONO_ROOT_DIR}/binary" CACHE PATH "Dire
set(XCENGINE_MONO_MSCORLIB_PATH "${XCENGINE_MONO_CORLIB_DIR}/mscorlib.dll")
set(XCENGINE_SCRIPT_CORE_DLL "${XCENGINE_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll" CACHE FILEPATH "Generated XCEngine.ScriptCore assembly")
set(
XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL
"${XCENGINE_MANAGED_OUTPUT_DIR}/XCEngine.RenderPipelines.Universal.dll"
CACHE FILEPATH
"Generated XCEngine.RenderPipelines.Universal assembly")
set(XCENGINE_GAME_SCRIPTS_DLL "${XCENGINE_MANAGED_OUTPUT_DIR}/GameScripts.dll" CACHE FILEPATH "Generated GameScripts assembly")
set(
XCENGINE_PROJECT_ASSETS_DIR
@@ -52,6 +57,11 @@ set(
"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/XCEngine.ScriptCore.dll"
CACHE FILEPATH
"Generated script core assembly copied into the project script assembly directory")
set(
XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL
"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/XCEngine.RenderPipelines.Universal.dll"
CACHE FILEPATH
"Generated render pipelines universal assembly copied into the project script assembly directory")
set(
XCENGINE_PROJECT_GAME_SCRIPTS_DLL
"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}/GameScripts.dll"
@@ -74,6 +84,12 @@ set(
CACHE FILEPATH
"ScriptCore assembly used by scripting tests for project asset assembly validation"
)
set(
XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL
"${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}/XCEngine.RenderPipelines.Universal.dll"
CACHE FILEPATH
"RenderPipelines.Universal assembly used by scripting tests for project asset assembly validation"
)
set(
XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL
"${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}/GameScripts.dll"
@@ -99,6 +115,7 @@ foreach(XCENGINE_REQUIRED_PATH
endforeach()
set(XCENGINE_SCRIPT_CORE_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/AssemblyInfo.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Behaviour.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Camera.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Color.cs
@@ -141,16 +158,6 @@ set(XCENGINE_SCRIPT_CORE_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineAsset.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineCameraRequestContext.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelinePlanningContext.cs
# Rendering renderer model
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipelineAsset.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererRecordingContext.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererDrivenRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RenderPassEvent.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRenderPass.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRenderer.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRendererData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRendererFeature.cs
# Rendering shared data
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Data/CameraData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Data/DirectionalLightData.cs
@@ -163,6 +170,19 @@ set(XCENGINE_SCRIPT_CORE_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Data/RenderingData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Data/ShadowData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Data/StageColorData.cs
)
set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES
# Rendering renderer model
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipelineAsset.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererRecordingContext.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RendererDrivenRenderPipeline.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/RenderPassEvent.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRenderPass.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRenderer.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRendererData.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Renderer/ScriptableRendererFeature.cs
# First-party rendering
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/FirstParty/ColorScalePostProcessRendererFeature.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/FirstParty/DisableDirectionalShadowRendererFeature.cs
@@ -240,6 +260,24 @@ add_custom_command(
VERBATIM
COMMENT "Building XCEngine.ScriptCore.dll")
add_custom_command(
OUTPUT ${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_MANAGED_OUTPUT_DIR}
COMMAND ${XCENGINE_DOTNET_EXECUTABLE} ${XCENGINE_CSC_DLL}
/nologo
/target:library
/langversion:latest
/nostdlib+
/out:${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_MANAGED_FRAMEWORK_REFERENCES}
/reference:${XCENGINE_SCRIPT_CORE_DLL}
${XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES}
DEPENDS
${XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES}
${XCENGINE_SCRIPT_CORE_DLL}
VERBATIM
COMMENT "Building XCEngine.RenderPipelines.Universal.dll")
add_custom_command(
OUTPUT ${XCENGINE_GAME_SCRIPTS_DLL}
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_MANAGED_OUTPUT_DIR}
@@ -251,8 +289,12 @@ add_custom_command(
/out:${XCENGINE_GAME_SCRIPTS_DLL}
${XCENGINE_MANAGED_FRAMEWORK_REFERENCES}
/reference:${XCENGINE_SCRIPT_CORE_DLL}
/reference:${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_GAME_SCRIPT_SOURCES}
DEPENDS ${XCENGINE_GAME_SCRIPT_SOURCES} ${XCENGINE_SCRIPT_CORE_DLL}
DEPENDS
${XCENGINE_GAME_SCRIPT_SOURCES}
${XCENGINE_SCRIPT_CORE_DLL}
${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
VERBATIM
COMMENT "Building GameScripts.dll")
@@ -270,6 +312,7 @@ add_custom_target(
xcengine_managed_assemblies
DEPENDS
${XCENGINE_SCRIPT_CORE_DLL}
${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_GAME_SCRIPTS_DLL}
${XCENGINE_MANAGED_OUTPUT_DIR}/mscorlib.dll
)
@@ -284,6 +327,16 @@ add_custom_command(
VERBATIM
COMMENT "Copying XCEngine.ScriptCore.dll into the scripting test project assembly directory")
add_custom_command(
OUTPUT ${XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
DEPENDS ${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
VERBATIM
COMMENT "Copying XCEngine.RenderPipelines.Universal.dll into the scripting test project assembly directory")
add_custom_command(
OUTPUT ${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_SCRIPTING_TEST_PROJECT_MANAGED_OUTPUT_DIR}
@@ -295,8 +348,12 @@ add_custom_command(
/out:${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}
${XCENGINE_MANAGED_FRAMEWORK_REFERENCES}
/reference:${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
/reference:${XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES}
DEPENDS ${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES} ${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
DEPENDS
${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES}
${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
${XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
VERBATIM
COMMENT "Building scripting test GameScripts.dll from project asset scripts")
@@ -314,6 +371,7 @@ add_custom_target(
xcengine_test_project_managed_assemblies
DEPENDS
${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}
${XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}
${XCENGINE_SCRIPTING_TEST_PROJECT_MONO_MSCORLIB_PATH}
)
@@ -328,6 +386,16 @@ add_custom_command(
VERBATIM
COMMENT "Copying XCEngine.ScriptCore.dll into the project script assembly directory")
add_custom_command(
OUTPUT ${XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
DEPENDS ${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}
VERBATIM
COMMENT "Copying XCEngine.RenderPipelines.Universal.dll into the project script assembly directory")
add_custom_command(
OUTPUT ${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}
COMMAND ${CMAKE_COMMAND} -E make_directory ${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR}
@@ -339,8 +407,12 @@ add_custom_command(
/out:${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}
${XCENGINE_MANAGED_FRAMEWORK_REFERENCES}
/reference:${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
/reference:${XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES}
DEPENDS ${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES} ${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
DEPENDS
${XCENGINE_PROJECT_GAME_SCRIPT_SOURCES}
${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
${XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
VERBATIM
COMMENT "Building project GameScripts.dll from project asset scripts")
@@ -358,6 +430,7 @@ add_custom_target(
xcengine_project_managed_assemblies ALL
DEPENDS
${XCENGINE_PROJECT_SCRIPT_CORE_DLL}
${XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}
${XCENGINE_PROJECT_GAME_SCRIPTS_DLL}
${XCENGINE_PROJECT_MONO_MSCORLIB_PATH}
)

View File

@@ -0,0 +1,3 @@
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("XCEngine.RenderPipelines.Universal")]

View File

@@ -66,68 +66,68 @@ namespace XCEngine.Rendering
m_stageColorData ??
(m_stageColorData = ResolveStageColorData());
internal bool RecordScene()
public bool RecordScene()
{
return InternalCalls
.Rendering_ScriptableRenderContext_RecordScene(
m_nativeHandle);
}
internal bool RecordOpaqueScenePhase()
public bool RecordOpaqueScenePhase()
{
return RecordScenePhaseInternal(
RecordedScenePhase.Opaque);
}
internal bool RecordSkyboxScenePhase()
public bool RecordSkyboxScenePhase()
{
return RecordScenePhaseInternal(
RecordedScenePhase.Skybox);
}
internal bool RecordTransparentScenePhase()
public bool RecordTransparentScenePhase()
{
return RecordScenePhaseInternal(
RecordedScenePhase.Transparent);
}
internal bool RecordBeforeOpaqueInjection()
public bool RecordBeforeOpaqueInjection()
{
return RecordSceneInjectionPointInternal(
RecordedSceneInjectionPoint.BeforeOpaque);
}
internal bool RecordAfterOpaqueInjection()
public bool RecordAfterOpaqueInjection()
{
return RecordSceneInjectionPointInternal(
RecordedSceneInjectionPoint.AfterOpaque);
}
internal bool RecordBeforeSkyboxInjection()
public bool RecordBeforeSkyboxInjection()
{
return RecordSceneInjectionPointInternal(
RecordedSceneInjectionPoint.BeforeSkybox);
}
internal bool RecordAfterSkyboxInjection()
public bool RecordAfterSkyboxInjection()
{
return RecordSceneInjectionPointInternal(
RecordedSceneInjectionPoint.AfterSkybox);
}
internal bool RecordBeforeTransparentInjection()
public bool RecordBeforeTransparentInjection()
{
return RecordSceneInjectionPointInternal(
RecordedSceneInjectionPoint.BeforeTransparent);
}
internal bool RecordAfterTransparentInjection()
public bool RecordAfterTransparentInjection()
{
return RecordSceneInjectionPointInternal(
RecordedSceneInjectionPoint.AfterTransparent);
}
internal bool RecordColorScaleFullscreenPass(
public bool RecordColorScaleFullscreenPass(
Vector4 colorScale)
{
return RecordFullscreenPassInternal(
@@ -137,7 +137,7 @@ namespace XCEngine.Rendering
colorScale);
}
internal bool RecordShaderVectorFullscreenPass(
public bool RecordShaderVectorFullscreenPass(
string shaderPath,
Vector4 vectorPayload,
string passName = null)

View File

@@ -8,13 +8,13 @@ namespace XCEngine.Rendering
{
}
protected internal virtual bool SupportsStageRenderGraph(
protected virtual bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
return false;
}
protected internal virtual bool RecordStageRenderGraph(
protected virtual bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
return false;

View File

@@ -8,22 +8,22 @@ namespace XCEngine.Rendering
{
}
protected internal virtual ScriptableRenderPipeline CreatePipeline()
protected virtual ScriptableRenderPipeline CreatePipeline()
{
return null;
}
protected internal virtual void ConfigureCameraRenderRequest(
protected virtual void ConfigureCameraRenderRequest(
ScriptableRenderPipelineCameraRequestContext context)
{
}
protected internal virtual void ConfigureCameraFramePlan(
protected virtual void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
}
protected internal virtual FinalColorSettings GetDefaultFinalColorSettings()
protected virtual FinalColorSettings GetDefaultFinalColorSettings()
{
return FinalColorSettings.CreateDefault();
}

View File

@@ -17,7 +17,7 @@ namespace XCEngine.Rendering.Renderer
return null;
}
protected internal override bool SupportsStageRenderGraph(
protected override bool SupportsStageRenderGraph(
CameraFrameStage stage)
{
ScriptableRenderer renderer = GetOrCreateRenderer();
@@ -25,7 +25,7 @@ namespace XCEngine.Rendering.Renderer
renderer.SupportsStageRenderGraph(stage);
}
protected internal override bool RecordStageRenderGraph(
protected override bool RecordStageRenderGraph(
ScriptableRenderContext context)
{
ScriptableRenderer renderer = GetOrCreateRenderer();

View File

@@ -10,7 +10,7 @@ namespace XCEngine.Rendering.Renderer
{
}
protected internal override ScriptableRenderPipeline CreatePipeline()
protected override ScriptableRenderPipeline CreatePipeline()
{
ScriptableRendererData rendererData =
ResolveRendererData();
@@ -19,7 +19,7 @@ namespace XCEngine.Rendering.Renderer
: null;
}
protected internal override void ConfigureCameraRenderRequest(
protected override void ConfigureCameraRenderRequest(
ScriptableRenderPipelineCameraRequestContext context)
{
ScriptableRendererData rendererData =
@@ -31,7 +31,7 @@ namespace XCEngine.Rendering.Renderer
}
}
protected internal override void ConfigureCameraFramePlan(
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
ScriptableRendererData rendererData =

View File

@@ -169,12 +169,17 @@ if(XCENGINE_ENABLE_MONO_SCRIPTING AND TARGET xcengine_managed_assemblies)
file(TO_CMAKE_PATH "${XCENGINE_MANAGED_OUTPUT_DIR}" XCENGINE_MANAGED_OUTPUT_DIR_CMAKE)
file(TO_CMAKE_PATH "${XCENGINE_SCRIPT_CORE_DLL}" XCENGINE_SCRIPT_CORE_DLL_CMAKE)
file(
TO_CMAKE_PATH
"${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}"
XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL_CMAKE)
file(TO_CMAKE_PATH "${XCENGINE_GAME_SCRIPTS_DLL}" XCENGINE_GAME_SCRIPTS_DLL_CMAKE)
target_compile_definitions(editor_tests PRIVATE
XCENGINE_ENABLE_MONO_SCRIPTING
XCENGINE_TEST_MANAGED_OUTPUT_DIR="${XCENGINE_MANAGED_OUTPUT_DIR_CMAKE}"
XCENGINE_TEST_SCRIPT_CORE_DLL="${XCENGINE_SCRIPT_CORE_DLL_CMAKE}"
XCENGINE_TEST_RENDER_PIPELINES_UNIVERSAL_DLL="${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL_CMAKE}"
XCENGINE_TEST_GAME_SCRIPTS_DLL="${XCENGINE_GAME_SCRIPTS_DLL_CMAKE}"
)
endif()

View File

@@ -55,6 +55,7 @@ TEST_F(EditorScriptAssemblyBuilderTest, RebuildsProjectScriptAssembliesIntoLibra
ASSERT_TRUE(result.succeeded) << result.message;
EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "XCEngine.ScriptCore.dll"));
EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "XCEngine.RenderPipelines.Universal.dll"));
EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "GameScripts.dll"));
EXPECT_TRUE(std::filesystem::exists(m_projectRoot / "Library" / "ScriptAssemblies" / "mscorlib.dll"));
}
@@ -79,6 +80,11 @@ TEST_F(EditorScriptAssemblyBuilderTest, RebuildFailsWhileLoadedAssemblyIsStillHe
settings.assemblyDirectory = m_projectRoot / "Library" / "ScriptAssemblies";
settings.corlibDirectory = settings.assemblyDirectory;
settings.coreAssemblyPath = settings.assemblyDirectory / "XCEngine.ScriptCore.dll";
settings.engineAssemblies.push_back(
XCEngine::Scripting::MonoScriptRuntime::ManagedAssemblyDescriptor{
"XCEngine.RenderPipelines.Universal",
settings.assemblyDirectory /
"XCEngine.RenderPipelines.Universal.dll"});
settings.appAssemblyPath = settings.assemblyDirectory / "GameScripts.dll";
auto runtime = std::make_unique<XCEngine::Scripting::MonoScriptRuntime>(settings);

View File

@@ -27,6 +27,10 @@ MonoScriptRuntime::Settings CreateMonoSettings() {
settings.assemblyDirectory = XCENGINE_TEST_MANAGED_OUTPUT_DIR;
settings.corlibDirectory = XCENGINE_TEST_MANAGED_OUTPUT_DIR;
settings.coreAssemblyPath = XCENGINE_TEST_SCRIPT_CORE_DLL;
settings.engineAssemblies.push_back(
MonoScriptRuntime::ManagedAssemblyDescriptor{
"XCEngine.RenderPipelines.Universal",
XCENGINE_TEST_RENDER_PIPELINES_UNIVERSAL_DLL});
settings.appAssemblyPath = XCENGINE_TEST_GAME_SCRIPTS_DLL;
return settings;
}

View File

@@ -60,11 +60,16 @@ if(TARGET xcengine_managed_assemblies)
file(TO_CMAKE_PATH "${XCENGINE_MANAGED_OUTPUT_DIR}" XCENGINE_MANAGED_OUTPUT_DIR_CMAKE)
file(TO_CMAKE_PATH "${XCENGINE_SCRIPT_CORE_DLL}" XCENGINE_SCRIPT_CORE_DLL_CMAKE)
file(
TO_CMAKE_PATH
"${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL}"
XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL_CMAKE)
file(TO_CMAKE_PATH "${XCENGINE_GAME_SCRIPTS_DLL}" XCENGINE_GAME_SCRIPTS_DLL_CMAKE)
target_compile_definitions(scripting_tests PRIVATE
XCENGINE_TEST_MANAGED_OUTPUT_DIR=\"${XCENGINE_MANAGED_OUTPUT_DIR_CMAKE}\"
XCENGINE_TEST_SCRIPT_CORE_DLL=\"${XCENGINE_SCRIPT_CORE_DLL_CMAKE}\"
XCENGINE_TEST_RENDER_PIPELINES_UNIVERSAL_DLL=\"${XCENGINE_RENDER_PIPELINES_UNIVERSAL_DLL_CMAKE}\"
XCENGINE_TEST_GAME_SCRIPTS_DLL=\"${XCENGINE_GAME_SCRIPTS_DLL_CMAKE}\"
)
endif()
@@ -83,6 +88,10 @@ if(TARGET xcengine_test_project_managed_assemblies)
TO_CMAKE_PATH
"${XCENGINE_SCRIPTING_TEST_PROJECT_SCRIPT_CORE_DLL}"
XCENGINE_PROJECT_SCRIPT_CORE_DLL_CMAKE)
file(
TO_CMAKE_PATH
"${XCENGINE_SCRIPTING_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL}"
XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL_CMAKE)
file(
TO_CMAKE_PATH
"${XCENGINE_SCRIPTING_TEST_PROJECT_GAME_SCRIPTS_DLL}"
@@ -91,6 +100,7 @@ if(TARGET xcengine_test_project_managed_assemblies)
target_compile_definitions(scripting_tests PRIVATE
XCENGINE_TEST_PROJECT_MANAGED_OUTPUT_DIR=\"${XCENGINE_PROJECT_MANAGED_OUTPUT_DIR_CMAKE}\"
XCENGINE_TEST_PROJECT_SCRIPT_CORE_DLL=\"${XCENGINE_PROJECT_SCRIPT_CORE_DLL_CMAKE}\"
XCENGINE_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL=\"${XCENGINE_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL_CMAKE}\"
XCENGINE_TEST_PROJECT_GAME_SCRIPTS_DLL=\"${XCENGINE_PROJECT_GAME_SCRIPTS_DLL_CMAKE}\"
)
endif()

View File

@@ -121,6 +121,10 @@ MonoScriptRuntime::Settings CreateMonoSettings() {
settings.assemblyDirectory = XCENGINE_TEST_MANAGED_OUTPUT_DIR;
settings.corlibDirectory = XCENGINE_TEST_MANAGED_OUTPUT_DIR;
settings.coreAssemblyPath = XCENGINE_TEST_SCRIPT_CORE_DLL;
settings.engineAssemblies.push_back(
MonoScriptRuntime::ManagedAssemblyDescriptor{
"XCEngine.RenderPipelines.Universal",
XCENGINE_TEST_RENDER_PIPELINES_UNIVERSAL_DLL});
settings.appAssemblyPath = XCENGINE_TEST_GAME_SCRIPTS_DLL;
return settings;
}
@@ -240,7 +244,7 @@ TEST_F(
classes.begin(),
classes.end(),
ScriptClassDescriptor{
"XCEngine.ScriptCore",
"XCEngine.RenderPipelines.Universal",
"XCEngine.Rendering.FirstParty",
"ForwardRenderPipelineAsset"}),
classes.end());
@@ -438,7 +442,7 @@ TEST_F(
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptor =
XCEngine::Rendering::Pipelines::GetConfiguredManagedRenderPipelineAssetDescriptor();
EXPECT_EQ(descriptor.assemblyName, "XCEngine.ScriptCore");
EXPECT_EQ(descriptor.assemblyName, "XCEngine.RenderPipelines.Universal");
EXPECT_EQ(descriptor.namespaceName, "XCEngine.Rendering.FirstParty");
EXPECT_EQ(descriptor.className, "ForwardRenderPipelineAsset");
EXPECT_NE(descriptor.managedAssetHandle, 0u);
@@ -773,7 +777,9 @@ TEST_F(
const XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(asset, nullptr);
EXPECT_EQ(asset->GetDescriptor().assemblyName, "XCEngine.ScriptCore");
EXPECT_EQ(
asset->GetDescriptor().assemblyName,
"XCEngine.RenderPipelines.Universal");
EXPECT_EQ(
asset->GetDescriptor().namespaceName,
"XCEngine.Rendering.FirstParty");
@@ -1025,7 +1031,9 @@ TEST_F(
const XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(pipelineAsset, nullptr);
EXPECT_EQ(pipelineAsset->GetDescriptor().assemblyName, "XCEngine.ScriptCore");
EXPECT_EQ(
pipelineAsset->GetDescriptor().assemblyName,
"XCEngine.RenderPipelines.Universal");
EXPECT_EQ(pipelineAsset->GetDescriptor().namespaceName, "XCEngine.Rendering.FirstParty");
EXPECT_EQ(
pipelineAsset->GetDescriptor().className,
@@ -1101,7 +1109,9 @@ TEST_F(
const XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(pipelineAsset, nullptr);
EXPECT_EQ(pipelineAsset->GetDescriptor().assemblyName, "XCEngine.ScriptCore");
EXPECT_EQ(
pipelineAsset->GetDescriptor().assemblyName,
"XCEngine.RenderPipelines.Universal");
EXPECT_EQ(pipelineAsset->GetDescriptor().namespaceName, "XCEngine.Rendering.FirstParty");
EXPECT_EQ(
pipelineAsset->GetDescriptor().className,

View File

@@ -58,11 +58,26 @@ std::filesystem::path ResolveProjectGameScriptsDllPath() {
return ResolveProjectManagedOutputDirectory() / "GameScripts.dll";
}
std::filesystem::path ResolveProjectRenderPipelinesUniversalDllPath() {
constexpr const char* configuredPath =
XCENGINE_TEST_PROJECT_RENDER_PIPELINES_UNIVERSAL_DLL;
if (configuredPath[0] != '\0') {
return std::filesystem::path(configuredPath);
}
return ResolveProjectManagedOutputDirectory() /
"XCEngine.RenderPipelines.Universal.dll";
}
MonoScriptRuntime::Settings CreateProjectMonoSettings() {
MonoScriptRuntime::Settings settings;
settings.assemblyDirectory = ResolveProjectManagedOutputDirectory();
settings.corlibDirectory = settings.assemblyDirectory;
settings.coreAssemblyPath = ResolveProjectScriptCoreDllPath();
settings.engineAssemblies.push_back(
MonoScriptRuntime::ManagedAssemblyDescriptor{
"XCEngine.RenderPipelines.Universal",
ResolveProjectRenderPipelinesUniversalDllPath()});
settings.appAssemblyPath = ResolveProjectGameScriptsDllPath();
return settings;
}
@@ -71,6 +86,9 @@ class ProjectScriptAssemblyTest : public ::testing::Test {
protected:
void SetUp() override {
ASSERT_TRUE(std::filesystem::exists(ResolveProjectScriptCoreDllPath()));
ASSERT_TRUE(
std::filesystem::exists(
ResolveProjectRenderPipelinesUniversalDllPath()));
ASSERT_TRUE(std::filesystem::exists(ResolveProjectGameScriptsDllPath()));
runtime = std::make_unique<MonoScriptRuntime>(CreateProjectMonoSettings());