diff --git a/parts/mdl/mdlpart.cpp b/parts/mdl/mdlpart.cpp index c970517..d1664a7 100644 --- a/parts/mdl/mdlpart.cpp +++ b/parts/mdl/mdlpart.cpp @@ -219,6 +219,7 @@ void MDLPart::reloadBoneData() RenderMaterial MDLPart::createMaterial(const physis_Material &material) { RenderMaterial newMaterial; + newMaterial.mat = material; if (material.shpk_name != nullptr) { std::string shpkPath = "shader/sm5/shpk/" + std::string(material.shpk_name); diff --git a/renderer/include/drawobject.h b/renderer/include/drawobject.h index e94c3f2..d48ac83 100644 --- a/renderer/include/drawobject.h +++ b/renderer/include/drawobject.h @@ -21,6 +21,7 @@ struct RenderTexture { enum class MaterialType { Object, Skin }; struct RenderMaterial { + physis_Material mat; MaterialType type = MaterialType::Object; physis_SHPK shaderPackage; diff --git a/renderer/src/gamerenderer.cpp b/renderer/src/gamerenderer.cpp index 21470fa..b09c1fb 100644 --- a/renderer/src/gamerenderer.cpp +++ b/renderer/src/gamerenderer.cpp @@ -224,8 +224,21 @@ void GameRenderer::render(VkCommandBuffer commandBuffer, uint32_t imageIndex, Ca }; std::vector materialKeys; for (int j = 0; j < renderMaterial.shaderPackage.num_material_keys; j++) { - auto value = renderMaterial.shaderPackage.material_keys[j].default_value; - materialKeys.push_back(renderMaterial.shaderPackage.material_keys[j].default_value); + auto id = renderMaterial.shaderPackage.material_keys[j].id; + + bool found = false; + for (int z = 0; z < renderMaterial.mat.num_shader_keys; z++) { + if (renderMaterial.mat.shader_keys[z].category == id) { + materialKeys.push_back(renderMaterial.mat.shader_keys[z].value); + found = true; + } + } + + // Fall back to default if needed + if (!found) { + auto value = renderMaterial.shaderPackage.material_keys[j].default_value; + materialKeys.push_back(renderMaterial.shaderPackage.material_keys[j].default_value); + } } std::vector subviewKeys = {physis_shpk_crc("Default"), physis_shpk_crc("SUB_VIEW_MAIN")};