diff options
Diffstat (limited to 'indra')
45 files changed, 653 insertions, 490 deletions
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index a86bbbffff..0a16b5120a 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -259,10 +259,10 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const  	}  	else  	{ -		gi = get_if_there(mCharGlyphInfoMap, (llwchar)0, (LLFontGlyphInfo*)NULL); -		if (gi) +		char_glyph_info_map_t::iterator found_it = mCharGlyphInfoMap.find((llwchar)0); +		if (found_it != mCharGlyphInfoMap.end())  		{ -			return gi->mXAdvance; +			return found_it->second->mXAdvance;  		}  	} diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index f60d09316d..4b4a0bb189 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -33,7 +33,7 @@  #ifndef LL_LLFONTFREETYPE_H  #define LL_LLFONTFREETYPE_H -#include <map> +#include <boost/unordered_map.hpp>  #include "llpointer.h"  #include "llstl.h" @@ -170,7 +170,7 @@ private:  	BOOL mValid; -	typedef std::map<llwchar, LLFontGlyphInfo*> char_glyph_info_map_t; +	typedef boost::unordered_map<llwchar, LLFontGlyphInfo*> char_glyph_info_map_t;  	mutable char_glyph_info_map_t mCharGlyphInfoMap; // Information about glyph location in bitmap  	mutable LLPointer<LLFontBitmapCache> mFontBitmapCachep; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 6eb5e0eff4..6a7eba2712 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -181,12 +181,17 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	gGL.loadUIIdentity(); -	gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ); +	//gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ);  	// this code snaps the text origin to a pixel grid to start with -	F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); -	F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); -	gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f); +	//F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); +	//F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); +	//gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f); + +	LLVector2 origin(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY)); +	// snap the text origin to a pixel grid to start with +	origin.mV[VX] -= llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); +	origin.mV[VY] -= llround((F32)sCurOrigin.mY) - (sCurOrigin.mY);  	LLFastTimer t(FTM_RENDER_FONTS); @@ -210,8 +215,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons   	// Not guaranteed to be set correctly  	gGL.setSceneBlendType(LLRender::BT_ALPHA); -	cur_x = ((F32)x * sScaleX); -	cur_y = ((F32)y * sScaleY); +	cur_x = ((F32)x * sScaleX) + origin.mV[VX]; +	cur_y = ((F32)y * sScaleY) + origin.mV[VY];  	// Offset y by vertical alignment.  	switch (valign) @@ -276,6 +281,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	const LLFontGlyphInfo* next_glyph = NULL; +	const S32 GLYPH_BATCH_SIZE = 30; +	LLVector3 vertices[GLYPH_BATCH_SIZE * 4]; +	LLVector2 uvs[GLYPH_BATCH_SIZE * 4]; +	LLColor4U colors[GLYPH_BATCH_SIZE * 4]; + +	S32 glyph_count = 0;  	for (i = begin_offset; i < begin_offset + length; i++)  	{  		llwchar wch = wstr[i]; @@ -313,7 +324,18 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  				    llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth,  				    llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight); -		drawGlyph(screen_rect, uv_rect, color, style_to_add, shadow, drop_shadow_strength); +		if (glyph_count >= GLYPH_BATCH_SIZE) +		{ +			gGL.begin(LLRender::QUADS); +			{ +				gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4); +			} +			gGL.end(); + +			glyph_count = 0; +		} + +		drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, color, style_to_add, shadow, drop_shadow_strength);  		chars_drawn++;  		cur_x += fgi->mXAdvance; @@ -338,11 +360,19 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		cur_render_y = cur_y;  	} +	gGL.begin(LLRender::QUADS); +	{ +		gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4); +	} +	gGL.end(); + +  	if (right_x)  	{  		*right_x = cur_x / sScaleX;  	} +	//FIXME: add underline as glyph?  	if (style_to_add & UNDERLINE)  	{  		F32 descender = mFontFreetype->getDescenderHeight(); @@ -1091,95 +1121,96 @@ LLFontGL &LLFontGL::operator=(const LLFontGL &source)  	return *this;  } -void LLFontGL::renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const +void LLFontGL::renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, F32 slant_amt) const  { -	gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); -	gGL.vertex2f(llfont_round_x(screen_rect.mRight),  -				llfont_round_y(screen_rect.mTop)); - -	gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); -	gGL.vertex2f(llfont_round_x(screen_rect.mLeft),  -				llfont_round_y(screen_rect.mTop)); - -	gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); -	gGL.vertex2f(llfont_round_x(screen_rect.mLeft + slant_amt),  -				llfont_round_y(screen_rect.mBottom)); - -	gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); -	gGL.vertex2f(llfont_round_x(screen_rect.mRight + slant_amt),  -				llfont_round_y(screen_rect.mBottom)); +	S32 index = 0; + +	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mTop), 0.f); +	uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); +	colors_out[index] = color; +	index++; + +	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mTop), 0.f); +	uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop); +	colors_out[index] = color; +	index++; + +	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mBottom), 0.f); +	uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); +	colors_out[index] = color; +	index++; + +	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mBottom), 0.f); +	uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom); +	colors_out[index] = color;  } -void LLFontGL::drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, ShadowType shadow, F32 drop_shadow_strength) const +//FIXME: do colors out as well +void LLFontGL::drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, U8 style, ShadowType shadow, F32 drop_shadow_strength) const  {  	F32 slant_offset;  	slant_offset = ((style & ITALIC) ? ( -mFontFreetype->getAscenderHeight() * 0.2f) : 0.f); -	gGL.begin(LLRender::QUADS); +	//FIXME: bold and drop shadow are mutually exclusive only for convenience +	//Allow both when we need them. +	if (style & BOLD)  	{ -		//FIXME: bold and drop shadow are mutually exclusive only for convenience -		//Allow both when we need them. -		if (style & BOLD) +		for (S32 pass = 0; pass < 2; pass++)  		{ -			gGL.color4fv(color.mV); -			for (S32 pass = 0; pass < 2; pass++) -			{ -				LLRectf screen_rect_offset = screen_rect; +			LLRectf screen_rect_offset = screen_rect; -				screen_rect_offset.translate((F32)(pass * BOLD_OFFSET), 0.f); -				renderQuad(screen_rect_offset, uv_rect, slant_offset); -			} +			screen_rect_offset.translate((F32)(pass * BOLD_OFFSET), 0.f); +			renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect_offset, uv_rect, color, slant_offset); +			glyph_count++;  		} -		else if (shadow == DROP_SHADOW_SOFT) +	} +	else if (shadow == DROP_SHADOW_SOFT) +	{ +		LLColor4U shadow_color = LLFontGL::sShadowColor; +		shadow_color.mV[VALPHA] = U8(color.mV[VALPHA] * drop_shadow_strength * DROP_SHADOW_SOFT_STRENGTH); +		for (S32 pass = 0; pass < 5; pass++)  		{ -			LLColor4 shadow_color = LLFontGL::sShadowColor; -			shadow_color.mV[VALPHA] = color.mV[VALPHA] * drop_shadow_strength * DROP_SHADOW_SOFT_STRENGTH; -			gGL.color4fv(shadow_color.mV); -			for (S32 pass = 0; pass < 5; pass++) -			{ -				LLRectf screen_rect_offset = screen_rect; +			LLRectf screen_rect_offset = screen_rect; -				switch(pass) -				{ -				case 0: -					screen_rect_offset.translate(-1.f, -1.f); -					break; -				case 1: -					screen_rect_offset.translate(1.f, -1.f); -					break; -				case 2: -					screen_rect_offset.translate(1.f, 1.f); -					break; -				case 3: -					screen_rect_offset.translate(-1.f, 1.f); -					break; -				case 4: -					screen_rect_offset.translate(0, -2.f); -					break; -				} -			 -				renderQuad(screen_rect_offset, uv_rect, slant_offset); +			switch(pass) +			{ +			case 0: +				screen_rect_offset.translate(-1.f, -1.f); +				break; +			case 1: +				screen_rect_offset.translate(1.f, -1.f); +				break; +			case 2: +				screen_rect_offset.translate(1.f, 1.f); +				break; +			case 3: +				screen_rect_offset.translate(-1.f, 1.f); +				break; +			case 4: +				screen_rect_offset.translate(0, -2.f); +				break;  			} -			gGL.color4fv(color.mV); -			renderQuad(screen_rect, uv_rect, slant_offset); -		} -		else if (shadow == DROP_SHADOW) -		{ -			LLColor4 shadow_color = LLFontGL::sShadowColor; -			shadow_color.mV[VALPHA] = color.mV[VALPHA] * drop_shadow_strength; -			gGL.color4fv(shadow_color.mV); -			LLRectf screen_rect_shadow = screen_rect; -			screen_rect_shadow.translate(1.f, -1.f); -			renderQuad(screen_rect_shadow, uv_rect, slant_offset); -			gGL.color4fv(color.mV); -			renderQuad(screen_rect, uv_rect, slant_offset); -		} -		else // normal rendering -		{ -			gGL.color4fv(color.mV); -			renderQuad(screen_rect, uv_rect, slant_offset); +		 +			renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect_offset, uv_rect, shadow_color, slant_offset); +			glyph_count++;  		} - +		renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect, uv_rect, color, slant_offset); +		glyph_count++; +	} +	else if (shadow == DROP_SHADOW) +	{ +		LLColor4 shadow_color = LLFontGL::sShadowColor; +		shadow_color.mV[VALPHA] = color.mV[VALPHA] * drop_shadow_strength; +		LLRectf screen_rect_shadow = screen_rect; +		screen_rect_shadow.translate(1.f, -1.f); +		renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect_shadow, uv_rect, shadow_color, slant_offset); +		glyph_count++; +		renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect, uv_rect, color, slant_offset); +		glyph_count++; +	} +	else // normal rendering +	{ +		renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect, uv_rect, color, slant_offset); +		glyph_count++;  	} -	gGL.end();  } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index f29ac5165c..8bc45fbf74 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -217,8 +217,8 @@ private:  	LLFontDescriptor mFontDescriptor;  	LLPointer<LLFontFreetype> mFontFreetype; -	void renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const; -	void drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, ShadowType shadow, F32 drop_shadow_fade) const; +	void renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, F32 slant_amt) const; +	void drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, U8 style, ShadowType shadow, F32 drop_shadow_fade) const;  	// Registry holds all instantiated fonts.  	static LLFontRegistry* sFontRegistry; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 5597b23c69..64238b2008 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -851,9 +851,9 @@ void LLRender::translateUI(F32 x, F32 y, F32 z)  		llerrs << "Need to push a UI translation frame before offsetting" << llendl;  	} -	mUIOffset.front().mV[0] += x; -	mUIOffset.front().mV[1] += y; -	mUIOffset.front().mV[2] += z; +	mUIOffset.back().mV[0] += x; +	mUIOffset.back().mV[1] += y; +	mUIOffset.back().mV[2] += z;  }  void LLRender::scaleUI(F32 x, F32 y, F32 z) @@ -863,27 +863,27 @@ void LLRender::scaleUI(F32 x, F32 y, F32 z)  		llerrs << "Need to push a UI transformation frame before scaling." << llendl;  	} -	mUIScale.front().scaleVec(LLVector3(x,y,z)); +	mUIScale.back().scaleVec(LLVector3(x,y,z));  }  void LLRender::pushUIMatrix()  {  	if (mUIOffset.empty())  	{ -		mUIOffset.push_front(LLVector3(0,0,0)); +		mUIOffset.push_back(LLVector3(0,0,0));  	}  	else  	{ -		mUIOffset.push_front(mUIOffset.front()); +		mUIOffset.push_back(mUIOffset.back());  	}  	if (mUIScale.empty())  	{ -		mUIScale.push_front(LLVector3(1,1,1)); +		mUIScale.push_back(LLVector3(1,1,1));  	}  	else  	{ -		mUIScale.push_front(mUIScale.front()); +		mUIScale.push_back(mUIScale.back());  	}  } @@ -893,8 +893,8 @@ void LLRender::popUIMatrix()  	{  		llerrs << "UI offset stack blown." << llendl;  	} -	mUIOffset.pop_front(); -	mUIScale.pop_front(); +	mUIOffset.pop_back(); +	mUIScale.pop_back();  }  LLVector3 LLRender::getUITranslation() @@ -903,7 +903,7 @@ LLVector3 LLRender::getUITranslation()  	{  		llerrs << "UI offset stack empty." << llendl;  	} -	return mUIOffset.front(); +	return mUIOffset.back();  }  LLVector3 LLRender::getUIScale() @@ -912,7 +912,7 @@ LLVector3 LLRender::getUIScale()  	{  		llerrs << "UI scale stack empty." << llendl;  	} -	return mUIScale.front(); +	return mUIScale.back();  } @@ -922,8 +922,8 @@ void LLRender::loadUIIdentity()  	{  		llerrs << "Need to push UI translation frame before clearing offset." << llendl;  	} -	mUIOffset.front().setVec(0,0,0); -	mUIScale.front().setVec(1,1,1); +	mUIOffset.back().setVec(0,0,0); +	mUIScale.back().setVec(1,1,1);  }  void LLRender::setColorMask(bool writeColor, bool writeAlpha) @@ -1210,18 +1210,79 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)  	}  	else  	{ -		LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.front()).scaledVec(mUIScale.front()); +		LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.back()).scaledVec(mUIScale.back());  		mVerticesp[mCount] = vert;  	}  	mCount++; -	if (mCount < 4096) +	mVerticesp[mCount] = mVerticesp[mCount-1]; +	mColorsp[mCount] = mColorsp[mCount-1]; +	mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; +} + +void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count) +{ +	if (mCount + vert_count > 4094)  	{ -		mVerticesp[mCount] = mVerticesp[mCount-1]; -		mColorsp[mCount] = mColorsp[mCount-1]; +		//	llwarns << "GL immediate mode overflow.  Some geometry not drawn." << llendl; +		return; +	} + +	for (S32 i = 0; i < vert_count; i++) +	{ +		mVerticesp[mCount] = verts[i]; + +		mCount++;  		mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; +		mColorsp[mCount] = mColorsp[mCount-1];  	} + +	mVerticesp[mCount] = mVerticesp[mCount-1];  } + +void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count) +{ +	if (mCount + vert_count > 4094) +	{ +		//	llwarns << "GL immediate mode overflow.  Some geometry not drawn." << llendl; +		return; +	} + +	for (S32 i = 0; i < vert_count; i++) +	{ +		mVerticesp[mCount] = verts[i]; +		mTexcoordsp[mCount] = uvs[i]; + +		mCount++; +		mColorsp[mCount] = mColorsp[mCount-1]; +	} + +	mVerticesp[mCount] = mVerticesp[mCount-1]; +	mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; +} + +void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count) +{ +	if (mCount + vert_count > 4094) +	{ +		//	llwarns << "GL immediate mode overflow.  Some geometry not drawn." << llendl; +		return; +	} + +	for (S32 i = 0; i < vert_count; i++) +	{ +		mVerticesp[mCount] = verts[i]; +		mTexcoordsp[mCount] = uvs[i]; +		mColorsp[mCount] = colors[i]; + +		mCount++; +	} + +	mVerticesp[mCount] = mVerticesp[mCount-1]; +	mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; +	mColorsp[mCount] = mColorsp[mCount-1]; +} +  void LLRender::vertex2i(const GLint& x, const GLint& y)  {  	vertex3f((GLfloat) x, (GLfloat) y, 0);	 diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index f6c87aa1db..0fa503182e 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -317,6 +317,10 @@ public:  	void color3fv(const GLfloat* c);  	void color4ubv(const GLubyte* c); +	void vertexBatchPreTransformed(LLVector3* verts, S32 vert_count); +	void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count); +	void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U*, S32 vert_count); +  	void setColorMask(bool writeColor, bool writeAlpha);  	void setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha);  	void setSceneBlendType(eBlendType type); @@ -373,8 +377,8 @@ private:  	F32				mMaxAnisotropy; -	std::list<LLVector3> mUIOffset; -	std::list<LLVector3> mUIScale; +	std::vector<LLVector3> mUIOffset; +	std::vector<LLVector3> mUIScale;  }; diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index 8241ee1518..f26a380e5f 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -141,6 +141,8 @@ public:  	const LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; } +	bool getFitParent() const {return mFitParent;} +  private:  	void	initNoTabsWidget(const LLTextBox::Params& tb_params);  	void	updateNoTabsHelpTextVisibility(); diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 87ff39575a..84716394e6 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -33,6 +33,7 @@  #include "linden_common.h"  #include "llaccordionctrltab.h" +#include "llaccordionctrl.h"  #include "lllocalcliprect.h"  #include "llscrollbar.h" @@ -710,7 +711,7 @@ S32	LLAccordionCtrlTab::notifyParent(const LLSD& info)  				setRect(panel_rect);  			} -			//LLAccordionCtrl should rearrange accodion tab if one of accordion change its size +			//LLAccordionCtrl should rearrange accordion tab if one of accordion change its size  			if (getParent()) // A parent may not be set if tabs are added dynamically.  				getParent()->notifyParent(info);  			return 1; @@ -721,6 +722,27 @@ S32	LLAccordionCtrlTab::notifyParent(const LLSD& info)  			return 1;  		}  	} +	else if (info.has("scrollToShowRect")) +	{ +		LLAccordionCtrl* parent = dynamic_cast<LLAccordionCtrl*>(getParent()); +		if (parent && parent->getFitParent()) +		{ +			//	EXT-8285 ('No attachments worn' text appears at the bottom of blank 'Attachments' accordion) +			//	The problem was in passing message "scrollToShowRect" IN LLAccordionCtrlTab::notifyParent +			//	FROM child LLScrollContainer TO parent LLAccordionCtrl with "it_parent" set to true. + +			//	It is wrong notification for parent accordion which leads to recursive call of adjustContainerPanel +			//	As the result of recursive call of adjustContainerPanel we got LLAccordionCtrlTab +			//	that reshaped and re-sized with different rectangles. + +			//	LLAccordionCtrl has own scrollContainer and LLAccordionCtrlTab has own scrollContainer +			//	both should handle own scroll container's event. +			//	So, if parent accordion "fit_parent" accordion tab should handle its scroll container events itself. + +			return 1; +		} +	} +  	return LLUICtrl::notifyParent(info);  } diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 90c6f15d23..70558f8eb8 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -615,7 +615,7 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)  	//only CTRL usage allows to deselect an item, usual clicking on an item cannot deselect it  	if (mask & MASK_CONTROL) -		selectItemPair(item_pair, select_item); +	selectItemPair(item_pair, select_item);  	else  		selectItemPair(item_pair, true);  } @@ -1078,25 +1078,6 @@ void LLFlatListView::setNoItemsCommentVisible(bool visible) const  {  	if (mNoItemsCommentTextbox)  	{ -		if (visible) -		{ -/* -// *NOTE: MA 2010-02-04 -// Deprecated after params of the comment text box were moved into widget (flat_list_view.xml) -// can be removed later if nothing happened. -			// We have to update child rect here because of issues with rect after reshaping while creating LLTextbox -			// It is possible to have invalid LLRect if Flat List is in LLAccordionTab -			LLRect comment_rect = getLocalRect(); - -			// To see comment correctly (EXT - 3244) in mNoItemsCommentTextbox we must get border width -			// of LLFlatListView (@see getBorderWidth()) and stretch mNoItemsCommentTextbox to this width -			// But getBorderWidth() returns 0 if LLFlatListView not visible. So we have to get border width -			// from 'scroll_border' -			LLViewBorder* scroll_border = getChild<LLViewBorder>("scroll border"); -			comment_rect.stretch(-scroll_border->getBorderWidth()); -			mNoItemsCommentTextbox->setRect(comment_rect); -*/ -		}  		mSelectedItemsBorder->setVisible(!visible);  		mNoItemsCommentTextbox->setVisible(visible);  	} diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp index 43c21e250c..55329f64e4 100644 --- a/indra/llui/lllocalcliprect.cpp +++ b/indra/llui/lllocalcliprect.cpp @@ -33,33 +33,8 @@  #include "lllocalcliprect.h"  #include "llfontgl.h" -#include "llgl.h"  #include "llui.h" -#include <stack> - -//--------------------------------------------------------------------------- -// LLScreenClipRect -// implementation class in screen space -//--------------------------------------------------------------------------- -class LLScreenClipRect -{ -public: -	LLScreenClipRect(const LLRect& rect, BOOL enabled = TRUE); -	virtual ~LLScreenClipRect(); - -private: -	static void pushClipRect(const LLRect& rect); -	static void popClipRect(); -	static void updateScissorRegion(); - -private: -	LLGLState		mScissorState; -	BOOL			mEnabled; - -	static std::stack<LLRect> sClipRectStack; -}; -  /*static*/ std::stack<LLRect> LLScreenClipRect::sClipRectStack; @@ -131,16 +106,11 @@ void LLScreenClipRect::updateScissorRegion()  // LLLocalClipRect  //---------------------------------------------------------------------------  LLLocalClipRect::LLLocalClipRect(const LLRect& rect, BOOL enabled /* = TRUE */) -{ -	LLRect screen(rect.mLeft + LLFontGL::sCurOrigin.mX,  -		rect.mTop + LLFontGL::sCurOrigin.mY,  -		rect.mRight + LLFontGL::sCurOrigin.mX,  -		rect.mBottom + LLFontGL::sCurOrigin.mY); -	mScreenClipRect = new LLScreenClipRect(screen, enabled); -} +:	LLScreenClipRect(LLRect(rect.mLeft + LLFontGL::sCurOrigin.mX,  +					rect.mTop + LLFontGL::sCurOrigin.mY,  +					rect.mRight + LLFontGL::sCurOrigin.mX,  +					rect.mBottom + LLFontGL::sCurOrigin.mY), enabled) +{}  LLLocalClipRect::~LLLocalClipRect() -{ -	delete mScreenClipRect; -	mScreenClipRect = NULL; -} +{} diff --git a/indra/llui/lllocalcliprect.h b/indra/llui/lllocalcliprect.h index cd0c55ca72..36413f1496 100644 --- a/indra/llui/lllocalcliprect.h +++ b/indra/llui/lllocalcliprect.h @@ -31,7 +31,9 @@  #ifndef LLLOCALCLIPRECT_H  #define LLLOCALCLIPRECT_H +#include "llgl.h"  #include "llrect.h"		// can't forward declare, it's templated +#include <stack>  // Clip rendering to a specific rectangle using GL scissor  // Just create one of these on the stack: @@ -39,15 +41,29 @@  //     LLLocalClipRect(rect);  //     draw();  // } -class LLLocalClipRect +class LLScreenClipRect  {  public: -	LLLocalClipRect(const LLRect& rect, BOOL enabled = TRUE); -	~LLLocalClipRect(); +	LLScreenClipRect(const LLRect& rect, BOOL enabled = TRUE); +	virtual ~LLScreenClipRect(); + +private: +	static void pushClipRect(const LLRect& rect); +	static void popClipRect(); +	static void updateScissorRegion();  private: -	// implementation class -	class LLScreenClipRect* mScreenClipRect; +	LLGLState		mScissorState; +	BOOL			mEnabled; + +	static std::stack<LLRect> sClipRectStack; +}; + +class LLLocalClipRect : public LLScreenClipRect +{ +public: +	LLLocalClipRect(const LLRect& rect, BOOL enabled = TRUE); +	~LLLocalClipRect();  };  #endif diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 34d58db7f8..a580345b6c 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1012,22 +1012,25 @@ void LLTextBase::draw()  	if (mBGVisible)  	{  		// clip background rect against extents, if we support scrolling -		LLLocalClipRect clip(doc_rect, mScroller != NULL); - +		LLRect bg_rect = mVisibleTextRect; +		if (mScroller) +		{ +			bg_rect.intersectWith(doc_rect); +		}  		LLColor4 bg_color = mReadOnly   							? mReadOnlyBgColor.get()  							: hasFocus()   								? mFocusBgColor.get()   								: mWriteableBgColor.get(); -		gl_rect_2d(mVisibleTextRect, bg_color, TRUE); +		gl_rect_2d(doc_rect, bg_color, TRUE);  	}  	// draw document view  	LLUICtrl::draw();  	{ -		// only clip if we support scrolling (mScroller != NULL) -		LLLocalClipRect clip(doc_rect, mScroller != NULL); +		// only clip if we support scrolling or have word wrap turned off +		LLLocalClipRect clip(doc_rect, !getWordWrap() || mScroller != NULL);  		drawSelectionBackground();  		drawText();  		drawCursor(); @@ -1495,6 +1498,7 @@ LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index)  	// when there are no segments, we return the end iterator, which must be checked by caller  	if (mSegments.size() <= 1) { return mSegments.begin(); } +	//FIXME: avoid operator new somehow (without running into refcount problems)  	segment_set_t::iterator it = mSegments.upper_bound(new LLIndexSegment(index));  	return it;  } @@ -1790,7 +1794,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig  		}  		else  		{ -			segments.push_back(new LLNormalTextSegment(sp, segment_start, segment_end, *this )); +		segments.push_back(new LLNormalTextSegment(sp, segment_start, segment_end, *this ));  		}  		insertStringNoUndo(getLength(), wide_text, &segments); @@ -2289,6 +2293,7 @@ void LLTextBase::updateRects()  	// allow horizontal scrolling?  	// if so, use entire width of text contents  	// otherwise, stop at width of mVisibleTextRect +	//FIXME: consider use of getWordWrap() instead  	doc_rect.mRight = mScroller   		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)  		: mVisibleTextRect.getWidth(); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fa7343ed62..ce22db97b4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7339,7 +7339,7 @@      <key>Value</key>      <integer>0</integer>    </map> -   +    <key>RenderDeferredGI</key>    <map>      <key>Comment</key> @@ -8032,7 +8032,7 @@        <integer>2</integer>      </map> -  <key>RenderReflectionRes</key> +    <key>RenderReflectionRes</key>      <map>        <key>Comment</key>        <string>Reflection map resolution.</string> diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index b64007aa75..63315ce2ae 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -983,6 +983,10 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  		LLNotificationsUtil::add("CannotWearTrash");  		return false;  	} +	else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), LLAppearanceMgr::instance().getCOF())) // EXT-84911 +	{ +		return false; +	}  	switch (item_to_wear->getType())  	{ @@ -1801,9 +1805,9 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool  	llinfos << "wearInventoryCategory( " << category->getName()  			 << " )" << llendl; -	callAfterCategoryFetch(category->getUUID(), boost::bind(&LLAppearanceMgr::wearCategoryFinal, -															&LLAppearanceMgr::instance(), -															category->getUUID(), copy, append)); +	callAfterCategoryFetch(category->getUUID(),boost::bind(&LLAppearanceMgr::wearCategoryFinal, +														   &LLAppearanceMgr::instance(), +														   category->getUUID(), copy, append));  }  void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append) diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index f356a04fa4..78405ebe33 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -660,20 +660,20 @@ LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()  	{  		const LLAccordionCtrlTab* expanded_tab = mAccordionCtrl->getExpandedTab(); -		return get_if_there(mTab2AssetType, expanded_tab, LLAssetType::AT_NONE); +	return get_if_there(mTab2AssetType, expanded_tab, LLAssetType::AT_NONE);  	}  	return LLAssetType::AT_NONE;  }  LLAssetType::EType LLCOFWearables::getSelectedAccordionAssetType() -{ +	{  	if (mAccordionCtrl != NULL)  	{  		const LLAccordionCtrlTab* selected_tab = mAccordionCtrl->getSelectedTab(); -		return get_if_there(mTab2AssetType, selected_tab, LLAssetType::AT_NONE); -	} +	return get_if_there(mTab2AssetType, selected_tab, LLAssetType::AT_NONE); +}  	return LLAssetType::AT_NONE;  } diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 24e818908a..d3d52e20f7 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -1874,13 +1874,18 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )  		}  		// Successively filter out invalid options -		selected_items_t::iterator item_itor; +  		U32 flags = FIRST_SELECTED_ITEM; -		for (item_itor = mSelectedItems.begin(); item_itor != mSelectedItems.end(); ++item_itor) +		for (selected_items_t::iterator item_itor = mSelectedItems.begin();  +			 item_itor != mSelectedItems.end();  +			 ++item_itor)  		{ -			(*item_itor)->buildContextMenu(*menu, flags); +			LLFolderViewItem* selected_item = (*item_itor); +			selected_item->buildContextMenu(*menu, flags);  			flags = 0x0;  		} +	    +		addNoOptions(menu);  		menu->updateParent(LLMenuGL::sMenuContainer);  		LLMenuGL::showPopup(this, menu, x, y); @@ -1889,7 +1894,7 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )  	}  	else  	{ -		if(menu && menu->getVisible()) +		if (menu && menu->getVisible())  		{  			menu->setVisible(FALSE);  		} @@ -1898,6 +1903,37 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )  	return handled;  } +// Add "--no options--" if the menu is completely blank. +BOOL LLFolderView::addNoOptions(LLMenuGL* menu) const +{ +	const std::string nooptions_str = "--no options--"; +	LLView *nooptions_item = NULL; +	 +	const LLView::child_list_t *list = menu->getChildList(); +	for (LLView::child_list_t::const_iterator itor = list->begin();  +		 itor != list->end();  +		 ++itor) +	{ +		LLView *menu_item = (*itor); +		if (menu_item->getVisible()) +		{ +			return FALSE; +		} +		std::string name = menu_item->getName(); +		if (menu_item->getName() == nooptions_str) +		{ +			nooptions_item = menu_item; +		} +	} +	if (nooptions_item) +	{ +		nooptions_item->setVisible(TRUE); +		nooptions_item->setEnabled(FALSE); +		return TRUE; +	} +	return FALSE; +} +  BOOL LLFolderView::handleHover( S32 x, S32 y, MASK mask )  {  	return LLView::handleHover( x, y, mask ); diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 03e1bb9eee..c69f08eb2d 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -292,6 +292,8 @@ protected:  	bool selectFirstItem();  	bool selectLastItem(); +	BOOL addNoOptions(LLMenuGL* menu) const; +  protected:  	LLHandle<LLView>					mPopupMenuHandle; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0b1408616e..38f3521b2d 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -952,6 +952,8 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)  BOOL LLInvFVBridge::canShare() const  { +	if (!isAgentInventory()) return FALSE; +  	const LLInventoryModel* model = getInventoryModel();  	if (!model) return FALSE; @@ -963,9 +965,10 @@ BOOL LLInvFVBridge::canShare() const  		return (BOOL)LLGiveInventory::isInventoryGiveAcceptable(item);  	} -	// All categories can be given. -	const LLViewerInventoryCategory* cat = model->getCategory(mUUID); -	return (cat != NULL); +	// Categories can be given. +	if (model->getCategory(mUUID)) return TRUE; + +	return FALSE;  }  // +=================================================+ @@ -2612,12 +2615,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		mDisabledItems.push_back(std::string("Share"));  	} -	if (mItems.empty()) -	{ -		mItems.push_back(std::string("--no options--")); -		mDisabledItems.push_back(std::string("--no options--")); -	} -  	hide_context_entries(menu, mItems, mDisabledItems);  	// Add menu items that are dependent on the contents of the folder. diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 2517db2678..86af76e0a4 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -250,6 +250,18 @@ BOOL get_can_item_be_worn(const LLUUID& id)  	const LLViewerInventoryItem* item = gInventory.getItem(id);  	if (!item)  		return FALSE; + +	if (LLAppearanceMgr::isLinkInCOF(item->getLinkedUUID())) +	{ +		// an item having links in COF (i.e. a worn item) +		return FALSE; +	} + +	if (gInventory.isObjectDescendentOf(id, LLAppearanceMgr::instance().getCOF())) +	{ +		// a non-link object in COF (should not normally happen) +		return FALSE; +	}  	const LLUUID trash_id = gInventory.findCategoryUUIDForType(  			LLFolderType::FT_TRASH); diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 7ff6e57966..833ff3bfcd 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -315,7 +315,7 @@ private:  };  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// Class LLFindByMask +// Class LLFindNonLinksByMask  //  //  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index c3eee1d1ad..8147a97317 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -1005,11 +1005,6 @@ bool LLOutfitsList::canWearSelected()  	{  		const LLUUID& id = *it; -		if (LLAppearanceMgr::isLinkInCOF(id)) -		{ -			return false; -		} -  		// Check whether the item is worn.  		if (!get_can_item_be_worn(id))  		{ diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 445cfe64f7..7a28d10baf 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -51,6 +51,7 @@  #include "lltabcontainer.h"  #include "lltextbox.h"  #include "lltexteditor.h" +#include "lltrans.h"  #include "llviewertexturelist.h"  #include "llviewerwindow.h"  #include "llfocusmgr.h" @@ -587,7 +588,7 @@ void LLPanelGroupSubTab::buildActionCategory(LLScrollListCtrl* ctrl,  		row["columns"][1]["column"] = "action";  		row["columns"][1]["type"] = "text"; -		row["columns"][1]["value"] = action_set->mActionSetData->mName; +		row["columns"][1]["value"] = LLTrans::getString(action_set->mActionSetData->mName);  		row["columns"][1]["font"]["name"] = "SANSSERIF_SMALL"; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index ca1361c84b..116e5ba4cb 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -750,8 +750,6 @@ void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  {  	std::vector<std::string> items;  	std::vector<std::string> disabled_items; -	items.push_back(std::string("--no options--")); -	disabled_items.push_back(std::string("--no options--"));  	hide_context_entries(menu, items, disabled_items);  } diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 58a5529505..b56cf5c3ce 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -655,21 +655,21 @@ void LLPanelOutfitEdit::onShopButtonClicked()  		}  		else  		{ -			if (type == LLWearableType::WT_NONE) -			{ -				type = getCOFWearablesSelectionType(); -			} +		if (type == LLWearableType::WT_NONE) +		{ +			type = getCOFWearablesSelectionType(); +		} -			ESex sex = gAgentAvatarp->getSex(); +		ESex sex = gAgentAvatarp->getSex(); -			// WT_INVALID comes for attachments -			if (type != LLWearableType::WT_INVALID && type != LLWearableType::WT_NONE) -			{ -				url = url_resolver.resolveURL(type, sex); -			} +		// WT_INVALID comes for attachments +		if (type != LLWearableType::WT_INVALID && type != LLWearableType::WT_NONE) +		{ +			url = url_resolver.resolveURL(type, sex); +		} -			if (url.empty()) -			{ +		if (url.empty()) +		{  				url = url_resolver.resolveURL(  						mCOFWearables->getExpandedAccordionAssetType(), sex);  			} @@ -779,9 +779,7 @@ void LLPanelOutfitEdit::updatePlusButton()  	}  	// If any of the selected items are not wearable (due to already being worn OR being of the wrong type), disable the add button. -	uuid_vec_t::iterator unwearable_item = std::find_if(selected_items.begin(), selected_items.end(), !boost::bind(& get_can_item_be_worn, _1) -		// since item can be not worn but in wearing process at that time - we need to check is link to item presents in COF -		|| boost::bind(&LLAppearanceMgr::isLinkInCOF, _1)); +	uuid_vec_t::iterator unwearable_item = std::find_if(selected_items.begin(), selected_items.end(), !boost::bind(&get_can_item_be_worn, _1));  	bool can_add = ( unwearable_item == selected_items.end() );  	mPlusBtn->setEnabled(can_add); @@ -866,7 +864,7 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  			LLUUID selected_item_id = mWearableItemsList->getSelectedUUID();  			LLViewerInventoryItem* item = gInventory.getLinkedItem(selected_item_id);  			if(item) -			{ +		{  				showFilteredWearablesListView(item->getWearableType());  				return;  			} diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index de59af49da..0951586dd5 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -33,10 +33,13 @@  #include "llsidepanelinventory.h"  #include "llagent.h" +#include "llappearancemgr.h"  #include "llavataractions.h"  #include "llbutton.h"  #include "llinventorybridge.h" +#include "llinventoryfunctions.h"  #include "llinventorypanel.h" +#include "lloutfitobserver.h"  #include "llpanelmaininventory.h"  #include "llsidepaneliteminfo.h"  #include "llsidepaneltaskinfo.h" @@ -98,6 +101,8 @@ BOOL LLSidepanelInventory::postBuild()  		my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK);  		my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE);  		*/ + +		LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));  	}  	// UI elements from item panel @@ -283,7 +288,7 @@ void LLSidepanelInventory::updateVerbs()  		case LLInventoryType::IT_OBJECT:  		case LLInventoryType::IT_ATTACHMENT:  			mWearBtn->setVisible(TRUE); -			mWearBtn->setEnabled(TRUE); +			mWearBtn->setEnabled(get_can_item_be_worn(item->getLinkedUUID()));  		 	mShopBtn->setVisible(FALSE);  			break;  		case LLInventoryType::IT_SOUND: diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 9926c8d15f..a6e8ea032a 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -936,7 +936,7 @@ void ModifiedCOFCallback::fire(const LLUUID& inv_item)  	gAgentWearables.editWearableIfRequested(inv_item);  	// TODO: camera mode may not be changed if a debug setting is tweaked -	if(gAgentCamera.cameraCustomizeAvatar()) +	if( gAgentCamera.cameraCustomizeAvatar() )  	{  		// If we're in appearance editing mode, the current tab may need to be refreshed  		LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index e38608bcfc..9d4f6fdd0c 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -2131,7 +2131,7 @@ void LLViewerFetchedTexture::deleteCallbackEntry(const LLLoadedCallbackEntry::so  void LLViewerFetchedTexture::unpauseLoadedCallbacks(const LLLoadedCallbackEntry::source_callback_list_t* callback_list)  {  	if(!callback_list) -	{ +{  		mPauseLoadedCallBacks = FALSE ;  		return ;  	} @@ -2160,7 +2160,7 @@ void LLViewerFetchedTexture::unpauseLoadedCallbacks(const LLLoadedCallbackEntry:  void LLViewerFetchedTexture::pauseLoadedCallbacks(const LLLoadedCallbackEntry::source_callback_list_t* callback_list)  {  	if(!callback_list) -	{ +{  		return ;  	} diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 68085b1baf..4fac7fe510 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2005,8 +2005,8 @@ void LLVOAvatar::updateMeshData()  				}  				else  				{ -					facep->mVertexBuffer->resizeBuffer(num_vertices, num_indices) ; -				} +				facep->mVertexBuffer->resizeBuffer(num_vertices, num_indices) ; +			}  			}  			facep->setGeomIndex(0); @@ -3789,11 +3789,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)  	{	//LOD changed or new mesh created, allocate new vertex buffer if needed  		if (needs_rebuild || mDirtyMesh >= 2 || mVisibilityRank <= 4)  		{ -			updateMeshData(); +		updateMeshData();  			mDirtyMesh = 0; -			mNeedsSkin = TRUE; -			mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); -		} +		mNeedsSkin = TRUE; +		mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); +	}  	}  	if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0) @@ -4202,7 +4202,7 @@ void LLVOAvatar::checkTextureLoading()  	{  		return ; //have not been invisible for enough time.  	} - +	  	for(LLLoadedCallbackEntry::source_callback_list_t::iterator iter = mCallbackTextureList.begin();  		iter != mCallbackTextureList.end(); ++iter)  	{ @@ -4239,7 +4239,7 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel  	//Note:  	//if this function is not called for the last MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL frames,   	//the texture pipeline will stop fetching this texture. -	 +  	imagep->resetTextureStats();  	imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures.  	imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 4163810d6c..eb622ce7c7 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -623,7 +623,7 @@ private:  public:  	void			setClothesColor(LLVOAvatarDefines::ETextureIndex te, const LLColor4& new_color, BOOL upload_bake);  	LLColor4		getClothesColor(LLVOAvatarDefines::ETextureIndex te); -	static BOOL		teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name); +	static BOOL			teToColorParams(LLVOAvatarDefines::ETextureIndex te, U32 *param_name);  	//--------------------------------------------------------------------  	// Global colors @@ -1049,7 +1049,7 @@ protected: // Shared with LLVOAvatarSelf   *******************************************************************************/  }; // LLVOAvatar -extern const F32 SELF_ADDITIONAL_PRI; +extern const F32  SELF_ADDITIONAL_PRI;  extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL;  #endif // LL_VO_AVATAR_H diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 3a283e7aa6..bddde08ca9 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1625,15 +1625,15 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te  					if (isSelf())  					{  						if (gAgentAvatarp->isUsingBakedTextures()) -						{ -							requestLayerSetUpdate(type); -						} +					{ +						requestLayerSetUpdate(type); +					}  						else -						{ -							LLVisualParamHint::requestHintUpdates(); -						} +					{ +						LLVisualParamHint::requestHintUpdates();  					}  				} +				}  				else  				{					  					tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type), NULL); diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 8035cd2d93..8ea731cf10 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -569,7 +569,7 @@ bool LLWearableItemTypeNameComparator::sortAssetTypeByName(LLAssetType::EType it  	}  	return const_it->second.mSortAssetTypeByName; -} +	}  bool LLWearableItemTypeNameComparator::sortWearableTypeByName(LLAssetType::EType item_type) const  { @@ -579,7 +579,7 @@ bool LLWearableItemTypeNameComparator::sortWearableTypeByName(LLAssetType::EType  	{  		llwarns<<"Absent information about sorting items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl;  		return true; -	} +}  	return const_it->second.mSortWearableTypeByName;  } diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index f2f81968ee..2e720d13bb 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -339,8 +339,8 @@ protected:  	 *     For example by spec in MY OUTFITS the order within each items type(LLAssetType) is:  	 *     1. AT_OBJECTS (abc order)  	 *     2. AT_CLOTHINGS -	 *       - by type (types order determined in LLWearableType::EType) -	 *       - outer layer on top +	 *         - by type (types order determined in LLWearableType::EType) +	 *         - outer layer on top  	 *     3. AT_BODYPARTS  (abc order)  	 *---------------------------------------------------------------------------------------------  	 * diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 1dc46a4012..c8f834c7f7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -635,10 +635,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  void LLPipeline::updateRenderDeferred()  {  	BOOL deferred = (gSavedSettings.getBOOL("RenderDeferred") &&  -			 LLRenderTarget::sUseFBO && +		LLRenderTarget::sUseFBO &&  			 LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && -			 gSavedSettings.getBOOL("VertexShaderEnable") &&  -			 gSavedSettings.getBOOL("RenderAvatarVP") && +		gSavedSettings.getBOOL("VertexShaderEnable") &&  +		gSavedSettings.getBOOL("RenderAvatarVP") &&  			 (gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) &&  		!gUseWireframe; @@ -1975,8 +1975,8 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)  	if(drawablep && !drawablep->isDead())  	{ -		if (drawablep->isSpatialBridge()) -		{ +	if (drawablep->isSpatialBridge()) +	{  			const LLDrawable* root = ((LLSpatialBridge*) drawablep)->mDrawable;  			llassert(root); // trying to catch a bad assumption  			if (root && //  // this test may not be needed, see above @@ -1988,24 +1988,24 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)  					LLViewerObject *vobj = rootparent->getVObj();  					llassert(vobj); // trying to catch a bad assumption  					if (vobj) // this test may not be needed, see above -					{ +		{  						const LLVOAvatar* av = vobj->asAvatar(); -						if (av && av->isImpostor()) -						{ -							return; -						} -					} -				} +			if (av && av->isImpostor()) +			{ +				return;  			} -			sCull->pushBridge((LLSpatialBridge*) drawablep); -		} -		else -		{ -			sCull->pushDrawable(drawablep);  		} - -		drawablep->setVisible(camera); +				} +			} +		sCull->pushBridge((LLSpatialBridge*) drawablep); +	} +	else +	{ +		sCull->pushDrawable(drawablep);  	} + +	drawablep->setVisible(camera); +}  }  void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion) @@ -3616,7 +3616,7 @@ void LLPipeline::renderDebug()  			if (i > 3)  			{ //render shadow frusta as volumes  				if (mShadowFrustPoints[i-4].empty()) -				{ +			{  					continue;  				} @@ -3649,22 +3649,22 @@ void LLPipeline::renderDebug()  			if (i < 4)  			{ - +				  				if (i == 0 || !mShadowFrustPoints[i].empty())  				{  					//render visible point cloud  					gGL.flush();  					glPointSize(8.f);  					gGL.begin(LLRender::POINTS); - +					  					F32* c = col+i*4;  					gGL.color3fv(c);  					for (U32 j = 0; j < mShadowFrustPoints[i].size(); ++j) -					{	 -						gGL.vertex3fv(mShadowFrustPoints[i][j].mV); +						{ +							gGL.vertex3fv(mShadowFrustPoints[i][j].mV); -					} +						}  					gGL.end();  					gGL.flush(); @@ -3690,7 +3690,7 @@ void LLPipeline::renderDebug()  					gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV);  					gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV);  					gGL.end(); -				} +					}  			} @@ -4315,7 +4315,7 @@ void LLPipeline::setupAvatarLights(BOOL for_edit)  		glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 	 0.0f);  		glLightf (GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.0f);  		glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 		 0.0f); -		glLightf (GL_LIGHT1, GL_SPOT_CUTOFF,		 180.0f); +		glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 			 180.0f);  	}  	else if (gAvatarBacklight) // Always true (unless overridden in a devs .ini)  	{ @@ -4631,8 +4631,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			}  			else // omnidirectional (point) light  			{ -				glLightf (gllight, GL_SPOT_EXPONENT, 0.0f); -				glLightf (gllight, GL_SPOT_CUTOFF,   180.0f); +			glLightf (gllight, GL_SPOT_EXPONENT,          0.0f); +			glLightf (gllight, GL_SPOT_CUTOFF,            180.0f);  				// we use specular.w = 1.0 as a cheap hack for the shaders to know that this is omnidirectional rather than a spotlight  				const float specular[] = {0.f, 0.f, 0.f, 1.f}; @@ -4666,7 +4666,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  		F32 light_radius = 16.f; -		F32 x = 3.f; +			F32 x = 3.f;  		float linatten = x / (light_radius); // % of brightness at radius  		mHWLightColors[2] = light_color; @@ -6336,13 +6336,13 @@ void LLPipeline::renderDeferredLighting()  			glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], 0);  		} -		glPushMatrix(); -		glLoadIdentity(); -		glMatrixMode(GL_PROJECTION); -		glPushMatrix(); -		glLoadIdentity(); +			glPushMatrix(); +			glLoadIdentity(); +			glMatrixMode(GL_PROJECTION); +			glPushMatrix(); +			glLoadIdentity(); -		mDeferredLight[0].bindTarget(); +			mDeferredLight[0].bindTarget();  		if (gSavedSettings.getBOOL("RenderDeferredSSAO") || gSavedSettings.getS32("RenderShadowDetail") > 0)  		{ @@ -6387,19 +6387,19 @@ void LLPipeline::renderDeferredLighting()  				unbindDeferredShader(gDeferredSunProgram);  			}  		} -		else -		{ +			else +			{  			glClearColor(1,1,1,1); -			mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT); +				mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);  			glClearColor(0,0,0,0); -		} +			} -		mDeferredLight[0].flush(); +			mDeferredLight[0].flush();  		{ //global illumination specific block (still experimental)  			if (gSavedSettings.getBOOL("RenderDeferredBlurLight") && -				gSavedSettings.getBOOL("RenderDeferredGI")) -			{  +			    gSavedSettings.getBOOL("RenderDeferredGI")) +			{  				LLFastTimer ftm(FTM_EDGE_DETECTION);  				//generate edge map  				LLGLDisable blend(GL_BLEND); @@ -6501,75 +6501,75 @@ void LLPipeline::renderDeferredLighting()  		}  		if (gSavedSettings.getBOOL("RenderDeferredSSAO")) -		{ //soften direct lighting lightmap -			LLFastTimer ftm(FTM_SOFTEN_SHADOW); -			//blur lightmap -			mDeferredLight[1].bindTarget(); +			{ //soften direct lighting lightmap +				LLFastTimer ftm(FTM_SOFTEN_SHADOW); +				//blur lightmap +				mDeferredLight[1].bindTarget(); -			glClearColor(1,1,1,1); -			mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT); -			glClearColor(0,0,0,0); -			 -			bindDeferredShader(gDeferredBlurLightProgram); +				glClearColor(1,1,1,1); +				mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT); +				glClearColor(0,0,0,0); +				 +				bindDeferredShader(gDeferredBlurLightProgram); -			LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian"); -			const U32 kern_length = 4; -			F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize"); -			F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor"); +				LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian"); +				const U32 kern_length = 4; +				F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize"); +				F32 dist_factor = gSavedSettings.getF32("RenderShadowBlurDistFactor"); -			// sample symmetrically with the middle sample falling exactly on 0.0 -			F32 x = 0.f; +				// sample symmetrically with the middle sample falling exactly on 0.0 +				F32 x = 0.f; -			LLVector3 gauss[32]; // xweight, yweight, offset +				LLVector3 gauss[32]; // xweight, yweight, offset -			for (U32 i = 0; i < kern_length; i++) -			{ -				gauss[i].mV[0] = llgaussian(x, go.mV[0]); -				gauss[i].mV[1] = llgaussian(x, go.mV[1]); -				gauss[i].mV[2] = x; -				x += 1.f; -			} +				for (U32 i = 0; i < kern_length; i++) +				{ +					gauss[i].mV[0] = llgaussian(x, go.mV[0]); +					gauss[i].mV[1] = llgaussian(x, go.mV[1]); +					gauss[i].mV[2] = x; +					x += 1.f; +				} -			gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f); -			gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor); -			gDeferredBlurLightProgram.uniform3fv("kern[0]", kern_length, gauss[0].mV); -			gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV); -			gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f)); -		 -			{ -				LLGLDisable blend(GL_BLEND); -				LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); -				stop_glerror(); -				glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -				stop_glerror(); -			} +				gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f); +				gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor); +				gDeferredBlurLightProgram.uniform3fv("kern[0]", kern_length, gauss[0].mV); +				gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV); +				gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f)); -			mDeferredLight[1].flush(); -			unbindDeferredShader(gDeferredBlurLightProgram); +				{ +					LLGLDisable blend(GL_BLEND); +					LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); +					stop_glerror(); +					glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); +					stop_glerror(); +				} +				 +				mDeferredLight[1].flush(); +				unbindDeferredShader(gDeferredBlurLightProgram); -			bindDeferredShader(gDeferredBlurLightProgram, 1); -			mDeferredLight[0].bindTarget(); +				bindDeferredShader(gDeferredBlurLightProgram, 1); +				mDeferredLight[0].bindTarget(); -			gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f); +				gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f); -			{ -				LLGLDisable blend(GL_BLEND); -				LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); -				stop_glerror(); -				glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); -				stop_glerror(); +				{ +					LLGLDisable blend(GL_BLEND); +					LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); +					stop_glerror(); +					glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); +					stop_glerror(); +				} +				mDeferredLight[0].flush(); +				unbindDeferredShader(gDeferredBlurLightProgram);  			} -			mDeferredLight[0].flush(); -			unbindDeferredShader(gDeferredBlurLightProgram); -		} -		stop_glerror(); -		glPopMatrix(); -		stop_glerror(); -		glMatrixMode(GL_MODELVIEW); -		stop_glerror(); -		glPopMatrix(); -		stop_glerror(); +			stop_glerror(); +			glPopMatrix(); +			stop_glerror(); +			glMatrixMode(GL_MODELVIEW); +			stop_glerror(); +			glPopMatrix(); +			stop_glerror();  		//copy depth and stencil from deferred screen  		//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(), @@ -7232,7 +7232,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		LLPipeline::sUseOcclusion = llmin(occlusion, 1);  		gPipeline.pushRenderTypeMask(); -		 +  		glh::matrix4f projection = glh_get_current_projection();  		glh::matrix4f mat; @@ -7322,24 +7322,24 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  				}  				gPipeline.pushRenderTypeMask(); -				 +  				clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER,  									LLPipeline::RENDER_TYPE_GROUND,  									LLPipeline::RENDER_TYPE_SKY,  									LLPipeline::RENDER_TYPE_CLOUDS,  									LLPipeline::END_RENDER_TYPES);	 -				S32 detail = gSavedSettings.getS32("RenderReflectionDetail"); +					S32 detail = gSavedSettings.getS32("RenderReflectionDetail");  				if (detail > 0)  				{ //mask out selected geometry based on reflection detail  					if (detail < 4)  					{  						clearRenderTypeMask(LLPipeline::RENDER_TYPE_PARTICLES, END_RENDER_TYPES); -						if (detail < 3) -						{ +					if (detail < 3) +					{  							clearRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES); -							if (detail < 2) -							{ +						if (detail < 2) +						{  								clearRenderTypeMask(LLPipeline::RENDER_TYPE_VOLUME, END_RENDER_TYPES);  							}  						} @@ -7351,15 +7351,15 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  					stateSort(camera, ref_result);  				} -				if (LLDrawPoolWater::sNeedsDistortionUpdate) -				{ +			if (LLDrawPoolWater::sNeedsDistortionUpdate) +			{  					if (gSavedSettings.getS32("RenderReflectionDetail") > 0) -					{ -						gPipeline.grabReferences(ref_result); -						LLGLUserClipPlane clip_plane(plane, mat, projection); -						renderGeom(camera); -					} +				{ +					gPipeline.grabReferences(ref_result); +					LLGLUserClipPlane clip_plane(plane, mat, projection); +					renderGeom(camera);  				} +			}	  				gPipeline.popRenderTypeMask();  			}	 @@ -7663,7 +7663,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  	//bounding box line segments  	U32 bs[] =  -	{ +			{  		0,1,  		1,3,  		3,2, @@ -7701,9 +7701,9 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  				LLVector3 intersect = v2+line*t;  				pp.push_back(intersect);  			} +			}  		} -	} - +			  	//camera frustum line segments  	const U32 fs[] =  	{ @@ -7716,7 +7716,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  		5,6,  		6,7,  		7,4, - +	  		0,4,  		1,5,  		2,6, @@ -7725,7 +7725,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  	LLVector3 center = (max+min)*0.5f;  	LLVector3 size = (max-min)*0.5f; - +	  	for (U32 i = 0; i < 12; i++)  	{  		for (U32 j = 0; j < 6; ++j) @@ -7748,17 +7748,17 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  				pp.push_back(intersect);  			}	  		} -	} -	 +				} +  	LLVector3 ext[] = { min-LLVector3(0.05f,0.05f,0.05f),  		max+LLVector3(0.05f,0.05f,0.05f) };  	for (U32 i = 0; i < pp.size(); ++i)  	{  		bool found = true; -		 -		const F32* p = pp[i].mV; +		const F32* p = pp[i].mV; +			  		for (U32 j = 0; j < 3; ++j)  		{  			if (p[j] < ext[0].mV[j] || @@ -7768,24 +7768,24 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  				break;  			}  		} -			 +				  		for (U32 j = 0; j < 6; ++j)  		{  			const LLPlane& cp = camera.getAgentPlane(j);  			F32 dist = cp.dist(pp[i]);  			if (dist > 0.05f) //point is above some plane, not contained -			{ +					{  				found = false;  				break; -			} -		} +						} +					} -		if (found) -		{ +					if (found) +					{  			fp.push_back(pp[i]);  		}  	} - +	  	if (fp.empty())  	{  		return FALSE; @@ -8588,141 +8588,141 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  		}  	} - +	  	//hack to disable projector shadows   	static bool clear = true;  	bool gen_shadow = gSavedSettings.getS32("RenderShadowDetail") > 1; -	 +  	if (gen_shadow)  	{  		clear = true; -		F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f); +	F32 fade_amt = gFrameIntervalSeconds * llmax(LLViewerCamera::getInstance()->getVelocityStat()->getCurrentPerSec(), 1.f); -		//update shadow targets -		for (U32 i = 0; i < 2; i++) -		{ //for each current shadow -			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i; - -			if (mShadowSpotLight[i].notNull() &&  -				(mShadowSpotLight[i] == mTargetShadowSpotLight[0] || -				mShadowSpotLight[i] == mTargetShadowSpotLight[1])) -			{ //keep this spotlight -				mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f); -			} -			else -			{ //fade out this light -				mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f); -				 -				if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull()) -				{ //faded out, grab one of the pending spots (whichever one isn't already taken) -					if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2]) -					{ -						mShadowSpotLight[i] = mTargetShadowSpotLight[0]; -					} -					else -					{ -						mShadowSpotLight[i] = mTargetShadowSpotLight[1]; -					} +	//update shadow targets +	for (U32 i = 0; i < 2; i++) +	{ //for each current shadow +		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i; + +		if (mShadowSpotLight[i].notNull() &&  +			(mShadowSpotLight[i] == mTargetShadowSpotLight[0] || +			mShadowSpotLight[i] == mTargetShadowSpotLight[1])) +		{ //keep this spotlight +			mSpotLightFade[i] = llmin(mSpotLightFade[i]+fade_amt, 1.f); +		} +		else +		{ //fade out this light +			mSpotLightFade[i] = llmax(mSpotLightFade[i]-fade_amt, 0.f); +			 +			if (mSpotLightFade[i] == 0.f || mShadowSpotLight[i].isNull()) +			{ //faded out, grab one of the pending spots (whichever one isn't already taken) +				if (mTargetShadowSpotLight[0] != mShadowSpotLight[(i+1)%2]) +				{ +					mShadowSpotLight[i] = mTargetShadowSpotLight[0]; +				} +				else +				{ +					mShadowSpotLight[i] = mTargetShadowSpotLight[1];  				}  			}  		} -		 -		for (S32 i = 0; i < 2; i++) -		{ -			glh_set_current_modelview(saved_view); -			glh_set_current_projection(saved_proj); +	} -			if (mShadowSpotLight[i].isNull()) -			{ -				continue; -			} +	for (S32 i = 0; i < 2; i++) +	{ +		glh_set_current_modelview(saved_view); +		glh_set_current_projection(saved_proj); -			LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume(); +		if (mShadowSpotLight[i].isNull()) +		{ +			continue; +		} -			if (!volume) -			{ -				mShadowSpotLight[i] = NULL; -				continue; -			} +		LLVOVolume* volume = mShadowSpotLight[i]->getVOVolume(); -			LLDrawable* drawable = mShadowSpotLight[i]; +		if (!volume) +		{ +			mShadowSpotLight[i] = NULL; +			continue; +		} -			LLVector3 params = volume->getSpotLightParams(); -			F32 fov = params.mV[0]; +		LLDrawable* drawable = mShadowSpotLight[i]; -			//get agent->light space matrix (modelview) -			LLVector3 center = drawable->getPositionAgent(); -			LLQuaternion quat = volume->getRenderRotation(); +		LLVector3 params = volume->getSpotLightParams(); +		F32 fov = params.mV[0]; -			//get near clip plane -			LLVector3 scale = volume->getScale(); -			LLVector3 at_axis(0,0,-scale.mV[2]*0.5f); -			at_axis *= quat; +		//get agent->light space matrix (modelview) +		LLVector3 center = drawable->getPositionAgent(); +		LLQuaternion quat = volume->getRenderRotation(); -			LLVector3 np = center+at_axis; -			at_axis.normVec(); +		//get near clip plane +		LLVector3 scale = volume->getScale(); +		LLVector3 at_axis(0,0,-scale.mV[2]*0.5f); +		at_axis *= quat; -			//get origin that has given fov for plane np, at_axis, and given scale -			F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f); +		LLVector3 np = center+at_axis; +		at_axis.normVec(); -			LLVector3 origin = np - at_axis*dist; +		//get origin that has given fov for plane np, at_axis, and given scale +		F32 dist = (scale.mV[1]*0.5f)/tanf(fov*0.5f); -			LLMatrix4 mat(quat, LLVector4(origin, 1.f)); +		LLVector3 origin = np - at_axis*dist; -			view[i+4] = glh::matrix4f((F32*) mat.mMatrix); +		LLMatrix4 mat(quat, LLVector4(origin, 1.f)); -			view[i+4] = view[i+4].inverse(); +		view[i+4] = glh::matrix4f((F32*) mat.mMatrix); -			//get perspective matrix -			F32 near_clip = dist+0.01f; -			F32 width = scale.mV[VX]; -			F32 height = scale.mV[VY]; -			F32 far_clip = dist+volume->getLightRadius()*1.5f; +		view[i+4] = view[i+4].inverse(); -			F32 fovy = fov * RAD_TO_DEG; -			F32 aspect = width/height; -			 -			proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip); +		//get perspective matrix +		F32 near_clip = dist+0.01f; +		F32 width = scale.mV[VX]; +		F32 height = scale.mV[VY]; +		F32 far_clip = dist+volume->getLightRadius()*1.5f; -			//translate and scale to from [-1, 1] to [0, 1] -			glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, -							0.f, 0.5f, 0.f, 0.5f, -							0.f, 0.f, 0.5f, 0.5f, -							0.f, 0.f, 0.f, 1.f); +		F32 fovy = fov * RAD_TO_DEG; +		F32 aspect = width/height; +		 +		proj[i+4] = gl_perspective(fovy, aspect, near_clip, far_clip); -			glh_set_current_modelview(view[i+4]); -			glh_set_current_projection(proj[i+4]); +		//translate and scale to from [-1, 1] to [0, 1] +		glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, +						0.f, 0.5f, 0.f, 0.5f, +						0.f, 0.f, 0.5f, 0.5f, +						0.f, 0.f, 0.f, 1.f); -			mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view; -			 -			for (U32 j = 0; j < 16; j++) -			{ -				gGLLastModelView[j] = mShadowModelview[i+4].m[j]; -				gGLLastProjection[j] = mShadowProjection[i+4].m[j]; -			} +		glh_set_current_modelview(view[i+4]); +		glh_set_current_projection(proj[i+4]); + +		mSunShadowMatrix[i+4] = trans*proj[i+4]*view[i+4]*inv_view; +		 +		for (U32 j = 0; j < 16; j++) +		{ +			gGLLastModelView[j] = mShadowModelview[i+4].m[j]; +			gGLLastProjection[j] = mShadowProjection[i+4].m[j]; +		} -			mShadowModelview[i+4] = view[i+4]; -			mShadowProjection[i+4] = proj[i+4]; +		mShadowModelview[i+4] = view[i+4]; +		mShadowProjection[i+4] = proj[i+4]; -			LLCamera shadow_cam = camera; -			shadow_cam.setFar(far_clip); -			shadow_cam.setOrigin(origin); +		LLCamera shadow_cam = camera; +		shadow_cam.setFar(far_clip); +		shadow_cam.setOrigin(origin); -			LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE); +		LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE); -			stop_glerror(); +		stop_glerror(); -			mShadow[i+4].bindTarget(); -			mShadow[i+4].getViewport(gGLViewport); +		mShadow[i+4].bindTarget(); +		mShadow[i+4].getViewport(gGLViewport); -			static LLCullResult result[2]; +		static LLCullResult result[2]; -			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4; +		LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4; -			renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE); +		renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE); -			mShadow[i+4].flush(); - 		} +		mShadow[i+4].flush(); + 	}  	}  	else  	{ diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml index 070b4218a8..b1ec2c44df 100644 --- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Profil for genstand"/>  	<text name="origin" value="(Beholdning)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Navn:  		</text> diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml index 63e7bce8ae..b9ca969ac5 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Objektprofil"/>  	<text name="origin" value="(Inventar)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Name:  		</text> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index bf1707c13e..52cf24333f 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3395,4 +3395,4 @@              </menu>          </menu>      </menu> -</menu_bar>
\ No newline at end of file +</menu_bar> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 50df227fbf..49b252174c 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -80,10 +80,11 @@  	<panel           follows="all"           height="493" +         help_topic=""           label=""           layout="topleft"           left="9" -         help_topic="" +         name="item_profile"           top="45"           width="313"     background_visible="true" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index a0c67e3612..048de70045 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3239,4 +3239,20 @@ Abuse Report</string>    <!--  currency formatting -->    <string name="LocalEstimateUSD">US$ [AMOUNT]</string> + +  <!-- Group Profile roles and powers --> +  <string name="Membership">Membership</string> +  <string name="Roles">Roles</string> +  <string name="Group Identity">Group Identity</string> +  <string name="Parcel Management">Parcel Management</string> +  <string name="Parcel Identity">Parcel Identity</string> +  <string name="Parcel Settings">Parcel Settings</string> +  <string name="Parcel Powers">Parcel Powers</string> +  <string name="Parcel Access">Parcel Access</string> +  <string name="Parcel Content">Parcel Content</string> +  <string name="Object Management">Object Management</string> +  <string name="Accounting">Accounting</string> +  <string name="Notices">Notices</string> +  <string name="Chat">Chat</string> +    </strings> diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml index 38f43c3cbc..d3b91e7a71 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Perfil del elemento"/>  	<text name="origin" value="(Inventario)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Nombre:  		</text> diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml index 257c44795f..6492a83e06 100644 --- a/indra/newview/skins/default/xui/fr/menu_object.xml +++ b/indra/newview/skins/default/xui/fr/menu_object.xml @@ -1,9 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <context_menu name="Object Pie"> -	<menu_item_call label="Toucher" name="Object Touch"> -		<on_enable parameter="Toucher" name="EnableTouch"/> -	</menu_item_call> -	<menu_item_call label="Modifier" name="Edit..."/> +	<menu_item_call label="Toucher" name="Object Touch"/> +	<menu_item_call label="Éditer" name="Edit..."/>  	<menu_item_call label="Construire" name="Build"/>  	<menu_item_call label="Ouvrir" name="Open"/>  	<menu_item_call label="M'asseoir ici" name="Object Sit"/> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml index 0a5680fe06..0350ea5116 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Profil de l'article"/>  	<text name="origin" value="(inventaire)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Nom :  		</text> diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml index d0ec943e67..627aeb5cb5 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Profilo articolo"/>  	<text name="origin" value="(Inventario)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Nome:  		</text> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml index fdabe88362..414eba0509 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="アイテムのプロフィール"/>  	<text name="origin" value="(持ち物)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			名前:  		</text> diff --git a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml index 2f43e0c215..0c6169c9c0 100644 --- a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Profil obiektu"/>  	<text name="origin" value="(Szafa)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Nazwa:  		</text> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml index 8e880588e9..d2050f4660 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml @@ -23,7 +23,8 @@  	</panel.string>  	<text name="title" value="Perfil do item"/>  	<text name="origin" value="(Inventário)"/> -	<panel label=""> +	<panel label="" +           name="item_profile">  		<text name="LabelItemNameTitle">  			Nome:  		</text>  | 
