diff options
author | Oz Linden <oz@lindenlab.com> | 2013-02-06 15:57:24 -0500 |
---|---|---|
committer | Oz Linden <oz@lindenlab.com> | 2013-02-06 15:57:24 -0500 |
commit | a5cfd935d389fa6b734e625b24d9f43cf91d02ce (patch) | |
tree | cc49b6ca184ffb56d2cb7106e813a337352f8c19 | |
parent | 170ecf5e8a771c8dd629cae0715ab243edea1171 (diff) | |
parent | f2b026138d5abe5464de6db349b3431c262de53a (diff) |
merge fix to defer server updates
-rw-r--r-- | indra/newview/llpanelface.cpp | 93 | ||||
-rw-r--r-- | indra/newview/llpanelface.h | 15 |
2 files changed, 99 insertions, 9 deletions
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index e0f9ec9b99..7b3bbf8b3b 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -257,7 +257,9 @@ LLPanelFace::LLPanelFace() : LLPanel(), mMaterialID(LLMaterialID::null), mMaterial(LLMaterialPtr()), - mIsAlpha(FALSE) + mIsAlpha(false), + mUpdateInFlight(false), + mUpdatePending(false) { } @@ -1140,6 +1142,13 @@ void LLPanelFace::getState() llinfos << "Requesting material ID " << mMaterialID.asString() << llendl; LLMaterialMgr::getInstance()->get(objectp->getRegion()->getRegionID(),mMaterialID,boost::bind(&LLPanelFace::onMaterialLoaded, this, _1, _2)); } + if (mUpdatePending && !mUpdateInFlight) + { + // One or more updates are pending, and the + // previous one has been acknowledged. Send + // the pending updates. + updateMaterial(); + } } // Set variable values for numeric expressions @@ -1206,6 +1215,9 @@ void LLPanelFace::refresh() void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMaterialPtr material) { mMaterial = material; + // We've gotten a materials update, so the sim's ready for another. + mUpdateInFlight = false; + // Alpha LLCtrlSelectionInterface* combobox_alphamode = childGetSelectionInterface("combobox alphamode"); @@ -1278,6 +1290,11 @@ void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMate void LLPanelFace::updateMaterial() { + if (mUpdateInFlight) + { + LL_WARNS("Materials") << "Attempt to update material while a previous update is pending ignored." << LL_ENDL; + return; + } LLComboBox* comboAlphaMode = getChild<LLComboBox>("combobox alphamode"); LLComboBox* comboBumpiness = getChild<LLComboBox>("combobox bumpiness"); LLComboBox* comboShininess = getChild<LLComboBox>("combobox shininess"); @@ -1336,6 +1353,10 @@ void LLPanelFace::updateMaterial() mMaterial->setAlphaMaskCutoff((U8)(getChild<LLUICtrl>("maskcutoff")->getValue().asInteger())); llinfos << "Updating material: " << mMaterial->asLLSD() << llendl; LLSelectMgr::getInstance()->selectionSetMaterial( *mMaterial ); + + // We've sent an update. Need to hold off on any more until + // the sim acknowledges this one. + mUpdateInFlight = true; } else { @@ -1346,8 +1367,15 @@ void LLPanelFace::updateMaterial() mMaterial.reset(); mMaterialID = LLMaterialID::null; // Delete existing material entry... + + // Hold off any further updates till this one's + // acknowledged. + //mUpdateInFlight = true; } } + + // We've taken care of the update, so clear the update pending flag. + mUpdatePending = false; } // @@ -1368,7 +1396,14 @@ void LLPanelFace::onCommitColor(const LLSD& data) void LLPanelFace::onCommitShinyColor(const LLSD& data) { - updateMaterial(); + if (!mUpdateInFlight) + { + updateMaterial(); + } + else + { + mUpdatePending = true; + } } void LLPanelFace::onCommitAlpha(const LLSD& data) @@ -1531,7 +1566,14 @@ void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata) { LLPanelFace* self = (LLPanelFace*) userdata; self->sendShiny(); - self->updateMaterial(); + if (!self->mUpdateInFlight) + { + self->updateMaterial(); + } + else + { + self->mUpdatePending = true; + } } // static @@ -1554,7 +1596,14 @@ void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata) { LLPanelFace* self = (LLPanelFace*) userdata; updateAlphaControls(ctrl,userdata); - self->updateMaterial(); + if (!self->mUpdateInFlight) + { + self->updateMaterial(); + } + else + { + self->mUpdatePending = true; + } } // static @@ -1608,25 +1657,53 @@ void LLPanelFace::onSelectTexture(const LLSD& data) void LLPanelFace::onCommitMaterialTexture( const LLSD& data ) { - updateMaterial(); + if (!mUpdateInFlight) + { + updateMaterial(); + } + else + { + mUpdatePending = true; + } } void LLPanelFace::onCancelMaterialTexture(const LLSD& data) { // not sure what to do here other than - updateMaterial(); + if (!mUpdateInFlight) + { + updateMaterial(); + } + else + { + mUpdatePending = true; + } } void LLPanelFace::onSelectMaterialTexture(const LLSD& data) { - updateMaterial(); + if (!mUpdateInFlight) + { + updateMaterial(); + } + else + { + mUpdatePending = true; + } } //static void LLPanelFace::onCommitMaterial(LLUICtrl* ctrl, void* userdata) { LLPanelFace* self = (LLPanelFace*) userdata; - self->updateMaterial(); + if (!self->mUpdateInFlight) + { + self->updateMaterial(); + } + else + { + self->mUpdatePending = true; + } } // static diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 62aa632821..e83a03b0ae 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -116,7 +116,20 @@ private: LLMaterialID mMaterialID; LLMaterialPtr mMaterial; - BOOL mIsAlpha; + bool mIsAlpha; + + /* These variables interlock processing of materials updates sent to + * the sim. mUpdateInFlight is set to flag that an update has been + * sent to the sim and not acknowledged yet, and cleared when an + * update is received from the sim. mUpdatePending is set when + * there's an update in flight and another UI change has been made + * that needs to be sent as a materials update, and cleared when the + * update is sent. This prevents the sim from getting spammed with + * update messages when, for example, the user holds down the + * up-arrow on a spinner, and avoids running afoul of its throttle. + */ + bool mUpdateInFlight; + bool mUpdatePending; }; #endif |