diff options
| -rwxr-xr-x | autobuild.xml | 4 | ||||
| -rwxr-xr-x | indra/llui/llfloater.cpp | 13 | ||||
| -rwxr-xr-x | indra/llui/llfloater.h | 2 | ||||
| -rwxr-xr-x | indra/llui/llpanel.cpp | 4 | ||||
| -rwxr-xr-x | indra/llui/llpanel.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 9 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llfloatersidepanelcontainer.cpp | 15 | ||||
| -rwxr-xr-x | indra/newview/llfloatersidepanelcontainer.h | 3 | ||||
| -rwxr-xr-x | indra/newview/llsidepanelappearance.cpp | 10 | ||||
| -rwxr-xr-x | indra/newview/llviewerobject.cpp | 22 | ||||
| -rwxr-xr-x | indra/newview/llviewerobject.h | 1 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.cpp | 56 | 
13 files changed, 116 insertions, 27 deletions
| diff --git a/autobuild.xml b/autobuild.xml index 06a70ea5ed..7cf6e23386 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1291,9 +1291,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>df8857aeb5f44dfd95f9f9f57814423a</string> +              <string>ddd6a49dd5bbb76216f73feafa26e65c</string>                <key>url</key> -              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearanceutility-source/rev/275707/arch/Linux/installer/llappearanceutility_source-0.1-linux-20130511.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearanceutility-source/rev/276989/arch/Linux/installer/llappearanceutility_source-0.1-linux-20130605.tar.bz2</string>              </map>              <key>name</key>              <string>linux</string> diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index ae4961559e..93eca8b62e 100755 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -704,9 +704,9 @@ void LLFloater::openFloater(const LLSD& key)  	dirtyRect();  } -void LLFloater::verifyClose() +void LLFloater::verifyClose( bool app_quitting )  { -	LLPanel::handleCloseConfirmation(); +	LLPanel::handleCloseConfirmation( app_quitting );  }  void LLFloater::closeFloater(bool app_quitting) @@ -717,16 +717,21 @@ void LLFloater::closeFloater(bool app_quitting)  	{  		if ( mVerifyUponClose && !mForceCloseAfterVerify )  		{ + +			llinfos<<"prep#dogshit1"<<llendl;  			onClose( app_quitting );  			if ( mForceCloseAfterVerify )   			{			 + +				llinfos<<"prep#dogshit1b"<<llendl;  				return;  			}			  		}  	}	  	if (app_quitting) -	{ +	{	 +		llinfos<<"prep#dogshit2"<<llendl;  		LLFloater::sQuitting = true;  	} @@ -2659,7 +2664,7 @@ void LLFloaterView::closeAllChildren(bool app_quitting)  		{  			if ( floaterp->mVerifyUponClose )  			{			 -				floaterp->verifyClose(); +				floaterp->verifyClose(app_quitting);  			}  			else  			{ diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index bf71b527b3..8eb40ddd0b 100755 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -225,7 +225,7 @@ public:  	// If allowed, close the floater cleanly, releasing focus.  	virtual void	closeFloater(bool app_quitting = false); -	virtual void	verifyClose(); +	virtual void	verifyClose( bool app_quitting = false );  	// Close the floater or its host. Use when hidding or toggling a floater instance.  	virtual void	closeHostedFloater(); diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 7b7920f866..b0bdbcb7d1 100755 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -354,11 +354,11 @@ void LLPanel::handleVisibilityChange ( BOOL new_visibility )  } -void LLPanel::handleCloseConfirmation( ) +void LLPanel::handleCloseConfirmation( bool app_quitting)  {	  	if (mCloseConfirmationSignal)  	{ -		(*mCloseConfirmationSignal)(this, LLSD() );  +		(*mCloseConfirmationSignal)(this, LLSD( app_quitting ) );   	}  }  void LLPanel::setFocus(BOOL b) diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index d48fab6dd9..02f8c0aba7 100755 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -116,7 +116,7 @@ public:  	/*virtual*/ void	draw();	  	/*virtual*/ BOOL	handleKeyHere( KEY key, MASK mask );  	/*virtual*/ void 	handleVisibilityChange ( BOOL new_visibility ); -				void	handleCloseConfirmation( ); +				void	handleCloseConfirmation( bool app_quitting );  	// From LLFocusableElement diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 646b2d18dd..722587ec0e 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3276,6 +3276,15 @@ void LLAppearanceMgr::incrementCofVersion(LLHTTPClient::ResponderPtr responder_p  	LLHTTPClient::get(url, body, responder_ptr, headers, 30.0f);  } +U32 LLAppearanceMgr::getNumAttachmentsInCOF() +{ +	const LLUUID cof = getCOF(); +	LLInventoryModel::item_array_t obj_items; +	getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT); +	return obj_items.size(); +} + +  std::string LLAppearanceMgr::getAppearanceServiceURL() const  {  	if (gSavedSettings.getString("DebugAvatarAppearanceServiceURLOverride").empty()) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 97f3283818..9eb26767c4 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -208,6 +208,8 @@ public:  	void incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr = NULL); +	U32 getNumAttachmentsInCOF(); +  	// *HACK Remove this after server side texture baking is deployed on all sims.  	void incrementCofVersionLegacy(); diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 13a9ba1695..02216420da 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -40,7 +40,8 @@  const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel");  LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const Params& params) -:	LLFloater(key, params) +: LLFloater(key, params) +, mAppQuiting( false )  {  	// Prevent transient floaters (e.g. IM windows) from hiding  	// when this floater is clicked. @@ -56,7 +57,8 @@ BOOL LLFloaterSidePanelContainer::postBuild()  }  void  LLFloaterSidePanelContainer::onConfirmationClose( const LLSD &confirm ) -{	 +{ +	mAppQuiting = confirm.asBoolean();  	onClickCloseBtn();  } @@ -69,10 +71,12 @@ LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer()  void LLFloaterSidePanelContainer::onOpen(const LLSD& key)  {  	getChild<LLPanel>(sMainPanelName)->onOpen(key); +	mAppQuiting = false;  } -void LLFloaterSidePanelContainer::onClose(bool app_quitting) -{		 -	mForceCloseAfterVerify = true;  		 + +void LLFloaterSidePanelContainer::onClose( bool app_quitting ) +{ +	if (! mAppQuiting ) { mForceCloseAfterVerify = true; }  	LLSidepanelAppearance* panel = getSidePanelAppearance();  	if ( panel )  	{		 @@ -80,6 +84,7 @@ void LLFloaterSidePanelContainer::onClose(bool app_quitting)  		panel->onCloseFromAppearance( this );			  	}  } +  void LLFloaterSidePanelContainer::onClickCloseBtn()  {  	LLSidepanelAppearance* panel = getSidePanelAppearance(); diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index dc85570f7e..b276821805 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -89,6 +89,9 @@ public:  private:  	LLSidepanelAppearance* getSidePanelAppearance(); + +public:  +	bool mAppQuiting;  };  #endif // LL_LLFLOATERSIDEPANELCONTAINER_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 70da576c83..775c148ea1 100755 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -151,11 +151,17 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica  		toggleWearableEditPanel(FALSE);	  		showOutfitEditPanel();  		LLVOAvatarSelf::onCustomizeEnd( FALSE );	 -		mRevertSet = true; +		if ( !mLLFloaterSidePanelContainer->mAppQuiting )  +		{ +			mRevertSet = true; 			 +		} +		else +		{ +			mLLFloaterSidePanelContainer->closeFloater( true ); +		}  		return false;  	}  	mLLFloaterSidePanelContainer->mForceCloseAfterVerify = false; -	//mRevertSet = true;  	return false;  } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 064e96e394..63de1ab77a 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5038,6 +5038,28 @@ void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)  	}  } +BOOL LLViewerObject::isDrawableState(U32 state, BOOL recursive) const +{ +	BOOL matches = FALSE; +	if (mDrawable) +	{ +		matches = mDrawable->isState(state); +	} +	if (recursive) +	{ +		for (child_list_t::const_iterator iter = mChildList.begin(); +			 (iter != mChildList.end()) && matches; iter++) +		{ +			LLViewerObject* child = *iter; +			matches &= child->isDrawableState(state, recursive); +		} +	} + +	return matches; +} + + +  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  // RN: these functions assume a 2-level hierarchy   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 316dbce7d0..0390cbc5b0 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -394,6 +394,7 @@ public:  	void setDrawableState(U32 state, BOOL recursive = TRUE);  	void clearDrawableState(U32 state, BOOL recursive = TRUE); +	BOOL isDrawableState(U32 state, BOOL recursive = TRUE) const;  	// Called when the drawable shifts  	virtual void onShift(const LLVector4a &shift_vector)	{ } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1dbcabf2b3..4593541f35 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5220,24 +5220,60 @@ void LLVOAvatar::computeBodySize()  	LLAvatarAppearance::computeBodySize();  	// Certain configurations of avatars can force the overall height (with offset) to go negative. -	// Enforce a constraint to make sure we don't go below 0.1 meters. +	// Enforce a constraint to make sure we don't go below 1.1 meters (server-enforced limit)  	// Camera positioning and other things start to break down when your avatar is "walking" while being fully underground +	const LLViewerObject * last_object = NULL;  	if (isSelf() && getWearableData() && isFullyLoaded() && !LLApp::isQuitting())  	{ -		LLViewerWearable* shape = (LLViewerWearable*)getWearableData()->getWearable(LLWearableType::WT_SHAPE, 0); -		if (shape && !shape->getVolitile())  +		// Do not force a hover parameter change while we have pending attachments, which may be mesh-based with  +		// joint offsets. +		if (LLAppearanceMgr::instance().getNumAttachmentsInCOF() == getNumAttachments())  		{ -			F32 hover_value = shape->getVisualParamWeight(AVATAR_HOVER); -			if (hover_value < 0.0f && (mBodySize.mV[VZ] + hover_value < 1.1f)) +			LLViewerWearable* shape = (LLViewerWearable*)getWearableData()->getWearable(LLWearableType::WT_SHAPE, 0); +			BOOL loaded = TRUE; +			for (attachment_map_t::const_iterator points_iter = mAttachmentPoints.begin(); +				 points_iter != mAttachmentPoints.end() && loaded; +				 ++points_iter)  			{ -				hover_value = -(mBodySize.mV[VZ] - 1.1f); // avoid floating point rounding making the above check continue to fail. -				llassert(mBodySize.mV[VZ] + hover_value >= 1.1f); +				const LLViewerJointAttachment *attachment_pt = (*points_iter).second; +				if (attachment_pt)  +				{ +					for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator attach_iter = attachment_pt->mAttachedObjects.begin(); attach_iter != attachment_pt->mAttachedObjects.end(); attach_iter++)  +					{ +						const LLViewerObject* object = (LLViewerObject*)*attach_iter; +						if (object)  +						{ +							last_object = object; +							llwarns << "attachment at point: " << (*points_iter).first << " object exists: " << object->getAttachmentItemID() << llendl; +							loaded &=!object->isDrawableState(LLDrawable::REBUILD_ALL); +							if (!loaded && shape && !shape->getVolitile())  +							{ +								llwarns << "caught unloaded attachment! skipping enforcement" << llendl; +							} +						} +					} +				} +			} -				hover_value =  llmin(hover_value, 0.0f); // don't force the hover value to be greater than 0. +			if (last_object)  +			{ +				LL_DEBUGS("Avatar") << "scanned at least one object!"  << LL_ENDL; +			} +			if (loaded && shape && !shape->getVolitile())  +			{ +				F32 hover_value = shape->getVisualParamWeight(AVATAR_HOVER); +				if (hover_value < 0.0f && (mBodySize.mV[VZ] + hover_value < 1.1f)) +				{ +					hover_value = -(mBodySize.mV[VZ] - 1.1f); // avoid floating point rounding making the above check continue to fail. +					llassert(mBodySize.mV[VZ] + hover_value >= 1.1f); + +					hover_value =  llmin(hover_value, 0.0f); // don't force the hover value to be greater than 0. -				mAvatarOffset.mV[VZ] = hover_value; -				shape->setVisualParamWeight(AVATAR_HOVER,hover_value, FALSE); +					LL_DEBUGS("Avatar") << "changed hover value to: " << hover_value << " from: " << mAvatarOffset.mV[VZ] << LL_ENDL; +					mAvatarOffset.mV[VZ] = hover_value; +					shape->setVisualParamWeight(AVATAR_HOVER,hover_value, FALSE); +				}  			}  		}  	} | 
