From b07cf40b8d872985a3f3e5c1734d77f6d162eb5c Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Wed, 7 Jan 2026 15:44:53 +0000 Subject: [PATCH] feat(bgfx_gui_service): Add support for MaterialX shaders with separate uniform handling --- src/services/impl/bgfx_gui_service.cpp | 47 +++++++++++++++++++++----- src/services/impl/bgfx_gui_service.hpp | 4 ++- tests/test_bgfx_gui_service.cpp | 2 ++ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/services/impl/bgfx_gui_service.cpp b/src/services/impl/bgfx_gui_service.cpp index 6469221..72df8c4 100644 --- a/src/services/impl/bgfx_gui_service.cpp +++ b/src/services/impl/bgfx_gui_service.cpp @@ -299,6 +299,14 @@ void BgfxGuiService::Shutdown() noexcept { bgfx::destroy(modelViewProjUniform_); modelViewProjUniform_ = BGFX_INVALID_HANDLE; } + if (bgfx::isValid(worldMatrixUniform_)) { + bgfx::destroy(worldMatrixUniform_); + worldMatrixUniform_ = BGFX_INVALID_HANDLE; + } + if (bgfx::isValid(viewProjMatrixUniform_)) { + bgfx::destroy(viewProjMatrixUniform_); + viewProjMatrixUniform_ = BGFX_INVALID_HANDLE; + } if (freeType_) { if (freeType_->face) { @@ -338,23 +346,18 @@ void BgfxGuiService::InitializeResources() { .add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float) .end(); - modelViewProjUniform_ = bgfx::createUniform("u_modelViewProj", bgfx::UniformType::Mat4); sampler_ = bgfx::createUniform("s_tex", bgfx::UniformType::Sampler); - if (logger_) { - logger_->Trace("BgfxGuiService", "InitializeResources", - "Uniforms created: modelViewProj=" + std::to_string(bgfx::isValid(modelViewProjUniform_)) + - ", sampler=" + std::to_string(bgfx::isValid(sampler_))); - } - const char* vertexSource = kGuiVertexSource; const char* fragmentSource = kGuiFragmentSource; guiVertexSourceOverride_.clear(); guiFragmentSourceOverride_.clear(); + bool usingMaterialX = false; if (configService_) { const auto& materialConfig = configService_->GetMaterialXConfig(); if (materialConfig.enabled && materialConfig.shaderKey == "gui") { + usingMaterialX = true; try { ShaderPaths generated = materialxGenerator_.Generate(materialConfig, {}); if (!generated.vertexSource.empty() && !generated.fragmentSource.empty()) { @@ -377,6 +380,27 @@ void BgfxGuiService::InitializeResources() { } } } + + // Create uniforms matching the shader we're using + if (usingMaterialX) { + // MaterialX shaders use separate world and viewProjection matrices + worldMatrixUniform_ = bgfx::createUniform("u_worldMatrix", bgfx::UniformType::Mat4); + viewProjMatrixUniform_ = bgfx::createUniform("u_viewProjectionMatrix", bgfx::UniformType::Mat4); + if (logger_) { + logger_->Trace("BgfxGuiService", "InitializeResources", + "MaterialX uniforms: world=" + std::to_string(bgfx::isValid(worldMatrixUniform_)) + + ", viewProj=" + std::to_string(bgfx::isValid(viewProjMatrixUniform_)) + + ", sampler=" + std::to_string(bgfx::isValid(sampler_))); + } + } else { + // Built-in shader uses combined modelViewProj matrix + modelViewProjUniform_ = bgfx::createUniform("u_modelViewProj", bgfx::UniformType::Mat4); + if (logger_) { + logger_->Trace("BgfxGuiService", "InitializeResources", + "Built-in uniforms: modelViewProj=" + std::to_string(bgfx::isValid(modelViewProjUniform_)) + + ", sampler=" + std::to_string(bgfx::isValid(sampler_))); + } + } program_ = CreateProgram(vertexSource, fragmentSource); @@ -792,10 +816,17 @@ void BgfxGuiService::SubmitQuad(const GuiVertex& v0, SetScissor(scissor); bgfx::setTransform(identity); + + // Use appropriate uniforms based on shader type if (bgfx::isValid(modelViewProjUniform_)) { + // Built-in shader: single combined matrix bgfx::setUniform(modelViewProjUniform_, viewProjection_.data()); + } else if (bgfx::isValid(worldMatrixUniform_) && bgfx::isValid(viewProjMatrixUniform_)) { + // MaterialX shader: separate matrices + bgfx::setUniform(worldMatrixUniform_, identity); + bgfx::setUniform(viewProjMatrixUniform_, viewProjection_.data()); } else if (logger_) { - logger_->Error("BgfxGuiService::SubmitQuad: modelViewProjUniform_ is invalid!"); + logger_->Error("BgfxGuiService::SubmitQuad: No valid uniforms for shader!"); } bgfx::setTexture(0, sampler_, texture); bgfx::setVertexBuffer(0, &tvb, 0, 4); diff --git a/src/services/impl/bgfx_gui_service.hpp b/src/services/impl/bgfx_gui_service.hpp index 83cbc24..5ed98de 100644 --- a/src/services/impl/bgfx_gui_service.hpp +++ b/src/services/impl/bgfx_gui_service.hpp @@ -154,7 +154,9 @@ private: bgfx::ProgramHandle program_ = BGFX_INVALID_HANDLE; bgfx::UniformHandle sampler_ = BGFX_INVALID_HANDLE; - bgfx::UniformHandle modelViewProjUniform_ = BGFX_INVALID_HANDLE; + bgfx::UniformHandle modelViewProjUniform_ = BGFX_INVALID_HANDLE; // For built-in shader + bgfx::UniformHandle worldMatrixUniform_ = BGFX_INVALID_HANDLE; // For MaterialX shaders + bgfx::UniformHandle viewProjMatrixUniform_ = BGFX_INVALID_HANDLE; // For MaterialX shaders bgfx::TextureHandle whiteTexture_ = BGFX_INVALID_HANDLE; bgfx::VertexLayout layout_; std::string guiVertexSourceOverride_; diff --git a/tests/test_bgfx_gui_service.cpp b/tests/test_bgfx_gui_service.cpp index 62b31b4..2d4572e 100644 --- a/tests/test_bgfx_gui_service.cpp +++ b/tests/test_bgfx_gui_service.cpp @@ -200,6 +200,8 @@ int main() { try { auto logger = std::make_shared(); + logger->EnableConsoleOutput(true); + logger->SetLevel(sdl3cpp::services::LogLevel::TRACE); auto configService = std::make_shared(); configService->DisableFreeType(); configService->EnableMaterialXGuiShader();