From 2252feeef375e155f6bd301d430dabb1ba031144 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 27 May 2024 13:15:40 -0400 Subject: [PATCH] MDLPart: Add render material cache --- parts/mdl/mdlpart.cpp | 26 ++++++++++++++++++++++++-- parts/mdl/mdlpart.h | 3 +++ renderer/include/drawobject.h | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/parts/mdl/mdlpart.cpp b/parts/mdl/mdlpart.cpp index 65f17ff..709e493 100644 --- a/parts/mdl/mdlpart.cpp +++ b/parts/mdl/mdlpart.cpp @@ -92,11 +92,11 @@ void MDLPart::addModel(physis_MDL mdl, model.skinned = skinned; std::transform(materials.begin(), materials.end(), std::back_inserter(model.materials), [this](const physis_Material &mat) { - return createMaterial(mat); + return createOrCacheMaterial(mat); }); if (materials.empty()) { - model.materials.push_back(createMaterial(physis_Material{})); + model.materials.push_back(createOrCacheMaterial(physis_Material{})); } models.push_back(model); @@ -335,6 +335,28 @@ RenderMaterial MDLPart::createMaterial(const physis_Material &material) return newMaterial; } +RenderMaterial MDLPart::createOrCacheMaterial(const physis_Material &mat) +{ + auto hash = getMaterialHash(mat); + if (!renderMaterialCache.contains(hash)) { + renderMaterialCache[hash] = createMaterial(mat); + } + + return renderMaterialCache[hash]; +} + +uint64_t MDLPart::getMaterialHash(const physis_Material &mat) +{ + // TODO: this hash is terrible + uint64_t hash = strlen(mat.shpk_name); + hash += mat.num_constants; + hash += mat.num_samplers; + hash += mat.num_shader_keys; + hash += mat.num_textures; + + return hash; +} + void MDLPart::calculateBoneInversePose(physis_Skeleton &skeleton, physis_Bone &bone, physis_Bone *parent_bone) { const glm::mat4 parentMatrix = parent_bone == nullptr ? glm::mat4(1.0f) : boneData[parent_bone->index].inversePose; diff --git a/parts/mdl/mdlpart.h b/parts/mdl/mdlpart.h index 6268783..ca6d51f 100644 --- a/parts/mdl/mdlpart.h +++ b/parts/mdl/mdlpart.h @@ -89,6 +89,8 @@ protected: private: RenderMaterial createMaterial(const physis_Material &mat); + RenderMaterial createOrCacheMaterial(const physis_Material &mat); + uint64_t getMaterialHash(const physis_Material &mat); void calculateBoneInversePose(physis_Skeleton &skeleton, physis_Bone &bone, physis_Bone *parent_bone); void calculateBone(physis_Skeleton &skeleton, physis_Bone &bone, const physis_Bone *parent_bone); @@ -97,6 +99,7 @@ private: FileCache &cache; std::vector models; + std::unordered_map renderMaterialCache; RenderManager *renderer = nullptr; VulkanWindow *vkWindow = nullptr; diff --git a/renderer/include/drawobject.h b/renderer/include/drawobject.h index b5d8cea..81c1ff6 100644 --- a/renderer/include/drawobject.h +++ b/renderer/include/drawobject.h @@ -18,7 +18,7 @@ enum class MaterialType { Object, Skin }; struct RenderMaterial { physis_Material mat; MaterialType type = MaterialType::Object; - physis_SHPK shaderPackage; + physis_SHPK shaderPackage{}; std::optional diffuseTexture; std::optional normalTexture;