From 3f6102bc0627b17b4e69c5a137ad5675ca53b604 Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Fri, 18 Apr 2025 20:25:25 +1000 Subject: [PATCH] Hide and restore GLTF material depending if on the BP or PBR tab to fix visual issues. --- indra/newview/fspanelface.cpp | 13 +++-- indra/newview/llface.cpp | 7 --- indra/newview/llselectmgr.cpp | 89 ++++++++++++++++++++++++++++++++ indra/newview/llselectmgr.h | 2 + indra/newview/llviewerobject.cpp | 33 ++++++++++++ indra/newview/llviewerobject.h | 14 +++++ indra/newview/llvovolume.cpp | 16 ------ 7 files changed, 148 insertions(+), 26 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 41e88c9b8b..8ff008372c 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -732,9 +732,6 @@ void FSPanelFace::onMatTabChange() static S32 last_mat = -1; if( auto curr_mat = getCurrentMaterialType(); curr_mat != last_mat ) { - // Fixes some UI desync - updateUI(true); - LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(); LLViewerObject* objectp = node ? node->getObject() : NULL; if(objectp) @@ -760,6 +757,16 @@ void FSPanelFace::onMatTabChange() } } } + + // Since we allow both PBR and BP textures to be applied at the same time, + // we need to hide or show the GLTF material only locally based on the current tab. + if (curr_mat != MATMEDIA_PBR) + LLSelectMgr::getInstance()->hideGLTFMaterial(); + else + LLSelectMgr::getInstance()->showGLTFMaterial(); + + // Fixes some UI desync + updateUI(true); } } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index bc3c2faa6c..ca997ff7aa 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1462,13 +1462,6 @@ bool LLFace::getGeometryVolume(const LLVolume& volume, // LLMaterial* mat = tep->getMaterialParams().get(); LLMaterial* mat = tep ? tep->getMaterialParams().get() : 0; // - // show legacy when editing the fallback materials. - static LLCachedControl showSelectedinBP(gSavedSettings, "FSShowSelectedInBlinnPhong"); - if( gltf_mat && getViewerObject()->isSelected() && showSelectedinBP ) - { - gltf_mat = nullptr; - } - // F32 r = 0, os = 0, ot = 0, ms = 0, mt = 0, cos_ang = 0, sin_ang = 0; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index ed1e92670e..551dd63728 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6236,6 +6236,13 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data // might need to be moved to LLGLTFMaterialOverrideDispatchHandler node->saveGLTFMaterials(material_ids, override_materials); } + + // [FIRE-35138] Show or hide the GLTF Material based on showSelectedinBP + static LLCachedControl showSelectedinBP(gSavedSettings, "FSShowSelectedInBlinnPhong"); + if (showSelectedinBP) + LLSelectMgr::instance().hideGLTFMaterial(); + else + LLSelectMgr::instance().showGLTFMaterial(); } node->mValid = true; @@ -9074,6 +9081,88 @@ bool LLSelectMgr::selectGetNoIndividual() } // +// [FIRE-35138] Hide the GLTF Material since we are currently in BP +void LLSelectMgr::hideGLTFMaterial() +{ + struct f : public LLSelectedObjectFunctor + { + f() {} + bool apply(LLViewerObject* objectp) + { + if (!objectp || !objectp->permModify()) + { + return false; + } + + // Save the current GLTF materials so they can be restored later + objectp->saveGLTFMaterials(); + + for (S32 te = 0; te < objectp->getNumTEs(); ++te) + { + // Blank out most override data on the object and don't send to server + objectp->setRenderMaterialID(te, LLUUID(), false); + } + + return true; + } + }; + f setfunc; + getSelection()->applyToObjects(&setfunc); +} +// + +// [FIRE-35138] Show the GLTF Material since we are no longer in BP +void LLSelectMgr::showGLTFMaterial() +{ + struct f : public LLSelectedObjectFunctor + { + f() {} + bool apply(LLViewerObject* objectp) + { + if (!objectp || !objectp->permModify()) + { + return false; + } + + const uuid_vec_t& saved_gltf_material_ids = objectp->getSavedGLTFMaterialIds(); + const gltf_materials_vec_t& saved_gltf_override_materials = objectp->getSavedGLTFOverrideMaterials(); + + if (saved_gltf_material_ids.empty()) + { + return false; + } + + for (S32 te = 0; te < objectp->getNumTEs(); ++te) + { + if (te >= saved_gltf_material_ids.size()) + { + LL_WARNS("FS") << "TE index out of bounds for saved GLTF materials" << LL_ENDL; + break; + } + + // Restore gltf material + LLUUID asset_id = saved_gltf_material_ids[te]; + LLGLTFMaterial* material = saved_gltf_override_materials[te]; + + // Update material locally + objectp->setRenderMaterialID(te, asset_id, false); + if (material) + { + material = new LLGLTFMaterial(*material); + objectp->setTEGLTFMaterialOverride(te, material); + } + + // Do not enqueue update to server + } + + objectp->clearSavedGLTFMaterials(); + return true; + } + } setfunc; + getSelection()->applyToObjects(&setfunc); +} +// + template<> bool LLCheckIdenticalFunctor::same(const F32& a, const F32& b, const F32& tolerance) { diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 0ce33d597f..6a8c3d255c 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -1024,6 +1024,8 @@ public: // (edit linked parts, select face) bool selectGetNoIndividual(); // + void showGLTFMaterial(); // [FIRE-35138] Show the GLTF Material since we are no longer in BP + void hideGLTFMaterial(); // [FIRE-35138] Hide the GLTF Material since we are currently in BP }; // *DEPRECATED: For callbacks or observers, use diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 146add2a3a..01b2f2aacb 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -7881,6 +7881,39 @@ void LLViewerObject::setRenderMaterialIDs(const LLUUID& id) setRenderMaterialID(-1, id); } +// [FIRE-35138] Helpers for GLTF Materials since we support PBR and BP at same time +void LLViewerObject::saveGLTFMaterials() +{ + if (!mSavedGLTFMaterialIds.empty()) + { + // Already saved, no need to do it again + return; + } + + for (S32 te = 0; te < getNumTEs(); ++te) + { + mSavedGLTFMaterialIds.emplace_back(getRenderMaterialID(te)); + + LLPointer old_override = getTE(te)->getGLTFMaterialOverride(); + if (old_override.notNull()) + { + LLGLTFMaterial* copy = new LLGLTFMaterial(*old_override); + mSavedGLTFOverrideMaterials.emplace_back(copy); + } + else + { + mSavedGLTFOverrideMaterials.emplace_back(nullptr); + } + } +} + +void LLViewerObject::clearSavedGLTFMaterials() +{ + mSavedGLTFMaterialIds.clear(); + mSavedGLTFOverrideMaterials.clear(); +} +// + void LLViewerObject::setRenderMaterialIDs(const LLRenderMaterialParams* material_params, bool local_origin) { if (!local_origin) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 515aca63f2..d0f973f196 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -100,6 +100,9 @@ typedef void (*inventory_callback)(LLViewerObject*, S32 serial_num, void*); +// [FIRE-35138] typedef for saved GLTF override materials +typedef std::vector > gltf_materials_vec_t; + // for exporting textured materials from SL struct LLMaterialExportInfo { @@ -135,6 +138,10 @@ protected: LLNetworkData *data; }; std::unordered_map mExtraParameterList; + // [FIRE-35138] Saved GLTF materials to be restored when needed + uuid_vec_t mSavedGLTFMaterialIds; + gltf_materials_vec_t mSavedGLTFOverrideMaterials; + // public: typedef std::list > child_list_t; @@ -204,6 +211,13 @@ public: void setRenderMaterialID(S32 te, const LLUUID& id, bool update_server = true, bool local_origin = true); void setRenderMaterialIDs(const LLUUID& id); + // [FIRE-35138] Helpers for GLTF Materials since we support PBR and BP at same time + const uuid_vec_t& getSavedGLTFMaterialIds() const { return mSavedGLTFMaterialIds; }; + const gltf_materials_vec_t& getSavedGLTFOverrideMaterials() const { return mSavedGLTFOverrideMaterials; }; + void saveGLTFMaterials(); + void clearSavedGLTFMaterials(); + // + virtual bool isHUDAttachment() const { return false; } virtual bool isTempAttachment() const; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index a6f4deb688..5144f95101 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5663,14 +5663,6 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, auto* gltf_mat = (LLFetchedGLTFMaterial*)te->getGLTFRenderMaterial(); llassert(gltf_mat == nullptr || dynamic_cast(te->getGLTFRenderMaterial()) != nullptr); - // show legacy when editing the fallback materials. - static LLCachedControl showSelectedinBP(gSavedSettings, "FSShowSelectedInBlinnPhong"); - if( gltf_mat && facep->getViewerObject()->isSelected() && showSelectedinBP ) - { - gltf_mat = nullptr; - } - // - if (gltf_mat != nullptr) { mat_id = gltf_mat->getHash(); // TODO: cache this hash @@ -6881,14 +6873,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace const LLTextureEntry* te = facep->getTextureEntry(); LLGLTFMaterial* gltf_mat = te->getGLTFRenderMaterial(); - // show legacy when editing the fallback materials. - static LLCachedControl showSelectedinBP(gSavedSettings, "FSShowSelectedInBlinnPhong"); - if( gltf_mat && facep->getViewerObject()->isSelected() && showSelectedinBP ) - { - gltf_mat = nullptr; - } - // - if (hud_group && gltf_mat == nullptr) { //all hud attachments are fullbright fullbright = true;