mirror of
https://github.com/johndoe6345789/SDL3CPlusPlus.git
synced 2026-04-24 13:44:58 +00:00
feat(bgfx_gui_service): Add support for MaterialX shaders with separate uniform handling
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -200,6 +200,8 @@ int main() {
|
||||
|
||||
try {
|
||||
auto logger = std::make_shared<TestLogger>();
|
||||
logger->EnableConsoleOutput(true);
|
||||
logger->SetLevel(sdl3cpp::services::LogLevel::TRACE);
|
||||
auto configService = std::make_shared<StubConfigService>();
|
||||
configService->DisableFreeType();
|
||||
configService->EnableMaterialXGuiShader();
|
||||
|
||||
Reference in New Issue
Block a user