diff --git a/editor/src/Application.cpp b/editor/src/Application.cpp index 9e5db9fe..6768c9ed 100644 --- a/editor/src/Application.cpp +++ b/editor/src/Application.cpp @@ -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."; diff --git a/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp b/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp index 5ab15801..2bd9f4ca 100644 --- a/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp +++ b/editor/src/Scripting/EditorScriptAssemblyBuilder.cpp @@ -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 scriptCoreSources = CollectCSharpSourceFiles(scriptCoreSourceRoot); + const std::vector allScriptCoreSources = + CollectCSharpSourceFiles(scriptCoreSourceRoot); + std::vector scriptCoreSources; + std::vector 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 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 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 gameScriptReferences = frameworkReferences; gameScriptReferences.push_back(scriptCoreOutputPath); + gameScriptReferences.push_back(renderPipelinesUniversalOutputPath); if (!RunCSharpCompiler( dotnetExecutable, cscDllPath, diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index ab9f6429..13f23e18 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -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} ) diff --git a/managed/XCEngine.ScriptCore/AssemblyInfo.cs b/managed/XCEngine.ScriptCore/AssemblyInfo.cs new file mode 100644 index 00000000..8811b563 --- /dev/null +++ b/managed/XCEngine.ScriptCore/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("XCEngine.RenderPipelines.Universal")] diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs index da380611..b68c38cb 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs @@ -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) diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipeline.cs b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipeline.cs index 11c91897..bb786f4e 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipeline.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipeline.cs @@ -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; diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineAsset.cs b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineAsset.cs index 14838f2d..5edec546 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineAsset.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipelineAsset.cs @@ -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(); } diff --git a/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipeline.cs b/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipeline.cs index 5ac251b2..0818258c 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipeline.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipeline.cs @@ -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(); diff --git a/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipelineAsset.cs index 0336988b..2f7454a5 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipelineAsset.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Renderer/RendererBackedRenderPipelineAsset.cs @@ -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 = diff --git a/tests/editor/CMakeLists.txt b/tests/editor/CMakeLists.txt index ec004a80..fccd5f87 100644 --- a/tests/editor/CMakeLists.txt +++ b/tests/editor/CMakeLists.txt @@ -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() diff --git a/tests/editor/test_editor_script_assembly_builder.cpp b/tests/editor/test_editor_script_assembly_builder.cpp index bdf3c243..5be599c4 100644 --- a/tests/editor/test_editor_script_assembly_builder.cpp +++ b/tests/editor/test_editor_script_assembly_builder.cpp @@ -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(settings); diff --git a/tests/editor/test_play_session_controller_scripting.cpp b/tests/editor/test_play_session_controller_scripting.cpp index 7358aea8..447995f4 100644 --- a/tests/editor/test_play_session_controller_scripting.cpp +++ b/tests/editor/test_play_session_controller_scripting.cpp @@ -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; } diff --git a/tests/scripting/CMakeLists.txt b/tests/scripting/CMakeLists.txt index de4548bb..6cbbffdc 100644 --- a/tests/scripting/CMakeLists.txt +++ b/tests/scripting/CMakeLists.txt @@ -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() diff --git a/tests/scripting/test_mono_script_runtime.cpp b/tests/scripting/test_mono_script_runtime.cpp index 2940919d..757c9fc6 100644 --- a/tests/scripting/test_mono_script_runtime.cpp +++ b/tests/scripting/test_mono_script_runtime.cpp @@ -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, diff --git a/tests/scripting/test_project_script_assembly.cpp b/tests/scripting/test_project_script_assembly.cpp index 82c3f8b6..dc024254 100644 --- a/tests/scripting/test_project_script_assembly.cpp +++ b/tests/scripting/test_project_script_assembly.cpp @@ -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(CreateProjectMonoSettings());