diff options
author | cosmic-linden <111533034+cosmic-linden@users.noreply.github.com> | 2023-02-14 14:45:53 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-14 14:45:53 -0800 |
commit | 0dd4efea93ad96da3aab9030e3bfc78c36b2bb10 (patch) | |
tree | 26c5014e88f87a061cafb3d1a8e5fc340e29adee /indra/newview | |
parent | ba7a3339697a906119520e23064dac2d7a5f31ff (diff) | |
parent | 917932549fe40f02bf393f22ec1af12aa2245264 (diff) |
Merge pull request #85 from secondlife/SL-19002
SL-19002: Handle edge case in client networking which could cause material ID and overrides to become out-of-sync
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llpanelface.cpp | 29 | ||||
-rw-r--r-- | indra/newview/llselectmgr.cpp | 68 | ||||
-rw-r--r-- | indra/newview/llviewerobject.cpp | 35 |
3 files changed, 22 insertions, 110 deletions
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index ce086f2520..cb7bc7b5df 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -3825,34 +3825,12 @@ private: struct LLPanelFaceUpdateFunctor : public LLSelectedObjectFunctor { - LLPanelFaceUpdateFunctor(bool update_media, bool update_pbr) + LLPanelFaceUpdateFunctor(bool update_media) : mUpdateMedia(update_media) - , mUpdatePbr(update_pbr) {} virtual bool apply(LLViewerObject* object) { - if (mUpdatePbr) - { - // setRenderMaterialId is supposed to create it - LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)object->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL); - if (param_block) - { - if (param_block->isEmpty()) - { - object->setHasRenderMaterialParams(false); - } - else if (object->hasRenderMaterialParams()) - { - object->parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true); - } - else - { - object->setHasRenderMaterialParams(true); - } - } - } - object->sendTEUpdate(); if (mUpdateMedia) @@ -3867,7 +3845,6 @@ struct LLPanelFaceUpdateFunctor : public LLSelectedObjectFunctor } private: bool mUpdateMedia; - bool mUpdatePbr; }; struct LLPanelFaceNavigateHomeFunctor : public LLSelectedTEFunctor @@ -4003,7 +3980,7 @@ void LLPanelFace::onPasteColor() LLPanelFacePasteTexFunctor paste_func(this, PASTE_COLOR); selected_objects->applyToTEs(&paste_func); - LLPanelFaceUpdateFunctor sendfunc(false, false); + LLPanelFaceUpdateFunctor sendfunc(false); selected_objects->applyToObjects(&sendfunc); } @@ -4364,7 +4341,7 @@ void LLPanelFace::onPasteTexture() LLPanelFacePasteTexFunctor paste_func(this, PASTE_TEXTURE); selected_objects->applyToTEs(&paste_func); - LLPanelFaceUpdateFunctor sendfunc(true, true); + LLPanelFaceUpdateFunctor sendfunc(true); selected_objects->applyToObjects(&sendfunc); LLGLTFMaterialList::flushUpdates(); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 02e85d7470..55cf6795fe 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1941,12 +1941,6 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) asset_id = mItem->getAssetUUID(); } - if (asset_id.notNull() && !objectp->hasRenderMaterialParams()) - { - // make sure param section exists - objectp->setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, TRUE, false /*prevent an update*/); - } - // Blank out most override data on the object and send to server objectp->setRenderMaterialID(te, asset_id); @@ -1975,25 +1969,6 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) return false; } - LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)object->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL); - if (param_block) - { - // To not cause multiple competing request that modify - // same param field send update only once per object - if (param_block->isEmpty()) - { - object->setHasRenderMaterialParams(false); - } - else if (object->hasRenderMaterialParams()) - { - object->parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true); - } - else - { - object->setHasRenderMaterialParams(true); - } - } - if (!mItem) { // 1 particle effect per object @@ -2209,14 +2184,13 @@ void LLSelectMgr::selectionRevertGLTFMaterials() { // Restore base material LLUUID asset_id = nodep->mSavedGLTFMaterialIds[te]; - objectp->setRenderMaterialID(te, asset_id, false /*wait for bulk update*/); + // Update material locally + objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/); + objectp->setTEGLTFMaterialOverride(te, nodep->mSavedGLTFOverrideMaterials[te]); - // todo: make sure this does not cause race condition with setRenderMaterialID - // when we are reverting from null id to non null plus override - if (te < (S32)nodep->mSavedGLTFOverrideMaterials.size() - && nodep->mSavedGLTFOverrideMaterials[te].notNull() - && asset_id.notNull()) + // Enqueue update to server + if (asset_id.notNull()) { // Restore overrides LLGLTFMaterialList::queueModify(objectp, te, nodep->mSavedGLTFOverrideMaterials[te]); @@ -2232,38 +2206,6 @@ void LLSelectMgr::selectionRevertGLTFMaterials() } } setfunc(mSelectedObjects); getSelection()->applyToTEs(&setfunc); - - struct g : public LLSelectedObjectFunctor - { - virtual bool apply(LLViewerObject* object) - { - if (object && !object->permModify()) - { - return false; - } - - LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)object->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL); - if (param_block) - { - if (param_block->isEmpty()) - { - object->setHasRenderMaterialParams(false); - } - else if (object->hasRenderMaterialParams()) - { - object->parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true); - } - else - { - object->setHasRenderMaterialParams(true); - } - } - - object->sendTEUpdate(); - return true; - } - } sendfunc; - getSelection()->applyToObjects(&sendfunc); } void LLSelectMgr::selectionSetBumpmap(U8 bumpmap, const LLUUID &image_id) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 2d9614d5c3..e217ede067 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -6289,6 +6289,11 @@ void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL { if (local_origin) { + // *NOTE: Do not send the render material ID in this way as it will get + // out-of-sync with other sent client data. + // See LLViewerObject::setRenderMaterialID and LLGLTFMaterialList + llassert(param_type != LLNetworkData::PARAMS_RENDER_MATERIAL); + LLViewerRegion* regionp = getRegion(); if(!regionp) return; @@ -7245,18 +7250,6 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat }); } - if (update_server) - { - // update via ModifyMaterialParams cap (server will echo back changes) - for (S32 te = start_idx; te < end_idx; ++te) - { - // This sends a cleared version of this object's current material - // override, but the override should already be cleared due to - // calling setBaseMaterial above. - LLGLTFMaterialList::queueApply(this, te, id); - } - } - // predictively update LLRenderMaterialParams (don't wait for server) if (param_block) { // update existing parameter block @@ -7264,17 +7257,17 @@ void LLViewerObject::setRenderMaterialID(S32 te_in, const LLUUID& id, bool updat { param_block->setMaterial(te, id); } + } - if (update_server) + if (update_server) + { + // update via ModifyMaterialParams cap (server will echo back changes) + for (S32 te = start_idx; te < end_idx; ++te) { - // If 'in use' changes, it will send an update itself. - bool in_use_changed = setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, !param_block->isEmpty(), true); - - if (!in_use_changed) - { - // In use didn't change, but the parameter did, send an update - parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, param_block, !param_block->isEmpty(), true); - } + // This sends a cleared version of this object's current material + // override, but the override should already be cleared due to + // calling setBaseMaterial above. + LLGLTFMaterialList::queueApply(this, te, id); } } } |