diff options
| author | Palmer <palmer@lindenlab.com> | 2010-02-12 15:16:19 -0800 | 
|---|---|---|
| committer | Palmer <palmer@lindenlab.com> | 2010-02-12 15:16:19 -0800 | 
| commit | 418504207bdbdac9b41f731d87562d7d08a229d2 (patch) | |
| tree | 8eb914baeeaa05fb8ce6f4556eabd697b3c45afe | |
| parent | 434436ef6b96f74eaf0daf687c6978d5a24d5be7 (diff) | |
| parent | 43ca4e104b613c95a1147751122f7ff007542e5c (diff) | |
merge
31 files changed, 577 insertions, 344 deletions
| diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index b6a6b448ee..25f8320b02 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -151,14 +151,16 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		}  	} -	gGL.pushMatrix(); -	glLoadIdentity(); -	gGL.translatef(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ); +	gGL.pushUIMatrix(); + +	gGL.loadUIIdentity(); +	 +	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.translatef(-pixel_offset_x, -pixel_offset_y, 0.f); +	gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f);  	LLFastTimer t(FTM_RENDER_FONTS); @@ -246,9 +248,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	} -	// Remember last-used texture to avoid unnecesssary bind calls. -	LLImageGL *last_bound_texture = NULL; -  	for (i = begin_offset; i < begin_offset + length; i++)  	{  		llwchar wch = wstr[i]; @@ -261,12 +260,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		}  		// Per-glyph bitmap texture.  		LLImageGL *image_gl = mFontFreetype->getFontBitmapCache()->getImageGL(fgi->mBitmapNum); -		if (last_bound_texture != image_gl) -		{ -			gGL.getTexUnit(0)->bind(image_gl); -			last_bound_texture = image_gl; -		} - +		gGL.getTexUnit(0)->bind(image_gl); +	  		if ((start_x + scaled_max_pixels) < (cur_x + fgi->mXBearing + fgi->mWidth))  		{  			// Not enough room for this character. @@ -330,10 +325,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		// recursively render ellipses at end of string  		// we've already reserved enough room -		gGL.pushMatrix(); -		//glLoadIdentity(); -		//gGL.translatef(sCurOrigin.mX, sCurOrigin.mY, 0.0f); -		//glScalef(sScaleX, sScaleY, 1.f); +		gGL.pushUIMatrix();  		renderUTF8(std::string("..."),   				0,  				cur_x / sScaleX, (F32)y, @@ -344,10 +336,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  				S32_MAX, max_pixels,  				right_x,  				FALSE);  -		gGL.popMatrix(); +		gGL.popUIMatrix();  	} -	gGL.popMatrix(); +	gGL.popUIMatrix();  	return chars_drawn;  } diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 595b8577ff..d2dc1104a8 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -49,6 +49,9 @@ F64 gGLLastProjection[16];  F64 gGLProjection[16];  S32	gGLViewport[4]; +U32 LLRender::sUICalls = 0; +U32 LLRender::sUIVerts = 0; +  static const U32 LL_NUM_TEXTURE_LAYERS = 16;   static GLenum sGLTextureType[] = @@ -255,10 +258,9 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)  		return false ;  	} -	gGL.flush(); -  	if ((mCurrTexture != texture->getTexName()) || forceBind)  	{ +		gGL.flush();  		activate();  		enable(texture->getTarget());  		mCurrTexture = texture->getTexName(); @@ -445,6 +447,8 @@ void LLTexUnit::setTextureBlendType(eTextureBlendType type)  		return;  	} +	gGL.flush(); +  	activate();  	mCurrBlendType = type;  	S32 scale_amount = 1; @@ -759,6 +763,7 @@ LLRender::LLRender()  	mCurrAlphaFunc = CF_DEFAULT;  	mCurrAlphaFuncVal = 0.01f; +	mCurrSceneBlendType = BT_ALPHA;  }  LLRender::~LLRender() @@ -821,6 +826,80 @@ void LLRender::popMatrix()  	glPopMatrix();  } +void LLRender::translateUI(F32 x, F32 y, F32 z) +{ +	if (mUIOffset.empty()) +	{ +		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; +} + +void LLRender::scaleUI(F32 x, F32 y, F32 z) +{ +	if (mUIScale.empty()) +	{ +		llerrs << "Need to push a UI transformation frame before scaling." << llendl; +	} + +	mUIScale.front().scaleVec(LLVector3(x,y,z)); +} + +void LLRender::pushUIMatrix() +{ +	mUIOffset.push_front(mUIOffset.front()); +	if (mUIScale.empty()) +	{ +		mUIScale.push_front(LLVector3(1,1,1)); +	} +	else +	{ +		mUIScale.push_front(mUIScale.front()); +	} +} + +void LLRender::popUIMatrix() +{ +	if (mUIOffset.empty()) +	{ +		llerrs << "UI offset stack blown." << llendl; +	} +	mUIOffset.pop_front(); +	mUIScale.pop_front(); +} + +LLVector3 LLRender::getUITranslation() +{ +	if (mUIOffset.empty()) +	{ +		llerrs << "UI offset stack empty." << llendl; +	} +	return mUIOffset.front(); +} + +LLVector3 LLRender::getUIScale() +{ +	if (mUIScale.empty()) +	{ +		llerrs << "UI scale stack empty." << llendl; +	} +	return mUIScale.front(); +} + + +void LLRender::loadUIIdentity() +{ +	if (mUIOffset.empty()) +	{ +		llerrs << "Need to push UI translation frame before clearing offset." << llendl; +	} +	mUIOffset.front().setVec(0,0,0); +	mUIScale.front().setVec(1,1,1); +} +  void LLRender::setColorMask(bool writeColor, bool writeAlpha)  {  	setColorMask(writeColor, writeColor, writeColor, writeAlpha); @@ -843,6 +922,11 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB  void LLRender::setSceneBlendType(eBlendType type)  { +	if (mCurrSceneBlendType == type) +	{ +		return; +	} +  	flush();  	switch (type)   	{ @@ -871,6 +955,7 @@ void LLRender::setSceneBlendType(eBlendType type)  			llerrs << "Unknown Scene Blend Type: " << type << llendl;  			break;  	} +	mCurrSceneBlendType = type;  }  void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value) @@ -1012,6 +1097,12 @@ void LLRender::flush()  		}  #endif +		if (!mUIOffset.empty()) +		{ +			sUICalls++; +			sUIVerts += mCount; +		} +  		mBuffer->setBuffer(immediate_mask);  		mBuffer->drawArrays(mMode, 0, mCount); @@ -1031,7 +1122,16 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)  		return;  	} -	mVerticesp[mCount] = LLVector3(x,y,z); +	if (mUIOffset.empty()) +	{ +		mVerticesp[mCount] = LLVector3(x,y,z); +	} +	else +	{ +		LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.front()).scaledVec(mUIScale.front()); +		mVerticesp[mCount] = vert; +	} +  	mCount++;  	if (mCount < 4096)  	{ diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 0121a190ee..6e38fac67b 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -286,6 +286,14 @@ public:  	void pushMatrix();  	void popMatrix(); +	void translateUI(F32 x, F32 y, F32 z); +	void scaleUI(F32 x, F32 y, F32 z); +	void pushUIMatrix(); +	void popUIMatrix(); +	void loadUIIdentity(); +	LLVector3 getUITranslation(); +	LLVector3 getUIScale(); +  	void flush();  	void begin(const GLuint& mode); @@ -333,7 +341,9 @@ public:  	};  public: - +	static U32 sUICalls; +	static U32 sUIVerts; +	  private:  	bool				mDirty;  	U32				mCount; @@ -350,7 +360,13 @@ private:  	std::vector<LLTexUnit*>		mTexUnits;  	LLTexUnit*			mDummyTexUnit; +	U32				mCurrSceneBlendType; +  	F32				mMaxAnisotropy; + +	std::list<LLVector3> mUIOffset; +	std::list<LLVector3> mUIScale; +  };  extern F64 gGLModelView[16]; diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 13340e7ded..575b6e3b6c 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -492,15 +492,15 @@ void LLTabContainer::draw()  		if( mIsVertical && has_scroll_arrows )  		{  			// Redraw the arrows so that they appears on top. -			gGL.pushMatrix(); -			gGL.translatef((F32)mPrevArrowBtn->getRect().mLeft, (F32)mPrevArrowBtn->getRect().mBottom, 0.f); +			gGL.pushUIMatrix(); +			gGL.translateUI((F32)mPrevArrowBtn->getRect().mLeft, (F32)mPrevArrowBtn->getRect().mBottom, 0.f);  			mPrevArrowBtn->draw(); -			gGL.popMatrix(); +			gGL.popUIMatrix(); -			gGL.pushMatrix(); -			gGL.translatef((F32)mNextArrowBtn->getRect().mLeft, (F32)mNextArrowBtn->getRect().mBottom, 0.f); +			gGL.pushUIMatrix(); +			gGL.translateUI((F32)mNextArrowBtn->getRect().mLeft, (F32)mNextArrowBtn->getRect().mBottom, 0.f);  			mNextArrowBtn->draw(); -			gGL.popMatrix(); +			gGL.popUIMatrix();  		}  	} diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 76f07373b4..852a19660a 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -39,6 +39,7 @@  // Linden library includes  #include "v2math.h" +#include "m3math.h"  #include "v4color.h"  #include "llrender.h"  #include "llrect.h" @@ -180,19 +181,19 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LL  void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled)  { -	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	left += LLFontGL::sCurOrigin.mX;  	right += LLFontGL::sCurOrigin.mX;  	bottom += LLFontGL::sCurOrigin.mY;  	top += LLFontGL::sCurOrigin.mY; -	glLoadIdentity(); +	gGL.loadUIIdentity();  	gl_rect_2d(llfloor((F32)left * LLUI::sGLScaleFactor.mV[VX]) - pixel_offset,  				llfloor((F32)top * LLUI::sGLScaleFactor.mV[VY]) + pixel_offset,  				llfloor((F32)right * LLUI::sGLScaleFactor.mV[VX]) + pixel_offset,  				llfloor((F32)bottom * LLUI::sGLScaleFactor.mV[VY]) - pixel_offset,  				filled); -	gGL.popMatrix(); +	gGL.popUIMatrix();  } @@ -508,9 +509,9 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex  		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);  	} -	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	{ -		gGL.translatef((F32)x, (F32)y, 0.f); +		gGL.translateUI((F32)x, (F32)y, 0.f);  		gGL.getTexUnit(0)->bind(image); @@ -637,7 +638,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex  		}  		gGL.end();  	} -	gGL.popMatrix(); +	gGL.popUIMatrix();  	if (solid_color)  	{ @@ -660,39 +661,72 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre  	LLGLSUIDefault gls_ui; -	gGL.pushMatrix(); + +	gGL.getTexUnit(0)->bind(image); + +	gGL.color4fv(color.mV); + +	if (degrees == 0.f)  	{ -		gGL.translatef((F32)x, (F32)y, 0.f); -		if( degrees ) +		gGL.pushUIMatrix(); +		gGL.translateUI((F32)x, (F32)y, 0.f); +			 +		gGL.begin(LLRender::QUADS);  		{ -			F32 offset_x = F32(width/2); -			F32 offset_y = F32(height/2); -			gGL.translatef( offset_x, offset_y, 0.f); -			glRotatef( degrees, 0.f, 0.f, 1.f ); -			gGL.translatef( -offset_x, -offset_y, 0.f ); +			gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); +			gGL.vertex2i(width, height ); + +			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); +			gGL.vertex2i(0, height ); + +			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); +			gGL.vertex2i(0, 0); + +			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); +			gGL.vertex2i(width, 0);  		} +		gGL.end(); +		gGL.popUIMatrix(); +	} +	else +	{ +		gGL.pushUIMatrix(); +		gGL.translateUI((F32)x, (F32)y, 0.f); +	 +		F32 offset_x = F32(width/2); +		F32 offset_y = F32(height/2); + +		gGL.translateUI(offset_x, offset_y, 0.f); +		LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD); +		  		gGL.getTexUnit(0)->bind(image);  		gGL.color4fv(color.mV);  		gGL.begin(LLRender::QUADS);  		{ +			LLVector3 v; + +			v = LLVector3(offset_x, offset_y, 0.f) * quat;  			gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); -			gGL.vertex2i(width, height ); +			gGL.vertex2i(v.mV[0], v.mV[1] ); +			v = LLVector3(-offset_x, offset_y, 0.f) * quat;  			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); -			gGL.vertex2i(0, height ); +			gGL.vertex2i(v.mV[0], v.mV[1] ); +			v = LLVector3(-offset_x, -offset_y, 0.f) * quat;  			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); -			gGL.vertex2i(0, 0); +			gGL.vertex2i(v.mV[0], v.mV[1] ); +			v = LLVector3(offset_x, -offset_y, 0.f) * quat;  			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); -			gGL.vertex2i(width, 0); +			gGL.vertex2i(v.mV[0], v.mV[1] );  		}  		gGL.end(); +		gGL.popUIMatrix();  	} -	gGL.popMatrix();  } @@ -747,9 +781,9 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F  		end_angle += F_TWO_PI;  	} -	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	{ -		gGL.translatef(center_x, center_y, 0.f); +		gGL.translateUI(center_x, center_y, 0.f);  		// Inexact, but reasonably fast.  		F32 delta = (end_angle - start_angle) / steps; @@ -780,15 +814,15 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F  		}  		gGL.end();  	} -	gGL.popMatrix(); +	gGL.popUIMatrix();  }  void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled)  { -	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	{  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.translatef(center_x, center_y, 0.f); +		gGL.translateUI(center_x, center_y, 0.f);  		// Inexact, but reasonably fast.  		F32 delta = F_TWO_PI / steps; @@ -819,7 +853,7 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled  		}  		gGL.end();  	} -	gGL.popMatrix(); +	gGL.popUIMatrix();  }  // Renders a ring with sides (tube shape) @@ -846,9 +880,9 @@ void gl_deep_circle( F32 radius, F32 depth, S32 steps )  void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center )  { -	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	{ -		gGL.translatef(0.f, 0.f, -width / 2); +		gGL.translateUI(0.f, 0.f, -width / 2);  		if( render_center )  		{  			gGL.color4fv(center_color.mV); @@ -857,11 +891,11 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor  		else  		{  			gl_washer_2d(radius, radius - width, steps, side_color, side_color); -			gGL.translatef(0.f, 0.f, width); +			gGL.translateUI(0.f, 0.f, width);  			gl_washer_2d(radius - width, radius, steps, side_color, side_color);  		}  	} -	gGL.popMatrix(); +	gGL.popUIMatrix();  }  // Draw gray and white checkerboard with black border @@ -1050,9 +1084,9 @@ void gl_segmented_rect_2d_tex(const S32 left,  	S32 width = llabs(right - left);  	S32 height = llabs(top - bottom); -	gGL.pushMatrix(); +	gGL.pushUIMatrix(); -	gGL.translatef((F32)left, (F32)bottom, 0.f); +	gGL.translateUI((F32)left, (F32)bottom, 0.f);  	LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height);  	if (border_uv_scale.mV[VX] > 0.5f) @@ -1193,7 +1227,7 @@ void gl_segmented_rect_2d_tex(const S32 left,  	}  	gGL.end(); -	gGL.popMatrix(); +	gGL.popUIMatrix();  }  void gl_segmented_rect_2d_fragment_tex(const S32 left,  @@ -1210,9 +1244,9 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,  	S32 width = llabs(right - left);  	S32 height = llabs(top - bottom); -	gGL.pushMatrix(); +	gGL.pushUIMatrix(); -	gGL.translatef((F32)left, (F32)bottom, 0.f); +	gGL.translateUI((F32)left, (F32)bottom, 0.f);  	LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height);  	if (border_uv_scale.mV[VX] > 0.5f) @@ -1383,7 +1417,7 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,  	}  	gGL.end(); -	gGL.popMatrix(); +	gGL.popUIMatrix();  }  void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width,  @@ -1591,7 +1625,7 @@ void LLUI::dirtyRect(LLRect rect)  //static  void LLUI::translate(F32 x, F32 y, F32 z)  { -	gGL.translatef(x,y,z); +	gGL.translateUI(x,y,z);  	LLFontGL::sCurOrigin.mX += (S32) x;  	LLFontGL::sCurOrigin.mY += (S32) y;  	LLFontGL::sCurOrigin.mZ += z; @@ -1600,14 +1634,14 @@ void LLUI::translate(F32 x, F32 y, F32 z)  //static  void LLUI::pushMatrix()  { -	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	LLFontGL::sOriginStack.push_back(LLFontGL::sCurOrigin);  }  //static  void LLUI::popMatrix()  { -	gGL.popMatrix(); +	gGL.popUIMatrix();  	LLFontGL::sCurOrigin = *LLFontGL::sOriginStack.rbegin();  	LLFontGL::sOriginStack.pop_back();  } @@ -1615,7 +1649,7 @@ void LLUI::popMatrix()  //static   void LLUI::loadIdentity()  { -	glLoadIdentity(); +	gGL.loadUIIdentity();   	LLFontGL::sCurOrigin.mX = 0;  	LLFontGL::sCurOrigin.mY = 0;  	LLFontGL::sCurOrigin.mZ = 0; diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index 30717f87de..bd9c43c97f 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -125,14 +125,6 @@ void LLViewBorder::draw()  			llassert( FALSE );  // not implemented  		}  	} -	else -	if( STYLE_TEXTURE == mStyle ) -	{ -		if( mTexture ) -		{ -			drawTextures(); -		} -	}  	LLView::draw();  } @@ -255,56 +247,6 @@ void LLViewBorder::drawTwoPixelLines()  	gl_line_2d(left+1, bottom+1, right-1, bottom+1);  } -void LLViewBorder::drawTextures() -{ -	//LLGLSUIDefault gls_ui; - -	//llassert( FALSE );  // TODO: finish implementing - -	//gGL.color4fv(UI_VERTEX_COLOR.mV); - -	//gGL.getTexUnit(0)->bind(mTexture); -	//gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); - -	//drawTextureTrapezoid(   0.f, mBorderWidth, getRect().getWidth(),  0,					0 ); -	//drawTextureTrapezoid(  90.f, mBorderWidth, getRect().getHeight(), (F32)getRect().getWidth(),0 ); -	//drawTextureTrapezoid( 180.f, mBorderWidth, getRect().getWidth(),  (F32)getRect().getWidth(),(F32)getRect().getHeight() ); -	//drawTextureTrapezoid( 270.f, mBorderWidth, getRect().getHeight(), 0,					(F32)getRect().getHeight() ); -} - - -void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y ) -{ -	gGL.pushMatrix(); -	{ -		gGL.translatef(start_x, start_y, 0.f); -		glRotatef( degrees, 0, 0, 1 ); - -		gGL.begin(LLRender::QUADS); -		{ -			//      width, width   /---------\ length-width, width		// -			//	   			      /           \							// -			//				     /			   \						// -			//				    /---------------\						// -			//    			0,0					  length, 0				// - -			gGL.texCoord2f( 0, 0 ); -			gGL.vertex2i( 0, 0 ); - -			gGL.texCoord2f( (GLfloat)length, 0 ); -			gGL.vertex2i( length, 0 ); - -			gGL.texCoord2f( (GLfloat)(length - width), (GLfloat)width ); -			gGL.vertex2i( length - width, width ); - -			gGL.texCoord2f( (GLfloat)width, (GLfloat)width ); -			gGL.vertex2i( width, width ); -		} -		gGL.end(); -	} -	gGL.popMatrix(); -} -  BOOL LLViewBorder::getBevelFromAttribute(LLXMLNodePtr node, LLViewBorder::EBevel& bevel_style)  {  	if (node->hasAttribute("bevel_style")) diff --git a/indra/llui/llviewborder.h b/indra/llui/llviewborder.h index 92fd569325..342e84fd93 100644 --- a/indra/llui/llviewborder.h +++ b/indra/llui/llviewborder.h @@ -99,8 +99,7 @@ private:  	void		drawOnePixelLines();  	void		drawTwoPixelLines();  	void		drawTextures(); -	void		drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y ); - +	  	EBevel		mBevel;  	EStyle		mStyle;  	LLUIColor	mHighlightLight; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index d0c2f3cb34..8aa80cd81a 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7395,7 +7395,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>RenderUseFarClip</key>      <map> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 3675be16e9..afd9d7b3f9 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3018,6 +3018,9 @@ void LLAgent::endAnimationUpdateUI()  //-----------------------------------------------------------------------------  void LLAgent::updateCamera()  { +	static LLFastTimer::DeclareTimer ftm("Camera"); +	LLFastTimer t(ftm); +  	//Ventrella - changed camera_skyward to the new global "mCameraUpVector"  	mCameraUpVector = LLVector3::z_axis;  	//LLVector3	camera_skyward(0.f, 0.f, 1.f); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 00a9e4d745..948d38befb 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3593,13 +3593,15 @@ void LLAppViewer::idle()  	{  		// Handle pending gesture processing +		static LLFastTimer::DeclareTimer ftm("Agent Position"); +		LLFastTimer t(ftm);  		LLGestureManager::instance().update();  		gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY);  	}  	{ -		LLFastTimer t(FTM_OBJECTLIST_UPDATE); // Actually "object update" +		LLFastTimer t(FTM_OBJECTLIST_UPDATE);           if (!(logoutRequestSent() && hasSavedFinalSnapshot()))  		{ @@ -3633,6 +3635,8 @@ void LLAppViewer::idle()  	//  	{ +		static LLFastTimer::DeclareTimer ftm("HUD Effects"); +		LLFastTimer t(ftm);  		LLSelectMgr::getInstance()->updateEffects();  		LLHUDManager::getInstance()->cleanupEffects();  		LLHUDManager::getInstance()->sendEffects(); @@ -3889,7 +3893,7 @@ void LLAppViewer::sendLogoutRequest()  static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;  #endif -static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Network"); +static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Idle Network");  void LLAppViewer::idleNetwork()  { diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 9fbc3408d7..38eda5bd2e 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -386,8 +386,6 @@ void LLDrawable::makeActive()  			mParent->makeActive();  		} -		gPipeline.setActive(this, TRUE); -  		//all child objects must also be active  		llassert_always(mVObjp); @@ -434,7 +432,6 @@ void LLDrawable::makeStatic(BOOL warning_enabled)  	if (isState(ACTIVE))  	{  		clearState(ACTIVE); -		gPipeline.setActive(this, FALSE);  		if (mParent.notNull() && mParent->isActive() && warning_enabled)  		{ diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index aea2de8e92..561965d021 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -51,6 +51,9 @@  /*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f; +static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild"); +static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update"); +  // LLFlexibleObjectData::pack/unpack now in llprimitive.cpp  //----------------------------------------------- @@ -194,7 +197,6 @@ void LLVolumeImplFlexible::remapSections(LLFlexibleObjectSection *source, S32 so  	}  } -  //-----------------------------------------------------------------------------  void LLVolumeImplFlexible::setAttributesOfAllSections(LLVector3* inScale)  { @@ -363,6 +365,7 @@ inline S32 log2(S32 x)  void LLVolumeImplFlexible::doFlexibleUpdate()  { +	LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE);  	LLVolume* volume = mVO->getVolume();  	LLPath *path = &volume->getPath();  	if (mSimulateRes == 0) @@ -693,7 +696,10 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)  	}  	volume->updateRelativeXform(); -	doFlexibleUpdate(); +	{ +		LLFastTimer t(FTM_DO_FLEXIBLE_UPDATE); +		doFlexibleUpdate(); +	}  	// Object may have been rotated, which means it needs a rebuild.  See SL-47220  	BOOL	rotated = FALSE; @@ -710,7 +716,10 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)  		volume->regenFaces();  		volume->mDrawable->setState(LLDrawable::REBUILD_VOLUME);  		volume->dirtySpatialGroup(); -		doFlexibleRebuild(); +		{ +			LLFastTimer t(FTM_FLEXIBLE_REBUILD); +			doFlexibleRebuild(); +		}  		volume->genBBoxes(isVolumeGlobal());  	}  	else if (!mUpdated || rotated) diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 750a9d478f..8569e208eb 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -897,19 +897,21 @@ void LLViewerObjectList::renderObjectBeacons()  		S32 last_line_width = -1;  		// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width) -		for (S32 i = 0; i < mDebugBeacons.count(); i++) +		BOOL flush = FALSE; +		for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)  		{ -			const LLDebugBeacon &debug_beacon = mDebugBeacons[i]; +			const LLDebugBeacon &debug_beacon = *iter;  			LLColor4 color = debug_beacon.mColor;  			color.mV[3] *= 0.25f;  			S32 line_width = debug_beacon.mLineWidth;  			if (line_width != last_line_width)  			{ -				if (i > 0) +				if (flush)  				{  					gGL.end(); -					gGL.flush();  				} +				flush = TRUE; +				gGL.flush();  				glLineWidth( (F32)line_width );  				last_line_width = line_width;  				gGL.begin(LLRender::LINES); @@ -936,18 +938,20 @@ void LLViewerObjectList::renderObjectBeacons()  		S32 last_line_width = -1;  		// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width) -		for (S32 i = 0; i < mDebugBeacons.count(); i++) +		BOOL flush = FALSE; +		for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)  		{ -			const LLDebugBeacon &debug_beacon = mDebugBeacons[i]; +			const LLDebugBeacon &debug_beacon = *iter;  			S32 line_width = debug_beacon.mLineWidth;  			if (line_width != last_line_width)  			{ -				if (i > 0) +				if (flush)  				{  					gGL.end(); -					gGL.flush();  				} +				flush = TRUE; +				gGL.flush();  				glLineWidth( (F32)line_width );  				last_line_width = line_width;  				gGL.begin(LLRender::LINES); @@ -969,9 +973,9 @@ void LLViewerObjectList::renderObjectBeacons()  		gGL.flush();  		glLineWidth(1.f); -		for (S32 i = 0; i < mDebugBeacons.count(); i++) +		for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)  		{ -			LLDebugBeacon &debug_beacon = mDebugBeacons[i]; +			LLDebugBeacon &debug_beacon = *iter;  			if (debug_beacon.mString == "")  			{  				continue; diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index a02dc3355b..325c9c260c 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -121,24 +121,24 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,  	glMatrixMode(GL_PROJECTION);  	glPushMatrix();  	glMatrixMode(GL_MODELVIEW); -	 +	gGL.pushMatrix();  	LLUI::pushMatrix();  	gl_state_for_2d(world_view_rect.getWidth(), world_view_rect.getHeight());  	gViewerWindow->setup3DViewport(); -	//gViewerWindow->setup2DRender(); - +	  	winX -= world_view_rect.mLeft;  	winY -= world_view_rect.mBottom;  	LLUI::loadIdentity(); +	glLoadIdentity();  	LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f)); -	//glRotatef(angle * RAD_TO_DEG, axis.mV[VX], axis.mV[VY], axis.mV[VZ]); -	//glScalef(right_scale, up_scale, 1.f);  	F32 right_x;  	font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x); +  	LLUI::popMatrix(); -	 +	gGL.popMatrix(); +  	glMatrixMode(GL_PROJECTION);  	glPopMatrix();  	glMatrixMode(GL_MODELVIEW); diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 8ad94b957d..8d1d27444b 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -555,7 +555,7 @@ void LLHUDText::renderText(BOOL for_select)  		}  	}  	/// Reset the default color to white.  The renderer expects this to be the default.  -	glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +	gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f);  	if (for_select)  	{  		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 501a137b42..bf33d8527e 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -724,14 +724,14 @@ void LLMediaCtrl::draw()  		LLGLSUIDefault gls_ui;  		LLGLDisable gls_alphaTest( GL_ALPHA_TEST ); -		gGL.pushMatrix(); +		gGL.pushUIMatrix();  		{  			if (mIgnoreUIScale)  			{ -				glLoadIdentity(); +				gGL.loadUIIdentity();  				// font system stores true screen origin, need to scale this by UI scale factor  				// to get render origin for this view (with unit scale) -				gGL.translatef(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),  +				gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),   							floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),   							LLFontGL::sCurOrigin.mZ);  			} @@ -825,7 +825,7 @@ void LLMediaCtrl::draw()  			gGL.end();  			gGL.setSceneBlendType(LLRender::BT_ALPHA);  		} -		gGL.popMatrix(); +		gGL.popUIMatrix();  	}  	else diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 234fe13217..05623198ab 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -153,6 +153,18 @@ void LLNetMap::draw()  	// Prepare a scissor region  	F32 rotation = 0; +	gGL.pushMatrix(); +	gGL.pushUIMatrix(); +	 +	LLVector3 offset = gGL.getUITranslation(); +	LLVector3 scale = gGL.getUIScale(); + +	glLoadIdentity(); +	gGL.loadUIIdentity(); + +	glScalef(scale.mV[0], scale.mV[1], scale.mV[2]); +	gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]); +	  	{  		LLLocalClipRect clip(getLocalRect());  		{ @@ -435,6 +447,9 @@ void LLNetMap::draw()  		}  	} +	gGL.popMatrix(); +	gGL.popUIMatrix(); +  	LLUICtrl::draw();  } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 64eabe65cf..827d34138f 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -514,6 +514,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderUIBuffer")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); +	gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));  	gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));  	gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2));  	gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d0afa9d9de..b5642d07a5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2001,6 +2001,9 @@ BOOL LLViewerObject::isActive() const  BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { +	static LLFastTimer::DeclareTimer ftm("Viewer Object"); +	LLFastTimer t(ftm); +  	if (mDead)  	{  		// It's dead.  Don't update it. diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 96828ee1b6..6347090f71 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -93,7 +93,7 @@ extern LLPipeline	gPipeline;  // Statics for object lookup tables.  U32						LLViewerObjectList::sSimulatorMachineIndex = 1; // Not zero deliberately, to speed up index check. -LLMap<U64, U32>			LLViewerObjectList::sIPAndPortToIndex; +std::map<U64, U32>			LLViewerObjectList::sIPAndPortToIndex;  std::map<U64, LLUUID>	LLViewerObjectList::sIndexAndLocalIDToUUID;  LLViewerObjectList::LLViewerObjectList() @@ -571,10 +571,9 @@ void LLViewerObjectList::processCachedObjectUpdate(LLMessageSystem *mesgsys,  void LLViewerObjectList::dirtyAllObjectInventory()  { -	S32 count = mObjects.count(); -	for(S32 i = 0; i < count; ++i) +	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  	{ -		mObjects[i]->dirtyInventory(); +		(*iter)->dirtyInventory();  	}  } @@ -587,14 +586,14 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)  	S32 num_updates, max_value;  	if (NUM_BINS - 1 == mCurBin)  	{ -		num_updates = mObjects.count() - mCurLazyUpdateIndex; -		max_value = mObjects.count(); +		num_updates = (S32) mObjects.size() - mCurLazyUpdateIndex; +		max_value = (S32) mObjects.size();  		gTextureList.setUpdateStats(TRUE);  	}  	else  	{ -		num_updates = (mObjects.count() / NUM_BINS) + 1; -		max_value = llmin(mObjects.count(), mCurLazyUpdateIndex + num_updates); +		num_updates = ((S32) mObjects.size() / NUM_BINS) + 1; +		max_value = llmin((S32) mObjects.size(), mCurLazyUpdateIndex + num_updates);  	} @@ -647,7 +646,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)  	}  	mCurLazyUpdateIndex = max_value; -	if (mCurLazyUpdateIndex == mObjects.count()) +	if (mCurLazyUpdateIndex == mObjects.size())  	{  		mCurLazyUpdateIndex = 0;  	} @@ -694,20 +693,26 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  	// Make a copy of the list in case something in idleUpdate() messes with it  	std::vector<LLViewerObject*> idle_list; -	idle_list.reserve( mActiveObjects.size() ); +	 +	static LLFastTimer::DeclareTimer idle_copy("Idle Copy"); - 	for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin(); -		active_iter != mActiveObjects.end(); active_iter++)  	{ -		objectp = *active_iter; -		if (objectp) +		LLFastTimer t(idle_copy); +		idle_list.reserve( mActiveObjects.size() ); + + 		for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin(); +			active_iter != mActiveObjects.end(); active_iter++)  		{ -			idle_list.push_back( objectp ); -		} -		else -		{	// There shouldn't be any NULL pointers in the list, but they have caused -			// crashes before.  This may be idleUpdate() messing with the list. -			llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl; +			objectp = *active_iter; +			if (objectp) +			{ +				idle_list.push_back( objectp ); +			} +			else +			{	// There shouldn't be any NULL pointers in the list, but they have caused +				// crashes before.  This may be idleUpdate() messing with the list. +				llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl; +			}  		}  	} @@ -807,7 +812,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  	}  	*/ -	LLViewerStats::getInstance()->mNumObjectsStat.addValue(mObjects.count()); +	LLViewerStats::getInstance()->mNumObjectsStat.addValue((S32) mObjects.size());  	LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(num_active_objects);  	LLViewerStats::getInstance()->mNumSizeCulledStat.addValue(mNumSizeCulled);  	LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled); @@ -815,9 +820,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  void LLViewerObjectList::clearDebugText()  { -	for (S32 i = 0; i < mObjects.count(); i++) +	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  	{ -		mObjects[i]->setDebugText(""); +		(*iter)->setDebugText("");  	}  } @@ -856,7 +861,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)  	if (objectp->isOnMap())  	{ -		mMapObjects.removeObj(objectp); +		removeFromMap(objectp);  	}  	// Don't clean up mObject references, these will be cleaned up more efficiently later! @@ -913,10 +918,10 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp)  {  	LLViewerObject *objectp; -	S32 i; -	for (i = 0; i < mObjects.count(); i++) +	 +	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  	{ -		objectp = mObjects[i]; +		objectp = *iter;  		if (objectp->mRegionp == regionp)  		{ @@ -933,10 +938,9 @@ void LLViewerObjectList::killAllObjects()  	// Used only on global destruction.  	LLViewerObject *objectp; -	for (S32 i = 0; i < mObjects.count(); i++) +	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  	{ -		objectp = mObjects[i]; -		 +		objectp = *iter;  		killObject(objectp);  		llassert(objectp->isDead());  	} @@ -945,7 +949,7 @@ void LLViewerObjectList::killAllObjects()  	if(!mObjects.empty())  	{ -		llwarns << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.count() << llendl; +		llwarns << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.size() << llendl;  		mObjects.clear();  	} @@ -970,16 +974,15 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  		return;  	} -	S32 i = 0;  	S32 num_removed = 0;  	LLViewerObject *objectp; -	while (i < mObjects.count()) +	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); )  	{  		// Scan for all of the dead objects and remove any "global" references to them. -		objectp = mObjects[i]; +		objectp = *iter;  		if (objectp->isDead())  		{ -			mObjects.remove(i); +			iter = mObjects.erase(iter);  			num_removed++;  			if (num_removed == mNumDeadObjects) @@ -990,8 +993,7 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  		}  		else  		{ -			// iterate, this isn't a dead object. -			i++; +			++iter;  		}  	} @@ -1041,12 +1043,11 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)  	}  	LLViewerObject *objectp; -	S32 i; -	for (i = 0; i < mObjects.count(); i++) +	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  	{ -		objectp = getObject(i); +		objectp = *iter;  		// There could be dead objects on the object list, so don't update stuff if the object is dead. -		if (objectp) +		if (!objectp->isDead())  		{  			objectp->updatePositionCaches(); @@ -1076,9 +1077,9 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)  	F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius"); -	for (S32 i = 0; i < mMapObjects.count(); i++) +	for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)  	{ -		LLViewerObject* objectp = mMapObjects[i]; +		LLViewerObject* objectp = *iter;  		if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())  		{  			continue; @@ -1144,21 +1145,14 @@ void LLViewerObjectList::renderObjectBounds(const LLVector3 ¢er)  {  } -void LLViewerObjectList::renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent) -{ -	generatePickList(camera); -	renderPickList(screen_rect, pick_parcel_wall, render_transparent); -} -  void LLViewerObjectList::generatePickList(LLCamera &camera)  {  		LLViewerObject *objectp;  		S32 i;  		// Reset all of the GL names to zero. -		for (i = 0; i < mObjects.count(); i++) +		for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  		{ -			objectp = mObjects[i]; -			objectp->mGLName = 0; +			(*iter)->mGLName = 0;  		}  		mSelectPickList.clear(); @@ -1321,17 +1315,19 @@ void LLViewerObjectList::addDebugBeacon(const LLVector3 &pos_agent,  										const LLColor4 &text_color,  										S32 line_width)  { -	LLDebugBeacon *beaconp = mDebugBeacons.reserve_block(1); -	beaconp->mPositionAgent = pos_agent; -	beaconp->mString = string; -	beaconp->mColor = color; -	beaconp->mTextColor = text_color; -	beaconp->mLineWidth = line_width; +	LLDebugBeacon beacon; +	beacon.mPositionAgent = pos_agent; +	beacon.mString = string; +	beacon.mColor = color; +	beacon.mTextColor = text_color; +	beacon.mLineWidth = line_width; + +	mDebugBeacons.push_back(beacon);  }  void LLViewerObjectList::resetObjectBeacons()  { -	mDebugBeacons.reset(); +	mDebugBeacons.clear();  }  LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp) @@ -1349,7 +1345,7 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi  	mUUIDObjectMap[fullid] = objectp; -	mObjects.put(objectp); +	mObjects.push_back(objectp);  	updateActive(objectp); @@ -1388,7 +1384,7 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe  					gMessageSystem->getSenderIP(),  					gMessageSystem->getSenderPort()); -	mObjects.put(objectp); +	mObjects.push_back(objectp);  	updateActive(objectp); @@ -1411,11 +1407,11 @@ LLViewerObject *LLViewerObjectList::replaceObject(const LLUUID &id, const LLPCod  S32 LLViewerObjectList::findReferences(LLDrawable *drawablep) const  {  	LLViewerObject *objectp; -	S32 i;  	S32 num_refs = 0; -	for (i = 0; i < mObjects.count(); i++) +	 +	for (vobj_list_t::const_iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)  	{ -		objectp = mObjects[i]; +		objectp = *iter;  		if (objectp->mDrawable.notNull())  		{  			num_refs += objectp->mDrawable->findReferences(drawablep); @@ -1460,15 +1456,15 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip  	// Unknown parent, add to orpaned child list  	U64 parent_info = getIndex(parent_id, ip, port); -	if (-1 == mOrphanParents.find(parent_info)) +	if (std::find(mOrphanParents.begin(), mOrphanParents.end(), parent_info) == mOrphanParents.end())  	{ -		mOrphanParents.put(parent_info); +		mOrphanParents.push_back(parent_info);  	}  	LLViewerObjectList::OrphanInfo oi(parent_info, childp->mID); -	if (-1 == mOrphanChildren.find(oi)) +	if (std::find(mOrphanChildren.begin(), mOrphanChildren.end(), oi) == mOrphanChildren.end())  	{ -		mOrphanChildren.put(oi); +		mOrphanChildren.push_back(oi);  		mNumOrphans++;  	}  } @@ -1491,28 +1487,29 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)  	// See if we are a parent of an orphan.  	// Note:  This code is fairly inefficient but it should happen very rarely.  	// It can be sped up if this is somehow a performance issue... -	if (0 == mOrphanParents.count()) +	if (mOrphanParents.empty())  	{  		// no known orphan parents  		return;  	} -	if (-1 == mOrphanParents.find(getIndex(objectp->mLocalID, ip, port))) +	if (std::find(mOrphanParents.begin(), mOrphanParents.end(), getIndex(objectp->mLocalID, ip, port)) == mOrphanParents.end())  	{  		// did not find objectp in OrphanParent list  		return;  	} -	S32 i;  	U64 parent_info = getIndex(objectp->mLocalID, ip, port);  	BOOL orphans_found = FALSE;  	// Iterate through the orphan list, and set parents of matching children. -	for (i = 0; i < mOrphanChildren.count(); i++) -	{ -		if (mOrphanChildren[i].mParentInfo != parent_info) + +	for (std::vector<OrphanInfo>::iterator iter = mOrphanChildren.begin(); iter != mOrphanChildren.end(); ) +	{	 +		if (iter->mParentInfo != parent_info)  		{ +			++iter;  			continue;  		} -		LLViewerObject *childp = findObject(mOrphanChildren[i].mChildInfo); +		LLViewerObject *childp = findObject(iter->mChildInfo);  		if (childp)  		{  			if (childp == objectp) @@ -1546,29 +1543,35 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)  			objectp->addChild(childp);  			orphans_found = TRUE; +			++iter;  		}  		else  		{  			llinfos << "Missing orphan child, removing from list" << llendl; -			mOrphanChildren.remove(i); -			i--; + +			iter = mOrphanChildren.erase(iter);  		}  	}  	// Remove orphan parent and children from lists now that they've been found -	mOrphanParents.remove(mOrphanParents.find(parent_info)); - -	i = 0; -	while (i < mOrphanChildren.count())  	{ -		if (mOrphanChildren[i].mParentInfo == parent_info) +		std::vector<U64>::iterator iter = std::find(mOrphanParents.begin(), mOrphanParents.end(), parent_info); +		if (iter != mOrphanParents.end()) +		{ +			mOrphanParents.erase(iter); +		} +	} +	 +	for (std::vector<OrphanInfo>::iterator iter = mOrphanChildren.begin(); iter != mOrphanChildren.end(); ) +	{ +		if (iter->mParentInfo == parent_info)  		{ -			mOrphanChildren.remove(i); +			iter = mOrphanChildren.erase(iter);  			mNumOrphans--;  		}  		else  		{ -			i++; +			++iter;  		}  	} diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 2858081dc9..706966deae 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -38,8 +38,6 @@  // common includes  #include "llstat.h" -#include "lldarrayptr.h" -#include "llmap.h"			// *TODO: switch to std::map  #include "llstring.h"  // project includes @@ -50,7 +48,7 @@ class LLNetMap;  class LLDebugBeacon;  const U32 CLOSE_BIN_SIZE = 10; -const U32 NUM_BINS = 16; +const U32 NUM_BINS = 128;  // GL name = position in object list + GL_NAME_INDEX_OFFSET so that  // we can have special numbers like zero. @@ -111,13 +109,12 @@ public:  	void updateAvatarVisibility();  	// Selection related stuff -	void renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall = FALSE, BOOL render_transparent = TRUE);  	void generatePickList(LLCamera &camera);  	void renderPickList(const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent);  	LLViewerObject *getSelectedObject(const U32 object_id); -	inline S32 getNumObjects() { return mObjects.count(); } +	inline S32 getNumObjects() { return (S32) mObjects.size(); }  	void addToMap(LLViewerObject *objectp);  	void removeFromMap(LLViewerObject *objectp); @@ -131,7 +128,7 @@ public:  	S32 findReferences(LLDrawable *drawablep) const; // Find references to drawable in all objects, and return value. -	S32 getOrphanParentCount() const { return mOrphanParents.count(); } +	S32 getOrphanParentCount() const { return (S32) mOrphanParents.size(); }  	S32 getOrphanCount() const { return mNumOrphans; }  	void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port);  	void findOrphans(LLViewerObject* objectp, U32 ip, U32 port); @@ -179,26 +176,28 @@ public:  	S32 mNumUnknownKills;  	S32 mNumDeadObjects;  protected: -	LLDynamicArray<U64>	mOrphanParents;	// LocalID/ip,port of orphaned objects -	LLDynamicArray<OrphanInfo> mOrphanChildren;	// UUID's of orphaned objects +	std::vector<U64>	mOrphanParents;	// LocalID/ip,port of orphaned objects +	std::vector<OrphanInfo> mOrphanChildren;	// UUID's of orphaned objects  	S32 mNumOrphans; -	LLDynamicArrayPtr<LLPointer<LLViewerObject>, 256> mObjects; +	typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t; + +	vobj_list_t mObjects;  	std::set<LLPointer<LLViewerObject> > mActiveObjects; -	LLDynamicArrayPtr<LLPointer<LLViewerObject> > mMapObjects; +	vobj_list_t mMapObjects;  	typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;  	vo_map mDeadObjects;	// Need to keep multiple entries per UUID  	std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap; -	LLDynamicArray<LLDebugBeacon> mDebugBeacons; +	std::vector<LLDebugBeacon> mDebugBeacons;  	S32 mCurLazyUpdateIndex;  	static U32 sSimulatorMachineIndex; -	static LLMap<U64, U32> sIPAndPortToIndex; +	static std::map<U64, U32> sIPAndPortToIndex;  	static std::map<U64, LLUUID> sIndexAndLocalIDToUUID; @@ -264,12 +263,16 @@ inline LLViewerObject *LLViewerObjectList::getObject(const S32 index)  inline void LLViewerObjectList::addToMap(LLViewerObject *objectp)  { -	mMapObjects.put(objectp); +	mMapObjects.push_back(objectp);  }  inline void LLViewerObjectList::removeFromMap(LLViewerObject *objectp)  { -	mMapObjects.removeObj(objectp); +	std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mMapObjects.begin(), mMapObjects.end(), objectp); +	if (iter != mMapObjects.end()) +	{ +		mMapObjects.erase(iter); +	}  } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 51d99a1d36..28998d409e 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -496,7 +496,9 @@ void LLViewerTexture::init(bool firstinit)  	mAdditionalDecodePriority = 0.f ;	  	mParcelMedia = NULL ;  	mNumFaces = 0 ; +	mNumVolumes = 0;  	mFaceList.clear() ; +	mVolumeList.clear();  }  //virtual  @@ -508,7 +510,7 @@ S8 LLViewerTexture::getType() const  void LLViewerTexture::cleanup()  {  	mFaceList.clear() ; -	 +	mVolumeList.clear();  	if(mGLTexturep)  	{  		mGLTexturep->cleanup(); @@ -661,6 +663,42 @@ S32 LLViewerTexture::getNumFaces() const  	return mNumFaces ;  } + +//virtual +void LLViewerTexture::addVolume(LLVOVolume* volumep)  +{ +	if( mNumVolumes >= mVolumeList.size()) +	{ +		mVolumeList.resize(2 * mNumVolumes + 1) ;		 +	} +	mVolumeList[mNumVolumes] = volumep ; +	volumep->setIndexInTex(mNumVolumes) ; +	mNumVolumes++ ; +	mLastVolumeListUpdateTimer.reset() ; +} + +//virtual +void LLViewerTexture::removeVolume(LLVOVolume* volumep)  +{ +	if(mNumVolumes > 1) +	{ +		S32 index = volumep->getIndexInTex() ;  +		mVolumeList[index] = mVolumeList[--mNumVolumes] ; +		mVolumeList[index]->setIndexInTex(index) ; +	} +	else  +	{ +		mVolumeList.clear() ; +		mNumVolumes = 0 ; +	} +	mLastVolumeListUpdateTimer.reset() ; +} + +S32 LLViewerTexture::getNumVolumes() const +{ +	return mNumVolumes ; +} +  void LLViewerTexture::reorganizeFaceList()  {  	static const F32 MAX_WAIT_TIME = 20.f; // seconds @@ -680,6 +718,27 @@ void LLViewerTexture::reorganizeFaceList()  	mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end());  } +void LLViewerTexture::reorganizeVolumeList() +{ +	static const F32 MAX_WAIT_TIME = 20.f; // seconds +	static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ; + +	if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size()) +	{ +		return ; +	} + +	if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME) +	{ +		return ; +	} + +	mLastVolumeListUpdateTimer.reset() ; +	mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end()); +} + + +  //virtual  void LLViewerTexture::switchToCachedImage()  { @@ -1610,6 +1669,7 @@ void LLViewerFetchedTexture::updateVirtualSize()  	}  	mNeedsResetMaxVirtualSize = TRUE ;  	reorganizeFaceList() ; +	reorganizeVolumeList();  }  bool LLViewerFetchedTexture::updateFetch() @@ -3264,6 +3324,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()  	mNeedsResetMaxVirtualSize = TRUE ;  	reorganizeFaceList() ; +	reorganizeVolumeList();  	return mMaxVirtualSize ;  } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 79d9c4e7bb..85f03b5839 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -134,7 +134,9 @@ public:  	static S32 getIndexFromCategory(S32 category) ;  	static S32 getCategoryFromIndex(S32 index) ; -	typedef std::vector<LLFace*> ll_face_list_t ; +	typedef std::vector<LLFace*> ll_face_list_t; +	typedef std::vector<LLVOVolume*> ll_volume_list_t; +  protected:  	virtual ~LLViewerTexture(); @@ -178,6 +180,11 @@ public:  	S32 getNumFaces() const;  	const ll_face_list_t* getFaceList() const {return &mFaceList;} +	virtual void addVolume(LLVOVolume* volumep); +	virtual void removeVolume(LLVOVolume* volumep); +	S32 getNumVolumes() const; +	const ll_volume_list_t* getVolumeList() const { return &mVolumeList; } +  	void generateGLTexture() ;  	void destroyGLTexture() ; @@ -242,7 +249,7 @@ protected:  	void cleanup() ;  	void init(bool firstinit) ;	  	void reorganizeFaceList() ; - +	void reorganizeVolumeList() ;  private:  	//note: do not make this function public.  	/*virtual*/ LLImageGL* getGLTexture() const ; @@ -269,6 +276,10 @@ protected:  	U32               mNumFaces ;  	LLFrameTimer      mLastFaceListUpdateTimer ; +	ll_volume_list_t  mVolumeList; +	U32					mNumVolumes; +	LLFrameTimer	  mLastVolumeListUpdateTimer; +  	//do not use LLPointer here.  	LLViewerMediaTexture* mParcelMedia ; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b76a2e150f..bd0732c5c2 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -486,6 +486,10 @@ public:  			}              ypos += y_inc; +			addText(xpos, ypos, llformat("UI Verts/Calls: %d/%d", LLRender::sUIVerts, LLRender::sUICalls)); +			LLRender::sUICalls = LLRender::sUIVerts = 0; +			ypos += y_inc; +  			addText(xpos,ypos, llformat("%d/%d Nodes visible", gPipeline.mNumVisibleNodes, LLSpatialGroup::sNodeCount));  			ypos += y_inc; @@ -1358,7 +1362,7 @@ LLViewerWindow::LLViewerWindow(  		gSavedSettings.getBOOL("DisableVerticalSync"),  		!gNoRender,  		ignore_pixel_depth, -		gSavedSettings.getU32("RenderFSAASamples")); +		0); //gSavedSettings.getU32("RenderFSAASamples"));  	if (!LLAppViewer::instance()->restoreErrorTrap())  	{ @@ -1988,12 +1992,15 @@ void LLViewerWindow::drawDebugText()  {  	gGL.color4f(1,1,1,1);  	gGL.pushMatrix(); +	gGL.pushUIMatrix();  	{  		// scale view by UI global scale factor and aspect ratio correction factor -		glScalef(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); +		gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);  		mDebugText->draw();  	} +	gGL.popUIMatrix();  	gGL.popMatrix(); +  	gGL.flush();  } @@ -2041,9 +2048,11 @@ void LLViewerWindow::draw()  	// No translation needed, this view is glued to 0,0  	gGL.pushMatrix(); +	LLUI::pushMatrix();  	{ +		  		// scale view by UI global scale factor and aspect ratio correction factor -		glScalef(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); +		gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);  		LLVector2 old_scale_factor = LLUI::sGLScaleFactor;  		// apply camera zoom transform (for high res screenshots) @@ -2109,6 +2118,7 @@ void LLViewerWindow::draw()  		LLUI::sGLScaleFactor = old_scale_factor;  	} +	LLUI::popMatrix();  	gGL.popMatrix();  #if LL_DEBUG @@ -2461,6 +2471,9 @@ void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params)  // event processing.  void LLViewerWindow::updateUI()  { +	static LLFastTimer::DeclareTimer ftm("Update UI"); +	LLFastTimer t(ftm); +  	static std::string last_handle_msg;  	LLConsole::updateClass(); @@ -3042,7 +3055,6 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)  // Must be called after displayObjects is called, which sets the mGLName parameter  // NOTE: This function gets called 3 times:  //  render_ui_3d: 			FALSE, FALSE, TRUE -//  renderObjectsForSelect:	TRUE, pick_parcel_wall, FALSE  //  render_hud_elements:	FALSE, FALSE, FALSE  void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud )  { @@ -4707,8 +4719,9 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,  		return TRUE;  	} -	U32 fsaa = gSavedSettings.getU32("RenderFSAASamples"); -	U32 old_fsaa = mWindow->getFSAASamples(); +	//U32 fsaa = gSavedSettings.getU32("RenderFSAASamples"); +	//U32 old_fsaa = mWindow->getFSAASamples(); +  	// going from windowed to windowed  	if (!old_fullscreen && !fullscreen)  	{ @@ -4718,7 +4731,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,  			mWindow->setSize(size);  		} -		if (fsaa == old_fsaa) +		//if (fsaa == old_fsaa)  		{  			return TRUE;  		} @@ -4747,13 +4760,13 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,  		gSavedSettings.setS32("WindowY", old_pos.mY);  	} -	mWindow->setFSAASamples(fsaa); +	//mWindow->setFSAASamples(fsaa);  	result_first_try = mWindow->switchContext(fullscreen, size, disable_vsync);  	if (!result_first_try)  	{  		// try to switch back -		mWindow->setFSAASamples(old_fsaa); +		//mWindow->setFSAASamples(old_fsaa);  		result_second_try = mWindow->switchContext(old_fullscreen, old_size, disable_vsync);  		if (!result_second_try) diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp index 177cb16c50..5153cef709 100644 --- a/indra/newview/llvoclouds.cpp +++ b/indra/newview/llvoclouds.cpp @@ -77,9 +77,11 @@ BOOL LLVOClouds::isActive() const  	return TRUE;  } -  BOOL LLVOClouds::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  { +	static LLFastTimer::DeclareTimer ftm("Idle Clouds"); +	LLFastTimer t(ftm); +  	if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))  	{  		return TRUE; diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp index 75beab519e..428ef20006 100644 --- a/indra/newview/llvotextbubble.cpp +++ b/indra/newview/llvotextbubble.cpp @@ -84,6 +84,9 @@ BOOL LLVOTextBubble::isActive() const  BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld	&world, const F64 &time)  { +	static LLFastTimer::DeclareTimer ftm("Text Bubble"); +	LLFastTimer t(ftm); +  	F32 dt = mUpdateTimer.getElapsedTimeF32();  	// Die after a few seconds.  	if (dt > 1.5f) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index fa00396c34..fad726a225 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -192,6 +192,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re  	mMediaImplList.resize(getNumTEs());  	mLastFetchedMediaVersion = -1; +	mIndexInTex = 0;  }  LLVOVolume::~LLVOVolume() @@ -226,6 +227,11 @@ void LLVOVolume::markDead()  		{  			removeMediaImpl(i);  		} + +		if (mSculptTexture.notNull()) +		{ +			mSculptTexture->removeVolume(this); +		}  	}  	LLViewerObject::markDead(); @@ -597,6 +603,9 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  {  	LLViewerObject::idleUpdate(agent, world, time); +	static LLFastTimer::DeclareTimer ftm("Volume"); +	LLFastTimer t(ftm); +  	if (mDead || mDrawable.isNull())  	{  		return TRUE; @@ -618,6 +627,18 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)  		mVolumeImpl->doIdleUpdate(agent, world, time);  	} +	const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40; + +	if (mDrawable->isActive()) +	{ +		if (mDrawable->isRoot() &&  +			mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES &&  +			(!mDrawable->getParent() || !mDrawable->getParent()->isActive())) +		{ +			mDrawable->makeStatic(); +		} +	} +  	return TRUE;  } @@ -725,7 +746,9 @@ void LLVOVolume::updateTextureVirtualSize()  	{  		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);  		LLUUID id =  sculpt_params->getSculptTexture();  -		mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +		 +		updateSculptTexture(); +		  		if (mSculptTexture.notNull())  		{  			mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), @@ -914,35 +937,53 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail  		{  			mVolumeImpl->onSetVolume(volume_params, detail);  		} -		 +	 +		updateSculptTexture(); +  		if (isSculpted())  		{ -			mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +			updateSculptTexture(); +  			if (mSculptTexture.notNull())  			{ -				//ignore sculpt GL usage since bao fixed this in a separate branch -				if (!gGLActive) -				{ -					gGLActive = TRUE; -					sculpt(); -					gGLActive = FALSE; -				} -				else -				{ -					sculpt(); -				} +				sculpt();  			}  		} -		else -		{ -			mSculptTexture = NULL; -		}  		return TRUE;  	}  	return FALSE;  } +void LLVOVolume::updateSculptTexture() +{ +	LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture; + +	if (isSculpted()) +	{ +		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); +		LLUUID id =  sculpt_params->getSculptTexture();  +		mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	} +	else +	{ +		mSculptTexture = NULL; +	} + +	if (mSculptTexture != old_sculpt) +	{ +		if (old_sculpt.notNull()) +		{ +			old_sculpt->removeVolume(this); +		} +		if (mSculptTexture.notNull()) +		{ +			mSculptTexture->addVolume(this); +		} +	} +	 +} +  // sculpt replaces generate() for sculpted surfaces  void LLVOVolume::sculpt()  {	 @@ -1006,6 +1047,17 @@ void LLVOVolume::sculpt()  			}  		}  		getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level); + +		//notify rebuild any other VOVolumes that reference this sculpty volume +		for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i) +		{ +			LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i]; +			if (volume != this && volume->getVolume() == getVolume()) +			{ +				gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE); +				volume->mSculptChanged = TRUE; +			} +		}  	}  } @@ -1035,7 +1087,7 @@ BOOL LLVOVolume::calcLOD()  	S32 cur_detail = 0;  	F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length(); -	F32 distance = llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE); +	F32 distance = mDrawable->mDistanceWRTCamera; //llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE);  	distance *= sDistanceFactor;  	F32 rampDist = LLVOVolume::sLODFactor * 2; diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index a287d34402..a8bb597f93 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -179,8 +179,10 @@ public:  	/*virtual*/ BOOL 	setMaterial(const U8 material);  				void	setTexture(const S32 face); - +				S32     getIndexInTex() const {return mIndexInTex ;}  	/*virtual*/ BOOL	setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false); +				void	updateSculptTexture(); +				void    setIndexInTex(S32 index) { mIndexInTex = index ;}  				void	sculpt();  				void	updateRelativeXform();  	/*virtual*/ BOOL	updateGeometry(LLDrawable *drawable); @@ -303,7 +305,7 @@ private:  	LLPointer<LLViewerFetchedTexture> mLightTexture;  	media_list_t mMediaImplList;  	S32			mLastFetchedMediaVersion; // as fetched from the server, starts as -1 -	 +	S32 mIndexInTex;  	// statics  public:  	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop  diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 118d7f8d08..d7e5b464a6 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -657,6 +657,9 @@ void LLWorld::updateParticles()  void LLWorld::updateClouds(const F32 dt)  { +	static LLFastTimer::DeclareTimer ftm("World Clouds"); +	LLFastTimer t(ftm); +  	if (gSavedSettings.getBOOL("FreezeTime") ||  		!gSavedSettings.getBOOL("SkyUseClassicClouds"))  	{ diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index dd9634a234..6e2fa14c75 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -116,7 +116,6 @@ const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f;  const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f;  const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;  const F32 BACKLIGHT_NIGHT_MAGNITUDE_OBJECT = 0.08f; -const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40;  const S32 MAX_OFFSCREEN_GEOMETRY_CHANGES_PER_FRAME = 10;  const U32 REFLECTION_MAP_RES = 128; @@ -1412,38 +1411,26 @@ void LLPipeline::updateMove()  	assertInitialized(); -	for (LLDrawable::drawable_set_t::iterator iter = mRetexturedList.begin(); -		 iter != mRetexturedList.end(); ++iter)  	{ -		LLDrawable* drawablep = *iter; -		if (drawablep && !drawablep->isDead()) -		{ -			drawablep->updateTexture(); -		} -	} -	mRetexturedList.clear(); +		static LLFastTimer::DeclareTimer ftm("Retexture"); +		LLFastTimer t(ftm); -	updateMovedList(mMovedList); - -	for (LLDrawable::drawable_set_t::iterator iter = mActiveQ.begin(); -		 iter != mActiveQ.end(); ) -	{ -		LLDrawable::drawable_set_t::iterator curiter = iter++; -		LLDrawable* drawablep = *curiter; -		if (drawablep && !drawablep->isDead())  +		for (LLDrawable::drawable_set_t::iterator iter = mRetexturedList.begin(); +			 iter != mRetexturedList.end(); ++iter)  		{ -			if (drawablep->isRoot() &&  -				drawablep->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES &&  -				(!drawablep->getParent() || !drawablep->getParent()->isActive())) +			LLDrawable* drawablep = *iter; +			if (drawablep && !drawablep->isDead())  			{ -				drawablep->makeStatic(); // removes drawable and its children from mActiveQ -				iter = mActiveQ.upper_bound(drawablep); // next valid entry +				drawablep->updateTexture();  			}  		} -		else -		{ -			mActiveQ.erase(curiter); -		} +		mRetexturedList.clear(); +	} + +	{ +		static LLFastTimer::DeclareTimer ftm("Moved List"); +		LLFastTimer t(ftm); +		updateMovedList(mMovedList);  	}  	//balance octrees @@ -3059,12 +3046,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  		}  	} -	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING)) -	{ -		LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderForSelect"); -		gObjectList.renderObjectsForSelect(camera, gViewerWindow->getWindowRectScaled()); -	} -	else  	{  		LLFastTimer t(FTM_POOLS); @@ -4798,10 +4779,6 @@ void LLPipeline::findReferences(LLDrawable *drawablep)  		llinfos << "In mRetexturedList" << llendl;  	} -	if (mActiveQ.find(drawablep) != mActiveQ.end()) -	{ -		llinfos << "In mActiveQ" << llendl; -	}  	if (std::find(mBuildQ1.begin(), mBuildQ1.end(), drawablep) != mBuildQ1.end())  	{  		llinfos << "In mBuildQ1" << llendl; @@ -4958,19 +4935,6 @@ void LLPipeline::setLight(LLDrawable *drawablep, BOOL is_light)  	}  } -void LLPipeline::setActive(LLDrawable *drawablep, BOOL active) -{ -	assertInitialized(); -	if (active) -	{ -		mActiveQ.insert(drawablep); -	} -	else -	{ -		mActiveQ.erase(drawablep); -	} -} -  //static  void LLPipeline::toggleRenderType(U32 type)  { diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 67004a5f2d..c5285943e8 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -270,8 +270,7 @@ public:  	void shiftObjects(const LLVector3 &offset);  	void setLight(LLDrawable *drawablep, BOOL is_light); -	void setActive(LLDrawable *drawablep, BOOL active); - +	  	BOOL hasRenderBatches(const U32 type) const;  	LLCullResult::drawinfo_list_t::iterator beginRenderMap(U32 type);  	LLCullResult::drawinfo_list_t::iterator endRenderMap(U32 type); @@ -589,8 +588,6 @@ protected:  	LLViewerObject::vobj_list_t		mCreateQ; -	LLDrawable::drawable_set_t		mActiveQ; -	  	LLDrawable::drawable_set_t		mRetexturedList;  	class HighlightItem | 
