From 228cb5fe94574c6f004f63d38d9a665bf72cf1fe Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Fri, 9 Jan 2026 21:08:51 +0000 Subject: [PATCH] ROADMAP.md --- CMakeLists.txt | 10 + ROADMAP.md | 2 + src/app/service_based_app.cpp | 26 ++- .../impl/materialx_document_loader.cpp | 31 +++ .../impl/materialx_document_loader.hpp | 18 ++ src/services/impl/materialx_path_resolver.cpp | 33 +++ src/services/impl/materialx_path_resolver.hpp | 13 ++ .../impl/materialx_search_path_builder.cpp | 26 +++ .../impl/materialx_search_path_builder.hpp | 17 ++ .../impl/materialx_surface_node_resolver.cpp | 41 ++++ .../impl/materialx_surface_node_resolver.hpp | 15 ++ .../materialx_surface_parameter_reader.cpp | 81 +++++++ .../materialx_surface_parameter_reader.hpp | 20 ++ .../impl/materialx_surface_parameters.hpp | 16 ++ src/services/impl/script_engine_service.cpp | 202 ++---------------- .../impl/workflow_default_step_registrar.cpp | 23 +- .../impl/workflow_default_step_registrar.hpp | 4 +- 17 files changed, 380 insertions(+), 198 deletions(-) create mode 100644 src/services/impl/materialx_document_loader.cpp create mode 100644 src/services/impl/materialx_document_loader.hpp create mode 100644 src/services/impl/materialx_path_resolver.cpp create mode 100644 src/services/impl/materialx_path_resolver.hpp create mode 100644 src/services/impl/materialx_search_path_builder.cpp create mode 100644 src/services/impl/materialx_search_path_builder.hpp create mode 100644 src/services/impl/materialx_surface_node_resolver.cpp create mode 100644 src/services/impl/materialx_surface_node_resolver.hpp create mode 100644 src/services/impl/materialx_surface_parameter_reader.cpp create mode 100644 src/services/impl/materialx_surface_parameter_reader.hpp create mode 100644 src/services/impl/materialx_surface_parameters.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 86b8342..19ded68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -295,6 +295,14 @@ set(WORKFLOW_SOURCES src/services/impl/workflow_default_step_registrar.cpp ) +set(MATERIALX_SCRIPT_SOURCES + src/services/impl/materialx_path_resolver.cpp + src/services/impl/materialx_search_path_builder.cpp + src/services/impl/materialx_document_loader.cpp + src/services/impl/materialx_surface_node_resolver.cpp + src/services/impl/materialx_surface_parameter_reader.cpp +) + if(BUILD_SDL3_APP) add_executable(sdl3_app src/main.cpp @@ -303,6 +311,7 @@ if(BUILD_SDL3_APP) src/events/event_bus.cpp ${JSON_CONFIG_SOURCES} ${WORKFLOW_SOURCES} + ${MATERIALX_SCRIPT_SOURCES} src/services/impl/config_compiler_service.cpp src/services/impl/command_line_service.cpp src/services/impl/json_config_writer_service.cpp @@ -428,6 +437,7 @@ add_executable(script_engine_tests src/services/impl/physics_bridge_service.cpp src/services/impl/platform_service.cpp src/services/impl/script_engine_service.cpp + ${MATERIALX_SCRIPT_SOURCES} src/services/impl/lua_helpers.cpp src/services/impl/scene_script_service.cpp src/services/impl/shader_script_service.cpp diff --git a/ROADMAP.md b/ROADMAP.md index 23ae9d5..8e2eee7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -160,6 +160,7 @@ Treat JSON config as a declarative control plane that compiles into scene, resou ### Phase A: Mechanical Extraction (1-3 days) - [~] JsonConfigService: extracted config document load/merge helpers into `src/services/impl/json_config_document_loader.cpp` plus small parser/extend/merge services to keep files <100 LOC. - [~] JsonConfigService: split schema validation/versioning/migration into `json_config_*` services (`schema_validator`, `version_validator`, `migration_service`). +- [~] ScriptEngineService: extracted MaterialX helpers into micro services (`materialx_path_resolver`, `materialx_search_path_builder`, `materialx_document_loader`, `materialx_surface_node_resolver`, `materialx_surface_parameter_reader`). - Move self-contained helpers into `*_helpers.cpp` with clear headers. - Extract pure data transforms into free functions with unit tests. - Preserve public interfaces; no behavior change in this phase. @@ -231,6 +232,7 @@ Option B: per-shader only - Describe boot + frame pipelines as a declarative JSON workflow graph. - Keep each step tiny (<100 LOC), with explicit inputs/outputs and DI-backed plugin lookup. - Package common pipelines as templates so users don't start from scratch. +- Only register/instantiate step plugins that are referenced by the active workflow. ### Status - [~] Workflow core: step registry + executor + JSON definition parser. diff --git a/src/app/service_based_app.cpp b/src/app/service_based_app.cpp index 8cbd62d..c77646b 100644 --- a/src/app/service_based_app.cpp +++ b/src/app/service_based_app.cpp @@ -38,6 +38,7 @@ #include "services/impl/pipeline_compiler_service.hpp" #include "services/impl/validation_tour_service.hpp" #include "services/impl/workflow_default_step_registrar.hpp" +#include "services/impl/workflow_definition_parser.hpp" #include "services/impl/workflow_executor.hpp" #include "services/impl/workflow_step_registry.hpp" #include "services/interfaces/i_platform_service.hpp" @@ -49,6 +50,7 @@ #include "services/interfaces/i_workflow_step_registry.hpp" #include "services/interfaces/i_config_compiler_service.hpp" #include +#include #include #include @@ -233,10 +235,26 @@ void ServiceBasedApp::RegisterServices() { registry_.RegisterService( registry_.GetService(), registry_.GetService()); - services::impl::WorkflowDefaultStepRegistrar workflowRegistrar( - registry_.GetService(), - registry_.GetService()); - workflowRegistrar.RegisterDefaults(registry_.GetService()); + services::impl::WorkflowDefinitionParser workflowParser; + services::WorkflowDefinition workflowDefinition; + bool workflowLoaded = false; + try { + const std::filesystem::path workflowPath = + std::filesystem::current_path() / "config" / "workflows" / "templates" / "boot_default.json"; + workflowDefinition = workflowParser.ParseFile(workflowPath); + workflowLoaded = true; + } catch (const std::exception& e) { + logger_->Warn("ServiceBasedApp::RegisterServices: Failed to load workflow template: " + + std::string(e.what())); + } + if (workflowLoaded) { + services::impl::WorkflowDefaultStepRegistrar workflowRegistrar( + registry_.GetService(), + registry_.GetService()); + workflowRegistrar.RegisterUsedSteps( + workflowDefinition, + registry_.GetService()); + } // Configuration service registry_.RegisterService( diff --git a/src/services/impl/materialx_document_loader.cpp b/src/services/impl/materialx_document_loader.cpp new file mode 100644 index 0000000..3b26c7f --- /dev/null +++ b/src/services/impl/materialx_document_loader.cpp @@ -0,0 +1,31 @@ +#include "materialx_document_loader.hpp" +#include "materialx_search_path_builder.hpp" + +#include +#include + +namespace sdl3cpp::services::impl { + +MaterialX::DocumentPtr MaterialXDocumentLoader::Load(const std::filesystem::path& documentPath, + const MaterialXConfig& config, + const std::filesystem::path& scriptDirectory) const { + MaterialX::DocumentPtr document = MaterialX::createDocument(); + MaterialXSearchPathBuilder builder; + auto searchPath = builder.Build(config, scriptDirectory); + MaterialX::readFromXmlFile(document, MaterialX::FilePath(documentPath.string()), searchPath); + + if (!config.libraryFolders.empty()) { + MaterialX::DocumentPtr stdLib = MaterialX::createDocument(); + MaterialX::FilePathVec folders; + folders.reserve(config.libraryFolders.size()); + for (const auto& folder : config.libraryFolders) { + folders.emplace_back(folder); + } + MaterialX::loadLibraries(folders, searchPath, stdLib); + document->importLibrary(stdLib); + } + + return document; +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_document_loader.hpp b/src/services/impl/materialx_document_loader.hpp new file mode 100644 index 0000000..60bd299 --- /dev/null +++ b/src/services/impl/materialx_document_loader.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "../interfaces/config_types.hpp" + +#include + +#include + +namespace sdl3cpp::services::impl { + +class MaterialXDocumentLoader { +public: + MaterialX::DocumentPtr Load(const std::filesystem::path& documentPath, + const MaterialXConfig& config, + const std::filesystem::path& scriptDirectory) const; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_path_resolver.cpp b/src/services/impl/materialx_path_resolver.cpp new file mode 100644 index 0000000..18ad926 --- /dev/null +++ b/src/services/impl/materialx_path_resolver.cpp @@ -0,0 +1,33 @@ +#include "materialx_path_resolver.hpp" + +#include + +namespace sdl3cpp::services::impl { + +std::filesystem::path MaterialXPathResolver::Resolve(const std::filesystem::path& path, + const std::filesystem::path& scriptDirectory) const { + if (path.empty()) { + return {}; + } + if (path.is_absolute()) { + return path; + } + if (!scriptDirectory.empty()) { + auto projectRoot = scriptDirectory.parent_path(); + if (!projectRoot.empty()) { + std::error_code ec; + auto resolved = std::filesystem::weakly_canonical(projectRoot / path, ec); + if (!ec) { + return resolved; + } + } + } + std::error_code ec; + auto resolved = std::filesystem::weakly_canonical(path, ec); + if (ec) { + return {}; + } + return resolved; +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_path_resolver.hpp b/src/services/impl/materialx_path_resolver.hpp new file mode 100644 index 0000000..b31fb37 --- /dev/null +++ b/src/services/impl/materialx_path_resolver.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace sdl3cpp::services::impl { + +class MaterialXPathResolver { +public: + std::filesystem::path Resolve(const std::filesystem::path& path, + const std::filesystem::path& scriptDirectory) const; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_search_path_builder.cpp b/src/services/impl/materialx_search_path_builder.cpp new file mode 100644 index 0000000..1bfda13 --- /dev/null +++ b/src/services/impl/materialx_search_path_builder.cpp @@ -0,0 +1,26 @@ +#include "materialx_search_path_builder.hpp" +#include "materialx_path_resolver.hpp" + +#include + +namespace sdl3cpp::services::impl { + +MaterialX::FileSearchPath MaterialXSearchPathBuilder::Build( + const MaterialXConfig& config, + const std::filesystem::path& scriptDirectory) const { + MaterialX::FileSearchPath searchPath; + MaterialXPathResolver resolver; + std::filesystem::path libraryPath = resolver.Resolve(config.libraryPath, scriptDirectory); + if (libraryPath.empty() && !scriptDirectory.empty()) { + auto fallback = scriptDirectory.parent_path() / "MaterialX" / "libraries"; + if (std::filesystem::exists(fallback)) { + libraryPath = fallback; + } + } + if (!libraryPath.empty()) { + searchPath.append(MaterialX::FilePath(libraryPath.string())); + } + return searchPath; +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_search_path_builder.hpp b/src/services/impl/materialx_search_path_builder.hpp new file mode 100644 index 0000000..8174a67 --- /dev/null +++ b/src/services/impl/materialx_search_path_builder.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "../interfaces/config_types.hpp" + +#include + +#include + +namespace sdl3cpp::services::impl { + +class MaterialXSearchPathBuilder { +public: + MaterialX::FileSearchPath Build(const MaterialXConfig& config, + const std::filesystem::path& scriptDirectory) const; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_surface_node_resolver.cpp b/src/services/impl/materialx_surface_node_resolver.cpp new file mode 100644 index 0000000..8d7a2e2 --- /dev/null +++ b/src/services/impl/materialx_surface_node_resolver.cpp @@ -0,0 +1,41 @@ +#include "materialx_surface_node_resolver.hpp" + +namespace sdl3cpp::services::impl { + +MaterialX::NodePtr MaterialXSurfaceNodeResolver::ResolveSurfaceNode( + const MaterialX::DocumentPtr& document, + const std::string& materialName) const { + if (!materialName.empty()) { + MaterialX::NodePtr candidate = document->getNode(materialName); + if (candidate && candidate->getCategory() == "surfacematerial") { + MaterialX::NodePtr surfaceNode = candidate->getConnectedNode("surfaceshader"); + if (surfaceNode) { + return surfaceNode; + } + } + if (candidate && (candidate->getCategory() == "standard_surface" + || candidate->getCategory() == "usd_preview_surface")) { + return candidate; + } + } + + for (const auto& node : document->getNodes()) { + if (node->getCategory() == "surfacematerial") { + MaterialX::NodePtr surfaceNode = node->getConnectedNode("surfaceshader"); + if (surfaceNode) { + return surfaceNode; + } + } + } + + for (const auto& node : document->getNodes()) { + if (node->getCategory() == "standard_surface" + || node->getCategory() == "usd_preview_surface") { + return node; + } + } + + return {}; +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_surface_node_resolver.hpp b/src/services/impl/materialx_surface_node_resolver.hpp new file mode 100644 index 0000000..93e8168 --- /dev/null +++ b/src/services/impl/materialx_surface_node_resolver.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include + +#include + +namespace sdl3cpp::services::impl { + +class MaterialXSurfaceNodeResolver { +public: + MaterialX::NodePtr ResolveSurfaceNode(const MaterialX::DocumentPtr& document, + const std::string& materialName) const; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_surface_parameter_reader.cpp b/src/services/impl/materialx_surface_parameter_reader.cpp new file mode 100644 index 0000000..6533978 --- /dev/null +++ b/src/services/impl/materialx_surface_parameter_reader.cpp @@ -0,0 +1,81 @@ +#include "materialx_surface_parameter_reader.hpp" + +namespace sdl3cpp::services::impl { + +bool MaterialXSurfaceParameterReader::TryReadColor3(const MaterialX::NodePtr& node, + const char* name, + std::array& outColor) const { + if (!node) { + return false; + } + MaterialX::InputPtr input = node->getInput(name); + if (!input || !input->hasValueString()) { + return false; + } + MaterialX::ValuePtr value = input->getValue(); + if (!value || !value->isA()) { + return false; + } + const MaterialX::Color3& color = value->asA(); + outColor = {color[0], color[1], color[2]}; + return true; +} + +bool MaterialXSurfaceParameterReader::TryReadFloat(const MaterialX::NodePtr& node, + const char* name, + float& outValue) const { + if (!node) { + return false; + } + MaterialX::InputPtr input = node->getInput(name); + if (!input || !input->hasValueString()) { + return false; + } + MaterialX::ValuePtr value = input->getValue(); + if (!value || !value->isA()) { + return false; + } + outValue = value->asA(); + return true; +} + +MaterialXSurfaceParameters MaterialXSurfaceParameterReader::ReadStandardSurfaceParameters( + const MaterialX::NodePtr& node) const { + MaterialXSurfaceParameters parameters; + std::array baseColor = parameters.albedo; + bool hasBaseColor = TryReadColor3(node, "base_color", baseColor); + if (!hasBaseColor) { + hasBaseColor = TryReadColor3(node, "diffuse_color", baseColor); + } + float baseStrength = 1.0f; + bool hasBaseStrength = TryReadFloat(node, "base", baseStrength); + if (hasBaseColor) { + parameters.albedo = { + baseColor[0] * baseStrength, + baseColor[1] * baseStrength, + baseColor[2] * baseStrength + }; + parameters.hasAlbedo = true; + } else if (hasBaseStrength) { + parameters.albedo = {baseStrength, baseStrength, baseStrength}; + parameters.hasAlbedo = true; + } + + float roughness = parameters.roughness; + if (TryReadFloat(node, "specular_roughness", roughness) + || TryReadFloat(node, "roughness", roughness)) { + parameters.roughness = roughness; + parameters.hasRoughness = true; + } + + float metallic = parameters.metallic; + if (TryReadFloat(node, "metalness", metallic) + || TryReadFloat(node, "metallic", metallic)) { + parameters.metallic = metallic; + parameters.hasMetallic = true; + } + + return parameters; +} + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_surface_parameter_reader.hpp b/src/services/impl/materialx_surface_parameter_reader.hpp new file mode 100644 index 0000000..31174b8 --- /dev/null +++ b/src/services/impl/materialx_surface_parameter_reader.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "materialx_surface_parameters.hpp" + +#include +#include + +namespace sdl3cpp::services::impl { + +class MaterialXSurfaceParameterReader { +public: + MaterialXSurfaceParameters ReadStandardSurfaceParameters(const MaterialX::NodePtr& node) const; + +private: + bool TryReadColor3(const MaterialX::NodePtr& node, const char* name, + std::array& outColor) const; + bool TryReadFloat(const MaterialX::NodePtr& node, const char* name, float& outValue) const; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/materialx_surface_parameters.hpp b/src/services/impl/materialx_surface_parameters.hpp new file mode 100644 index 0000000..e9808b0 --- /dev/null +++ b/src/services/impl/materialx_surface_parameters.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include + +namespace sdl3cpp::services::impl { + +struct MaterialXSurfaceParameters { + std::array albedo = {1.0f, 1.0f, 1.0f}; + float roughness = 0.3f; + float metallic = 0.0f; + bool hasAlbedo = false; + bool hasRoughness = false; + bool hasMetallic = false; +}; + +} // namespace sdl3cpp::services::impl diff --git a/src/services/impl/script_engine_service.cpp b/src/services/impl/script_engine_service.cpp index ce10a82..d51aba9 100644 --- a/src/services/impl/script_engine_service.cpp +++ b/src/services/impl/script_engine_service.cpp @@ -1,15 +1,14 @@ #include "script_engine_service.hpp" #include "lua_helpers.hpp" +#include "materialx_document_loader.hpp" +#include "materialx_path_resolver.hpp" +#include "materialx_surface_node_resolver.hpp" +#include "materialx_surface_parameter_reader.hpp" #include "services/interfaces/i_logger.hpp" #include #include -#include -#include -#include -#include -#include #include #include #include @@ -24,17 +23,6 @@ #include namespace { -namespace mx = MaterialX; - -struct MaterialXSurfaceParameters { - std::array albedo = {1.0f, 1.0f, 1.0f}; - float roughness = 0.3f; - float metallic = 0.0f; - bool hasAlbedo = false; - bool hasRoughness = false; - bool hasMetallic = false; -}; - std::array TransformPoint(const std::array& matrix, const std::array& point) { const float x = point[0]; @@ -47,174 +35,6 @@ std::array TransformPoint(const std::array& matrix, }; } -std::filesystem::path ResolveMaterialXPath(const std::filesystem::path& path, - const std::filesystem::path& scriptDirectory) { - if (path.empty()) { - return {}; - } - if (path.is_absolute()) { - return path; - } - if (!scriptDirectory.empty()) { - auto projectRoot = scriptDirectory.parent_path(); - if (!projectRoot.empty()) { - std::error_code ec; - auto resolved = std::filesystem::weakly_canonical(projectRoot / path, ec); - if (!ec) { - return resolved; - } - } - } - std::error_code ec; - auto resolved = std::filesystem::weakly_canonical(path, ec); - if (ec) { - return {}; - } - return resolved; -} - -mx::FileSearchPath BuildMaterialXSearchPath(const sdl3cpp::services::MaterialXConfig& config, - const std::filesystem::path& scriptDirectory) { - mx::FileSearchPath searchPath; - std::filesystem::path libraryPath = ResolveMaterialXPath(config.libraryPath, scriptDirectory); - if (libraryPath.empty() && !scriptDirectory.empty()) { - auto fallback = scriptDirectory.parent_path() / "MaterialX" / "libraries"; - if (std::filesystem::exists(fallback)) { - libraryPath = fallback; - } - } - if (!libraryPath.empty()) { - searchPath.append(mx::FilePath(libraryPath.string())); - } - return searchPath; -} - -mx::DocumentPtr LoadMaterialXDocument(const std::filesystem::path& documentPath, - const sdl3cpp::services::MaterialXConfig& config, - const std::filesystem::path& scriptDirectory) { - mx::DocumentPtr document = mx::createDocument(); - mx::FileSearchPath searchPath = BuildMaterialXSearchPath(config, scriptDirectory); - mx::readFromXmlFile(document, mx::FilePath(documentPath.string()), searchPath); - - if (!config.libraryFolders.empty()) { - mx::DocumentPtr stdLib = mx::createDocument(); - mx::FilePathVec folders; - folders.reserve(config.libraryFolders.size()); - for (const auto& folder : config.libraryFolders) { - folders.emplace_back(folder); - } - mx::loadLibraries(folders, searchPath, stdLib); - document->importLibrary(stdLib); - } - - return document; -} - -mx::NodePtr ResolveSurfaceNode(const mx::DocumentPtr& document, const std::string& materialName) { - if (!materialName.empty()) { - mx::NodePtr candidate = document->getNode(materialName); - if (candidate && candidate->getCategory() == "surfacematerial") { - mx::NodePtr surfaceNode = candidate->getConnectedNode("surfaceshader"); - if (surfaceNode) { - return surfaceNode; - } - } - if (candidate && (candidate->getCategory() == "standard_surface" - || candidate->getCategory() == "usd_preview_surface")) { - return candidate; - } - } - - for (const auto& node : document->getNodes()) { - if (node->getCategory() == "surfacematerial") { - mx::NodePtr surfaceNode = node->getConnectedNode("surfaceshader"); - if (surfaceNode) { - return surfaceNode; - } - } - } - - for (const auto& node : document->getNodes()) { - if (node->getCategory() == "standard_surface" - || node->getCategory() == "usd_preview_surface") { - return node; - } - } - - return {}; -} - -bool TryReadColor3(const mx::NodePtr& node, const char* name, std::array& outColor) { - if (!node) { - return false; - } - mx::InputPtr input = node->getInput(name); - if (!input || !input->hasValueString()) { - return false; - } - mx::ValuePtr value = input->getValue(); - if (!value || !value->isA()) { - return false; - } - const mx::Color3& color = value->asA(); - outColor = {color[0], color[1], color[2]}; - return true; -} - -bool TryReadFloat(const mx::NodePtr& node, const char* name, float& outValue) { - if (!node) { - return false; - } - mx::InputPtr input = node->getInput(name); - if (!input || !input->hasValueString()) { - return false; - } - mx::ValuePtr value = input->getValue(); - if (!value || !value->isA()) { - return false; - } - outValue = value->asA(); - return true; -} - -MaterialXSurfaceParameters ReadStandardSurfaceParameters(const mx::NodePtr& node) { - MaterialXSurfaceParameters parameters; - std::array baseColor = parameters.albedo; - bool hasBaseColor = TryReadColor3(node, "base_color", baseColor); - if (!hasBaseColor) { - hasBaseColor = TryReadColor3(node, "diffuse_color", baseColor); - } - float baseStrength = 1.0f; - bool hasBaseStrength = TryReadFloat(node, "base", baseStrength); - if (hasBaseColor) { - parameters.albedo = { - baseColor[0] * baseStrength, - baseColor[1] * baseStrength, - baseColor[2] * baseStrength - }; - parameters.hasAlbedo = true; - } else if (hasBaseStrength) { - parameters.albedo = {baseStrength, baseStrength, baseStrength}; - parameters.hasAlbedo = true; - } - - float roughness = parameters.roughness; - if (TryReadFloat(node, "specular_roughness", roughness) - || TryReadFloat(node, "roughness", roughness)) { - parameters.roughness = roughness; - parameters.hasRoughness = true; - } - - float metallic = parameters.metallic; - if (TryReadFloat(node, "metalness", metallic) - || TryReadFloat(node, "metallic", metallic)) { - parameters.metallic = metallic; - parameters.hasMetallic = true; - } - - return parameters; -} - bool TryParseMouseButtonName(const char* name, uint8_t& button) { if (!name) { return false; @@ -1356,7 +1176,8 @@ int ScriptEngineService::MaterialXGetSurfaceParameters(lua_State* L) { ", material=" + std::string(materialArg ? materialArg : "")); } - std::filesystem::path documentPath = ResolveMaterialXPath(documentArg ? documentArg : "", scriptDirectory); + MaterialXPathResolver pathResolver; + std::filesystem::path documentPath = pathResolver.Resolve(documentArg ? documentArg : "", scriptDirectory); if (documentPath.empty()) { lua_pushnil(L); lua_pushstring(L, "MaterialX document path could not be resolved"); @@ -1370,9 +1191,12 @@ int ScriptEngineService::MaterialXGetSurfaceParameters(lua_State* L) { } const auto& materialConfig = context->configService->GetMaterialXConfig(); - mx::DocumentPtr document; + MaterialXDocumentLoader documentLoader; + MaterialXSurfaceNodeResolver nodeResolver; + MaterialXSurfaceParameterReader parameterReader; + MaterialX::DocumentPtr document; try { - document = LoadMaterialXDocument(documentPath, materialConfig, scriptDirectory); + document = documentLoader.Load(documentPath, materialConfig, scriptDirectory); } catch (const std::exception& ex) { lua_pushnil(L); std::string message = "MaterialX document load failed: "; @@ -1381,14 +1205,14 @@ int ScriptEngineService::MaterialXGetSurfaceParameters(lua_State* L) { return 2; } - mx::NodePtr surfaceNode = ResolveSurfaceNode(document, materialArg ? materialArg : ""); + auto surfaceNode = nodeResolver.ResolveSurfaceNode(document, materialArg ? materialArg : ""); if (!surfaceNode) { lua_pushnil(L); lua_pushstring(L, "MaterialX document has no standard_surface material"); return 2; } - MaterialXSurfaceParameters parameters = ReadStandardSurfaceParameters(surfaceNode); + MaterialXSurfaceParameters parameters = parameterReader.ReadStandardSurfaceParameters(surfaceNode); if (!parameters.hasAlbedo && !parameters.hasRoughness && !parameters.hasMetallic) { lua_pushnil(L); lua_pushstring(L, "MaterialX material does not expose supported PBR parameters"); diff --git a/src/services/impl/workflow_default_step_registrar.cpp b/src/services/impl/workflow_default_step_registrar.cpp index ce2dbc7..a4918ee 100644 --- a/src/services/impl/workflow_default_step_registrar.cpp +++ b/src/services/impl/workflow_default_step_registrar.cpp @@ -4,6 +4,7 @@ #include "workflow_config_version_step.hpp" #include +#include #include namespace sdl3cpp::services::impl { @@ -13,13 +14,27 @@ WorkflowDefaultStepRegistrar::WorkflowDefaultStepRegistrar(std::shared_ptr& registry) const { +void WorkflowDefaultStepRegistrar::RegisterUsedSteps( + const WorkflowDefinition& workflow, + const std::shared_ptr& registry) const { if (!registry) { throw std::runtime_error("WorkflowDefaultStepRegistrar: registry is null"); } - registry->RegisterStep(std::make_shared(logger_)); - registry->RegisterStep(std::make_shared(logger_)); - registry->RegisterStep(std::make_shared(logger_, probeService_)); + + std::unordered_set plugins; + for (const auto& step : workflow.steps) { + plugins.insert(step.plugin); + } + + if (plugins.contains("config.load")) { + registry->RegisterStep(std::make_shared(logger_)); + } + if (plugins.contains("config.version.validate")) { + registry->RegisterStep(std::make_shared(logger_)); + } + if (plugins.contains("config.schema.validate")) { + registry->RegisterStep(std::make_shared(logger_, probeService_)); + } } } // namespace sdl3cpp::services::impl diff --git a/src/services/impl/workflow_default_step_registrar.hpp b/src/services/impl/workflow_default_step_registrar.hpp index ec8b60f..ba2ade9 100644 --- a/src/services/impl/workflow_default_step_registrar.hpp +++ b/src/services/impl/workflow_default_step_registrar.hpp @@ -3,6 +3,7 @@ #include "../interfaces/i_logger.hpp" #include "../interfaces/i_probe_service.hpp" #include "../interfaces/i_workflow_step_registry.hpp" +#include "../interfaces/workflow_definition.hpp" namespace sdl3cpp::services::impl { @@ -11,7 +12,8 @@ public: WorkflowDefaultStepRegistrar(std::shared_ptr logger, std::shared_ptr probeService); - void RegisterDefaults(const std::shared_ptr& registry) const; + void RegisterUsedSteps(const WorkflowDefinition& workflow, + const std::shared_ptr& registry) const; private: std::shared_ptr logger_;