diff options
| -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 | 
