diff options
| author | Richard Linden <none@none> | 2012-04-17 14:13:31 -0700 | 
|---|---|---|
| committer | Richard Linden <none@none> | 2012-04-17 14:13:31 -0700 | 
| commit | 37186d452fcb94b13e34d01aa801e7db17ee353e (patch) | |
| tree | dbc1dce0698a6b87f41325737e6af717e00b5b9d | |
| parent | aa4a9059037d3e75d2c93d7889b460978d41fde1 (diff) | |
CHUI-86 WIP Investigate voice-dot with name tag integration
added draw3D to LLUIImage to encapsulate display of image in projective 3D space
| -rw-r--r-- | indra/llui/llui.cpp | 152 | ||||
| -rw-r--r-- | indra/llui/llui.h | 3 | ||||
| -rw-r--r-- | indra/llui/lluiimage.cpp | 44 | ||||
| -rw-r--r-- | indra/llui/lluiimage.h | 4 | ||||
| -rw-r--r-- | indra/newview/llhudnametag.cpp | 96 | 
5 files changed, 160 insertions, 139 deletions
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index b52b0355fe..46882850cc 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1464,144 +1464,132 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,  	gGL.popUIMatrix();  } -void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width,  -							  const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec, -							  const U32 edges) +void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv_rect, const LLRectf& center_draw_rect,  +							 const LLVector3& width_vec, const LLVector3& height_vec)  { -	LLVector3 left_border_width = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? border_width : LLVector3::zero; -	LLVector3 right_border_width = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? border_width : LLVector3::zero; - -	LLVector3 top_border_height = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? border_height : LLVector3::zero; -	LLVector3 bottom_border_height = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? border_height : LLVector3::zero; - -  	gGL.begin(LLRender::QUADS);  	{  		// draw bottom left -		gGL.texCoord2f(0.f, 0.f); +		gGL.texCoord2f(clip_rect.mLeft, clip_rect.mBottom);  		gGL.vertex3f(0.f, 0.f, 0.f); -		gGL.texCoord2f(border_scale.mV[VX], 0.f); -		gGL.vertex3fv(left_border_width.mV); +		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(0.f, border_scale.mV[VY]); -		gGL.vertex3fv(bottom_border_height.mV); +		gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mBottom * height_vec).mV);  		// draw bottom middle -		gGL.texCoord2f(border_scale.mV[VX], 0.f); -		gGL.vertex3fv(left_border_width.mV); +		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], 0.f); -		gGL.vertex3fv((width_vec - right_border_width).mV); +		gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV);  		// draw bottom right -		gGL.texCoord2f(1.f - border_scale.mV[VX], 0.f); -		gGL.vertex3fv((width_vec - right_border_width).mV); +		gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec).mV); -		gGL.texCoord2f(1.f, 0.f); +		gGL.texCoord2f(clip_rect.mRight, clip_rect.mBottom);  		gGL.vertex3fv(width_vec.mV); -		gGL.texCoord2f(1.f, border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + bottom_border_height).mV); +		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV);  		// draw left  -		gGL.texCoord2f(0.f, border_scale.mV[VY]); -		gGL.vertex3fv(bottom_border_height.mV); +		gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(0.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((height_vec - top_border_height).mV); +		gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mTop * height_vec).mV);  		// draw middle -		gGL.texCoord2f(border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV);  		// draw right  -		gGL.texCoord2f(1.f - border_scale.mV[VX], border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + bottom_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(1.f, border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + bottom_border_height).mV); +		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).mV); -		gGL.texCoord2f(1.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + height_vec - top_border_height).mV); +		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV);  		// draw top left -		gGL.texCoord2f(0.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((height_vec - top_border_height).mV); +		gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], 1.f); -		gGL.vertex3fv((left_border_width + height_vec).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV); -		gGL.texCoord2f(0.f, 1.f); +		gGL.texCoord2f(clip_rect.mLeft, clip_rect.mTop);  		gGL.vertex3fv((height_vec).mV);  		// draw top middle -		gGL.texCoord2f(border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((left_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f); -		gGL.vertex3fv((width_vec - right_border_width + height_vec).mV); +		gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + height_vec).mV); -		gGL.texCoord2f(border_scale.mV[VX], 1.f); -		gGL.vertex3fv((left_border_width + height_vec).mV); +		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV);  		// draw top right -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec - right_border_width + height_vec - top_border_height).mV); +		gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(1.f, 1.f - border_scale.mV[VY]); -		gGL.vertex3fv((width_vec + height_vec - top_border_height).mV); +		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).mV); -		gGL.texCoord2f(1.f, 1.f); +		gGL.texCoord2f(clip_rect.mRight, clip_rect.mTop);  		gGL.vertex3fv((width_vec + height_vec).mV); -		gGL.texCoord2f(1.f - border_scale.mV[VX], 1.f); -		gGL.vertex3fv((width_vec - right_border_width + height_vec).mV); +		gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + height_vec).mV);  	}  	gGL.end();  } -void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec) -{ -	gl_segmented_rect_3d_tex(border_scale, border_width, border_height, width_vec, height_vec, ROUNDED_RECT_TOP); -}  void LLUI::initClass(const settings_map_t& settings,  					 LLImageProviderInterface* image_provider, diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 618ed2fc42..eafae10c49 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -127,8 +127,7 @@ typedef enum e_rounded_edge  void gl_segmented_rect_2d_tex(const S32 left, const S32 top, const S32 right, const S32 bottom, const S32 texture_width, const S32 texture_height, const S32 border_size, const U32 edges = ROUNDED_RECT_ALL);  void gl_segmented_rect_2d_fragment_tex(const S32 left, const S32 top, const S32 right, const S32 bottom, const S32 texture_width, const S32 texture_height, const S32 border_size, const F32 start_fragment, const F32 end_fragment, const U32 edges = ROUNDED_RECT_ALL); -void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec, U32 edges = ROUNDED_RECT_ALL); -void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3& border_width, const LLVector3& border_height, const LLVector3& width_vec, const LLVector3& height_vec); +void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv_rect, const LLVector3& width_vec, const LLVector3& height_vec);  inline void gl_rect_2d( const LLRect& rect, BOOL filled )  { diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp index 6ae42c8852..a4886dabb0 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llui/lluiimage.cpp @@ -112,6 +112,50 @@ void LLUIImage::drawBorder(S32 x, S32 y, S32 width, S32 height, const LLColor4&  	drawSolid(border_rect, color);  } +void LLUIImage::draw3D(const LLVector3& origin_agent, const LLVector3& x_axis, const LLVector3& y_axis,  +						const LLRect& rect, const LLColor4& color) +{ +	F32 border_scale = 1.f; +	F32 border_height = (1.f - mScaleRegion.getHeight()) * getHeight(); +	F32 border_width = (1.f - mScaleRegion.getWidth()) * getWidth(); +	if (rect.getHeight() < border_height || rect.getWidth() < border_width) +	{ +		 if(border_height - rect.getHeight() > border_width - rect.getWidth()) +		 { +			 border_scale = (F32)rect.getHeight() / border_height; +		 } +		 else +		 { +			border_scale = (F32)rect.getWidth() / border_width; +		 } +	} + +	LLUI::pushMatrix(); +	{  +		LLVector3 rect_origin = origin_agent + (rect.mLeft * x_axis) + (rect.mBottom * y_axis);  +		LLUI::translate(rect_origin.mV[VX], +						rect_origin.mV[VY],  +						rect_origin.mV[VZ]); +		gGL.getTexUnit(0)->bind(getImage()); +		gGL.color4fv(color.mV); + +		LLRectf center_uv_rect(mClipRegion.mLeft + mScaleRegion.mLeft * mClipRegion.getWidth(), +							mClipRegion.mBottom + mScaleRegion.mTop * mClipRegion.getHeight(), +							mClipRegion.mLeft + mScaleRegion.mRight * mClipRegion.getWidth(), +							mClipRegion.mBottom + mScaleRegion.mBottom * mClipRegion.getHeight()); +		gl_segmented_rect_3d_tex(mClipRegion, +								center_uv_rect, +								LLRectf(border_width * border_scale * 0.5f, +										1.f - (border_height * border_scale * 0.5f), +										1.f - (border_width * border_scale * 0.5f), +										border_height * border_scale * 0.5f), +								rect.getWidth() * x_axis,  +								rect.getHeight() * y_axis); +		 +	} LLUI::popMatrix(); +} + +  S32 LLUIImage::getWidth() const  {   	// return clipped dimensions of actual image area diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h index b86ea67505..7817ba1c7b 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llui/lluiimage.h @@ -64,7 +64,9 @@ public:  	void drawBorder(S32 x, S32 y, S32 width, S32 height, const LLColor4& color, S32 border_width) const;  	void drawBorder(const LLRect& rect, const LLColor4& color, S32 border_width) const { drawBorder(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(), color, border_width); }  	void drawBorder(S32 x, S32 y, const LLColor4& color, S32 border_width) const { drawBorder(x, y, getWidth(), getHeight(), color, border_width); } -	 + +	void draw3D(const LLVector3& origin_agent, const LLVector3& x_axis, const LLVector3& y_axis, const LLRect& rect, const LLColor4& color); +  	const std::string& getName() const { return mName; }  	virtual S32 getWidth() const; diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index cf55954d7d..26c3ee8c7a 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -166,7 +166,6 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&  	}  	// scale screen size of borders down -	//RN: for now, text on hud objects is never occluded  	LLVector3 x_pixel_vec;  	LLVector3 y_pixel_vec; @@ -191,7 +190,6 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&  		+ (F32)mOffsetY * y_pixel_vec  		- (width_vec / 2.f)  		- (height_vec); -	//LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]);  	LLVector3 v[] =   	{ @@ -201,18 +199,6 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3&  		bg_pos + height_vec,  	}; -	if (debug_render) -	{ -		gGL.begin(LLRender::LINE_STRIP); -		gGL.vertex3fv(v[0].mV); -		gGL.vertex3fv(v[1].mV); -		gGL.vertex3fv(v[2].mV); -		gGL.vertex3fv(v[3].mV); -		gGL.vertex3fv(v[0].mV); -		gGL.vertex3fv(v[2].mV); -		gGL.end(); -	} -  	LLVector3 dir = end-start;  	F32 a, b, t; @@ -334,46 +320,48 @@ void LLHUDNameTag::renderText(BOOL for_select)  			+ (y_pixel_vec * screen_offset.mV[VY]);  	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); -	LLUI::pushMatrix(); -	{ -		LLVector3 bg_pos = render_position -			+ (F32)mOffsetY * y_pixel_vec -			- (width_vec / 2.f) -			- (height_vec); -		LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]); - -		if (for_select) -		{ -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			S32 name = mSourceObject->mGLName; -			LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name); -			gGL.color4ubv(coloru.mV); -			gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); -			LLUI::popMatrix(); -			return; -		} -		else -		{ -			gGL.getTexUnit(0)->bind(imagep->getImage()); -				 -			gGL.color4fv(bg_color.mV); -			gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); -		 -			if ( mLabelSegments.size()) -			{ -				LLUI::pushMatrix(); -				{ -					gGL.color4f(text_color.mV[VX], text_color.mV[VY], text_color.mV[VZ], gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); -					LLVector3 label_height = (mFontp->getLineHeight() * mLabelSegments.size() + (VERTICAL_PADDING / 3.f)) * y_pixel_vec; -					LLVector3 label_offset = height_vec - label_height; -					LLUI::translate(label_offset.mV[VX], label_offset.mV[VY], label_offset.mV[VZ]); -					gl_segmented_rect_3d_tex_top(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, label_height); -				} -				LLUI::popMatrix(); -			} -		} -	} -	LLUI::popMatrix(); +	LLRect screen_rect; +	screen_rect.setCenterAndSize(0, -mHeight / 2 + mOffsetY, mWidth, mHeight); +	imagep->draw3D(render_position, x_pixel_vec, y_pixel_vec, screen_rect, bg_color); +	if (mLabelSegments.size()) +	{ +		LLUIImagePtr rect_top_image = LLUI::getUIImage("Rounded_Rect_Top"); +		LLRect label_top_rect = screen_rect; +		const S32 label_height = llround((mFontp->getLineHeight() * (F32)mLabelSegments.size() + (VERTICAL_PADDING / 3.f))); +		label_top_rect.mBottom = label_top_rect.mTop - label_height; +		LLColor4 label_top_color = text_color; +		label_top_color.mV[VALPHA] = gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor; + +		rect_top_image->draw3D(render_position, x_pixel_vec, y_pixel_vec, label_top_rect, label_top_color); + +	} +	//LLUI::pushMatrix(); +	//{ +	//	LLVector3 bg_pos = render_position +	//		+ (F32)mOffsetY * y_pixel_vec +	//		- (width_vec / 2.f) +	//		- (height_vec); +	//	LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]); + +	//	gGL.getTexUnit(0)->bind(imagep->getImage()); +	//			 +	//	gGL.color4fv(bg_color.mV); +	//	gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); +	//	 +	//	if ( mLabelSegments.size()) +	//	{ +	//		LLUI::pushMatrix(); +	//		{ +	//			gGL.color4f(text_color.mV[VX], text_color.mV[VY], text_color.mV[VZ], gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); +	//			LLVector3 label_height = (mFontp->getLineHeight() * mLabelSegments.size() + (VERTICAL_PADDING / 3.f)) * y_pixel_vec; +	//			LLVector3 label_offset = height_vec - label_height; +	//			LLUI::translate(label_offset.mV[VX], label_offset.mV[VY], label_offset.mV[VZ]); +	//			gl_segmented_rect_3d_tex_top(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, label_height); +	//		} +	//		LLUI::popMatrix(); +	//	} +	//} +	//LLUI::popMatrix();  	F32 y_offset = (F32)mOffsetY;  | 
