diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llfontgl.cpp | 30 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 125 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 19 | 
3 files changed, 141 insertions, 33 deletions
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index f1f86fd638..768f042e69 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; -  	const LLFontGlyphInfo* next_glyph = NULL;  	for (i = begin_offset; i < begin_offset + length; i++) @@ -268,12 +267,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. @@ -338,10 +333,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, @@ -352,10 +344,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..55c5b4531b 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,8 @@ LLRender::LLRender()  	mCurrAlphaFunc = CF_DEFAULT;  	mCurrAlphaFuncVal = 0.01f; +	mCurrBlendSFactor = BF_ONE; +	mCurrBlendDFactor = BF_ZERO;  }  LLRender::~LLRender() @@ -821,6 +827,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,29 +923,28 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB  void LLRender::setSceneBlendType(eBlendType type)  { -	flush();  	switch (type)   	{  		case BT_ALPHA: -			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +			blendFunc(BF_SOURCE_ALPHA, BF_ONE_MINUS_SOURCE_ALPHA);  			break;  		case BT_ADD: -			glBlendFunc(GL_ONE, GL_ONE); +			blendFunc(BF_ONE, BF_ONE);  			break;  		case BT_ADD_WITH_ALPHA: -			glBlendFunc(GL_SRC_ALPHA, GL_ONE); +			blendFunc(BF_SOURCE_ALPHA, BF_ONE);  			break;  		case BT_MULT: -			glBlendFunc(GL_DST_COLOR, GL_ZERO); +			blendFunc(BF_DEST_COLOR, BF_ZERO);  			break;  		case BT_MULT_ALPHA: -			glBlendFunc(GL_DST_ALPHA, GL_ZERO); +			blendFunc(BF_DEST_ALPHA, BF_ZERO);  			break;  		case BT_MULT_X2: -			glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); +			blendFunc(BF_DEST_COLOR, BF_SOURCE_COLOR);  			break;  		case BT_REPLACE: -			glBlendFunc(GL_ONE, GL_ZERO); +			blendFunc(BF_ONE, BF_ZERO);  			break;  		default:  			llerrs << "Unknown Scene Blend Type: " << type << llendl; @@ -891,8 +970,13 @@ void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)  void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)  { -	flush(); -	glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]); +	if (mCurrBlendSFactor != sfactor || mCurrBlendDFactor != dfactor) +	{ +		mCurrBlendSFactor = sfactor; +		mCurrBlendDFactor = dfactor; +		flush(); +		glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]); +	}  }  LLTexUnit* LLRender::getTexUnit(U32 index) @@ -1012,6 +1096,12 @@ void LLRender::flush()  		}  #endif +		if (!mUIOffset.empty()) +		{ +			sUICalls++; +			sUIVerts += mCount; +		} +  		mBuffer->setBuffer(immediate_mask);  		mBuffer->drawArrays(mMode, 0, mCount); @@ -1031,7 +1121,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..a70ccf4d80 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,14 @@ private:  	std::vector<LLTexUnit*>		mTexUnits;  	LLTexUnit*			mDummyTexUnit; +	U32				mCurrBlendSFactor; +	U32				mCurrBlendDFactor; +  	F32				mMaxAnisotropy; + +	std::list<LLVector3> mUIOffset; +	std::list<LLVector3> mUIScale; +  };  extern F64 gGLModelView[16];  | 
