summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorcosmic-linden <111533034+cosmic-linden@users.noreply.github.com>2023-02-14 14:45:53 -0800
committerGitHub <noreply@github.com>2023-02-14 14:45:53 -0800
commit0dd4efea93ad96da3aab9030e3bfc78c36b2bb10 (patch)
tree26c5014e88f87a061cafb3d1a8e5fc340e29adee /indra/newview
parentba7a3339697a906119520e23064dac2d7a5f31ff (diff)
parent917932549fe40f02bf393f22ec1af12aa2245264 (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.cpp29
-rw-r--r--indra/newview/llselectmgr.cpp68
-rw-r--r--indra/newview/llviewerobject.cpp35
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);
}
}
}