Skip to content
Snippets Groups Projects
Commit f2b02613 authored by tonyasouther's avatar tonyasouther
Browse files

Don't send a materials update to the sim until the previous one has been acknowledged.

parent a91b231b
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -116,7 +116,20 @@ class LLPanelFace : public LLPanel
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment