diff options
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 9 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llviewerobject.cpp | 22 | ||||
| -rwxr-xr-x | indra/newview/llviewerobject.h | 1 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.cpp | 56 | 
5 files changed, 80 insertions, 10 deletions
| diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 30b6169b46..d817f10aee 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3250,6 +3250,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 3fb470ef14..b63e883426 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -206,6 +206,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/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 6df5fab42b..310ff47cf5 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); +				}  			}  		}  	} | 
