From da126a535f73e5a7faa2c24a81d51368f83143f2 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Tue, 6 Jan 2026 16:12:53 +0000 Subject: [PATCH] feat(materialx): Update MaterialX library handling and improve shader generation logging --- CMakeLists.txt | 21 ++++---- .../impl/materialx_shader_generator.cpp | 49 ++++++++++++++++++- src/services/impl/null_gui_service.cpp | 2 + src/services/impl/script_engine_service.cpp | 4 +- 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dfe4954..207fae0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,20 +154,23 @@ if(TARGET bimg::bimg) endif() set(SDL3CPP_MATERIALX_LIBS) -if(TARGET MaterialX::MaterialX) - list(APPEND SDL3CPP_MATERIALX_LIBS MaterialX::MaterialX) -else() foreach(candidate IN ITEMS + MaterialX::MaterialX + materialx::MaterialX MaterialX::MaterialXCore MaterialX::MaterialXFormat MaterialX::MaterialXGenShader MaterialX::MaterialXGenGlsl - MaterialX::MaterialXRender) - if(TARGET ${candidate}) - list(APPEND SDL3CPP_MATERIALX_LIBS ${candidate}) - endif() - endforeach() -endif() + MaterialX::MaterialXRender + materialx::MaterialXCore + materialx::MaterialXFormat + materialx::MaterialXGenShader + materialx::MaterialXGenGlsl + materialx::MaterialXRender) + if(TARGET ${candidate}) + list(APPEND SDL3CPP_MATERIALX_LIBS ${candidate}) + endif() +endforeach() if(SDL3CPP_MATERIALX_LIBS) list(APPEND SDL3CPP_RENDER_STACK_LIBS ${SDL3CPP_MATERIALX_LIBS}) endif() diff --git a/src/services/impl/materialx_shader_generator.cpp b/src/services/impl/materialx_shader_generator.cpp index 10f90c8..35bff19 100644 --- a/src/services/impl/materialx_shader_generator.cpp +++ b/src/services/impl/materialx_shader_generator.cpp @@ -2,8 +2,11 @@ #include #include +#include +#include #include #include +#include #include #include @@ -39,6 +42,9 @@ ShaderPaths MaterialXShaderGenerator::Generate(const MaterialXConfig& config, if (!config.enabled) { return {}; } + if (logger_) { + logger_->Trace("MaterialXShaderGenerator", "Generate", "enabled=true"); + } mx::FileSearchPath searchPath; std::filesystem::path libraryPath = ResolvePath(config.libraryPath, scriptDirectory); @@ -51,6 +57,11 @@ ShaderPaths MaterialXShaderGenerator::Generate(const MaterialXConfig& config, if (!libraryPath.empty()) { searchPath.append(mx::FilePath(libraryPath.string())); } + if (logger_) { + logger_->Trace("MaterialXShaderGenerator", "Generate", + "libraryPath=" + libraryPath.string() + + ", libraryFolders=" + std::to_string(config.libraryFolders.size())); + } mx::DocumentPtr stdLib = mx::createDocument(); if (!config.libraryFolders.empty()) { @@ -69,6 +80,10 @@ ShaderPaths MaterialXShaderGenerator::Generate(const MaterialXConfig& config, if (config.useConstantColor) { mx::Color3 color(config.constantColor[0], config.constantColor[1], config.constantColor[2]); shader = mx::createConstantShader(context, stdLib, config.shaderKey, color); + if (logger_) { + logger_->Trace("MaterialXShaderGenerator", "Generate", + "usingConstantColor=true, shaderKey=" + config.shaderKey); + } } else { if (config.documentPath.empty()) { throw std::runtime_error("MaterialX document path is required when use_constant_color is false"); @@ -78,14 +93,38 @@ ShaderPaths MaterialXShaderGenerator::Generate(const MaterialXConfig& config, if (documentPath.empty()) { throw std::runtime_error("MaterialX document path could not be resolved"); } + if (logger_) { + logger_->Trace("MaterialXShaderGenerator", "Generate", + "documentPath=" + documentPath.string() + + ", materialName=" + config.materialName); + } mx::DocumentPtr document = mx::createDocument(); - mx::readFromXmlFile(document, mx::FilePath(documentPath.string()), &searchPath); + mx::readFromXmlFile(document, mx::FilePath(documentPath.string()), searchPath); document->importLibrary(stdLib); mx::TypedElementPtr element; if (!config.materialName.empty()) { - element = document->getMaterial(config.materialName); + auto renderables = mx::findRenderableElements(document); + for (const auto& candidate : renderables) { + if (candidate && candidate->getName() == config.materialName) { + element = candidate; + break; + } + } + if (!element) { + mx::NodePtr node = document->getNode(config.materialName); + if (node && (node->getCategory() == "surfacematerial" + || node->getType() == "surfaceshader")) { + element = node; + } + } + if (!element) { + mx::OutputPtr output = document->getOutput(config.materialName); + if (output) { + element = output; + } + } } if (!element) { auto renderables = mx::findRenderableElements(document); @@ -96,6 +135,12 @@ ShaderPaths MaterialXShaderGenerator::Generate(const MaterialXConfig& config, if (!element) { throw std::runtime_error("MaterialX document has no renderable elements"); } + if (logger_) { + logger_->Trace("MaterialXShaderGenerator", "Generate", + "selectedElement=" + element->getName() + + ", category=" + element->getCategory() + + ", type=" + element->getType()); + } shader = mx::createShader(config.shaderKey, context, element); } diff --git a/src/services/impl/null_gui_service.cpp b/src/services/impl/null_gui_service.cpp index bcedd3f..4fc4950 100644 --- a/src/services/impl/null_gui_service.cpp +++ b/src/services/impl/null_gui_service.cpp @@ -1,5 +1,7 @@ #include "null_gui_service.hpp" +#include "../interfaces/gui_types.hpp" + #include namespace sdl3cpp::services::impl { diff --git a/src/services/impl/script_engine_service.cpp b/src/services/impl/script_engine_service.cpp index bbb6c08..0c24fcc 100644 --- a/src/services/impl/script_engine_service.cpp +++ b/src/services/impl/script_engine_service.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include #include @@ -79,7 +81,7 @@ mx::DocumentPtr LoadMaterialXDocument(const std::filesystem::path& documentPath, const std::filesystem::path& scriptDirectory) { mx::DocumentPtr document = mx::createDocument(); mx::FileSearchPath searchPath = BuildMaterialXSearchPath(config, scriptDirectory); - mx::readFromXmlFile(document, mx::FilePath(documentPath.string()), &searchPath); + mx::readFromXmlFile(document, mx::FilePath(documentPath.string()), searchPath); if (!config.libraryFolders.empty()) { mx::DocumentPtr stdLib = mx::createDocument();