diff options
26 files changed, 269 insertions, 166 deletions
| @@ -60,3 +60,4 @@ glob:indra/newview/teleport_history.txt  glob:indra/newview/search_history.txt  glob:indra/newview/filters.xml  glob:indra/newview/avatar_icons_cache.txt +glob:indra/newview/avatar_lad.log diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index 40a9752268..27c0c0b640 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -389,27 +389,6 @@ void LLCharacter::clearVisualParamWeights()  }  //----------------------------------------------------------------------------- -// BOOL visualParamWeightsAreDefault() -//----------------------------------------------------------------------------- -BOOL LLCharacter::visualParamWeightsAreDefault() -{ -	for (LLVisualParam *param = getFirstVisualParam();  -		param; -		param = getNextVisualParam()) -	{ -		if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) -		{ -			if (param->getWeight() != param->getDefaultWeight()) -				return false; -		} -	} - -	return true; -} - - - -//-----------------------------------------------------------------------------  // getVisualParam()  //-----------------------------------------------------------------------------  LLVisualParam*	LLCharacter::getVisualParam(const char *param_name) diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index 27e2a51c62..cac73c01b9 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -212,12 +212,9 @@ public:  	F32 getVisualParamWeight(const char* param_name);  	F32 getVisualParamWeight(S32 index); -	// set all morph weights to 0 +	// set all morph weights to defaults  	void clearVisualParamWeights(); -	// see if all the weights are default -	BOOL visualParamWeightsAreDefault(); -  	// visual parameter accessors  	LLVisualParam*	getFirstVisualParam()  	{ @@ -231,6 +228,21 @@ public:  		return (mCurIterator++)->second;  	} +	S32 getVisualParamCountInGroup(const EVisualParamGroup group) const +	{ +		S32 rtn = 0; +		for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); +		     iter != mVisualParamIndexMap.end(); +		     /**/ ) +		{ +			if ((iter++)->second->getGroup() == group) +			{ +				++rtn; +			} +		} +		return rtn; +	} +  	LLVisualParam*	getVisualParam(S32 id) const  	{  		visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(id); diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp index 297322fe58..703fe2f9cc 100644 --- a/indra/llcharacter/llvisualparam.cpp +++ b/indra/llcharacter/llvisualparam.cpp @@ -284,7 +284,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake)  void LLVisualParam::setNextParam( LLVisualParam *next )  {  	llassert(!mNext); - +	llassert(getWeight() == getDefaultWeight()); // need to establish mNext before we start changing values on this, else initial value won't get mirrored (we can fix that, but better to forbid this pattern)  	mNext = next;  } diff --git a/indra/llrender/llrendersphere.cpp b/indra/llrender/llrendersphere.cpp index e22b753923..212963f270 100644 --- a/indra/llrender/llrendersphere.cpp +++ b/indra/llrender/llrendersphere.cpp @@ -68,45 +68,6 @@ void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks)  } -// lat = 0 is Z-axis -// lon = 0, lat = 90 at X-axis -void lat2xyz(LLVector3 * result, F32 lat, F32 lon) -{ -	// Convert a latitude and longitude to x,y,z on a normal sphere and return it in result -	F32 r; -	result->mV[VX] = (F32) (cos(lon * DEG_TO_RAD) * sin(lat * DEG_TO_RAD)); -	result->mV[VY] = (F32) (sin(lon * DEG_TO_RAD) * sin(lat * DEG_TO_RAD)); -	r = (F32) pow(result->mV[VX] * result->mV[VX] + result->mV[VY] * result->mV[VY], 0.5f); -	if (r == 1.0f)  -	{ -		result->mV[VZ] = 0.0f; -	} -	else -	{ -		result->mV[VZ] = (F32) pow(1 - r*r, 0.5f); -		if (lat > 90.01) -		{ -			result->mV[VZ] *= -1.0; -		} -	} -} - -void lat2xyz_rad(LLVector3 * result, F32 lat, F32 lon) -{ -	// Convert a latitude and longitude to x,y,z on a normal sphere and return it in result -	F32 r; -	result->mV[VX] = (F32) (cos(lon) * sin(lat)); -	result->mV[VY] = (F32) (sin(lon) * sin(lat)); -	r = (F32) pow(result->mV[VX] * result->mV[VX] + result->mV[VY] * result->mV[VY], 0.5f); -	if (r == 1.0f)  -		result->mV[VZ] = 0.0f; -	else -	{ -		result->mV[VZ] = (F32) pow(1 - r*r, 0.5f); -		if (lat > F_PI_BY_TWO) result->mV[VZ] *= -1.0; -	} -} -  // A couple thoughts on sphere drawing:  // 1) You need more slices than stacks, but little less than 2:1  // 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother @@ -181,3 +142,50 @@ void LLRenderSphere::render()  {  	glCallList(mDList[0]);  } + +inline LLVector3 polar_to_cart(F32 latitude, F32 longitude) +{ +	return LLVector3(sin(F_TWO_PI * latitude) * cos(F_TWO_PI * longitude), +					 sin(F_TWO_PI * latitude) * sin(F_TWO_PI * longitude), +					 cos(F_TWO_PI * latitude)); +} + + +void LLRenderSphere::renderGGL() +{ +	S32 const LATITUDE_SLICES = 20; +	S32 const LONGITUDE_SLICES = 30; + +	if (mSpherePoints.empty()) +	{ +		mSpherePoints.resize(LATITUDE_SLICES + 1); +		for (S32 lat_i = 0; lat_i < LATITUDE_SLICES + 1; lat_i++) +		{ +			mSpherePoints[lat_i].resize(LONGITUDE_SLICES + 1); +			for (S32 lon_i = 0; lon_i < LONGITUDE_SLICES + 1; lon_i++) +			{ +				F32 lat = (F32)lat_i / LATITUDE_SLICES; +				F32 lon = (F32)lon_i / LONGITUDE_SLICES; + +				mSpherePoints[lat_i][lon_i] = polar_to_cart(lat, lon); +			} +		} +	} +	 +	gGL.begin(LLRender::TRIANGLES); + +	for (S32 lat_i = 0; lat_i < LATITUDE_SLICES; lat_i++) +	{ +		for (S32 lon_i = 0; lon_i < LONGITUDE_SLICES; lon_i++) +		{ +			gGL.vertex3fv(mSpherePoints[lat_i][lon_i].mV); +			gGL.vertex3fv(mSpherePoints[lat_i][lon_i+1].mV); +			gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i].mV); + +			gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i].mV); +			gGL.vertex3fv(mSpherePoints[lat_i][lon_i+1].mV); +			gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i+1].mV); +		} +	} +	gGL.end(); +} diff --git a/indra/llrender/llrendersphere.h b/indra/llrender/llrendersphere.h index 617ee3e12e..ebc71b6146 100644 --- a/indra/llrender/llrendersphere.h +++ b/indra/llrender/llrendersphere.h @@ -52,6 +52,10 @@ public:  	void cleanupGL();  	void render(F32 pixel_area);		// of a box of size 1.0 at that position  	void render();						// render at highest LOD +	void renderGGL();                   // render using LLRender + +private: +	std::vector< std::vector<LLVector3> > mSpherePoints;  };  extern LLRenderSphere gSphere; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 6babaf936b..fad98e553f 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -330,6 +330,7 @@ void LLFloater::addDragHandle()  		addChild(mDragHandle);  	}  	layoutDragHandle(); +	applyTitle();  }  void LLFloater::layoutDragHandle() @@ -348,7 +349,6 @@ void LLFloater::layoutDragHandle()  	}  	mDragHandle->setRect(rect);  	updateTitleButtons(); -	applyTitle();  }  void LLFloater::addResizeCtrls() @@ -2519,7 +2519,7 @@ LLFloater *LLFloaterView::getBackmost() const  void LLFloaterView::syncFloaterTabOrder()  { -	// look for a visible modal dialog, starting from first (should be only one) +	// look for a visible modal dialog, starting from first  	LLModalDialog* modal_dialog = NULL;  	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)  	{ diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 94eade06ad..d4d161f2c9 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -2949,7 +2949,6 @@ BOOL LLScrollListCtrl::operateOnAll(EOperation op)  //virtual   void LLScrollListCtrl::setFocus(BOOL b)  { -	mSearchString.clear();  	// for tabbing into pristine scroll lists (Finder)  	if (!getFirstSelected())  	{ @@ -2994,6 +2993,9 @@ void LLScrollListCtrl::onFocusLost()  	{  		gFocusMgr.setMouseCapture(NULL);  	} + +	mSearchString.clear(); +  	LLUICtrl::onFocusLost();  } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 78a6ab1eaa..616033f77f 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -962,18 +962,19 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)  {  	if (width != getRect().getWidth() || height != getRect().getHeight())  	{ -		//EXT-4288 -		//to keep consistance scrolling behaviour  -		//when scrolling from top and from bottom... -		bool is_scrolled_to_end = (mScroller!=NULL) && scrolledToEnd(); -		 +		bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; +  		LLUICtrl::reshape( width, height, called_from_parent ); -	 -		if (is_scrolled_to_end) + +		if (mScroller && scrolled_to_bottom && mTrackEnd)  		{ -			deselect(); -			endOfDoc(); -		}		 +			// keep bottom of text buffer visible +			// do this here as well as in reflow to handle case +			// where shrinking from top, which causes buffer to temporarily  +			// not be scrolled to the bottom, since the scroll index +			// specified the _top_ of the visible document region +			mScroller->goToBottom(); +		}  		// do this first after reshape, because other things depend on  		// up-to-date mVisibleTextRect @@ -1116,6 +1117,34 @@ void LLTextBase::reflow()  	updateSegments(); +	if (mReflowIndex == S32_MAX) +	{ +		return; +	} + +	bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; + +	LLRect cursor_rect = getLocalRectFromDocIndex(mCursorPos); +	bool follow_selection = getLocalRect().overlaps(cursor_rect); // cursor is (potentially) visible + +	// store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing +	cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop; +	cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom; + +	S32 first_line = getFirstVisibleLine(); + +	// if scroll anchor not on first line, update it to first character of first line +	if (!mLineInfoList.empty() +		&&	(mScrollIndex <  mLineInfoList[first_line].mDocIndexStart +			||	mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) +	{ +		mScrollIndex = mLineInfoList[first_line].mDocIndexStart; +	} +	LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex); +	// store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing +	first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop; +	first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom; +  	S32 reflow_count = 0;  	while(mReflowIndex < S32_MAX)  	{ @@ -1129,6 +1158,7 @@ void LLTextBase::reflow()  			lldebugs << "Breaking out of reflow due to possible infinite loop in " << getName() << llendl;  			break;  		} +	  		S32 start_index = mReflowIndex;  		mReflowIndex = S32_MAX; @@ -1136,25 +1166,6 @@ void LLTextBase::reflow()  		// to force inlined widgets with follows set to shrink  		mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); -		bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false; - -		LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos); -		bool follow_selection = mVisibleTextRect.overlaps(old_cursor_rect); // cursor is visible -		old_cursor_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom); - -		S32 first_line = getFirstVisibleLine(); - -		// if scroll anchor not on first line, update it to first character of first line -		if (!mLineInfoList.empty() -			&&	(mScrollIndex <  mLineInfoList[first_line].mDocIndexStart -				||	mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd)) -		{ -			mScrollIndex = mLineInfoList[first_line].mDocIndexStart; -		} -		LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex); -		// subtract off effect of horizontal scrollbar from local position of first char -		first_char_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom); -  		S32 cur_top = 0;  		segment_set_t::iterator seg_iter = mSegments.begin(); @@ -1275,32 +1286,42 @@ void LLTextBase::reflow()  			segmentp->updateLayout(*this);  		} +	} -		// apply scroll constraints after reflowing text -		if (!hasMouseCapture() && mScroller) +	// apply scroll constraints after reflowing text +	if (!hasMouseCapture() && mScroller) +	{ +		if (scrolled_to_bottom && mTrackEnd)  		{ -			if (scrolled_to_bottom && mTrackEnd) -			{ -				// keep bottom of text buffer visible -				endOfDoc(); -			} -			else if (hasSelection() && follow_selection) -			{ -				// keep cursor in same vertical position on screen when selecting text -				LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos); -				mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect); -			} -			else -			{ -				// keep first line of text visible -				LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex); -				mScroller->scrollToShowRect(new_first_char_rect, first_char_rect); -			} +			// keep bottom of text buffer visible +			endOfDoc();  		} +		else if (hasSelection() && follow_selection) +		{ +			// keep cursor in same vertical position on screen when selecting text +			LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos); +			LLRect old_cursor_rect = cursor_rect; +			old_cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop; +			old_cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom; -		// reset desired x cursor position -		updateCursorXPos(); +			mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect); +		} +		else +		{ +			// keep first line of text visible +			LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex); + +			// pass in desired rect in the coordinate frame of the document viewport +			LLRect old_first_char_rect = first_char_rect; +			old_first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop; +			old_first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom; + +			mScroller->scrollToShowRect(new_first_char_rect, old_first_char_rect); +		}  	} + +	// reset desired x cursor position +	updateCursorXPos();  }  LLRect LLTextBase::getTextBoundingRect() @@ -1858,7 +1879,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round,  			pos = segment_line_start;  			break;  		} -		if (local_x < start_x + text_width			// cursor to left of right edge of text +		if (local_x < start_x + text_width						// cursor to left of right edge of text  			|| newline)								// or this line ends with a newline, set doc pos to newline char  		{  			// Figure out which character we're nearest to. @@ -1958,11 +1979,18 @@ LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const  LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const  { +	LLRect content_window_rect = mScroller ? mScroller->getContentWindowRect() : getLocalRect(); +	if (mBorderVisible) +	{ +		content_window_rect.stretch(-1); +	} +  	LLRect local_rect; +  	if (mLineInfoList.empty())   	{   		// return default height rect in upper left -		local_rect = mVisibleTextRect; +		local_rect = content_window_rect;  		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());  		return local_rect;  	} @@ -1973,8 +2001,8 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const  	// compensate for scrolled, inset view of doc  	LLRect scrolled_view_rect = getVisibleDocumentRect();  	local_rect = doc_rect; -	local_rect.translate(mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,  -						mVisibleTextRect.mBottom - scrolled_view_rect.mBottom); +	local_rect.translate(content_window_rect.mLeft - scrolled_view_rect.mLeft,  +						content_window_rect.mBottom - scrolled_view_rect.mBottom);  	return local_rect;  } diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e86f50ce20..6204c8047a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -632,7 +632,18 @@      <key>BlockAvatarAppearanceMessages</key>          <map>          <key>Comment</key> -            <string>Ignore's appearance messages (for simulating Ruth)</string> +            <string>Ignores appearance messages (for simulating Ruth)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>BlockSomeAvatarAppearanceVisualParams</key> +        <map> +        <key>Comment</key> +            <string>Drop around 50% of VisualParam occurances in appearance messages (for simulating Ruth)</string>          <key>Persist</key>              <integer>1</integer>          <key>Type</key> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 5efd997ab7..9564236ad2 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -4782,7 +4782,7 @@       group="1"       name="Saddlebags"       wearable="shape" -     edit_grouo="driven" +     edit_group="driven"       value_min="-.5"       value_max="3">        <param_morph> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index b4add267fe..de4d787d65 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -26,6 +26,7 @@ list all  RenderAnisotropic			1	0  RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0 +RenderAvatarMaxVisible      1   35  RenderAvatarVP				1	1  RenderCubeMap				1	1  RenderDelayVBUpdate			1	0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 4fb529ab39..adda7cec4d 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -26,6 +26,7 @@ list all  RenderAnisotropic			1	0  RenderAvatarCloth			1	1  RenderAvatarLODFactor		1	1.0 +RenderAvatarMaxVisible      1   35  RenderAvatarVP				1	1  RenderCubeMap				1	1  RenderDelayVBUpdate			1	0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index fbc589d3e7..82886d7e2c 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -26,6 +26,7 @@ list all  RenderAnisotropic				1	0  RenderAvatarCloth				0	0  RenderAvatarLODFactor			1	1.0 +RenderAvatarMaxVisible          1   35  RenderAvatarVP					1	0  RenderCubeMap					1	1  RenderDelayVBUpdate				1	0 diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index bd14732b4a..0bd03571da 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -846,12 +846,3 @@ void LLChatHistory::draw()  	LLUICtrl::draw();  } - -void LLChatHistory::reshape(S32 width, S32 height, BOOL called_from_parent) -{ -	bool is_scrolled_to_end = mEditor->scrolledToEnd(); -	LLUICtrl::reshape( width, height, called_from_parent ); -	// update scroll -	if (is_scrolled_to_end) -		mEditor->setCursorAndScrollToEnd(); -} diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 950b32861b..fa1f2e04a4 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -122,7 +122,6 @@ class LLChatHistory : public LLUICtrl  		 */  		void appendMessage(const LLChat& chat, const LLSD &args = LLSD(), const LLStyle::Params& input_append_params = LLStyle::Params());  		/*virtual*/ void clear(); -		/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	private:  		std::string mLastFromName; diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 546b60f286..2d0859650a 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -634,7 +634,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  	if (!single_avatar && !avatarp->isFullyLoaded() )  	{ -		if (pass==1 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0)) +		if (pass==0 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0))  		{  			// debug code to draw a sphere in place of avatar  			gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep); @@ -646,8 +646,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  			gGL.translatef((F32)(pos.mV[VX]),	   						   (F32)(pos.mV[VY]),	   							(F32)(pos.mV[VZ]));	  -			 gGL.scalef(0.15f, 0.15f, 0.3f);	  -			 gSphere.render();	  +			 gGL.scalef(0.15f, 0.15f, 0.3f); + +			 gSphere.renderGGL(); +				   			 gGL.popMatrix();  			 gGL.setColorMask(true, false);  		} diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 7290849fca..b13f9e3898 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -87,7 +87,7 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,  	mNeedsUpdate(TRUE),  	mNeedsUpload(FALSE),  	mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates -	mNeedsLowResUpload(TRUE), +	mDebugNumLowresUploads(0),  	mTexLayerSet(owner)  {  	LLTexLayerSetBuffer::sGLByteCount += getSize(); @@ -141,12 +141,12 @@ void LLTexLayerSetBuffer::requestUpload()  	// If we requested a new upload but haven't even uploaded  	// a low res version of our last upload request, then  	// keep the timer ticking instead of resetting it. -	if (mNeedsUpload && mNeedsLowResUpload) +	if (mNeedsUpload && (mDebugNumLowresUploads == 0))  	{  		mNeedsUploadTimer.reset();  	}  	mNeedsUpload = TRUE; -	mNeedsLowResUpload = TRUE; +	mDebugNumLowresUploads = 0;  	mUploadPending = TRUE;  	mNeedsUploadTimer.unpause();  } @@ -292,7 +292,7 @@ BOOL LLTexLayerSetBuffer::isReadyToUpload() const  		// If we hit our timeout and have textures available at even lower resolution, then upload.  		const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout;  		const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable(); -		if (has_lower_lod && is_upload_textures_timeout && mNeedsLowResUpload) return TRUE;  +		if (has_lower_lod && is_upload_textures_timeout) return TRUE;   	}  	return FALSE;  } @@ -434,12 +434,18 @@ void LLTexLayerSetBuffer::readBackAndUpload()  				if (highest_lod)  				{ +					// Got the final LOD for the baked texture. +					// All done, pause the upload timer so we know how long it took.  					mNeedsUpload = FALSE;  					mNeedsUploadTimer.pause();  				}  				else  				{ -					mNeedsLowResUpload = FALSE; +					// Got a lower level LOD for the baked texture. +					// Restart the upload timer. +					mDebugNumLowresUploads++; +					mNeedsUploadTimer.unpause(); +					mNeedsUploadTimer.reset();  				}  			}  			else @@ -2235,11 +2241,11 @@ const std::string LLTexLayerSetBuffer::dumpTextureInfo() const  	if (!isAgentAvatarValid()) return "";  	const BOOL is_high_res = !mNeedsUpload; -	const BOOL is_low_res = !mNeedsLowResUpload; +	const U32 num_low_res = mDebugNumLowresUploads;  	const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32();  	const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet);  	std::string text = llformat("[ HiRes:%d LoRes:%d Timer:%d ] %s", -								is_high_res, is_low_res, upload_time,  +								is_high_res, num_low_res, upload_time,   								local_texture_info.c_str());  	return text;  } diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index 8f386b5a19..313c5f24e1 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -360,7 +360,7 @@ private:  	BOOL					mNeedsUpdate; // Whether we need to update our baked textures  	BOOL					mNeedsUpload; // Whether we need to send our baked textures to the server -	BOOL					mNeedsLowResUpload; // Whether we have sent a lowres version of our baked textures to the server +	U32						mDebugNumLowresUploads; // Number of times we've sent a lowres version of our baked textures to the server  	BOOL					mUploadPending; // Whether we have received back the new baked textures  	LLUUID					mUploadID; // Identifies the current upload process (null if none).  Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit) diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 568cd4cb19..9abfab300c 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -271,7 +271,10 @@ void LLToast::setVisible(BOOL show)  		{  			mTimer->start();  		} -		LLModalDialog::setFrontmost(FALSE); +		if (!getVisible()) +		{ +			LLModalDialog::setFrontmost(FALSE); +		}  	}  	else  	{ diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 7a232afba6..8456d13931 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6686,6 +6686,41 @@ void LLVOAvatar::onFirstTEMessageReceived()  }  //----------------------------------------------------------------------------- +// bool visualParamWeightsAreDefault() +//----------------------------------------------------------------------------- +bool LLVOAvatar::visualParamWeightsAreDefault() +{ +	bool rtn = true; + +	bool is_wearing_skirt = isWearingWearableType(LLWearableType::WT_SKIRT); +	for (LLVisualParam *param = getFirstVisualParam();  +	     param; +	     param = getNextVisualParam()) +	{ +		if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) +		{ +			LLViewerVisualParam* vparam = dynamic_cast<LLViewerVisualParam*>(param); +			llassert(vparam); +			bool is_skirt_param = vparam && +				LLWearableType::WT_SKIRT == vparam->getWearableType(); +			if (param->getWeight() != param->getDefaultWeight() && +			    // we have to not care whether skirt weights are default, if we're not actually wearing a skirt +			    (is_wearing_skirt || !is_skirt_param)) +			{ +				//llinfos << "param '" << param->getName() << "'=" << param->getWeight() << " which differs from default=" << param->getDefaultWeight() << llendl; +				rtn = false; +				break; +			} +		} +	} + +	//llinfos << "params are default ? " << int(rtn) << llendl; + +	return rtn; +} + + +//-----------------------------------------------------------------------------  // processAvatarAppearance()  //-----------------------------------------------------------------------------  void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) @@ -6753,16 +6788,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	{  		releaseComponentTextures();  	} -	 -	 +		  	// parse visual params  	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); -	if( num_blocks > 1 ) +	bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (random()%2)==0; // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing +	if( num_blocks > 1 && !drop_visual_params_debug)  	{  		BOOL params_changed = FALSE;  		BOOL interp_params = FALSE;  		LLVisualParam* param = getFirstVisualParam(); +		llassert(param); // if this ever fires, we should do the same as when num_blocks<=1  		if (!param)  		{  			llwarns << "No visual params!" << llendl; @@ -6778,8 +6814,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  				if( !param )  				{ -					llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; -					return; +					// more visual params supplied than expected - just process what we know about +					break;  				}  				U8 value; @@ -6804,14 +6840,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  			}  		} -		while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) ) +		const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); +		if (num_blocks != expected_tweakable_count)  		{ -			param = getNextVisualParam(); -		} -		if( param ) -		{ -			llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl; -			return; +			llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << ").  Processing what we can.  object: " << getID() << llendl;  		}  		if (params_changed) @@ -6828,16 +6860,37 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  				updateSexDependentLayerSets( FALSE );  			}	  		} + +		llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) );  	}  	else  	{ -		llwarns << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; +		// AvatarAppearance message arrived without visual params +		if (drop_visual_params_debug) +		{ +			llinfos << "Debug-faked lack of parameters on AvatarAppearance for object: "  << getID() << llendl; +		} +		else +		{ +			llinfos << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; +		} + +		// this isn't really a problem if we already have a non-default shape +		if (visualParamWeightsAreDefault()) +		{ +			// re-request appearance, hoping that it comes back with a shape next time +			llinfos << "Re-requesting AvatarAppearance for object: "  << getID() << llendl; +			LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); +		} +		else +		{ +			llinfos << "That's okay, we already have a non-default shape for object: "  << getID() << llendl; +			// we don't really care. +		}  	}  	setCompositeUpdatesEnabled( TRUE ); -	llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) ); -  	// If all of the avatars are completely baked, release the global image caches to conserve memory.  	LLVOAvatar::cullAvatarsByPixelArea(); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 3c940e03c0..b30cce09f6 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -249,6 +249,7 @@ public:  	//--------------------------------------------------------------------  public:  	BOOL			isFullyLoaded() const; +	bool visualParamWeightsAreDefault();  protected:  	virtual BOOL	getIsCloud();  	BOOL			updateIsFullyLoaded(); diff --git a/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml index afd9001df0..5e7442b877 100644 --- a/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="clothing_list_button_bar_panel"> -	<button label="Permuter" name="switch_btn"/> +	<button label="Changer" name="switch_btn"/>  	<button label="Acheter >" name="bodyparts_shop_btn"/>  </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml index 24cb92dde7..0b58a4e40b 100644 --- a/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="clothing_list_button_bar_panel"> -	<button label="Ajouter +" name="add_btn"/> +	<button label="Ajout +" name="add_btn"/>  	<button label="Acheter >" name="clothing_shop_btn"/>  </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml index 2c12547d61..fb650ff646 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml @@ -73,6 +73,6 @@ domaine.  	<button label="?" name="ban_resident_help"/>  	<button label="Ajouter..." name="add_banned_avatar_btn"/>  	<button label="Supprimer..." name="remove_banned_avatar_btn"/> -	<button label="Envoyer un message au domaine..." name="message_estate_btn"/> -	<button label="Éjecter un résident du domaine..." name="kick_user_from_estate_btn"/> +	<button label="Message au domaine..." name="message_estate_btn"/> +	<button label="Éjecter du domaine..." name="kick_user_from_estate_btn"/>  </panel> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 5d162eb80f..1ac7677b07 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -639,7 +639,7 @@ L$ が不足しているのでこのグループに参加することができ  		次のファイルのエンコードができません: [FILE]  	</notification>  	<notification name="CorruptedProtectedDataStore"> -		あなたの保護されたデータを読みとることが出来ないためリセットされます。 +		保護されているデータを読みとることが出来ないためリセットされます。     ネットワーク設定を変更すると起こることがあります。  		<usetemplate name="okbutton" yestext="OK"/>  	</notification> | 
