diff options
| author | Nyx Linden <nyx@lindenlab.com> | 2013-03-12 22:34:15 +0000 | 
|---|---|---|
| committer | Nyx Linden <nyx@lindenlab.com> | 2013-03-12 22:34:15 +0000 | 
| commit | 34fe6ad59161e0dcd57dfdc1feb6cfd1fcaa4794 (patch) | |
| tree | 278444ac8f53286f8701b5002836e65c707294c5 | |
| parent | 0123ab0dc67dd9de266f1edac2cadbd43ef0aa4d (diff) | |
SH-3944 WIP CHUI merge fixing
re-introduced don's refactor of low-level openGL calls pulling out of llui
and putting them into llrender. Took the new code from their updated versions
from the CHUI merge, but put them in a place accessible to appearance utility.
| -rw-r--r-- | indra/llrender/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | indra/llrender/llrender2dutils.cpp | 1608 | ||||
| -rw-r--r-- | indra/llrender/llrender2dutils.h | 163 | ||||
| -rw-r--r-- | indra/llrender/lluiimage.cpp (renamed from indra/llui/lluiimage.cpp) | 10 | ||||
| -rw-r--r-- | indra/llrender/lluiimage.h (renamed from indra/llui/lluiimage.h) | 0 | ||||
| -rw-r--r-- | indra/llui/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llui/llcombobox.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/lllineeditor.cpp | 6 | ||||
| -rw-r--r-- | indra/llui/lllocalcliprect.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 4 | ||||
| -rw-r--r-- | indra/llui/lltexteditor.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llui.cpp | 1567 | ||||
| -rw-r--r-- | indra/llui/llui.h | 130 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llglsandbox.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llmediactrl.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llviewerdisplay.cpp | 10 | ||||
| -rwxr-xr-x | indra/newview/llviewerwindow.cpp | 12 | ||||
| -rw-r--r-- | indra/newview/llworldmapview.cpp | 4 | 
19 files changed, 1846 insertions, 1714 deletions
| diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 904f5587b7..669b70aa43 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -43,11 +43,13 @@ set(llrender_SOURCE_FILES      llimagegl.cpp      llpostprocess.cpp      llrender.cpp +    llrender2dutils.cpp      llrendernavprim.cpp      llrendersphere.cpp      llrendertarget.cpp      llshadermgr.cpp      lltexture.cpp +    lluiimage.cpp      llvertexbuffer.cpp      ) @@ -69,10 +71,12 @@ set(llrender_HEADER_FILES      llimagegl.h      llpostprocess.h      llrender.h +    llrender2dutils.h      llrendernavprim.h      llrendersphere.h      llshadermgr.h      lltexture.h +    lluiimage.h      llvertexbuffer.h      ) diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp new file mode 100644 index 0000000000..d3cfbaf03a --- /dev/null +++ b/indra/llrender/llrender2dutils.cpp @@ -0,0 +1,1608 @@ +/**  + * @file llrender2dutils.cpp + * @brief GL function implementations for immediate-mode gl drawing. + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +// Linden library includes +#include "v2math.h" +#include "m3math.h" +#include "v4color.h" +#include "llfontgl.h" +#include "llrender.h" +#include "llrect.h" +#include "llgl.h" +#include "lltexture.h" + +// Project includes +#include "llrender2dutils.h" +#include "lluiimage.h" + + +// +// Globals +// +const LLColor4 UI_VERTEX_COLOR(1.f, 1.f, 1.f, 1.f); +/*static*/ LLVector2		LLRender2D::sGLScaleFactor(1.f, 1.f); +/*static*/ LLImageProviderInterface* LLRender2D::sImageProvider = NULL; + +// +// Functions +// + +BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom) +{ +	if (x < left || right < x) return FALSE; +	if (y < bottom || top < y) return FALSE; +	return TRUE; +} + + +// Puts GL into 2D drawing mode by turning off lighting, setting to an +// orthographic projection, etc. +void gl_state_for_2d(S32 width, S32 height) +{ +	stop_glerror(); +	F32 window_width = (F32) width;//gViewerWindow->getWindowWidth(); +	F32 window_height = (F32) height;//gViewerWindow->getWindowHeight(); + +	gGL.matrixMode(LLRender::MM_PROJECTION); +	gGL.loadIdentity(); +	gGL.ortho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f); +	gGL.matrixMode(LLRender::MM_MODELVIEW); +	gGL.loadIdentity(); +	stop_glerror(); +} + + +void gl_draw_x(const LLRect& rect, const LLColor4& color) +{ +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.color4fv( color.mV ); + +	gGL.begin( LLRender::LINES ); +		gGL.vertex2i( rect.mLeft,		rect.mTop ); +		gGL.vertex2i( rect.mRight,	rect.mBottom ); +		gGL.vertex2i( rect.mLeft,		rect.mBottom ); +		gGL.vertex2i( rect.mRight,	rect.mTop ); +	gGL.end(); +} + + +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset, BOOL filled) +{ +	gGL.color4fv(color.mV); +	gl_rect_2d_offset_local(left, top, right, bottom, pixel_offset, filled); +} + +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled) +{ +	gGL.pushUIMatrix(); +	left += LLFontGL::sCurOrigin.mX; +	right += LLFontGL::sCurOrigin.mX; +	bottom += LLFontGL::sCurOrigin.mY; +	top += LLFontGL::sCurOrigin.mY; + +	gGL.loadUIIdentity(); +	gl_rect_2d(llfloor((F32)left * LLRender2D::sGLScaleFactor.mV[VX]) - pixel_offset, +				llfloor((F32)top * LLRender2D::sGLScaleFactor.mV[VY]) + pixel_offset, +				llfloor((F32)right * LLRender2D::sGLScaleFactor.mV[VX]) + pixel_offset, +				llfloor((F32)bottom * LLRender2D::sGLScaleFactor.mV[VY]) - pixel_offset, +				filled); +	gGL.popUIMatrix(); +} + + +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled ) +{ +	stop_glerror(); +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	// Counterclockwise quad will face the viewer +	if( filled ) +	{  +		gGL.begin( LLRender::QUADS ); +			gGL.vertex2i(left, top); +			gGL.vertex2i(left, bottom); +			gGL.vertex2i(right, bottom); +			gGL.vertex2i(right, top); +		gGL.end(); +	} +	else +	{ +		if( gGLManager.mATIOffsetVerticalLines ) +		{ +			// Work around bug in ATI driver: vertical lines are offset by (-1,-1) +			gGL.begin( LLRender::LINES ); + +				// Verticals  +				gGL.vertex2i(left + 1, top); +				gGL.vertex2i(left + 1, bottom); + +				gGL.vertex2i(right, bottom); +				gGL.vertex2i(right, top); + +				// Horizontals +				top--; +				right--; +				gGL.vertex2i(left, bottom); +				gGL.vertex2i(right, bottom); + +				gGL.vertex2i(left, top); +				gGL.vertex2i(right, top); +			gGL.end(); +		} +		else +		{ +			top--; +			right--; +			gGL.begin( LLRender::LINE_STRIP ); +				gGL.vertex2i(left, top); +				gGL.vertex2i(left, bottom); +				gGL.vertex2i(right, bottom); +				gGL.vertex2i(right, top); +				gGL.vertex2i(left, top); +			gGL.end(); +		} +	} +	stop_glerror(); +} + +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled ) +{ +	gGL.color4fv( color.mV ); +	gl_rect_2d( left, top, right, bottom, filled ); +} + + +void gl_rect_2d( const LLRect& rect, const LLColor4& color, BOOL filled ) +{ +	gGL.color4fv( color.mV ); +	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); +} + +// Given a rectangle on the screen, draws a drop shadow _outside_ +// the right and bottom edges of it.  Along the right it has width "lines" +// and along the bottom it has height "lines". +void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines) +{ +	stop_glerror(); +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	 +	// HACK: Overlap with the rectangle by a single pixel. +	right--; +	bottom++; +	lines++; + +	LLColor4 end_color = start_color; +	end_color.mV[VALPHA] = 0.f; + +	gGL.begin(LLRender::QUADS); + +	// Right edge, CCW faces screen +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(right,		top-lines); +	gGL.vertex2i(right,		bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(right+lines, bottom); +	gGL.vertex2i(right+lines, top-lines); + +	// Bottom edge, CCW faces screen +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(right,		bottom); +	gGL.vertex2i(left+lines,	bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(left+lines,	bottom-lines); +	gGL.vertex2i(right,		bottom-lines); + +	// bottom left Corner +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(left+lines,	bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(left,		bottom); +	// make the bottom left corner not sharp +	gGL.vertex2i(left+1,		bottom-lines+1); +	gGL.vertex2i(left+lines,	bottom-lines); + +	// bottom right corner +	gGL.color4fv(start_color.mV); +	gGL.vertex2i(right,		bottom); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i(right,		bottom-lines); +	// make the rightmost corner not sharp +	gGL.vertex2i(right+lines-1,	bottom-lines+1); +	gGL.vertex2i(right+lines,	bottom); + +	// top right corner +	gGL.color4fv(start_color.mV); +	gGL.vertex2i( right,			top-lines ); +	gGL.color4fv(end_color.mV); +	gGL.vertex2i( right+lines,	top-lines ); +	// make the corner not sharp +	gGL.vertex2i( right+lines-1,	top-1 ); +	gGL.vertex2i( right,			top ); + +	gGL.end(); +	stop_glerror(); +} + +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2 ) +{ +	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) +	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) +	{ +		x1++; +		x2++; +		y1++; +		y2++; +	} + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	 +	gGL.begin(LLRender::LINES); +		gGL.vertex2i(x1, y1); +		gGL.vertex2i(x2, y2); +	gGL.end(); +} + +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ) +{ +	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) +	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) +	{ +		x1++; +		x2++; +		y1++; +		y2++; +	} + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.color4fv( color.mV ); + +	gGL.begin(LLRender::LINES); +		gGL.vertex2i(x1, y1); +		gGL.vertex2i(x2, y2); +	gGL.end(); +} + +void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled) +{ +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.color4fv(color.mV); + +	if (filled) +	{ +		gGL.begin(LLRender::TRIANGLES); +	} +	else +	{ +		gGL.begin(LLRender::LINE_LOOP); +	} +	gGL.vertex2i(x1, y1); +	gGL.vertex2i(x2, y2); +	gGL.vertex2i(x3, y3); +	gGL.end(); +} + +void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac) +{ +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	length = llmin((S32)(max_frac*(right - left)), length); +	length = llmin((S32)(max_frac*(top - bottom)), length); +	gGL.begin(LLRender::LINES); +	gGL.vertex2i(left, top); +	gGL.vertex2i(left + length, top); +	 +	gGL.vertex2i(left, top); +	gGL.vertex2i(left, top - length); + +	gGL.vertex2i(left, bottom); +	gGL.vertex2i(left + length, bottom); +	 +	gGL.vertex2i(left, bottom); +	gGL.vertex2i(left, bottom + length); + +	gGL.vertex2i(right, top); +	gGL.vertex2i(right - length, top); + +	gGL.vertex2i(right, top); +	gGL.vertex2i(right, top - length); + +	gGL.vertex2i(right, bottom); +	gGL.vertex2i(right - length, bottom); + +	gGL.vertex2i(right, bottom); +	gGL.vertex2i(right, bottom + length); +	gGL.end(); +} + + +void gl_draw_image( S32 x, S32 y, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect ) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} +	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color, uv_rect ); +} + +void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} +	gl_draw_scaled_rotated_image( x, y, width, height, 0.f, image, color, uv_rect ); +} + +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} + +	// scale screen size of borders down +	F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(0); +	F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0); + +	LLRectf scale_rect(border_width_fraction, 1.f - border_height_fraction, 1.f - border_width_fraction, border_height_fraction); +	gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect); +} + +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_outer_rect, const LLRectf& center_rect) +{ +	stop_glerror(); + +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} + +	// add in offset of current image to current UI translation +	const LLVector3 ui_scale = gGL.getUIScale(); +	const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale); + +	F32 uv_width = uv_outer_rect.getWidth(); +	F32 uv_height = uv_outer_rect.getHeight(); + +	// shrink scaling region to be proportional to clipped image region +	LLRectf uv_center_rect( +		uv_outer_rect.mLeft + (center_rect.mLeft * uv_width), +		uv_outer_rect.mBottom + (center_rect.mTop * uv_height), +		uv_outer_rect.mLeft + (center_rect.mRight * uv_width), +		uv_outer_rect.mBottom + (center_rect.mBottom * uv_height)); + +	F32 image_width = image->getWidth(0); +	F32 image_height = image->getHeight(0); + +	S32 image_natural_width = llround(image_width * uv_width); +	S32 image_natural_height = llround(image_height * uv_height); + +	LLRectf draw_center_rect(	uv_center_rect.mLeft * image_width, +								uv_center_rect.mTop * image_height, +								uv_center_rect.mRight * image_width, +								uv_center_rect.mBottom * image_height); + +	{	// scale fixed region of image to drawn region +		draw_center_rect.mRight += width - image_natural_width; +		draw_center_rect.mTop += height - image_natural_height; + +		F32 border_shrink_width = llmax(0.f, draw_center_rect.mLeft - draw_center_rect.mRight); +		F32 border_shrink_height = llmax(0.f, draw_center_rect.mBottom - draw_center_rect.mTop); + +		F32 shrink_width_ratio = center_rect.getWidth() == 1.f ? 0.f : border_shrink_width / ((F32)image_natural_width * (1.f - center_rect.getWidth())); +		F32 shrink_height_ratio = center_rect.getHeight() == 1.f ? 0.f : border_shrink_height / ((F32)image_natural_height * (1.f - center_rect.getHeight())); + +		F32 shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio); + +		draw_center_rect.mLeft = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * shrink_scale * ui_scale.mV[VX]); +		draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale) * ui_scale.mV[VY]); +		draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale) * ui_scale.mV[VX]); +		draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * shrink_scale * ui_scale.mV[VY]); +	} + +	LLRectf draw_outer_rect(ui_translation.mV[VX],  +							ui_translation.mV[VY] + height * ui_scale.mV[VY],  +							ui_translation.mV[VX] + width * ui_scale.mV[VX],  +							ui_translation.mV[VY]); + +	LLGLSUIDefault gls_ui; +	 +	if (solid_color) +	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gSolidColorProgram.bind(); +		} +		else +		{ +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); +		} +	} + +	gGL.getTexUnit(0)->bind(image, true); + +	gGL.color4fv(color.mV); +	 +	const S32 NUM_VERTICES = 9 * 4; // 9 quads +	LLVector2 uv[NUM_VERTICES]; +	LLVector3 pos[NUM_VERTICES]; + +	S32 index = 0; + +	gGL.begin(LLRender::QUADS); +	{ +		// draw bottom left +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		// draw bottom middle +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		// draw bottom right +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		// draw left  +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		// draw middle +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		// draw right  +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		// draw top left +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f); +		index++; + +		// draw top middle +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +		index++; + +		// draw top right +		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f); +		index++; + +		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); +		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +		index++; + +		gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); +	} +	gGL.end(); + +	if (solid_color) +	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.bind(); +		} +		else +		{ +			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		} +	} +} + +void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) +{ +	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color, uv_rect ); +} + +void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) +{ +	if (NULL == image) +	{ +		llwarns << "image == NULL; aborting function" << llendl; +		return; +	} + +	LLGLSUIDefault gls_ui; + + +	gGL.getTexUnit(0)->bind(image, true); + +	gGL.color4fv(color.mV); + +	if (degrees == 0.f) +	{ +		const S32 NUM_VERTICES = 4; // 9 quads +		LLVector2 uv[NUM_VERTICES]; +		LLVector3 pos[NUM_VERTICES]; + +		gGL.begin(LLRender::QUADS); +		{ +			LLVector3 ui_scale = gGL.getUIScale(); +			LLVector3 ui_translation = gGL.getUITranslation(); +			ui_translation.mV[VX] += x; +			ui_translation.mV[VY] += y; +			ui_translation.scaleVec(ui_scale); +			S32 index = 0; +			S32 scaled_width = llround(width * ui_scale.mV[VX]); +			S32 scaled_height = llround(height * ui_scale.mV[VY]); + +			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); +			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f); +			index++; + +			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop); +			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f); +			index++; + +			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); +			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY], 0.f); +			index++; + +			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom); +			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f); +			index++; + +			gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); +		} +		gGL.end(); +	} +	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, true); + +		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.vertex2f(v.mV[0], v.mV[1] ); + +			v = LLVector3(-offset_x, offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); +			gGL.vertex2f(v.mV[0], v.mV[1] ); + +			v = LLVector3(-offset_x, -offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); +			gGL.vertex2f(v.mV[0], v.mV[1] ); + +			v = LLVector3(offset_x, -offset_y, 0.f) * quat; +			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); +			gGL.vertex2f(v.mV[0], v.mV[1] ); +		} +		gGL.end(); +		gGL.popUIMatrix(); +	} +} + + +void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase ) +{ +	phase = fmod(phase, 1.f); + +	S32 shift = S32(phase * 4.f) % 4; + +	// Stippled line +	LLGLEnable stipple(GL_LINE_STIPPLE); +	 +	gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], color.mV[VALPHA]); + +	gGL.flush(); +	glLineWidth(2.5f); + +	if (!LLGLSLShader::sNoFixedFunction) +	{ +		glLineStipple(2, 0x3333 << shift); +	} + +	gGL.begin(LLRender::LINES); +	{ +		gGL.vertex3fv( start.mV ); +		gGL.vertex3fv( end.mV ); +	} +	gGL.end(); + +	LLRender2D::setLineWidth(1.f); +} + +void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle) +{ +	if (end_angle < start_angle) +	{ +		end_angle += F_TWO_PI; +	} + +	gGL.pushUIMatrix(); +	{ +		gGL.translateUI(center_x, center_y, 0.f); + +		// Inexact, but reasonably fast. +		F32 delta = (end_angle - start_angle) / steps; +		F32 sin_delta = sin( delta ); +		F32 cos_delta = cos( delta ); +		F32 x = cosf(start_angle) * radius; +		F32 y = sinf(start_angle) * radius; + +		if (filled) +		{ +			gGL.begin(LLRender::TRIANGLE_FAN); +			gGL.vertex2f(0.f, 0.f); +			// make sure circle is complete +			steps += 1; +		} +		else +		{ +			gGL.begin(LLRender::LINE_STRIP); +		} + +		while( steps-- ) +		{ +			// Successive rotations +			gGL.vertex2f( x, y ); +			F32 x_new = x * cos_delta - y * sin_delta; +			y = x * sin_delta +  y * cos_delta; +			x = x_new; +		} +		gGL.end(); +	} +	gGL.popUIMatrix(); +} + +void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled) +{ +	gGL.pushUIMatrix(); +	{ +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gGL.translateUI(center_x, center_y, 0.f); + +		// Inexact, but reasonably fast. +		F32 delta = F_TWO_PI / steps; +		F32 sin_delta = sin( delta ); +		F32 cos_delta = cos( delta ); +		F32 x = radius; +		F32 y = 0.f; + +		if (filled) +		{ +			gGL.begin(LLRender::TRIANGLE_FAN); +			gGL.vertex2f(0.f, 0.f); +			// make sure circle is complete +			steps += 1; +		} +		else +		{ +			gGL.begin(LLRender::LINE_LOOP); +		} + +		while( steps-- ) +		{ +			// Successive rotations +			gGL.vertex2f( x, y ); +			F32 x_new = x * cos_delta - y * sin_delta; +			y = x * sin_delta +  y * cos_delta; +			x = x_new; +		} +		gGL.end(); +	} +	gGL.popUIMatrix(); +} + +// Renders a ring with sides (tube shape) +void gl_deep_circle( F32 radius, F32 depth, S32 steps ) +{ +	F32 x = radius; +	F32 y = 0.f; +	F32 angle_delta = F_TWO_PI / (F32)steps; +	gGL.begin( LLRender::TRIANGLE_STRIP  ); +	{ +		S32 step = steps + 1; // An extra step to close the circle. +		while( step-- ) +		{ +			gGL.vertex3f( x, y, depth ); +			gGL.vertex3f( x, y, 0.f ); + +			F32 x_new = x * cosf(angle_delta) - y * sinf(angle_delta); +			y = x * sinf(angle_delta) +  y * cosf(angle_delta); +			x = x_new; +		} +	} +	gGL.end(); +} + +void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ) +{ +	gGL.pushUIMatrix(); +	{ +		gGL.translateUI(0.f, 0.f, -width / 2); +		if( render_center ) +		{ +			gGL.color4fv(center_color.mV); +			gGL.diffuseColor4fv(center_color.mV); +			gl_deep_circle( radius, width, steps ); +		} +		else +		{ +			gGL.diffuseColor4fv(side_color.mV); +			gl_washer_2d(radius, radius - width, steps, side_color, side_color); +			gGL.translateUI(0.f, 0.f, width); +			gl_washer_2d(radius - width, radius, steps, side_color, side_color); +		} +	} +	gGL.popUIMatrix(); +} + +// Draw gray and white checkerboard with black border +void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha) +{ +	if (!LLGLSLShader::sNoFixedFunction) +	{  +	// Initialize the first time this is called. +	const S32 PIXELS = 32; +	static GLubyte checkerboard[PIXELS * PIXELS]; +	static BOOL first = TRUE; +	if( first ) +	{ +		for( S32 i = 0; i < PIXELS; i++ ) +		{ +			for( S32 j = 0; j < PIXELS; j++ ) +			{ +				checkerboard[i * PIXELS + j] = ((i & 1) ^ (j & 1)) * 0xFF; +			} +		} +		first = FALSE; +	} +	 +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	// ...white squares +	gGL.color4f( 1.f, 1.f, 1.f, alpha ); +	gl_rect_2d(rect); + +	// ...gray squares +	gGL.color4f( .7f, .7f, .7f, alpha ); +	gGL.flush(); + +		glPolygonStipple( checkerboard ); + +		LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE); +		gl_rect_2d(rect); +	} +	else +	{ //polygon stipple is deprecated, use "Checker" texture +		LLPointer<LLUIImage> img = LLRender2D::getUIImage("Checker"); +		gGL.getTexUnit(0)->bind(img->getImage()); +		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); +		gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + +		LLColor4 color(1.f, 1.f, 1.f, alpha); +		LLRectf uv_rect(0, 0, rect.getWidth()/32.f, rect.getHeight()/32.f); + +		gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(), +			img->getImage(), color, uv_rect); +	} +	 +	gGL.flush(); +} + + +// Draws the area between two concentric circles, like +// a doughnut or washer. +void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) +{ +	const F32 DELTA = F_TWO_PI / steps; +	const F32 SIN_DELTA = sin( DELTA ); +	const F32 COS_DELTA = cos( DELTA ); + +	F32 x1 = outer_radius; +	F32 y1 = 0.f; +	F32 x2 = inner_radius; +	F32 y2 = 0.f; + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + +	gGL.begin( LLRender::TRIANGLE_STRIP  ); +	{ +		steps += 1; // An extra step to close the circle. +		while( steps-- ) +		{ +			gGL.color4fv(outer_color.mV); +			gGL.vertex2f( x1, y1 ); +			gGL.color4fv(inner_color.mV); +			gGL.vertex2f( x2, y2 ); + +			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; +			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; +			x1 = x1_new; + +			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; +			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; +			x2 = x2_new; +		} +	} +	gGL.end(); +} + +// Draws the area between two concentric circles, like +// a doughnut or washer. +void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) +{ +	const F32 DELTA = (end_radians - start_radians) / steps; +	const F32 SIN_DELTA = sin( DELTA ); +	const F32 COS_DELTA = cos( DELTA ); + +	F32 x1 = outer_radius * cos( start_radians ); +	F32 y1 = outer_radius * sin( start_radians ); +	F32 x2 = inner_radius * cos( start_radians ); +	F32 y2 = inner_radius * sin( start_radians ); + +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	gGL.begin( LLRender::TRIANGLE_STRIP  ); +	{ +		steps += 1; // An extra step to close the circle. +		while( steps-- ) +		{ +			gGL.color4fv(outer_color.mV); +			gGL.vertex2f( x1, y1 ); +			gGL.color4fv(inner_color.mV); +			gGL.vertex2f( x2, y2 ); + +			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; +			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; +			x1 = x1_new; + +			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; +			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; +			x2 = x2_new; +		} +	} +	gGL.end(); +} + +void gl_rect_2d_simple_tex( S32 width, S32 height ) +{ +	gGL.begin( LLRender::QUADS ); + +		gGL.texCoord2f(1.f, 1.f); +		gGL.vertex2i(width, height); + +		gGL.texCoord2f(0.f, 1.f); +		gGL.vertex2i(0, height); + +		gGL.texCoord2f(0.f, 0.f); +		gGL.vertex2i(0, 0); + +		gGL.texCoord2f(1.f, 0.f); +		gGL.vertex2i(width, 0); +	 +	gGL.end(); +} + +void gl_rect_2d_simple( S32 width, S32 height ) +{ +	gGL.begin( LLRender::QUADS ); +		gGL.vertex2i(width, height); +		gGL.vertex2i(0, height); +		gGL.vertex2i(0, 0); +		gGL.vertex2i(width, 0); +	gGL.end(); +} + +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) +{ +	S32 width = llabs(right - left); +	S32 height = llabs(top - bottom); + +	gGL.pushUIMatrix(); + +	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) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; +	} +	if (border_uv_scale.mV[VY] > 0.5f) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; +	} + +	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); +	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 width_vec((F32)width, 0.f); +	LLVector2 height_vec(0.f, (F32)height); + +	gGL.begin(LLRender::QUADS); +	{ +		// draw bottom left +		gGL.texCoord2f(0.f, 0.f); +		gGL.vertex2f(0.f, 0.f); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv(border_width_left.mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv(border_height_bottom.mV); + +		// draw bottom middle +		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv(border_width_left.mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv((width_vec - border_width_right).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		// draw bottom right +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +		gGL.vertex2fv((width_vec - border_width_right).mV); + +		gGL.texCoord2f(1.f, 0.f); +		gGL.vertex2fv(width_vec.mV); + +		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + border_height_bottom).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		// draw left  +		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv(border_height_bottom.mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((height_vec - border_height_top).mV); + +		// draw middle +		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		// draw right  +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + border_height_bottom).mV); + +		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		// draw top left +		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((height_vec - border_height_top).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((border_width_left + height_vec).mV); + +		gGL.texCoord2f(0.f, 1.f); +		gGL.vertex2fv((height_vec).mV); + +		// draw top middle +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); + +		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((border_width_left + height_vec).mV); + +		// draw top right +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); +		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); + +		gGL.texCoord2f(1.f, 1.f); +		gGL.vertex2fv((width_vec + height_vec).mV); + +		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); +	} +	gGL.end(); + +	gGL.popUIMatrix(); +} + +//FIXME: rewrite to use scissor? +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) +{ +	S32 width = llabs(right - left); +	S32 height = llabs(top - bottom); + +	gGL.pushUIMatrix(); + +	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) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; +	} +	if (border_uv_scale.mV[VY] > 0.5f) +	{ +		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; +	} + +	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); +	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; +	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; +	LLVector2 width_vec((F32)width, 0.f); +	LLVector2 height_vec(0.f, (F32)height); + +	F32 middle_start = border_scale / (F32)width; +	F32 middle_end = 1.f - middle_start; + +	F32 u_min; +	F32 u_max; +	LLVector2 x_min; +	LLVector2 x_max; + +	gGL.begin(LLRender::QUADS); +	{ +		if (start_fragment < middle_start) +		{ +			u_min = (start_fragment / middle_start) * border_uv_scale.mV[VX]; +			u_max = llmin(end_fragment / middle_start, 1.f) * border_uv_scale.mV[VX]; +			x_min = (start_fragment / middle_start) * border_width_left; +			x_max = llmin(end_fragment / middle_start, 1.f) * border_width_left; + +			// draw bottom left +			gGL.texCoord2f(u_min, 0.f); +			gGL.vertex2fv(x_min.mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +			gGL.vertex2fv(x_max.mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			// draw left  +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); +			 +			// draw top left +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f); +			gGL.vertex2fv((x_max + height_vec).mV); + +			gGL.texCoord2f(u_min, 1.f); +			gGL.vertex2fv((x_min + height_vec).mV); +		} + +		if (end_fragment > middle_start || start_fragment < middle_end) +		{ +			x_min = border_width_left + ((llclamp(start_fragment, middle_start, middle_end) - middle_start)) * width_vec; +			x_max = border_width_left + ((llclamp(end_fragment, middle_start, middle_end) - middle_start)) * width_vec; + +			// draw bottom middle +			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +			gGL.vertex2fv(x_min.mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +			gGL.vertex2fv((x_max).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			// draw middle +			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			// draw top middle +			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +			gGL.vertex2fv((x_max + height_vec).mV); + +			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +			gGL.vertex2fv((x_min + height_vec).mV); +		} + +		if (end_fragment > middle_end) +		{ +			u_min = (1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_uv_scale.mV[VX]; +			u_max = (1.f - ((end_fragment - middle_end) / middle_start)) * border_uv_scale.mV[VX]; +			x_min = width_vec - ((1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_width_right); +			x_max = width_vec - ((1.f - ((end_fragment - middle_end) / middle_start)) * border_width_right); + +			// draw bottom right +			gGL.texCoord2f(u_min, 0.f); +			gGL.vertex2fv((x_min).mV); + +			gGL.texCoord2f(u_max, 0.f); +			gGL.vertex2fv(x_max.mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			// draw right  +			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + border_height_bottom).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			// draw top right +			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); + +			gGL.texCoord2f(u_max, 1.f); +			gGL.vertex2fv((x_max + height_vec).mV); + +			gGL.texCoord2f(u_min, 1.f); +			gGL.vertex2fv((x_min + height_vec).mV); +		} +	} +	gGL.end(); + +	gGL.popUIMatrix(); +} + +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) +{ +	gGL.begin(LLRender::QUADS); +	{ +		// draw bottom left +		gGL.texCoord2f(clip_rect.mLeft, clip_rect.mBottom); +		gGL.vertex3f(0.f, 0.f, 0.f); + +		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec).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(clip_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mBottom * height_vec).mV); + +		// draw bottom middle +		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec).mV); + +		gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec).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(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(center_uv_rect.mRight, clip_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec).mV); + +		gGL.texCoord2f(clip_rect.mRight, clip_rect.mBottom); +		gGL.vertex3fv(width_vec.mV); + +		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).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(clip_rect.mLeft, center_uv_rect.mBottom); +		gGL.vertex3fv((center_draw_rect.mBottom * height_vec).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(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(clip_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mTop * height_vec).mV); + +		// draw middle +		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(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(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(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(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(clip_rect.mRight, center_uv_rect.mBottom); +		gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).mV); + +		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).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(clip_rect.mLeft, center_uv_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mTop * height_vec).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(center_uv_rect.mLeft, clip_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV); + +		gGL.texCoord2f(clip_rect.mLeft, clip_rect.mTop); +		gGL.vertex3fv((height_vec).mV); + +		// draw top middle +		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(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(center_uv_rect.mRight, clip_rect.mTop); +		gGL.vertex3fv((center_draw_rect.mRight * width_vec + 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(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(clip_rect.mRight, center_uv_rect.mTop); +		gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).mV); + +		gGL.texCoord2f(clip_rect.mRight, clip_rect.mTop); +		gGL.vertex3fv((width_vec + 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(); + +} + +// static +void LLRender2D::initClass(LLImageProviderInterface* image_provider, +						   const LLVector2* scale_factor) +{ +	sGLScaleFactor = (scale_factor == NULL) ? LLVector2(1.f, 1.f) : *scale_factor; +	sImageProvider = image_provider; +} + +// static +void LLRender2D::cleanupClass() +{ +	if(sImageProvider) +	{ +		sImageProvider->cleanUp(); +	} +} + + +//static +void LLRender2D::translate(F32 x, F32 y, F32 z) +{ +	gGL.translateUI(x,y,z); +	LLFontGL::sCurOrigin.mX += (S32) x; +	LLFontGL::sCurOrigin.mY += (S32) y; +	LLFontGL::sCurDepth += z; +} + +//static +void LLRender2D::pushMatrix() +{ +	gGL.pushUIMatrix(); +	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth)); +} + +//static +void LLRender2D::popMatrix() +{ +	gGL.popUIMatrix(); +	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first; +	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second; +	LLFontGL::sOriginStack.pop_back(); +} + +//static  +void LLRender2D::loadIdentity() +{ +	gGL.loadUIIdentity();  +	LLFontGL::sCurOrigin.mX = 0; +	LLFontGL::sCurOrigin.mY = 0; +	LLFontGL::sCurDepth = 0.f; +} + +//static +void LLRender2D::setScaleFactor(const LLVector2 &scale_factor) +{ +	sGLScaleFactor = scale_factor; +} + +//static +void LLRender2D::setLineWidth(F32 width) +{ +	gGL.flush(); +	glLineWidth(width * lerp(sGLScaleFactor.mV[VX], sGLScaleFactor.mV[VY], 0.5f)); +} + +//static +LLPointer<LLUIImage> LLRender2D::getUIImageByID(const LLUUID& image_id, S32 priority) +{ +	if (sImageProvider) +	{ +		return sImageProvider->getUIImageByID(image_id, priority); +	} +	else +	{ +		return NULL; +	} +} + +//static  +LLPointer<LLUIImage> LLRender2D::getUIImage(const std::string& name, S32 priority) +{ +	if (!name.empty() && sImageProvider) +		return sImageProvider->getUIImage(name, priority); +	else +		return NULL; +} + diff --git a/indra/llrender/llrender2dutils.h b/indra/llrender/llrender2dutils.h new file mode 100644 index 0000000000..4884422c58 --- /dev/null +++ b/indra/llrender/llrender2dutils.h @@ -0,0 +1,163 @@ +/**  + * @file llrender2dutils.h + * @brief GL function declarations for immediate-mode gl drawing. + * + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +// All immediate-mode gl drawing should happen here. + + +#ifndef LL_RENDER2DUTILS_H +#define LL_RENDER2DUTILS_H + +#include "llpointer.h"		// LLPointer<> +#include "llrect.h" +#include "llglslshader.h" + +class LLColor4;  +class LLVector3; +class LLVector2; +class LLUIImage; +class LLUUID; + +extern const LLColor4 UI_VERTEX_COLOR; + +BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom); +void gl_state_for_2d(S32 width, S32 height); + +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2); +void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ); +void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled); +void gl_rect_2d_simple( S32 width, S32 height ); + +void gl_draw_x(const LLRect& rect, const LLColor4& color); + +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled = TRUE ); +void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled = TRUE ); +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset = 0, BOOL filled = TRUE ); +void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset = 0, BOOL filled = TRUE ); +void gl_rect_2d(const LLRect& rect, BOOL filled = TRUE ); +void gl_rect_2d(const LLRect& rect, const LLColor4& color, BOOL filled = TRUE ); +void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha = 1.0f); + +void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines); + +void gl_circle_2d(F32 x, F32 y, F32 radius, S32 steps, BOOL filled); +void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle); +void gl_deep_circle( F32 radius, F32 depth ); +void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ); +void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac); +void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); +void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); + +void gl_draw_image(S32 x, S32 y, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees,LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); +void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); + +void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase = 0.f );  + +void gl_rect_2d_simple_tex( S32 width, S32 height ); + +// segmented rectangles + +/* +   TL |______TOP_________| TR  +     /|                  |\   +   _/_|__________________|_\_ +   L| |    MIDDLE        | |R +   _|_|__________________|_|_ +    \ |    BOTTOM        | /   +   BL\|__________________|/ BR +      |                  |     +*/ + +typedef enum e_rounded_edge +{ +	ROUNDED_RECT_LEFT	= 0x1,  +	ROUNDED_RECT_TOP	= 0x2,  +	ROUNDED_RECT_RIGHT	= 0x4,  +	ROUNDED_RECT_BOTTOM	= 0x8, +	ROUNDED_RECT_ALL	= 0xf +}ERoundedEdge; + + +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 LLRectf& clip_rect, const LLRectf& center_uv_rect, const LLRectf& center_draw_rect, const LLVector3& width_vec, const LLVector3& height_vec); + +inline void gl_rect_2d( const LLRect& rect, BOOL filled ) +{ +	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); +} + +inline void gl_rect_2d_offset_local( const LLRect& rect, S32 pixel_offset, BOOL filled) +{ +	gl_rect_2d_offset_local( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, pixel_offset, filled ); +} + +class LLImageProviderInterface; + +class LLRender2D +{ +	LOG_CLASS(LLRender2D); +public: +	static void initClass(LLImageProviderInterface* image_provider, +						  const LLVector2* scale_factor); +	static void cleanupClass(); + +	static void pushMatrix(); +	static void popMatrix(); +	static void loadIdentity(); +	static void translate(F32 x, F32 y, F32 z = 0.0f); + +	static void setLineWidth(F32 width); +	static void setScaleFactor(const LLVector2& scale_factor); + +	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0); +	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0); + +	static LLVector2		sGLScaleFactor; +private: +	static LLImageProviderInterface* sImageProvider; +}; + +class LLImageProviderInterface +{ +protected: +	LLImageProviderInterface() {}; +	virtual ~LLImageProviderInterface() {}; +public: +	virtual LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority) = 0; +	virtual LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority) = 0; +	virtual void cleanUp() = 0; +}; + + +extern LLGLSLShader gSolidColorProgram; +extern LLGLSLShader gUIProgram; + +#endif // LL_RENDER2DUTILS_H + diff --git a/indra/llui/lluiimage.cpp b/indra/llrender/lluiimage.cpp index 9ed98f941f..b954b66350 100644 --- a/indra/llui/lluiimage.cpp +++ b/indra/llrender/lluiimage.cpp @@ -31,7 +31,7 @@  // Project includes  #include "lluiimage.h" -#include "llui.h" +#include "llrender2dutils.h"  LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image)  :	mName(name), @@ -130,10 +130,10 @@ void LLUIImage::draw3D(const LLVector3& origin_agent, const LLVector3& x_axis, c  		 }  	} -	LLUI::pushMatrix(); +	LLRender2D::pushMatrix();  	{   		LLVector3 rect_origin = origin_agent + (rect.mLeft * x_axis) + (rect.mBottom * y_axis);  -		LLUI::translate(rect_origin.mV[VX], +		LLRender2D::translate(rect_origin.mV[VX],  						rect_origin.mV[VY],   						rect_origin.mV[VZ]);  		gGL.getTexUnit(0)->bind(getImage()); @@ -152,7 +152,7 @@ void LLUIImage::draw3D(const LLVector3& origin_agent, const LLVector3& x_axis, c  								rect.getWidth() * x_axis,   								rect.getHeight() * y_axis); -	} LLUI::popMatrix(); +	} LLRender2D::popMatrix();  } @@ -209,7 +209,7 @@ namespace LLInitParam  			return;  		} -		LLUIImage* imagep =  LLUI::getUIImage(name()); +		LLUIImage* imagep =  LLRender2D::getUIImage(name());  		if (imagep)  		{  			updateValue(imagep); diff --git a/indra/llui/lluiimage.h b/indra/llrender/lluiimage.h index 7817ba1c7b..7817ba1c7b 100644 --- a/indra/llui/lluiimage.h +++ b/indra/llrender/lluiimage.h diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 01c42e07a2..34a08603fa 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -117,7 +117,6 @@ set(llui_SOURCE_FILES      lluicolortable.cpp      lluictrl.cpp      lluictrlfactory.cpp -	lluiimage.cpp      lluistring.cpp      llundo.cpp      llurlaction.cpp @@ -231,7 +230,6 @@ set(llui_HEADER_FILES      lluifwd.h      llui.h      lluicolor.h -	lluiimage.h      lluistring.h      llundo.h      llurlaction.h diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 41e5d74042..d4e14d9419 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -551,7 +551,7 @@ void LLComboBox::showList()  	LLCoordWindow window_size;  	getWindow()->getSize(&window_size);  	//HACK: shouldn't have to know about scale here -	mList->fitContents( 192, llfloor((F32)window_size.mY / LLUI::sGLScaleFactor.mV[VY]) - 50 ); +	mList->fitContents( 192, llfloor((F32)window_size.mY / LLUI::getScaleFactor().mV[VY]) - 50 );  	// Make sure that we can see the whole list  	LLRect root_view_local; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 2e64be89fa..f8b84e39b5 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2015,8 +2015,8 @@ void LLLineEditor::draw()  				LLRect screen_pos = calcScreenRect();  				LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - lineeditor_v_pad ); -				ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); -				ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); +				ime_pos.mX = (S32) (ime_pos.mX * LLUI::getScaleFactor().mV[VX]); +				ime_pos.mY = (S32) (ime_pos.mY * LLUI::getScaleFactor().mV[VY]);  				getWindow()->setLanguageTextInput( ime_pos );  			}  		} @@ -2563,7 +2563,7 @@ void LLLineEditor::markAsPreedit(S32 position, S32 length)  S32 LLLineEditor::getPreeditFontSize() const  { -	return llround(mGLFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]); +	return llround(mGLFont->getLineHeight() * LLUI::getScaleFactor().mV[VY]);  }  void LLLineEditor::setReplaceNewlinesWithSpaces(BOOL replace) diff --git a/indra/llui/lllocalcliprect.cpp b/indra/llui/lllocalcliprect.cpp index 31ceb0766a..0620e0f52d 100644 --- a/indra/llui/lllocalcliprect.cpp +++ b/indra/llui/lllocalcliprect.cpp @@ -88,10 +88,10 @@ void LLScreenClipRect::updateScissorRegion()  	LLRect rect = sClipRectStack.top();  	stop_glerror();  	S32 x,y,w,h; -	x = llfloor(rect.mLeft * LLUI::sGLScaleFactor.mV[VX]); -	y = llfloor(rect.mBottom * LLUI::sGLScaleFactor.mV[VY]); -	w = llmax(0, llceil(rect.getWidth() * LLUI::sGLScaleFactor.mV[VX])) + 1; -	h = llmax(0, llceil(rect.getHeight() * LLUI::sGLScaleFactor.mV[VY])) + 1; +	x = llfloor(rect.mLeft * LLUI::getScaleFactor().mV[VX]); +	y = llfloor(rect.mBottom * LLUI::getScaleFactor().mV[VY]); +	w = llmax(0, llceil(rect.getWidth() * LLUI::getScaleFactor().mV[VX])) + 1; +	h = llmax(0, llceil(rect.getHeight() * LLUI::getScaleFactor().mV[VY])) + 1;  	glScissor( x,y,w,h );  	stop_glerror();  } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 7cee9f5b46..e22b806a74 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -521,8 +521,8 @@ void LLTextBase::drawCursor()  			LLRect screen_pos = calcScreenRect();  			LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_rect.mLeft), screen_pos.mBottom + llfloor(cursor_rect.mTop) ); -			ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); -			ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); +			ime_pos.mX = (S32) (ime_pos.mX * LLUI::getScaleFactor().mV[VX]); +			ime_pos.mY = (S32) (ime_pos.mY * LLUI::getScaleFactor().mV[VY]);  			getWindow()->setLanguageTextInput( ime_pos );  		}  	} diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index d5e08fa29b..3dc1b99edb 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -2911,7 +2911,7 @@ void LLTextEditor::markAsPreedit(S32 position, S32 length)  S32 LLTextEditor::getPreeditFontSize() const  { -	return llround((F32)mFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]); +	return llround((F32)mFont->getLineHeight() * LLUI::getScaleFactor().mV[VY]);  }  BOOL LLTextEditor::isDirty() const diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 2a774d54a3..0ddb149738 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -39,6 +39,7 @@  #include "llrect.h"  #include "lldir.h"  #include "llgl.h" +#include "llsd.h"  // Project includes  #include "llcommandmanager.h" @@ -69,16 +70,13 @@  //  // Globals  // -const LLColor4 UI_VERTEX_COLOR(1.f, 1.f, 1.f, 1.f);  // Language for UI construction  std::map<std::string, std::string> gTranslation;  std::list<std::string> gUntranslated;  /*static*/ LLUI::settings_map_t LLUI::sSettingGroups; -/*static*/ LLImageProviderInterface* LLUI::sImageProvider = NULL;  /*static*/ LLUIAudioCallback LLUI::sAudioCallback = NULL;  /*static*/ LLUIAudioCallback LLUI::sDeferredAudioCallback = NULL; -/*static*/ LLVector2		LLUI::sGLScaleFactor(1.f, 1.f);  /*static*/ LLWindow*		LLUI::sWindow = NULL;  /*static*/ LLView*			LLUI::sRootView = NULL;  /*static*/ BOOL                         LLUI::sDirty = FALSE; @@ -158,1474 +156,6 @@ void make_ui_sound_deferred(const char* namep)  	}  } -BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom) -{ -	if (x < left || right < x) return FALSE; -	if (y < bottom || top < y) return FALSE; -	return TRUE; -} - - -// Puts GL into 2D drawing mode by turning off lighting, setting to an -// orthographic projection, etc. -void gl_state_for_2d(S32 width, S32 height) -{ -	stop_glerror(); -	F32 window_width = (F32) width;//gViewerWindow->getWindowWidth(); -	F32 window_height = (F32) height;//gViewerWindow->getWindowHeight(); - -	gGL.matrixMode(LLRender::MM_PROJECTION); -	gGL.loadIdentity(); -	gGL.ortho(0.0f, llmax(window_width, 1.f), 0.0f, llmax(window_height,1.f), -1.0f, 1.0f); -	gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.loadIdentity(); -	stop_glerror(); -} - - -void gl_draw_x(const LLRect& rect, const LLColor4& color) -{ -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.color4fv( color.mV ); - -	gGL.begin( LLRender::LINES ); -		gGL.vertex2i( rect.mLeft,		rect.mTop ); -		gGL.vertex2i( rect.mRight,	rect.mBottom ); -		gGL.vertex2i( rect.mLeft,		rect.mBottom ); -		gGL.vertex2i( rect.mRight,	rect.mTop ); -	gGL.end(); -} - - -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset, BOOL filled) -{ -	gGL.color4fv(color.mV); -	gl_rect_2d_offset_local(left, top, right, bottom, pixel_offset, filled); -} - -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled) -{ -	gGL.pushUIMatrix(); -	left += LLFontGL::sCurOrigin.mX; -	right += LLFontGL::sCurOrigin.mX; -	bottom += LLFontGL::sCurOrigin.mY; -	top += LLFontGL::sCurOrigin.mY; - -	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.popUIMatrix(); -} - - -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled ) -{ -	stop_glerror(); -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	// Counterclockwise quad will face the viewer -	if( filled ) -	{  -		gGL.begin( LLRender::QUADS ); -			gGL.vertex2i(left, top); -			gGL.vertex2i(left, bottom); -			gGL.vertex2i(right, bottom); -			gGL.vertex2i(right, top); -		gGL.end(); -	} -	else -	{ -		if( gGLManager.mATIOffsetVerticalLines ) -		{ -			// Work around bug in ATI driver: vertical lines are offset by (-1,-1) -			gGL.begin( LLRender::LINES ); - -				// Verticals  -				gGL.vertex2i(left + 1, top); -				gGL.vertex2i(left + 1, bottom); - -				gGL.vertex2i(right, bottom); -				gGL.vertex2i(right, top); - -				// Horizontals -				top--; -				right--; -				gGL.vertex2i(left, bottom); -				gGL.vertex2i(right, bottom); - -				gGL.vertex2i(left, top); -				gGL.vertex2i(right, top); -			gGL.end(); -		} -		else -		{ -			top--; -			right--; -			gGL.begin( LLRender::LINE_STRIP ); -				gGL.vertex2i(left, top); -				gGL.vertex2i(left, bottom); -				gGL.vertex2i(right, bottom); -				gGL.vertex2i(right, top); -				gGL.vertex2i(left, top); -			gGL.end(); -		} -	} -	stop_glerror(); -} - -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled ) -{ -	gGL.color4fv( color.mV ); -	gl_rect_2d( left, top, right, bottom, filled ); -} - - -void gl_rect_2d( const LLRect& rect, const LLColor4& color, BOOL filled ) -{ -	gGL.color4fv( color.mV ); -	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); -} - -// Given a rectangle on the screen, draws a drop shadow _outside_ -// the right and bottom edges of it.  Along the right it has width "lines" -// and along the bottom it has height "lines". -void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines) -{ -	stop_glerror(); -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	 -	// HACK: Overlap with the rectangle by a single pixel. -	right--; -	bottom++; -	lines++; - -	LLColor4 end_color = start_color; -	end_color.mV[VALPHA] = 0.f; - -	gGL.begin(LLRender::QUADS); - -	// Right edge, CCW faces screen -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(right,		top-lines); -	gGL.vertex2i(right,		bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(right+lines, bottom); -	gGL.vertex2i(right+lines, top-lines); - -	// Bottom edge, CCW faces screen -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(right,		bottom); -	gGL.vertex2i(left+lines,	bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(left+lines,	bottom-lines); -	gGL.vertex2i(right,		bottom-lines); - -	// bottom left Corner -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(left+lines,	bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(left,		bottom); -	// make the bottom left corner not sharp -	gGL.vertex2i(left+1,		bottom-lines+1); -	gGL.vertex2i(left+lines,	bottom-lines); - -	// bottom right corner -	gGL.color4fv(start_color.mV); -	gGL.vertex2i(right,		bottom); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i(right,		bottom-lines); -	// make the rightmost corner not sharp -	gGL.vertex2i(right+lines-1,	bottom-lines+1); -	gGL.vertex2i(right+lines,	bottom); - -	// top right corner -	gGL.color4fv(start_color.mV); -	gGL.vertex2i( right,			top-lines ); -	gGL.color4fv(end_color.mV); -	gGL.vertex2i( right+lines,	top-lines ); -	// make the corner not sharp -	gGL.vertex2i( right+lines-1,	top-1 ); -	gGL.vertex2i( right,			top ); - -	gGL.end(); -	stop_glerror(); -} - -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2 ) -{ -	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) -	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) -	{ -		x1++; -		x2++; -		y1++; -		y2++; -	} - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	 -	gGL.begin(LLRender::LINES); -		gGL.vertex2i(x1, y1); -		gGL.vertex2i(x2, y2); -	gGL.end(); -} - -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ) -{ -	// Work around bug in ATI driver: vertical lines are offset by (-1,-1) -	if( (x1 == x2) && gGLManager.mATIOffsetVerticalLines ) -	{ -		x1++; -		x2++; -		y1++; -		y2++; -	} - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.color4fv( color.mV ); - -	gGL.begin(LLRender::LINES); -		gGL.vertex2i(x1, y1); -		gGL.vertex2i(x2, y2); -	gGL.end(); -} - -void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled) -{ -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.color4fv(color.mV); - -	if (filled) -	{ -		gGL.begin(LLRender::TRIANGLES); -	} -	else -	{ -		gGL.begin(LLRender::LINE_LOOP); -	} -	gGL.vertex2i(x1, y1); -	gGL.vertex2i(x2, y2); -	gGL.vertex2i(x3, y3); -	gGL.end(); -} - -void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac) -{ -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	length = llmin((S32)(max_frac*(right - left)), length); -	length = llmin((S32)(max_frac*(top - bottom)), length); -	gGL.begin(LLRender::LINES); -	gGL.vertex2i(left, top); -	gGL.vertex2i(left + length, top); -	 -	gGL.vertex2i(left, top); -	gGL.vertex2i(left, top - length); - -	gGL.vertex2i(left, bottom); -	gGL.vertex2i(left + length, bottom); -	 -	gGL.vertex2i(left, bottom); -	gGL.vertex2i(left, bottom + length); - -	gGL.vertex2i(right, top); -	gGL.vertex2i(right - length, top); - -	gGL.vertex2i(right, top); -	gGL.vertex2i(right, top - length); - -	gGL.vertex2i(right, bottom); -	gGL.vertex2i(right - length, bottom); - -	gGL.vertex2i(right, bottom); -	gGL.vertex2i(right, bottom + length); -	gGL.end(); -} - - -void gl_draw_image( S32 x, S32 y, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect ) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} -	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color, uv_rect ); -} - -void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} -	gl_draw_scaled_rotated_image( x, y, width, height, 0.f, image, color, uv_rect ); -} - -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_rect) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} - -	// scale screen size of borders down -	F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(0); -	F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0); - -	LLRectf scale_rect(border_width_fraction, 1.f - border_height_fraction, 1.f - border_width_fraction, border_height_fraction); -	gl_draw_scaled_image_with_border(x, y, width, height, image, color, solid_color, uv_rect, scale_rect); -} - -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color, BOOL solid_color, const LLRectf& uv_outer_rect, const LLRectf& center_rect) -{ -	stop_glerror(); - -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} - -	// add in offset of current image to current UI translation -	const LLVector3 ui_scale = gGL.getUIScale(); -	const LLVector3 ui_translation = (gGL.getUITranslation() + LLVector3(x, y, 0.f)).scaledVec(ui_scale); - -	F32 uv_width = uv_outer_rect.getWidth(); -	F32 uv_height = uv_outer_rect.getHeight(); - -	// shrink scaling region to be proportional to clipped image region -	LLRectf uv_center_rect( -		uv_outer_rect.mLeft + (center_rect.mLeft * uv_width), -		uv_outer_rect.mBottom + (center_rect.mTop * uv_height), -		uv_outer_rect.mLeft + (center_rect.mRight * uv_width), -		uv_outer_rect.mBottom + (center_rect.mBottom * uv_height)); - -	F32 image_width = image->getWidth(0); -	F32 image_height = image->getHeight(0); - -	S32 image_natural_width = llround(image_width * uv_width); -	S32 image_natural_height = llround(image_height * uv_height); - -	LLRectf draw_center_rect(	uv_center_rect.mLeft * image_width, -								uv_center_rect.mTop * image_height, -								uv_center_rect.mRight * image_width, -								uv_center_rect.mBottom * image_height); - -	{	// scale fixed region of image to drawn region -		draw_center_rect.mRight += width - image_natural_width; -		draw_center_rect.mTop += height - image_natural_height; - -		F32 border_shrink_width = llmax(0.f, draw_center_rect.mLeft - draw_center_rect.mRight); -		F32 border_shrink_height = llmax(0.f, draw_center_rect.mBottom - draw_center_rect.mTop); - -		F32 shrink_width_ratio = center_rect.getWidth() == 1.f ? 0.f : border_shrink_width / ((F32)image_natural_width * (1.f - center_rect.getWidth())); -		F32 shrink_height_ratio = center_rect.getHeight() == 1.f ? 0.f : border_shrink_height / ((F32)image_natural_height * (1.f - center_rect.getHeight())); - -		F32 shrink_scale = 1.f - llmax(shrink_width_ratio, shrink_height_ratio); - -		draw_center_rect.mLeft = llround(ui_translation.mV[VX] + (F32)draw_center_rect.mLeft * shrink_scale * ui_scale.mV[VX]); -		draw_center_rect.mTop = llround(ui_translation.mV[VY] + lerp((F32)height, (F32)draw_center_rect.mTop, shrink_scale) * ui_scale.mV[VY]); -		draw_center_rect.mRight = llround(ui_translation.mV[VX] + lerp((F32)width, (F32)draw_center_rect.mRight, shrink_scale) * ui_scale.mV[VX]); -		draw_center_rect.mBottom = llround(ui_translation.mV[VY] + (F32)draw_center_rect.mBottom * shrink_scale * ui_scale.mV[VY]); -	} - -	LLRectf draw_outer_rect(ui_translation.mV[VX],  -							ui_translation.mV[VY] + height * ui_scale.mV[VY],  -							ui_translation.mV[VX] + width * ui_scale.mV[VX],  -							ui_translation.mV[VY]); - -	LLGLSUIDefault gls_ui; -	 -	if (solid_color) -	{ -		if (LLGLSLShader::sNoFixedFunction) -		{ -			gSolidColorProgram.bind(); -		} -		else -		{ -			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); -			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); -		} -	} - -	gGL.getTexUnit(0)->bind(image, true); - -	gGL.color4fv(color.mV); -	 -	const S32 NUM_VERTICES = 9 * 4; // 9 quads -	LLVector2 uv[NUM_VERTICES]; -	LLVector3 pos[NUM_VERTICES]; - -	S32 index = 0; - -	gGL.begin(LLRender::QUADS); -	{ -		// draw bottom left -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		// draw bottom middle -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		// draw bottom right -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		// draw left  -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		// draw middle -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		// draw right  -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		// draw top left -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f); -		index++; - -		// draw top middle -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); -		index++; - -		// draw top right -		uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f); -		index++; - -		uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); -		pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); -		index++; - -		gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); -	} -	gGL.end(); - -	if (solid_color) -	{ -		if (LLGLSLShader::sNoFixedFunction) -		{ -			gUIProgram.bind(); -		} -		else -		{ -			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); -		} -	} -} - -void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) -{ -	gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color, uv_rect ); -} - -void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLTexture* image, const LLColor4& color, const LLRectf& uv_rect) -{ -	if (NULL == image) -	{ -		llwarns << "image == NULL; aborting function" << llendl; -		return; -	} - -	LLGLSUIDefault gls_ui; - - -	gGL.getTexUnit(0)->bind(image, true); - -	gGL.color4fv(color.mV); - -	if (degrees == 0.f) -	{ -		const S32 NUM_VERTICES = 4; // 9 quads -		LLVector2 uv[NUM_VERTICES]; -		LLVector3 pos[NUM_VERTICES]; - -		gGL.begin(LLRender::QUADS); -		{ -			LLVector3 ui_scale = gGL.getUIScale(); -			LLVector3 ui_translation = gGL.getUITranslation(); -			ui_translation.mV[VX] += x; -			ui_translation.mV[VY] += y; -			ui_translation.scaleVec(ui_scale); -			S32 index = 0; -			S32 scaled_width = llround(width * ui_scale.mV[VX]); -			S32 scaled_height = llround(height * ui_scale.mV[VY]); - -			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); -			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f); -			index++; - -			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop); -			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f); -			index++; - -			uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); -			pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY], 0.f); -			index++; - -			uv[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom); -			pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f); -			index++; - -			gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); -		} -		gGL.end(); -	} -	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, true); - -		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.vertex2f(v.mV[0], v.mV[1] ); - -			v = LLVector3(-offset_x, offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); -			gGL.vertex2f(v.mV[0], v.mV[1] ); - -			v = LLVector3(-offset_x, -offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); -			gGL.vertex2f(v.mV[0], v.mV[1] ); - -			v = LLVector3(offset_x, -offset_y, 0.f) * quat; -			gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); -			gGL.vertex2f(v.mV[0], v.mV[1] ); -		} -		gGL.end(); -		gGL.popUIMatrix(); -	} -} - - -void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase ) -{ -	phase = fmod(phase, 1.f); - -	S32 shift = S32(phase * 4.f) % 4; - -	// Stippled line -	LLGLEnable stipple(GL_LINE_STIPPLE); -	 -	gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], color.mV[VALPHA]); - -	gGL.flush(); -	glLineWidth(2.5f); - -	if (!LLGLSLShader::sNoFixedFunction) -	{ -		glLineStipple(2, 0x3333 << shift); -	} - -	gGL.begin(LLRender::LINES); -	{ -		gGL.vertex3fv( start.mV ); -		gGL.vertex3fv( end.mV ); -	} -	gGL.end(); - -	LLUI::setLineWidth(1.f); -} - -void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle) -{ -	if (end_angle < start_angle) -	{ -		end_angle += F_TWO_PI; -	} - -	gGL.pushUIMatrix(); -	{ -		gGL.translateUI(center_x, center_y, 0.f); - -		// Inexact, but reasonably fast. -		F32 delta = (end_angle - start_angle) / steps; -		F32 sin_delta = sin( delta ); -		F32 cos_delta = cos( delta ); -		F32 x = cosf(start_angle) * radius; -		F32 y = sinf(start_angle) * radius; - -		if (filled) -		{ -			gGL.begin(LLRender::TRIANGLE_FAN); -			gGL.vertex2f(0.f, 0.f); -			// make sure circle is complete -			steps += 1; -		} -		else -		{ -			gGL.begin(LLRender::LINE_STRIP); -		} - -		while( steps-- ) -		{ -			// Successive rotations -			gGL.vertex2f( x, y ); -			F32 x_new = x * cos_delta - y * sin_delta; -			y = x * sin_delta +  y * cos_delta; -			x = x_new; -		} -		gGL.end(); -	} -	gGL.popUIMatrix(); -} - -void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled) -{ -	gGL.pushUIMatrix(); -	{ -		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		gGL.translateUI(center_x, center_y, 0.f); - -		// Inexact, but reasonably fast. -		F32 delta = F_TWO_PI / steps; -		F32 sin_delta = sin( delta ); -		F32 cos_delta = cos( delta ); -		F32 x = radius; -		F32 y = 0.f; - -		if (filled) -		{ -			gGL.begin(LLRender::TRIANGLE_FAN); -			gGL.vertex2f(0.f, 0.f); -			// make sure circle is complete -			steps += 1; -		} -		else -		{ -			gGL.begin(LLRender::LINE_LOOP); -		} - -		while( steps-- ) -		{ -			// Successive rotations -			gGL.vertex2f( x, y ); -			F32 x_new = x * cos_delta - y * sin_delta; -			y = x * sin_delta +  y * cos_delta; -			x = x_new; -		} -		gGL.end(); -	} -	gGL.popUIMatrix(); -} - -// Renders a ring with sides (tube shape) -void gl_deep_circle( F32 radius, F32 depth, S32 steps ) -{ -	F32 x = radius; -	F32 y = 0.f; -	F32 angle_delta = F_TWO_PI / (F32)steps; -	gGL.begin( LLRender::TRIANGLE_STRIP  ); -	{ -		S32 step = steps + 1; // An extra step to close the circle. -		while( step-- ) -		{ -			gGL.vertex3f( x, y, depth ); -			gGL.vertex3f( x, y, 0.f ); - -			F32 x_new = x * cosf(angle_delta) - y * sinf(angle_delta); -			y = x * sinf(angle_delta) +  y * cosf(angle_delta); -			x = x_new; -		} -	} -	gGL.end(); -} - -void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ) -{ -	gGL.pushUIMatrix(); -	{ -		gGL.translateUI(0.f, 0.f, -width / 2); -		if( render_center ) -		{ -			gGL.color4fv(center_color.mV); -			gGL.diffuseColor4fv(center_color.mV); -			gl_deep_circle( radius, width, steps ); -		} -		else -		{ -			gGL.diffuseColor4fv(side_color.mV); -			gl_washer_2d(radius, radius - width, steps, side_color, side_color); -			gGL.translateUI(0.f, 0.f, width); -			gl_washer_2d(radius - width, radius, steps, side_color, side_color); -		} -	} -	gGL.popUIMatrix(); -} - -// Draw gray and white checkerboard with black border -void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha) -{ -	if (!LLGLSLShader::sNoFixedFunction) -	{  -	// Initialize the first time this is called. -	const S32 PIXELS = 32; -	static GLubyte checkerboard[PIXELS * PIXELS]; -	static BOOL first = TRUE; -	if( first ) -	{ -		for( S32 i = 0; i < PIXELS; i++ ) -		{ -			for( S32 j = 0; j < PIXELS; j++ ) -			{ -				checkerboard[i * PIXELS + j] = ((i & 1) ^ (j & 1)) * 0xFF; -			} -		} -		first = FALSE; -	} -	 -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	// ...white squares -	gGL.color4f( 1.f, 1.f, 1.f, alpha ); -	gl_rect_2d(rect); - -	// ...gray squares -	gGL.color4f( .7f, .7f, .7f, alpha ); -	gGL.flush(); - -		glPolygonStipple( checkerboard ); - -		LLGLEnable polygon_stipple(GL_POLYGON_STIPPLE); -		gl_rect_2d(rect); -	} -	else -	{ //polygon stipple is deprecated, use "Checker" texture -		LLPointer<LLUIImage> img = LLUI::getUIImage("Checker"); -		gGL.getTexUnit(0)->bind(img->getImage()); -		gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); -		gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); - -		LLColor4 color(1.f, 1.f, 1.f, alpha); -		LLRectf uv_rect(0, 0, rect.getWidth()/32.f, rect.getHeight()/32.f); - -		gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(), -			img->getImage(), color, uv_rect); -	} -	 -	gGL.flush(); -} - - -// Draws the area between two concentric circles, like -// a doughnut or washer. -void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) -{ -	const F32 DELTA = F_TWO_PI / steps; -	const F32 SIN_DELTA = sin( DELTA ); -	const F32 COS_DELTA = cos( DELTA ); - -	F32 x1 = outer_radius; -	F32 y1 = 0.f; -	F32 x2 = inner_radius; -	F32 y2 = 0.f; - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -	gGL.begin( LLRender::TRIANGLE_STRIP  ); -	{ -		steps += 1; // An extra step to close the circle. -		while( steps-- ) -		{ -			gGL.color4fv(outer_color.mV); -			gGL.vertex2f( x1, y1 ); -			gGL.color4fv(inner_color.mV); -			gGL.vertex2f( x2, y2 ); - -			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; -			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; -			x1 = x1_new; - -			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; -			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; -			x2 = x2_new; -		} -	} -	gGL.end(); -} - -// Draws the area between two concentric circles, like -// a doughnut or washer. -void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color) -{ -	const F32 DELTA = (end_radians - start_radians) / steps; -	const F32 SIN_DELTA = sin( DELTA ); -	const F32 COS_DELTA = cos( DELTA ); - -	F32 x1 = outer_radius * cos( start_radians ); -	F32 y1 = outer_radius * sin( start_radians ); -	F32 x2 = inner_radius * cos( start_radians ); -	F32 y2 = inner_radius * sin( start_radians ); - -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.begin( LLRender::TRIANGLE_STRIP  ); -	{ -		steps += 1; // An extra step to close the circle. -		while( steps-- ) -		{ -			gGL.color4fv(outer_color.mV); -			gGL.vertex2f( x1, y1 ); -			gGL.color4fv(inner_color.mV); -			gGL.vertex2f( x2, y2 ); - -			F32 x1_new = x1 * COS_DELTA - y1 * SIN_DELTA; -			y1 = x1 * SIN_DELTA +  y1 * COS_DELTA; -			x1 = x1_new; - -			F32 x2_new = x2 * COS_DELTA - y2 * SIN_DELTA; -			y2 = x2 * SIN_DELTA +  y2 * COS_DELTA; -			x2 = x2_new; -		} -	} -	gGL.end(); -} - -void gl_rect_2d_simple_tex( S32 width, S32 height ) -{ -	gGL.begin( LLRender::QUADS ); - -		gGL.texCoord2f(1.f, 1.f); -		gGL.vertex2i(width, height); - -		gGL.texCoord2f(0.f, 1.f); -		gGL.vertex2i(0, height); - -		gGL.texCoord2f(0.f, 0.f); -		gGL.vertex2i(0, 0); - -		gGL.texCoord2f(1.f, 0.f); -		gGL.vertex2i(width, 0); -	 -	gGL.end(); -} - -void gl_rect_2d_simple( S32 width, S32 height ) -{ -	gGL.begin( LLRender::QUADS ); -		gGL.vertex2i(width, height); -		gGL.vertex2i(0, height); -		gGL.vertex2i(0, 0); -		gGL.vertex2i(width, 0); -	gGL.end(); -} - -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) -{ -	S32 width = llabs(right - left); -	S32 height = llabs(top - bottom); - -	gGL.pushUIMatrix(); - -	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) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; -	} -	if (border_uv_scale.mV[VY] > 0.5f) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; -	} - -	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); -	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 width_vec((F32)width, 0.f); -	LLVector2 height_vec(0.f, (F32)height); - -	gGL.begin(LLRender::QUADS); -	{ -		// draw bottom left -		gGL.texCoord2f(0.f, 0.f); -		gGL.vertex2f(0.f, 0.f); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv(border_width_left.mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv(border_height_bottom.mV); - -		// draw bottom middle -		gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv(border_width_left.mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv((width_vec - border_width_right).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		// draw bottom right -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); -		gGL.vertex2fv((width_vec - border_width_right).mV); - -		gGL.texCoord2f(1.f, 0.f); -		gGL.vertex2fv(width_vec.mV); - -		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + border_height_bottom).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		// draw left  -		gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv(border_height_bottom.mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((height_vec - border_height_top).mV); - -		// draw middle -		gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + border_height_bottom).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		// draw right  -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); - -		gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + border_height_bottom).mV); - -		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		// draw top left -		gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((height_vec - border_height_top).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((border_width_left + height_vec).mV); - -		gGL.texCoord2f(0.f, 1.f); -		gGL.vertex2fv((height_vec).mV); - -		// draw top middle -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); - -		gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((border_width_left + height_vec).mV); - -		// draw top right -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); -		gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); - -		gGL.texCoord2f(1.f, 1.f); -		gGL.vertex2fv((width_vec + height_vec).mV); - -		gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); -		gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); -	} -	gGL.end(); - -	gGL.popUIMatrix(); -} - -//FIXME: rewrite to use scissor? -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) -{ -	S32 width = llabs(right - left); -	S32 height = llabs(top - bottom); - -	gGL.pushUIMatrix(); - -	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) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VX]; -	} -	if (border_uv_scale.mV[VY] > 0.5f) -	{ -		border_uv_scale *= 0.5f / border_uv_scale.mV[VY]; -	} - -	F32 border_scale = llmin((F32)border_size, (F32)width * 0.5f, (F32)height * 0.5f); -	LLVector2 border_width_left = ((edges & (~(U32)ROUNDED_RECT_RIGHT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_width_right = ((edges & (~(U32)ROUNDED_RECT_LEFT)) != 0) ? LLVector2(border_scale, 0.f) : LLVector2::zero; -	LLVector2 border_height_bottom = ((edges & (~(U32)ROUNDED_RECT_TOP)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 border_height_top = ((edges & (~(U32)ROUNDED_RECT_BOTTOM)) != 0) ? LLVector2(0.f, border_scale) : LLVector2::zero; -	LLVector2 width_vec((F32)width, 0.f); -	LLVector2 height_vec(0.f, (F32)height); - -	F32 middle_start = border_scale / (F32)width; -	F32 middle_end = 1.f - middle_start; - -	F32 u_min; -	F32 u_max; -	LLVector2 x_min; -	LLVector2 x_max; - -	gGL.begin(LLRender::QUADS); -	{ -		if (start_fragment < middle_start) -		{ -			u_min = (start_fragment / middle_start) * border_uv_scale.mV[VX]; -			u_max = llmin(end_fragment / middle_start, 1.f) * border_uv_scale.mV[VX]; -			x_min = (start_fragment / middle_start) * border_width_left; -			x_max = llmin(end_fragment / middle_start, 1.f) * border_width_left; - -			// draw bottom left -			gGL.texCoord2f(u_min, 0.f); -			gGL.vertex2fv(x_min.mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -			gGL.vertex2fv(x_max.mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			// draw left  -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); -			 -			// draw top left -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f); -			gGL.vertex2fv((x_max + height_vec).mV); - -			gGL.texCoord2f(u_min, 1.f); -			gGL.vertex2fv((x_min + height_vec).mV); -		} - -		if (end_fragment > middle_start || start_fragment < middle_end) -		{ -			x_min = border_width_left + ((llclamp(start_fragment, middle_start, middle_end) - middle_start)) * width_vec; -			x_max = border_width_left + ((llclamp(end_fragment, middle_start, middle_end) - middle_start)) * width_vec; - -			// draw bottom middle -			gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); -			gGL.vertex2fv(x_min.mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); -			gGL.vertex2fv((x_max).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			// draw middle -			gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			// draw top middle -			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); -			gGL.vertex2fv((x_max + height_vec).mV); - -			gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); -			gGL.vertex2fv((x_min + height_vec).mV); -		} - -		if (end_fragment > middle_end) -		{ -			u_min = (1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_uv_scale.mV[VX]; -			u_max = (1.f - ((end_fragment - middle_end) / middle_start)) * border_uv_scale.mV[VX]; -			x_min = width_vec - ((1.f - llmax(0.f, ((start_fragment - middle_end) / middle_start))) * border_width_right); -			x_max = width_vec - ((1.f - ((end_fragment - middle_end) / middle_start)) * border_width_right); - -			// draw bottom right -			gGL.texCoord2f(u_min, 0.f); -			gGL.vertex2fv((x_min).mV); - -			gGL.texCoord2f(u_max, 0.f); -			gGL.vertex2fv(x_max.mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			// draw right  -			gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + border_height_bottom).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			// draw top right -			gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_min + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); -			gGL.vertex2fv((x_max + height_vec - border_height_top).mV); - -			gGL.texCoord2f(u_max, 1.f); -			gGL.vertex2fv((x_max + height_vec).mV); - -			gGL.texCoord2f(u_min, 1.f); -			gGL.vertex2fv((x_min + height_vec).mV); -		} -	} -	gGL.end(); - -	gGL.popUIMatrix(); -} - -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) -{ -	gGL.begin(LLRender::QUADS); -	{ -		// draw bottom left -		gGL.texCoord2f(clip_rect.mLeft, clip_rect.mBottom); -		gGL.vertex3f(0.f, 0.f, 0.f); - -		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); -		gGL.vertex3fv((center_draw_rect.mLeft * width_vec).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(clip_rect.mLeft, center_uv_rect.mBottom); -		gGL.vertex3fv((center_draw_rect.mBottom * height_vec).mV); - -		// draw bottom middle -		gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); -		gGL.vertex3fv((center_draw_rect.mLeft * width_vec).mV); - -		gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mBottom); -		gGL.vertex3fv((center_draw_rect.mRight * width_vec).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(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(center_uv_rect.mRight, clip_rect.mBottom); -		gGL.vertex3fv((center_draw_rect.mRight * width_vec).mV); - -		gGL.texCoord2f(clip_rect.mRight, clip_rect.mBottom); -		gGL.vertex3fv(width_vec.mV); - -		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mBottom); -		gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).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(clip_rect.mLeft, center_uv_rect.mBottom); -		gGL.vertex3fv((center_draw_rect.mBottom * height_vec).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(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(clip_rect.mLeft, center_uv_rect.mTop); -		gGL.vertex3fv((center_draw_rect.mTop * height_vec).mV); - -		// draw middle -		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(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(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(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(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(clip_rect.mRight, center_uv_rect.mBottom); -		gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).mV); - -		gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mTop); -		gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).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(clip_rect.mLeft, center_uv_rect.mTop); -		gGL.vertex3fv((center_draw_rect.mTop * height_vec).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(center_uv_rect.mLeft, clip_rect.mTop); -		gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV); - -		gGL.texCoord2f(clip_rect.mLeft, clip_rect.mTop); -		gGL.vertex3fv((height_vec).mV); - -		// draw top middle -		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(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(center_uv_rect.mRight, clip_rect.mTop); -		gGL.vertex3fv((center_draw_rect.mRight * width_vec + 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(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(clip_rect.mRight, center_uv_rect.mTop); -		gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).mV); - -		gGL.texCoord2f(clip_rect.mRight, clip_rect.mTop); -		gGL.vertex3fv((width_vec + 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 LLUI::initClass(const settings_map_t& settings,  					 LLImageProviderInterface* image_provider,  					 LLUIAudioCallback audio_callback, @@ -1633,6 +163,7 @@ void LLUI::initClass(const settings_map_t& settings,  					 const LLVector2* scale_factor,  					 const std::string& language)  { +	LLRender2D::initClass(image_provider,scale_factor);  	sSettingGroups = settings;  	if ((get_ptr_in_map(sSettingGroups, std::string("config")) == NULL) || @@ -1642,10 +173,8 @@ void LLUI::initClass(const settings_map_t& settings,  		llerrs << "Failure to initialize configuration groups" << llendl;  	} -	sImageProvider = image_provider;  	sAudioCallback = audio_callback;  	sDeferredAudioCallback = deferred_audio_callback; -	sGLScaleFactor = (scale_factor == NULL) ? LLVector2(1.f, 1.f) : *scale_factor;  	sWindow = NULL; // set later in startup  	LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow"); @@ -1679,10 +208,7 @@ void LLUI::initClass(const settings_map_t& settings,  void LLUI::cleanupClass()  { -	if(sImageProvider) -	{ -	sImageProvider->cleanUp(); -} +	LLRender2D::cleanupClass();  }  void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup,  const clear_popups_t& clear_popups) @@ -1706,60 +232,12 @@ void LLUI::dirtyRect(LLRect rect)  	}		  } - -//static -void LLUI::translate(F32 x, F32 y, F32 z) -{ -	gGL.translateUI(x,y,z); -	LLFontGL::sCurOrigin.mX += (S32) x; -	LLFontGL::sCurOrigin.mY += (S32) y; -	LLFontGL::sCurDepth += z; -} - -//static -void LLUI::pushMatrix() -{ -	gGL.pushUIMatrix(); -	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth)); -} - -//static -void LLUI::popMatrix() -{ -	gGL.popUIMatrix(); -	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first; -	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second; -	LLFontGL::sOriginStack.pop_back(); -} - -//static  -void LLUI::loadIdentity() -{ -	gGL.loadUIIdentity();  -	LLFontGL::sCurOrigin.mX = 0; -	LLFontGL::sCurOrigin.mY = 0; -	LLFontGL::sCurDepth = 0.f; -} - -//static -void LLUI::setScaleFactor(const LLVector2 &scale_factor) -{ -	sGLScaleFactor = scale_factor; -} - -//static -void LLUI::setLineWidth(F32 width) -{ -	gGL.flush(); -	glLineWidth(width * lerp(sGLScaleFactor.mV[VX], sGLScaleFactor.mV[VY], 0.5f)); -} -  //static   void LLUI::setMousePositionScreen(S32 x, S32 y)  {  	S32 screen_x, screen_y; -	screen_x = llround((F32)x * sGLScaleFactor.mV[VX]); -	screen_y = llround((F32)y * sGLScaleFactor.mV[VY]); +	screen_x = llround((F32)x * getScaleFactor().mV[VX]); +	screen_y = llround((F32)y * getScaleFactor().mV[VY]);  	LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());  } @@ -1770,8 +248,8 @@ void LLUI::getMousePositionScreen(S32 *x, S32 *y)  	LLCoordWindow cursor_pos_window;  	getWindow()->getCursorPosition(&cursor_pos_window);  	LLCoordGL cursor_pos_gl(cursor_pos_window.convert()); -	*x = llround((F32)cursor_pos_gl.mX / sGLScaleFactor.mV[VX]); -	*y = llround((F32)cursor_pos_gl.mY / sGLScaleFactor.mV[VX]); +	*x = llround((F32)cursor_pos_gl.mX / getScaleFactor().mV[VX]); +	*y = llround((F32)cursor_pos_gl.mY / getScaleFactor().mV[VX]);  }  //static  @@ -1885,21 +363,21 @@ LLVector2 LLUI::getWindowSize()  	LLCoordWindow window_rect;  	sWindow->getSize(&window_rect); -	return LLVector2(window_rect.mX / sGLScaleFactor.mV[VX], window_rect.mY / sGLScaleFactor.mV[VY]); +	return LLVector2(window_rect.mX / getScaleFactor().mV[VX], window_rect.mY / getScaleFactor().mV[VY]);  }  //static  void LLUI::screenPointToGL(S32 screen_x, S32 screen_y, S32 *gl_x, S32 *gl_y)  { -	*gl_x = llround((F32)screen_x * sGLScaleFactor.mV[VX]); -	*gl_y = llround((F32)screen_y * sGLScaleFactor.mV[VY]); +	*gl_x = llround((F32)screen_x * getScaleFactor().mV[VX]); +	*gl_y = llround((F32)screen_y * getScaleFactor().mV[VY]);  }  //static  void LLUI::glPointToScreen(S32 gl_x, S32 gl_y, S32 *screen_x, S32 *screen_y)  { -	*screen_x = llround((F32)gl_x / sGLScaleFactor.mV[VX]); -	*screen_y = llround((F32)gl_y / sGLScaleFactor.mV[VY]); +	*screen_x = llround((F32)gl_x / getScaleFactor().mV[VX]); +	*screen_y = llround((F32)gl_y / getScaleFactor().mV[VY]);  }  //static @@ -1916,27 +394,6 @@ void LLUI::glRectToScreen(const LLRect& gl, LLRect *screen)  	glPointToScreen(gl.mRight, gl.mBottom, &screen->mRight, &screen->mBottom);  } -//static -LLPointer<LLUIImage> LLUI::getUIImageByID(const LLUUID& image_id, S32 priority) -{ -	if (sImageProvider) -	{ -		return sImageProvider->getUIImageByID(image_id, priority); -	} -	else -	{ -		return NULL; -	} -} - -//static  -LLPointer<LLUIImage> LLUI::getUIImage(const std::string& name, S32 priority) -{ -	if (!name.empty() && sImageProvider) -		return sImageProvider->getUIImage(name, priority); -	else -		return NULL; -}  LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname)  { diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 4c1703392a..83831e4799 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -1,6 +1,6 @@  /**    * @file llui.h - * @brief GL function declarations and other general static UI services. + * @brief General static UI services.   *   * $LicenseInfo:firstyear=2001&license=viewerlgpl$   * Second Life Viewer Source Code @@ -24,122 +24,38 @@   * $/LicenseInfo$   */ -// All immediate-mode gl drawing should happen here.  #ifndef LL_LLUI_H  #define LL_LLUI_H -#include "llpointer.h"		// LLPointer<>  #include "llrect.h"  #include "llcontrol.h"  #include "llcoord.h" -#include "llglslshader.h" +#include "v2math.h"  #include "llinitparam.h"  #include "llregistry.h" +#include "llrender2dutils.h" +#include "llpointer.h"  #include "lluicolor.h"  #include "lluicolortable.h" +#include "lluiimage.h"  #include <boost/signals2.hpp>  #include "lllazyvalue.h"  #include "llframetimer.h"  #include <limits> -// LLUIFactory -#include "llsd.h" -  // for initparam specialization  #include "llfontgl.h" -class LLColor4;  -class LLVector3; -class LLVector2; -class LLUIImage;  class LLUUID;  class LLWindow;  class LLView;  class LLHelp; -// UI colors -extern const LLColor4 UI_VERTEX_COLOR;  void make_ui_sound(const char* name);  void make_ui_sound_deferred(const char * name); -BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom); -void gl_state_for_2d(S32 width, S32 height); - -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2); -void gl_line_2d(S32 x1, S32 y1, S32 x2, S32 y2, const LLColor4 &color ); -void gl_triangle_2d(S32 x1, S32 y1, S32 x2, S32 y2, S32 x3, S32 y3, const LLColor4& color, BOOL filled); -void gl_rect_2d_simple( S32 width, S32 height ); - -void gl_draw_x(const LLRect& rect, const LLColor4& color); - -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled = TRUE ); -void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, BOOL filled = TRUE ); -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &color, S32 pixel_offset = 0, BOOL filled = TRUE ); -void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset = 0, BOOL filled = TRUE ); -void gl_rect_2d(const LLRect& rect, BOOL filled = TRUE ); -void gl_rect_2d(const LLRect& rect, const LLColor4& color, BOOL filled = TRUE ); -void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha = 1.0f); - -void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines); - -void gl_circle_2d(F32 x, F32 y, F32 radius, S32 steps, BOOL filled); -void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F32 start_angle, F32 end_angle); -void gl_deep_circle( F32 radius, F32 depth ); -void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center ); -void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max_frac); -void gl_washer_2d(F32 outer_radius, F32 inner_radius, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); -void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians, F32 end_radians, S32 steps, const LLColor4& inner_color, const LLColor4& outer_color); - -void gl_draw_image(S32 x, S32 y, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees,LLTexture* image, const LLColor4& color = UI_VERTEX_COLOR, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border_height, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); -void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTexture* image, const LLColor4 &color, BOOL solid_color = FALSE, const LLRectf& uv_rect = LLRectf(0.f, 1.f, 1.f, 0.f), const LLRectf& scale_rect = LLRectf(0.f, 1.f, 1.f, 0.f)); - -void gl_stippled_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& color, F32 phase = 0.f );  - -void gl_rect_2d_simple_tex( S32 width, S32 height ); - -// segmented rectangles - -/* -   TL |______TOP_________| TR  -     /|                  |\   -   _/_|__________________|_\_ -   L| |    MIDDLE        | |R -   _|_|__________________|_|_ -    \ |    BOTTOM        | /   -   BL\|__________________|/ BR -      |                  |     -*/ - -typedef enum e_rounded_edge -{ -	ROUNDED_RECT_LEFT	= 0x1,  -	ROUNDED_RECT_TOP	= 0x2,  -	ROUNDED_RECT_RIGHT	= 0x4,  -	ROUNDED_RECT_BOTTOM	= 0x8, -	ROUNDED_RECT_ALL	= 0xf -}ERoundedEdge; - - -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 LLRectf& clip_rect, const LLRectf& center_uv_rect, const LLRectf& center_draw_rect, const LLVector3& width_vec, const LLVector3& height_vec); - -inline void gl_rect_2d( const LLRect& rect, BOOL filled ) -{ -	gl_rect_2d( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, filled ); -} - -inline void gl_rect_2d_offset_local( const LLRect& rect, S32 pixel_offset, BOOL filled) -{ -	gl_rect_2d_offset_local( rect.mLeft, rect.mTop, rect.mRight, rect.mBottom, pixel_offset, filled ); -} -  class LLImageProviderInterface;  typedef	void (*LLUIAudioCallback)(const LLUUID& uuid); @@ -281,10 +197,10 @@ public:  	static void cleanupClass();  	static void setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t&, const clear_popups_t& ); -	static void pushMatrix(); -	static void popMatrix(); -	static void loadIdentity(); -	static void translate(F32 x, F32 y, F32 z = 0.0f); +	static void pushMatrix() { LLRender2D::pushMatrix(); } +	static void popMatrix() { LLRender2D::popMatrix(); } +	static void loadIdentity() { LLRender2D::loadIdentity(); } +	static void translate(F32 x, F32 y, F32 z = 0.0f) { LLRender2D::translate(x, y, z); }  	static LLRect	sDirtyRect;  	static BOOL		sDirty; @@ -329,10 +245,13 @@ public:  	static void getMousePositionScreen(S32 *x, S32 *y);  	static void setMousePositionLocal(const LLView* viewp, S32 x, S32 y);  	static void getMousePositionLocal(const LLView* viewp, S32 *x, S32 *y); -	static void setScaleFactor(const LLVector2& scale_factor); -	static void setLineWidth(F32 width); -	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0); -	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0); +	static LLVector2& getScaleFactor() { return LLRender2D::sGLScaleFactor; } +	static void setScaleFactor(const LLVector2& scale_factor) { LLRender2D::setScaleFactor(scale_factor); } +	static void setLineWidth(F32 width) { LLRender2D::setLineWidth(width); } +	static LLPointer<LLUIImage> getUIImageByID(const LLUUID& image_id, S32 priority = 0) +		{ return LLRender2D::getUIImageByID(image_id, priority); } +	static LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority = 0) +		{ return LLRender2D::getUIImage(name, priority); }  	static LLVector2 getWindowSize();  	static void screenPointToGL(S32 screen_x, S32 screen_y, S32 *gl_x, S32 *gl_y);  	static void glPointToScreen(S32 gl_x, S32 gl_y, S32 *screen_x, S32 *screen_y); @@ -362,12 +281,10 @@ public:  	static settings_map_t sSettingGroups;  	static LLUIAudioCallback sAudioCallback;  	static LLUIAudioCallback sDeferredAudioCallback; -	static LLVector2		sGLScaleFactor;  	static LLWindow*		sWindow;  	static LLView*			sRootView;  	static LLHelp*			sHelpImpl;  private: -	static LLImageProviderInterface* sImageProvider;  	static std::vector<std::string> sXUIPaths;  	static LLFrameTimer		sMouseIdleTimer;  	static add_popup_t		sAddPopupFunc; @@ -378,18 +295,6 @@ private:  // Moved LLLocalClipRect to lllocalcliprect.h -//RN: maybe this needs to moved elsewhere? -class LLImageProviderInterface -{ -protected: -	LLImageProviderInterface() {}; -	virtual ~LLImageProviderInterface() {}; -public: -	virtual LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority) = 0; -	virtual LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority) = 0; -	virtual void cleanUp() = 0; -}; -  class LLCallbackRegistry  {  public: @@ -600,7 +505,4 @@ namespace LLInitParam  	};  } -extern LLGLSLShader gSolidColorProgram; -extern LLGLSLShader gUIProgram; -  #endif diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 0f77c68ec8..dac268ec92 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -803,7 +803,7 @@ bool LLAppViewer::init()  		LLUIImageList::getInstance(),  		ui_audio_callback,  		deferred_ui_audio_callback, -		&LLUI::sGLScaleFactor); +		&LLUI::getScaleFactor());  	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;  	// NOW LLUI::getLanguage() should work. gDirUtilp must know the language diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 1208c9378e..60fa53f491 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -79,10 +79,10 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)  	S32 top =	llmax(y, mDragStartY);  	S32 bottom =llmin(y, mDragStartY); -	left = llround((F32) left * LLUI::sGLScaleFactor.mV[VX]); -	right = llround((F32) right * LLUI::sGLScaleFactor.mV[VX]); -	top = llround((F32) top * LLUI::sGLScaleFactor.mV[VY]); -	bottom = llround((F32) bottom * LLUI::sGLScaleFactor.mV[VY]); +	left = llround((F32) left * LLUI::getScaleFactor().mV[VX]); +	right = llround((F32) right * LLUI::getScaleFactor().mV[VX]); +	top = llround((F32) top * LLUI::getScaleFactor().mV[VY]); +	bottom = llround((F32) bottom * LLUI::getScaleFactor().mV[VY]);  	F32 old_far_plane = LLViewerCamera::getInstance()->getFar();  	F32 old_near_plane = LLViewerCamera::getInstance()->getNear(); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 99b4707158..2075aeed63 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -119,8 +119,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :  	if(!getDecoupleTextureSize())  	{ -		S32 screen_width = llround((F32)getRect().getWidth() * LLUI::sGLScaleFactor.mV[VX]); -		S32 screen_height = llround((F32)getRect().getHeight() * LLUI::sGLScaleFactor.mV[VY]); +		S32 screen_width = llround((F32)getRect().getWidth() * LLUI::getScaleFactor().mV[VX]); +		S32 screen_height = llround((F32)getRect().getHeight() * LLUI::getScaleFactor().mV[VY]);  		setTextureSize(screen_width, screen_height);  	} @@ -469,8 +469,8 @@ void LLMediaCtrl::reshape( S32 width, S32 height, BOOL called_from_parent )  {  	if(!getDecoupleTextureSize())  	{ -		S32 screen_width = llround((F32)width * LLUI::sGLScaleFactor.mV[VX]); -		S32 screen_height = llround((F32)height * LLUI::sGLScaleFactor.mV[VY]); +		S32 screen_width = llround((F32)width * LLUI::getScaleFactor().mV[VX]); +		S32 screen_height = llround((F32)height * LLUI::getScaleFactor().mV[VY]);  		// when floater is minimized, these sizes are negative  		if ( screen_height > 0 && screen_width > 0 ) @@ -667,7 +667,7 @@ bool LLMediaCtrl::ensureMediaSourceExists()  			mMediaSource->addObserver( this );  			mMediaSource->setBackgroundColor( getBackgroundColor() );  			mMediaSource->setTrustedBrowser(mTrusted); -			mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); +			mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] );  			if(mClearCache)  			{ @@ -750,7 +750,7 @@ void LLMediaCtrl::draw()  	{  		gGL.pushUIMatrix();  		{ -			mMediaSource->setPageZoomFactor( LLUI::sGLScaleFactor.mV[ VX ] ); +			mMediaSource->setPageZoomFactor( LLUI::getScaleFactor().mV[ VX ] );  			// scale texture to fit the space using texture coords  			gGL.getTexUnit(0)->bind(media_texture); @@ -864,14 +864,14 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)  		coords_opengl = mMediaSource->getMediaPlugin()->getTextureCoordsOpenGL();  	} -	x = llround((F32)x * LLUI::sGLScaleFactor.mV[VX]); +	x = llround((F32)x * LLUI::getScaleFactor().mV[VX]);  	if ( ! coords_opengl )  	{ -		y = llround((F32)(y) * LLUI::sGLScaleFactor.mV[VY]); +		y = llround((F32)(y) * LLUI::getScaleFactor().mV[VY]);  	}  	else  	{ -		y = llround((F32)(getRect().getHeight() - y) * LLUI::sGLScaleFactor.mV[VY]); +		y = llround((F32)(getRect().getHeight() - y) * LLUI::getScaleFactor().mV[VY]);  	};  } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index ffeea2f4df..02f82aba63 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1425,7 +1425,7 @@ void render_ui_2d()  		gGL.pushMatrix();  		S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);  		S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2); -		gGL.scalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f); +		gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f);  		gGL.translatef((F32)half_width, (F32)half_height, 0.f);  		F32 zoom = gAgentCamera.mHUDCurZoom;  		gGL.scalef(zoom,zoom,1.f); @@ -1463,10 +1463,10 @@ void render_ui_2d()  				LLUI::sDirtyRect = last_rect;  				last_rect = t_rect; -				last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::sGLScaleFactor.mV[0]); -				last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::sGLScaleFactor.mV[0]); -				last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::sGLScaleFactor.mV[1]); -				last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::sGLScaleFactor.mV[1]); +				last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / LLUI::getScaleFactor().mV[0]); +				last_rect.mRight = LLRect::tCoordType(last_rect.mRight / LLUI::getScaleFactor().mV[0]); +				last_rect.mTop = LLRect::tCoordType(last_rect.mTop / LLUI::getScaleFactor().mV[1]); +				last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / LLUI::getScaleFactor().mV[1]);  				LLRect clip_rect(last_rect); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 383eb3c9e4..db3476850b 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2157,7 +2157,7 @@ void LLViewerWindow::reshape(S32 width, S32 height)  		calcDisplayScale(); -		BOOL display_scale_changed = mDisplayScale != LLUI::sGLScaleFactor; +		BOOL display_scale_changed = mDisplayScale != LLUI::getScaleFactor();  		LLUI::setScaleFactor(mDisplayScale);  		// update our window rectangle @@ -2363,7 +2363,7 @@ void LLViewerWindow::draw()  		// scale view by UI global scale factor and aspect ratio correction factor  		gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f); -		LLVector2 old_scale_factor = LLUI::sGLScaleFactor; +		LLVector2 old_scale_factor = LLUI::getScaleFactor();  		// apply camera zoom transform (for high res screenshots)  		F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();  		S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion(); @@ -2377,7 +2377,7 @@ void LLViewerWindow::draw()  						(F32)getWindowHeightScaled() * -(F32)pos_y,   						0.f);  			gGL.scalef(zoom_factor, zoom_factor, 1.f); -			LLUI::sGLScaleFactor *= zoom_factor; +			LLUI::getScaleFactor() *= zoom_factor;  		}  		// Draw tool specific overlay on world @@ -2425,7 +2425,7 @@ void LLViewerWindow::draw()  				LLFontGL::HCENTER, LLFontGL::TOP);  		} -		LLUI::sGLScaleFactor = old_scale_factor; +		LLUI::setScaleFactor(old_scale_factor);  	}  	LLUI::popMatrix();  	gGL.popMatrix(); @@ -3230,8 +3230,8 @@ void LLViewerWindow::updateLayout()  void LLViewerWindow::updateMouseDelta()  { -	S32 dx = lltrunc((F32) (mCurrentMousePoint.mX - mLastMousePoint.mX) * LLUI::sGLScaleFactor.mV[VX]); -	S32 dy = lltrunc((F32) (mCurrentMousePoint.mY - mLastMousePoint.mY) * LLUI::sGLScaleFactor.mV[VY]); +	S32 dx = lltrunc((F32) (mCurrentMousePoint.mX - mLastMousePoint.mX) * LLUI::getScaleFactor().mV[VX]); +	S32 dy = lltrunc((F32) (mCurrentMousePoint.mY - mLastMousePoint.mY) * LLUI::getScaleFactor().mV[VY]);  	//RN: fix for asynchronous notification of mouse leaving window not working  	LLCoordWindow mouse_pos; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index ccc513b80d..ffb0964499 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -421,7 +421,7 @@ void LLWorldMapView::draw()  			{  				// Inform the fetch mechanism of the size we need  				S32 draw_size = llround(sMapScale); -				overlayimage->setKnownDrawSize(llround(draw_size * LLUI::sGLScaleFactor.mV[VX]), llround(draw_size * LLUI::sGLScaleFactor.mV[VY])); +				overlayimage->setKnownDrawSize(llround(draw_size * LLUI::getScaleFactor().mV[VX]), llround(draw_size * LLUI::getScaleFactor().mV[VY]));  				// Draw something whenever we have enough info  				if (overlayimage->hasGLTexture())  				{ @@ -1320,7 +1320,7 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const  	gGL.matrixMode(LLRender::MM_MODELVIEW);  	gGL.pushMatrix(); -	gGL.translatef((F32)x * LLUI::sGLScaleFactor.mV[VX], (F32)y * LLUI::sGLScaleFactor.mV[VY], 0.f); +	gGL.translatef((F32)x * LLUI::getScaleFactor().mV[VX], (F32)y * LLUI::getScaleFactor().mV[VY], 0.f);  	gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color);  	gGL.popMatrix(); | 
