From 105f50478c84b0c14243da3d49479c65ec6ee040 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 28 Oct 2022 18:49:51 -0500 Subject: SL-18498 WIP -- Better handling of updates from server (don't null out overrides on updates from server unless material ID has changed) --- indra/newview/llviewerobject.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 7ebc92d84d..6fcad1a8c7 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -7153,6 +7153,13 @@ const LLUUID& LLViewerObject::getRenderMaterialID(U8 te) const void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool update_server) { + // implementation is delicate + + // if update is bound for server, should always null out GLTFRenderMaterial and GLTFMaterialOverride even if ids haven't changed + // (the case where ids haven't changed indicates the user has reapplied the original material, in which case overrides should be dropped) + // otherwise, should only null out where ids have changed + // (the case where ids have changed but overrides are still present is from unsynchronized updates from the simulator) + S32 start_idx = 0; S32 end_idx = getNumTEs(); @@ -7168,26 +7175,36 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat // update local state for (S32 te = start_idx; te < end_idx; ++te) { - // clear out any existing override data and render material - getTE(te)->setGLTFMaterialOverride(nullptr); - getTE(te)->setGLTFRenderMaterial(nullptr); + + LLGLTFMaterial* new_material = nullptr; + LLTextureEntry* tep = getTE(te); if (id.notNull()) { - getTE(te)->setGLTFMaterial(gGLTFMaterialList.getMaterial(id)); + new_material = gGLTFMaterialList.getMaterial(id); } - else + + bool material_changed = tep->getGLTFMaterial() != new_material; + + if (update_server || material_changed) + { + tep->setGLTFRenderMaterial(nullptr); + tep->setGLTFMaterialOverride(nullptr); + } + + if (new_material != tep->getGLTFMaterial()) { - getTE(te)->setGLTFMaterial(nullptr); + tep->setGLTFMaterial(new_material); } } + // signal to render pipe that render batches must be rebuilt for this object faceMappingChanged(); gPipeline.markTextured(mDrawable); if (update_server) { - // blank out any override data + // blank out any override data on the ser for (S32 te = start_idx; te < end_idx; ++te) { LLCoros::instance().launch("modifyMaterialCoro", -- cgit v1.2.3