summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTonya Souther <tonya.souther@gmail.com>2013-02-05 03:30:56 -0600
committerTonya Souther <tonya.souther@gmail.com>2013-02-05 03:30:56 -0600
commitf2b026138d5abe5464de6db349b3431c262de53a (patch)
treee95673bf308fb4469d9f02c01e6bf6bea4764172
parenta91b231bfeb07fbfb123ce11e863941e311fc0f3 (diff)
Don't send a materials update to the sim until the previous one has been acknowledged.
-rw-r--r--indra/newview/llpanelface.cpp93
-rw-r--r--indra/newview/llpanelface.h15
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