diff options
author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-04-29 07:43:28 +0300 |
---|---|---|
committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-04-29 07:56:09 +0300 |
commit | 1b68f71348ecf3983b76b40d7940da8377f049b7 (patch) | |
tree | 2974eddaef130a067c26033d60a59fc790365b3d /indra/newview/llhudtext.cpp | |
parent | af4ea94efc1999f3b19fd8d643d0331f0b77e265 (diff) |
#824 Process source files in bulk: replace tabs with spaces, convert CRLF to LF, and trim trailing whitespaces as needed
Diffstat (limited to 'indra/newview/llhudtext.cpp')
-rw-r--r-- | indra/newview/llhudtext.cpp | 934 |
1 files changed, 467 insertions, 467 deletions
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 0b0de18534..736c0a5bcd 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llhudtext.cpp * @brief Floating text above objects, set via script with llSetText() * * $LicenseInfo:firstyear=2002&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$ */ @@ -62,35 +62,35 @@ BOOL LLHUDText::sDisplayText = TRUE ; bool lltextobject_further_away::operator()(const LLPointer<LLHUDText>& lhs, const LLPointer<LLHUDText>& rhs) const { - return lhs->getDistance() > rhs->getDistance(); + return lhs->getDistance() > rhs->getDistance(); } LLHUDText::LLHUDText(const U8 type) : - LLHUDObject(type), - mOnHUDAttachment(FALSE), -// mVisibleOffScreen(FALSE), - mWidth(0.f), - mHeight(0.f), - mFontp(LLFontGL::getFontSansSerifSmall()), - mBoldFontp(LLFontGL::getFontSansSerifBold()), - mMass(1.f), - mMaxLines(10), - mOffsetY(0), - mTextAlignment(ALIGN_TEXT_CENTER), - mVertAlignment(ALIGN_VERT_CENTER), -// mLOD(0), - mHidden(FALSE) + LLHUDObject(type), + mOnHUDAttachment(FALSE), +// mVisibleOffScreen(FALSE), + mWidth(0.f), + mHeight(0.f), + mFontp(LLFontGL::getFontSansSerifSmall()), + mBoldFontp(LLFontGL::getFontSansSerifBold()), + mMass(1.f), + mMaxLines(10), + mOffsetY(0), + mTextAlignment(ALIGN_TEXT_CENTER), + mVertAlignment(ALIGN_VERT_CENTER), +// mLOD(0), + mHidden(FALSE) { - mColor = LLColor4(1.f, 1.f, 1.f, 1.f); - mDoFade = TRUE; - mFadeDistance = 8.f; - mFadeRange = 4.f; - mZCompare = TRUE; - mOffscreen = FALSE; - mRadius = 0.1f; - LLPointer<LLHUDText> ptr(this); - sTextObjects.insert(ptr); + mColor = LLColor4(1.f, 1.f, 1.f, 1.f); + mDoFade = TRUE; + mFadeDistance = 8.f; + mFadeRange = 4.f; + mZCompare = TRUE; + mOffscreen = FALSE; + mRadius = 0.1f; + LLPointer<LLHUDText> ptr(this); + sTextObjects.insert(ptr); } LLHUDText::~LLHUDText() @@ -99,541 +99,541 @@ LLHUDText::~LLHUDText() void LLHUDText::render() { - if (!mOnHUDAttachment && sDisplayText) - { - LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - //LLGLDisable gls_stencil(GL_STENCIL_TEST); - renderText(); - } + if (!mOnHUDAttachment && sDisplayText) + { + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); + //LLGLDisable gls_stencil(GL_STENCIL_TEST); + renderText(); + } } void LLHUDText::renderText() { - if (!mVisible || mHidden) - { - return; - } - - gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); - - LLGLState gls_blend(GL_BLEND, TRUE); - - LLColor4 shadow_color(0.f, 0.f, 0.f, 1.f); - F32 alpha_factor = 1.f; - LLColor4 text_color = mColor; - if (mDoFade) - { - if (mLastDistance > mFadeDistance) - { - alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange); - text_color.mV[3] = text_color.mV[3]*alpha_factor; - } - } - if (text_color.mV[3] < 0.01f) - { - return; - } - shadow_color.mV[3] = text_color.mV[3]; - - mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f)); - - // *TODO: make this a per-text setting - LLColor4 bg_color = LLUIColorTable::instance().getColor("ObjectBubbleColor"); - bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); - - const S32 border_height = 16; - const S32 border_width = 16; - - // *TODO move this into helper function - F32 border_scale = 1.f; - - if (border_height * 2 > mHeight) - { - border_scale = (F32)mHeight / ((F32)border_height * 2.f); - } - if (border_width * 2 > mWidth) - { - border_scale = llmin(border_scale, (F32)mWidth / ((F32)border_width * 2.f)); - } - - // scale screen size of borders down - //RN: for now, text on hud objects is never occluded - - LLVector3 x_pixel_vec; - LLVector3 y_pixel_vec; - - if (mOnHUDAttachment) - { - x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidthRaw(); - y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeightRaw(); - } - else - { - LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); - } - - LLVector3 width_vec = mWidth * x_pixel_vec; - LLVector3 height_vec = mHeight * y_pixel_vec; - - mRadius = (width_vec + height_vec).magVec() * 0.5f; - - LLVector2 screen_offset; - screen_offset = mPositionOffset; - - LLVector3 render_position = mPositionAgent - + (x_pixel_vec * screen_offset.mV[VX]) - + (y_pixel_vec * screen_offset.mV[VY]); - - F32 y_offset = (F32)mOffsetY; - - // Render label - - // Render text - { - // -1 mMaxLines means unlimited lines. - S32 start_segment; - S32 max_lines = getMaxLines(); - - if (max_lines < 0) - { - start_segment = 0; - } - else - { - start_segment = llmax((S32)0, (S32)mTextSegments.size() - max_lines); - } - - for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin() + start_segment; - segment_iter != mTextSegments.end(); ++segment_iter ) - { - const LLFontGL* fontp = segment_iter->mFont; - y_offset -= fontp->getLineHeight() - 1; // correction factor to match legacy font metrics - - U8 style = segment_iter->mStyle; - LLFontGL::ShadowType shadow = LLFontGL::DROP_SHADOW; - - F32 x_offset; - if (mTextAlignment== ALIGN_TEXT_CENTER) - { - x_offset = -0.5f*segment_iter->getWidth(fontp); - } - else // ALIGN_LEFT - { - x_offset = -0.5f * mWidth + (HORIZONTAL_PADDING / 2.f); - } - - text_color = segment_iter->mColor; + if (!mVisible || mHidden) + { + return; + } + + gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); + + LLGLState gls_blend(GL_BLEND, TRUE); + + LLColor4 shadow_color(0.f, 0.f, 0.f, 1.f); + F32 alpha_factor = 1.f; + LLColor4 text_color = mColor; + if (mDoFade) + { + if (mLastDistance > mFadeDistance) + { + alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange); + text_color.mV[3] = text_color.mV[3]*alpha_factor; + } + } + if (text_color.mV[3] < 0.01f) + { + return; + } + shadow_color.mV[3] = text_color.mV[3]; + + mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f)); + + // *TODO: make this a per-text setting + LLColor4 bg_color = LLUIColorTable::instance().getColor("ObjectBubbleColor"); + bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); + + const S32 border_height = 16; + const S32 border_width = 16; + + // *TODO move this into helper function + F32 border_scale = 1.f; + + if (border_height * 2 > mHeight) + { + border_scale = (F32)mHeight / ((F32)border_height * 2.f); + } + if (border_width * 2 > mWidth) + { + border_scale = llmin(border_scale, (F32)mWidth / ((F32)border_width * 2.f)); + } + + // scale screen size of borders down + //RN: for now, text on hud objects is never occluded + + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + + if (mOnHUDAttachment) + { + x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWorldViewWidthRaw(); + y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWorldViewHeightRaw(); + } + else + { + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); + } + + LLVector3 width_vec = mWidth * x_pixel_vec; + LLVector3 height_vec = mHeight * y_pixel_vec; + + mRadius = (width_vec + height_vec).magVec() * 0.5f; + + LLVector2 screen_offset; + screen_offset = mPositionOffset; + + LLVector3 render_position = mPositionAgent + + (x_pixel_vec * screen_offset.mV[VX]) + + (y_pixel_vec * screen_offset.mV[VY]); + + F32 y_offset = (F32)mOffsetY; + + // Render label + + // Render text + { + // -1 mMaxLines means unlimited lines. + S32 start_segment; + S32 max_lines = getMaxLines(); + + if (max_lines < 0) + { + start_segment = 0; + } + else + { + start_segment = llmax((S32)0, (S32)mTextSegments.size() - max_lines); + } + + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin() + start_segment; + segment_iter != mTextSegments.end(); ++segment_iter ) + { + const LLFontGL* fontp = segment_iter->mFont; + y_offset -= fontp->getLineHeight() - 1; // correction factor to match legacy font metrics + + U8 style = segment_iter->mStyle; + LLFontGL::ShadowType shadow = LLFontGL::DROP_SHADOW; + + F32 x_offset; + if (mTextAlignment== ALIGN_TEXT_CENTER) + { + x_offset = -0.5f*segment_iter->getWidth(fontp); + } + else // ALIGN_LEFT + { + x_offset = -0.5f * mWidth + (HORIZONTAL_PADDING / 2.f); + } + + text_color = segment_iter->mColor; if (mOnHUDAttachment) { text_color = linearColor4(text_color); } - text_color.mV[VALPHA] *= alpha_factor; + text_color.mV[VALPHA] *= alpha_factor; - hud_render_text(segment_iter->getText(), render_position, *fontp, style, shadow, x_offset, y_offset, text_color, mOnHUDAttachment); - } - } - /// Reset the default color to white. The renderer expects this to be the default. - gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); + hud_render_text(segment_iter->getText(), render_position, *fontp, style, shadow, x_offset, y_offset, text_color, mOnHUDAttachment); + } + } + /// Reset the default color to white. The renderer expects this to be the default. + gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); } void LLHUDText::setString(const std::string &text_utf8) { - mTextSegments.clear(); - addLine(text_utf8, mColor); + mTextSegments.clear(); + addLine(text_utf8, mColor); } void LLHUDText::clearString() { - mTextSegments.clear(); + mTextSegments.clear(); } void LLHUDText::addLine(const std::string &text_utf8, - const LLColor4& color, - const LLFontGL::StyleFlags style, - const LLFontGL* font) + const LLColor4& color, + const LLFontGL::StyleFlags style, + const LLFontGL* font) { - LLWString wline = utf8str_to_wstring(text_utf8); - if (!wline.empty()) - { - // use default font for segment if custom font not specified - if (!font) - { - font = mFontp; - } - typedef boost::tokenizer<boost::char_separator<llwchar>, LLWString::const_iterator, LLWString > tokenizer; - LLWString seps(utf8str_to_wstring("\r\n")); - boost::char_separator<llwchar> sep(seps.c_str()); - - tokenizer tokens(wline, sep); - tokenizer::iterator iter = tokens.begin(); - - while (iter != tokens.end()) - { - U32 line_length = 0; - do - { - F32 max_pixels = HUD_TEXT_MAX_WIDTH_NO_BUBBLE; - S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); - LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); - mTextSegments.push_back(segment); - line_length += segment_length; - } - while (line_length != iter->size()); - ++iter; - } - } + LLWString wline = utf8str_to_wstring(text_utf8); + if (!wline.empty()) + { + // use default font for segment if custom font not specified + if (!font) + { + font = mFontp; + } + typedef boost::tokenizer<boost::char_separator<llwchar>, LLWString::const_iterator, LLWString > tokenizer; + LLWString seps(utf8str_to_wstring("\r\n")); + boost::char_separator<llwchar> sep(seps.c_str()); + + tokenizer tokens(wline, sep); + tokenizer::iterator iter = tokens.begin(); + + while (iter != tokens.end()) + { + U32 line_length = 0; + do + { + F32 max_pixels = HUD_TEXT_MAX_WIDTH_NO_BUBBLE; + S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); + LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); + mTextSegments.push_back(segment); + line_length += segment_length; + } + while (line_length != iter->size()); + ++iter; + } + } } void LLHUDText::setZCompare(const BOOL zcompare) { - mZCompare = zcompare; + mZCompare = zcompare; } void LLHUDText::setFont(const LLFontGL* font) { - mFontp = font; + mFontp = font; } void LLHUDText::setColor(const LLColor4 &color) { - mColor = color; - for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); - segment_iter != mTextSegments.end(); ++segment_iter ) - { - segment_iter->mColor = color; - } + mColor = color; + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); + segment_iter != mTextSegments.end(); ++segment_iter ) + { + segment_iter->mColor = color; + } } void LLHUDText::setAlpha(F32 alpha) { - mColor.mV[VALPHA] = alpha; - for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); - segment_iter != mTextSegments.end(); ++segment_iter ) - { - segment_iter->mColor.mV[VALPHA] = alpha; - } + mColor.mV[VALPHA] = alpha; + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); + segment_iter != mTextSegments.end(); ++segment_iter ) + { + segment_iter->mColor.mV[VALPHA] = alpha; + } } void LLHUDText::setDoFade(const BOOL do_fade) { - mDoFade = do_fade; + mDoFade = do_fade; } void LLHUDText::updateVisibility() { - if (mSourceObject) - { - mSourceObject->updateText(); - } - - mPositionAgent = gAgent.getPosAgentFromGlobal(mPositionGlobal); - - if (!mSourceObject) - { + if (mSourceObject) + { + mSourceObject->updateText(); + } + + mPositionAgent = gAgent.getPosAgentFromGlobal(mPositionGlobal); + + if (!mSourceObject) + { // Beacons - mVisible = TRUE; - if (mOnHUDAttachment) - { - sVisibleHUDTextObjects.push_back(LLPointer<LLHUDText> (this)); - } - else - { - sVisibleTextObjects.push_back(LLPointer<LLHUDText> (this)); - } - return; - } - - // Not visible if parent object is dead - if (mSourceObject->isDead()) - { - mVisible = FALSE; - return; - } - - // for now, all text on hud objects is visible - if (mOnHUDAttachment) - { - mVisible = TRUE; - sVisibleHUDTextObjects.push_back(LLPointer<LLHUDText> (this)); - mLastDistance = mPositionAgent.mV[VX]; - return; - } - - // push text towards camera by radius of object, but not past camera - LLVector3 vec_from_camera = mPositionAgent - LLViewerCamera::getInstance()->getOrigin(); - LLVector3 dir_from_camera = vec_from_camera; - dir_from_camera.normVec(); - - if (dir_from_camera * LLViewerCamera::getInstance()->getAtAxis() <= 0.f) - { //text is behind camera, don't render - mVisible = FALSE; - return; - } - - if (vec_from_camera * LLViewerCamera::getInstance()->getAtAxis() <= LLViewerCamera::getInstance()->getNear() + 0.1f + mSourceObject->getVObjRadius()) - { - mPositionAgent = LLViewerCamera::getInstance()->getOrigin() + vec_from_camera * ((LLViewerCamera::getInstance()->getNear() + 0.1f) / (vec_from_camera * LLViewerCamera::getInstance()->getAtAxis())); - } - else - { - mPositionAgent -= dir_from_camera * mSourceObject->getVObjRadius(); - } - - mLastDistance = (mPositionAgent - LLViewerCamera::getInstance()->getOrigin()).magVec(); - - if (!mTextSegments.size() || (mDoFade && (mLastDistance > mFadeDistance + mFadeRange))) - { - mVisible = FALSE; - return; - } - - LLVector3 pos_agent_center = gAgent.getPosAgentFromGlobal(mPositionGlobal) - dir_from_camera; - F32 last_distance_center = (pos_agent_center - LLViewerCamera::getInstance()->getOrigin()).magVec(); - F32 max_draw_distance = gSavedSettings.getF32("PrimTextMaxDrawDistance"); - - if(max_draw_distance < 0) - { - max_draw_distance = 0; - gSavedSettings.setF32("PrimTextMaxDrawDistance", max_draw_distance); - } - else if(max_draw_distance > MAX_DRAW_DISTANCE) - { - max_draw_distance = MAX_DRAW_DISTANCE; - gSavedSettings.setF32("PrimTextMaxDrawDistance", MAX_DRAW_DISTANCE); - } - - if(last_distance_center > max_draw_distance) - { - mVisible = FALSE; - return; - } - - - LLVector3 x_pixel_vec; - LLVector3 y_pixel_vec; - - LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); - - LLVector3 render_position = mPositionAgent + - (x_pixel_vec * mPositionOffset.mV[VX]) + - (y_pixel_vec * mPositionOffset.mV[VY]); - - mOffscreen = FALSE; - if (!LLViewerCamera::getInstance()->sphereInFrustum(render_position, mRadius)) - { -// if (!mVisibleOffScreen) -// { - mVisible = FALSE; - return; -// } -// else -// { -// mOffscreen = TRUE; -// } - } - - mVisible = TRUE; - sVisibleTextObjects.push_back(LLPointer<LLHUDText> (this)); + mVisible = TRUE; + if (mOnHUDAttachment) + { + sVisibleHUDTextObjects.push_back(LLPointer<LLHUDText> (this)); + } + else + { + sVisibleTextObjects.push_back(LLPointer<LLHUDText> (this)); + } + return; + } + + // Not visible if parent object is dead + if (mSourceObject->isDead()) + { + mVisible = FALSE; + return; + } + + // for now, all text on hud objects is visible + if (mOnHUDAttachment) + { + mVisible = TRUE; + sVisibleHUDTextObjects.push_back(LLPointer<LLHUDText> (this)); + mLastDistance = mPositionAgent.mV[VX]; + return; + } + + // push text towards camera by radius of object, but not past camera + LLVector3 vec_from_camera = mPositionAgent - LLViewerCamera::getInstance()->getOrigin(); + LLVector3 dir_from_camera = vec_from_camera; + dir_from_camera.normVec(); + + if (dir_from_camera * LLViewerCamera::getInstance()->getAtAxis() <= 0.f) + { //text is behind camera, don't render + mVisible = FALSE; + return; + } + + if (vec_from_camera * LLViewerCamera::getInstance()->getAtAxis() <= LLViewerCamera::getInstance()->getNear() + 0.1f + mSourceObject->getVObjRadius()) + { + mPositionAgent = LLViewerCamera::getInstance()->getOrigin() + vec_from_camera * ((LLViewerCamera::getInstance()->getNear() + 0.1f) / (vec_from_camera * LLViewerCamera::getInstance()->getAtAxis())); + } + else + { + mPositionAgent -= dir_from_camera * mSourceObject->getVObjRadius(); + } + + mLastDistance = (mPositionAgent - LLViewerCamera::getInstance()->getOrigin()).magVec(); + + if (!mTextSegments.size() || (mDoFade && (mLastDistance > mFadeDistance + mFadeRange))) + { + mVisible = FALSE; + return; + } + + LLVector3 pos_agent_center = gAgent.getPosAgentFromGlobal(mPositionGlobal) - dir_from_camera; + F32 last_distance_center = (pos_agent_center - LLViewerCamera::getInstance()->getOrigin()).magVec(); + F32 max_draw_distance = gSavedSettings.getF32("PrimTextMaxDrawDistance"); + + if(max_draw_distance < 0) + { + max_draw_distance = 0; + gSavedSettings.setF32("PrimTextMaxDrawDistance", max_draw_distance); + } + else if(max_draw_distance > MAX_DRAW_DISTANCE) + { + max_draw_distance = MAX_DRAW_DISTANCE; + gSavedSettings.setF32("PrimTextMaxDrawDistance", MAX_DRAW_DISTANCE); + } + + if(last_distance_center > max_draw_distance) + { + mVisible = FALSE; + return; + } + + + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); + + LLVector3 render_position = mPositionAgent + + (x_pixel_vec * mPositionOffset.mV[VX]) + + (y_pixel_vec * mPositionOffset.mV[VY]); + + mOffscreen = FALSE; + if (!LLViewerCamera::getInstance()->sphereInFrustum(render_position, mRadius)) + { +// if (!mVisibleOffScreen) +// { + mVisible = FALSE; + return; +// } +// else +// { +// mOffscreen = TRUE; +// } + } + + mVisible = TRUE; + sVisibleTextObjects.push_back(LLPointer<LLHUDText> (this)); } LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset) { - LLCoordGL screen_pos; - LLVector2 screen_pos_vec; - LLVector3 x_pixel_vec; - LLVector3 y_pixel_vec; - LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); -// LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); -// if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen) -// { -// // bubble off-screen, so find a spot for it along screen edge -// LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(world_pos, screen_pos); -// } - - screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY); - - LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); - S32 bottom = world_rect.mBottom + STATUS_BAR_HEIGHT; - - LLVector2 screen_center; - screen_center.mV[VX] = llclamp((F32)screen_pos_vec.mV[VX], (F32)world_rect.mLeft + mWidth * 0.5f, (F32)world_rect.mRight - mWidth * 0.5f); - - if(mVertAlignment == ALIGN_VERT_TOP) - { - screen_center.mV[VY] = llclamp((F32)screen_pos_vec.mV[VY], - (F32)bottom, - (F32)world_rect.mTop - mHeight - (F32)MENU_BAR_HEIGHT); - mSoftScreenRect.setLeftTopAndSize(screen_center.mV[VX] - (mWidth + BUFFER_SIZE) * 0.5f, - screen_center.mV[VY] + (mHeight + BUFFER_SIZE), mWidth + BUFFER_SIZE, mHeight + BUFFER_SIZE); - } - else - { - screen_center.mV[VY] = llclamp((F32)screen_pos_vec.mV[VY], - (F32)bottom + mHeight * 0.5f, - (F32)world_rect.mTop - mHeight * 0.5f - (F32)MENU_BAR_HEIGHT); - mSoftScreenRect.setCenterAndSize(screen_center.mV[VX], screen_center.mV[VY], mWidth + BUFFER_SIZE, mHeight + BUFFER_SIZE); - } - - return offset + (screen_center - LLVector2((F32)screen_pos.mX, (F32)screen_pos.mY)); + LLCoordGL screen_pos; + LLVector2 screen_pos_vec; + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); +// LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); +// if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen) +// { +// // bubble off-screen, so find a spot for it along screen edge +// LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(world_pos, screen_pos); +// } + + screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY); + + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); + S32 bottom = world_rect.mBottom + STATUS_BAR_HEIGHT; + + LLVector2 screen_center; + screen_center.mV[VX] = llclamp((F32)screen_pos_vec.mV[VX], (F32)world_rect.mLeft + mWidth * 0.5f, (F32)world_rect.mRight - mWidth * 0.5f); + + if(mVertAlignment == ALIGN_VERT_TOP) + { + screen_center.mV[VY] = llclamp((F32)screen_pos_vec.mV[VY], + (F32)bottom, + (F32)world_rect.mTop - mHeight - (F32)MENU_BAR_HEIGHT); + mSoftScreenRect.setLeftTopAndSize(screen_center.mV[VX] - (mWidth + BUFFER_SIZE) * 0.5f, + screen_center.mV[VY] + (mHeight + BUFFER_SIZE), mWidth + BUFFER_SIZE, mHeight + BUFFER_SIZE); + } + else + { + screen_center.mV[VY] = llclamp((F32)screen_pos_vec.mV[VY], + (F32)bottom + mHeight * 0.5f, + (F32)world_rect.mTop - mHeight * 0.5f - (F32)MENU_BAR_HEIGHT); + mSoftScreenRect.setCenterAndSize(screen_center.mV[VX], screen_center.mV[VY], mWidth + BUFFER_SIZE, mHeight + BUFFER_SIZE); + } + + return offset + (screen_center - LLVector2((F32)screen_pos.mX, (F32)screen_pos.mY)); } void LLHUDText::updateSize() { - F32 height = 0.f; - F32 width = 0.f; - - S32 max_lines = getMaxLines(); - - S32 start_segment; - if (max_lines < 0) start_segment = 0; - else start_segment = llmax((S32)0, (S32)mTextSegments.size() - max_lines); - - std::vector<LLHUDTextSegment>::iterator iter = mTextSegments.begin() + start_segment; - while (iter != mTextSegments.end()) - { - const LLFontGL* fontp = iter->mFont; - height += fontp->getLineHeight() - 1; // correction factor to match legacy font metrics - width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH)); - ++iter; - } - - if (width == 0.f) - { - return; - } - - width += HORIZONTAL_PADDING; - height += VERTICAL_PADDING; - - // *TODO: Could do some sort of timer-based resize logic here - F32 u = 1.f; - mWidth = llmax(width, lerp(mWidth, (F32)width, u)); - mHeight = llmax(height, lerp(mHeight, (F32)height, u)); + F32 height = 0.f; + F32 width = 0.f; + + S32 max_lines = getMaxLines(); + + S32 start_segment; + if (max_lines < 0) start_segment = 0; + else start_segment = llmax((S32)0, (S32)mTextSegments.size() - max_lines); + + std::vector<LLHUDTextSegment>::iterator iter = mTextSegments.begin() + start_segment; + while (iter != mTextSegments.end()) + { + const LLFontGL* fontp = iter->mFont; + height += fontp->getLineHeight() - 1; // correction factor to match legacy font metrics + width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH)); + ++iter; + } + + if (width == 0.f) + { + return; + } + + width += HORIZONTAL_PADDING; + height += VERTICAL_PADDING; + + // *TODO: Could do some sort of timer-based resize logic here + F32 u = 1.f; + mWidth = llmax(width, lerp(mWidth, (F32)width, u)); + mHeight = llmax(height, lerp(mHeight, (F32)height, u)); } void LLHUDText::updateAll() { - // iterate over all text objects, calculate their restoration forces, - // and add them to the visible set if they are on screen and close enough - sVisibleTextObjects.clear(); - sVisibleHUDTextObjects.clear(); - - TextObjectIterator text_it; - for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) - { - LLHUDText* textp = (*text_it); - textp->mTargetPositionOffset.clearVec(); - textp->updateSize(); - textp->updateVisibility(); - } - - // sort back to front for rendering purposes - std::sort(sVisibleTextObjects.begin(), sVisibleTextObjects.end(), lltextobject_further_away()); - std::sort(sVisibleHUDTextObjects.begin(), sVisibleHUDTextObjects.end(), lltextobject_further_away()); + // iterate over all text objects, calculate their restoration forces, + // and add them to the visible set if they are on screen and close enough + sVisibleTextObjects.clear(); + sVisibleHUDTextObjects.clear(); + + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDText* textp = (*text_it); + textp->mTargetPositionOffset.clearVec(); + textp->updateSize(); + textp->updateVisibility(); + } + + // sort back to front for rendering purposes + std::sort(sVisibleTextObjects.begin(), sVisibleTextObjects.end(), lltextobject_further_away()); + std::sort(sVisibleHUDTextObjects.begin(), sVisibleHUDTextObjects.end(), lltextobject_further_away()); } //void LLHUDText::setLOD(S32 lod) //{ -// mLOD = lod; -// //RN: uncomment this to visualize LOD levels -// //std::string label = llformat("%d", lod); -// //setLabel(label); +// mLOD = lod; +// //RN: uncomment this to visualize LOD levels +// //std::string label = llformat("%d", lod); +// //setLabel(label); //} S32 LLHUDText::getMaxLines() { - return mMaxLines; - //switch(mLOD) - //{ - //case 0: - // return mMaxLines; - //case 1: - // return mMaxLines > 0 ? mMaxLines / 2 : 5; - //case 2: - // return mMaxLines > 0 ? mMaxLines / 3 : 2; - //default: - // // label only - // return 0; - //} + return mMaxLines; + //switch(mLOD) + //{ + //case 0: + // return mMaxLines; + //case 1: + // return mMaxLines > 0 ? mMaxLines / 2 : 5; + //case 2: + // return mMaxLines > 0 ? mMaxLines / 3 : 2; + //default: + // // label only + // return 0; + //} } void LLHUDText::markDead() { // make sure we have at least one pointer // till the end of the function - LLPointer<LLHUDText> ptr(this); - sTextObjects.erase(ptr); - LLHUDObject::markDead(); + LLPointer<LLHUDText> ptr(this); + sTextObjects.erase(ptr); + LLHUDObject::markDead(); } void LLHUDText::renderAllHUD() { - LLGLState::checkStates(); - - { - LLGLDepthTest depth(GL_FALSE, GL_FALSE); - - VisibleTextObjectIterator text_it; - - for (text_it = sVisibleHUDTextObjects.begin(); text_it != sVisibleHUDTextObjects.end(); ++text_it) - { - (*text_it)->renderText(); - } - } - - LLVertexBuffer::unbind(); - - LLGLState::checkStates(); + LLGLState::checkStates(); + + { + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + + VisibleTextObjectIterator text_it; + + for (text_it = sVisibleHUDTextObjects.begin(); text_it != sVisibleHUDTextObjects.end(); ++text_it) + { + (*text_it)->renderText(); + } + } + + LLVertexBuffer::unbind(); + + LLGLState::checkStates(); } void LLHUDText::shiftAll(const LLVector3& offset) { - TextObjectIterator text_it; - for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) - { - LLHUDText *textp = text_it->get(); - textp->shift(offset); - } + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDText *textp = text_it->get(); + textp->shift(offset); + } } void LLHUDText::shift(const LLVector3& offset) { - mPositionAgent += offset; + mPositionAgent += offset; } //static // called when UI scale changes, to flush font width caches void LLHUDText::reshape() { - TextObjectIterator text_it; - for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) - { - LLHUDText* textp = (*text_it); - std::vector<LLHUDTextSegment>::iterator segment_iter; - for (segment_iter = textp->mTextSegments.begin(); - segment_iter != textp->mTextSegments.end(); ++segment_iter ) - { - segment_iter->clearFontWidthMap(); - } - } + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDText* textp = (*text_it); + std::vector<LLHUDTextSegment>::iterator segment_iter; + for (segment_iter = textp->mTextSegments.begin(); + segment_iter != textp->mTextSegments.end(); ++segment_iter ) + { + segment_iter->clearFontWidthMap(); + } + } } //============================================================================ F32 LLHUDText::LLHUDTextSegment::getWidth(const LLFontGL* font) { - std::map<const LLFontGL*, F32>::iterator iter = mFontWidthMap.find(font); - if (iter != mFontWidthMap.end()) - { - return iter->second; - } - else - { - F32 width = font->getWidthF32(mText.c_str()); - mFontWidthMap[font] = width; - return width; - } + std::map<const LLFontGL*, F32>::iterator iter = mFontWidthMap.find(font); + if (iter != mFontWidthMap.end()) + { + return iter->second; + } + else + { + F32 width = font->getWidthF32(mText.c_str()); + mFontWidthMap[font] = width; + return width; + } } |