void LLProgressView::drawStartTexture(F32 alpha) { gGL.pushMatrix(); if (gStartTexture) { LLGLSUIDefault gls_ui; gGL.getTexUnit(0)->bind(gStartTexture.get()); gGL.color4f(1.f, 1.f, 1.f, alpha); F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); F32 view_aspect = (F32)width / (F32)height; // stretch image to maintain aspect ratio if (image_aspect > view_aspect) { gGL.translatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); gGL.scalef(image_aspect / view_aspect, 1.f, 1.f); } else { gGL.translatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); gGL.scalef(1.f, view_aspect / image_aspect, 1.f); } gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } else { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color4f(0.f, 0.f, 0.f, 1.f); gl_rect_2d(getRect()); } gGL.popMatrix(); }
void LLProgressView::draw() { static LLTimer timer; // Paint bitmap if we've got one glPushMatrix(); if (gStartTexture) { LLGLSUIDefault gls_ui; gGL.getTexUnit(0)->bind(gStartTexture.get()); gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f); F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); F32 view_aspect = (F32)width / (F32)height; // stretch image to maintain aspect ratio if (image_aspect > view_aspect) { glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); glScalef(image_aspect / view_aspect, 1.f, 1.f); } else { glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); glScalef(1.f, view_aspect / image_aspect, 1.f); } gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } else { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color4f(0.f, 0.f, 0.f, 1.f); gl_rect_2d(getRect()); } glPopMatrix(); // Handle fade-in animation if (mFadeTimer.getStarted()) { LLPanel::draw(); if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME) { // Fade is complete, release focus gFocusMgr.releaseFocusIfNeeded( this ); LLPanel::setVisible(FALSE); mFadeTimer.stop(); gStartTexture = NULL; } return; } // draw children LLPanel::draw(); }
void render_disconnected_background() { if (!gDisconnectedImagep && gDisconnected) { llinfos << "Loading last bitmap..." << llendl; std::string temp_str; temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + SCREEN_LAST_FILENAME; LLPointer<LLImageBMP> image_bmp = new LLImageBMP; if( !image_bmp->load(temp_str) ) { //llinfos << "Bitmap load failed" << llendl; return; } LLPointer<LLImageRaw> raw = new LLImageRaw; if (!image_bmp->decode(raw, 0.0f)) { llinfos << "Bitmap decode failed" << llendl; gDisconnectedImagep = NULL; return; } U8 *rawp = raw->getData(); S32 npixels = (S32)image_bmp->getWidth()*(S32)image_bmp->getHeight(); for (S32 i = 0; i < npixels; i++) { S32 sum = 0; sum = *rawp + *(rawp+1) + *(rawp+2); sum /= 3; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; } raw->expandToPowerOfTwo(); gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE ); gStartTexture = gDisconnectedImagep; } // Make sure the progress view always fills the entire window. S32 width = gViewerWindow->getWindowWidthScaled(); S32 height = gViewerWindow->getWindowHeightScaled(); if (gDisconnectedImagep) { if (LLGLSLShader::sNoFixedFunction) { gUIProgram.bind(); } LLGLSUIDefault gls_ui; gViewerWindow->setup2DRender(); gGL.pushMatrix(); { // scale ui to reflect UIScaleFactor // this can't be done in setup2DRender because it requires a // pushMatrix/popMatrix pair const LLVector2& display_scale = gViewerWindow->getDisplayScale(); gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); gGL.getTexUnit(0)->bind(gDisconnectedImagep); gGL.color4f(1.f, 1.f, 1.f, 1.f); gl_rect_2d_simple_tex(width, height); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } gGL.popMatrix(); gGL.flush(); if (LLGLSLShader::sNoFixedFunction) { gUIProgram.unbind(); } } }
void render_disconnected_background() { if (!gDisconnectedImagep && gDisconnected) { llinfos << "Loading last bitmap..." << llendl; char temp_str[MAX_PATH]; /* Flawfinder: ignore */ strncpy(temp_str, gDirUtilp->getLindenUserDir().c_str(), MAX_PATH -1); /* Flawfinder: ignore */ temp_str[MAX_PATH -1] = '\0'; strncat(temp_str, gDirUtilp->getDirDelimiter().c_str(), MAX_PATH - strlen(temp_str) -1); /* Flawfinder: ignore */ strcat(temp_str, SCREEN_LAST_FILENAME); /* Flawfinder: ignore */ LLPointer<LLImageBMP> image_bmp = new LLImageBMP; if( !image_bmp->load(temp_str) ) { //llinfos << "Bitmap load failed" << llendl; return; } gDisconnectedImagep = new LLImageGL( FALSE ); LLPointer<LLImageRaw> raw = new LLImageRaw; if (!image_bmp->decode(raw)) { llinfos << "Bitmap decode failed" << llendl; gDisconnectedImagep = NULL; return; } U8 *rawp = raw->getData(); S32 npixels = (S32)image_bmp->getWidth()*(S32)image_bmp->getHeight(); for (S32 i = 0; i < npixels; i++) { S32 sum = 0; sum = *rawp + *(rawp+1) + *(rawp+2); sum /= 3; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; } raw->expandToPowerOfTwo(); gDisconnectedImagep->createGLTexture(0, raw); gStartImageGL = gDisconnectedImagep; LLImageGL::unbindTexture(0, GL_TEXTURE_2D); } // Make sure the progress view always fills the entire window. S32 width = gViewerWindow->getWindowWidth(); S32 height = gViewerWindow->getWindowHeight(); if (gDisconnectedImagep) { LLGLSUIDefault gls_ui; gViewerWindow->setup2DRender(); glPushMatrix(); { // scale ui to reflect UIScaleFactor // this can't be done in setup2DRender because it requires a // pushMatrix/popMatrix pair const LLVector2& display_scale = gViewerWindow->getDisplayScale(); glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); LLViewerImage::bindTexture(gDisconnectedImagep); glColor4f(1.f, 1.f, 1.f, 1.f); gl_rect_2d_simple_tex(width, height); LLImageGL::unbindTexture(0, GL_TEXTURE_2D); } glPopMatrix(); } }
BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height) { BOOL success = TRUE; if (!mTexLayer) { return success; } F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight(); BOOL weight_changed = effective_weight != mCachedEffectiveWeight; if (getSkip()) { return success; } LLTexLayerParamAlphaInfo *info = (LLTexLayerParamAlphaInfo *)getInfo(); gGL.flush(); if (info->mMultiplyBlend) { gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); // Multiplication: approximates a min() function } else { gGL.setSceneBlendType(LLRender::BT_ADD); // Addition: approximates a max() function } if (!info->mStaticImageFileName.empty() && !mStaticImageInvalid) { if (mStaticImageTGA.isNull()) { // Don't load the image file until we actually need it the first time. Like now. mStaticImageTGA = LLTexLayerStaticImageList::getInstance()->getImageTGA(info->mStaticImageFileName); // We now have something in one of our caches LLTexLayerSet::sHasCaches |= mStaticImageTGA.notNull() ? TRUE : FALSE; if (mStaticImageTGA.isNull()) { llwarns << "Unable to load static file: " << info->mStaticImageFileName << llendl; mStaticImageInvalid = TRUE; // don't try again. return FALSE; } } const S32 image_tga_width = mStaticImageTGA->getWidth(); const S32 image_tga_height = mStaticImageTGA->getHeight(); if (!mCachedProcessedTexture || (mCachedProcessedTexture->getWidth() != image_tga_width) || (mCachedProcessedTexture->getHeight() != image_tga_height) || (weight_changed)) { // llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl; mCachedEffectiveWeight = effective_weight; if (!mCachedProcessedTexture) { mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE); // We now have something in one of our caches LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE; mCachedProcessedTexture->setExplicitFormat(GL_ALPHA8, GL_ALPHA); } // Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed. mStaticImageRaw = NULL; mStaticImageRaw = new LLImageRaw; mStaticImageTGA->decodeAndProcess(mStaticImageRaw, info->mDomain, effective_weight); mNeedsCreateTexture = TRUE; } if (mCachedProcessedTexture) { { // Create the GL texture, and then hang onto it for future use. if (mNeedsCreateTexture) { mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw); mNeedsCreateTexture = FALSE; gGL.getTexUnit(0)->bind(mCachedProcessedTexture); mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP); } LLGLSNoAlphaTest gls_no_alpha_test; gGL.getTexUnit(0)->bind(mCachedProcessedTexture); gl_rect_2d_simple_tex(width, height); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); stop_glerror(); } } // Don't keep the cache for other people's avatars // (It's not really a "cache" in that case, but the logic is the same) if (!mAvatar->isSelf()) { mCachedProcessedTexture = NULL; } } else { LLGLDisable no_alpha(GL_ALPHA_TEST); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.color4f(0.f, 0.f, 0.f, effective_weight); gl_rect_2d_simple(width, height); } return success; }
void LLProgressView::draw() { static LLTimer timer; if (gNoRender) { return; } // Make sure the progress view always fills the entire window. S32 width = gViewerWindow->getWindowWidth(); S32 height = gViewerWindow->getWindowHeight(); if( (width != getRect().getWidth()) || (height != getRect().getHeight()) ) { reshape( width, height ); } // Paint bitmap if we've got one glPushMatrix(); if (gStartImageGL) { LLGLSUIDefault gls_ui; LLViewerImage::bindTexture(gStartImageGL); gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f); F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; F32 view_aspect = (F32)width / (F32)height; // stretch image to maintain aspect ratio if (image_aspect > view_aspect) { glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); glScalef(image_aspect / view_aspect, 1.f, 1.f); } else { glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); glScalef(1.f, view_aspect / image_aspect, 1.f); } gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); gStartImageGL->unbindTexture(0, GL_TEXTURE_2D); } else { LLGLSNoTexture gls_no_texture; gGL.color4f(0.f, 0.f, 0.f, 1.f); gl_rect_2d(getRect()); } glPopMatrix(); // Handle fade-in animation if (mFadeTimer.getStarted()) { LLView::draw(); if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME) { gFocusMgr.removeTopCtrlWithoutCallback(this); LLView::setVisible(FALSE); gStartImageGL = NULL; } return; } S32 line_x = getRect().getWidth() / 2; S32 line_one_y = getRect().getHeight() / 2 + 64; const S32 LINE_SPACING = 25; S32 line_two_y = line_one_y - LINE_SPACING; const LLFontGL* font = LLFontGL::sSansSerif; LLUIImagePtr shadow_imagep = LLUI::getUIImage("rounded_square_soft.tga"); LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga"); LLUIImagePtr bar_bg_imagep = LLUI::getUIImage("progressbar_track.tga"); LLUIImagePtr bar_imagep = LLUI::getUIImage("rounded_square.tga"); LLColor4 background_color = gColors.getColor("LoginProgressBarBgColor"); F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); // background_color.mV[3] = background_color.mV[3]*alpha; std::string top_line = LLAppViewer::instance()->getSecondLifeTitle(); S32 bar_bottom = line_two_y - 30; S32 bar_height = 18; S32 bar_width = getRect().getWidth() * 2 / 3; S32 bar_left = (getRect().getWidth() / 2) - (bar_width / 2); // translucent outline box S32 background_box_left = ( ( ( getRect().getWidth() / 2 ) - ( bar_width / 2 ) ) / 4 ) * 3; S32 background_box_top = ( getRect().getHeight() / 2 ) + LINE_SPACING * 5; S32 background_box_right = getRect().getWidth() - background_box_left; S32 background_box_bottom = ( getRect().getHeight() / 2 ) - LINE_SPACING * 5; S32 background_box_width = background_box_right - background_box_left + 1; S32 background_box_height = background_box_top - background_box_bottom + 1; // shadow_imagep->draw( background_box_left + 2, // background_box_bottom - 2, // background_box_width, // background_box_height, // gColors.getColor( "LoginProgressBoxShadowColor" ) ); // bar_outline_imagep->draw( background_box_left, // background_box_bottom, // background_box_width, // background_box_height, // gColors.getColor("LoginProgressBoxBorderColor") ); bar_imagep->draw( background_box_left + 1, background_box_bottom + 1, background_box_width - 2, background_box_height - 2, gColors.getColor("LoginProgressBoxCenterColor") ); // we'll need this later for catching a click if it looks like it contains a link if ( mMessage.find( "http://" ) != std::string::npos ) mOutlineRect.set( background_box_left, background_box_top, background_box_right, background_box_bottom ); else mOutlineRect.set( 0, 0, 0, 0 ); // draw loading bar font->renderUTF8(top_line, 0, line_x, line_one_y, //LLColor4::white, gColors.getColor("LoginProgressBoxTextColor"), LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); font->renderUTF8(mText, 0, line_x, line_two_y, //LLColor4::white, gColors.getColor("LoginProgressBoxTextColor"), LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); // shadow_imagep->draw( // bar_left + 2, // bar_bottom - 2, // bar_width, // bar_height, // gColors.getColor("LoginProgressBoxShadowColor")); // bar_imagep->draw( // bar_left, // bar_bottom, // bar_width, // bar_height, // LLColor4(0.7f, 0.7f, 0.8f, 1.0f)); bar_bg_imagep->draw( bar_left + 2, bar_bottom + 2, bar_width - 4, bar_height - 4, background_color); LLColor4 bar_color = gColors.getColor("LoginProgressBarFgColor"); bar_color.mV[3] = alpha; bar_fg_imagep->draw( bar_left + 2, bar_bottom + 2, llround((bar_width - 4) * (mPercentDone / 100.f)), bar_height - 4, bar_color); S32 line_three_y = line_two_y - LINE_SPACING * 3; // draw the message if there is one if(!mMessage.empty()) { LLColor4 text_message_color = gColors.getColor("LoginProgressBoxTextColor"); LLWString wmessage = utf8str_to_wstring(mMessage); const F32 MAX_PIXELS = 640.0f; S32 chars_left = wmessage.length(); S32 chars_this_time = 0; S32 msgidx = 0; while(chars_left > 0) { chars_this_time = font->maxDrawableChars(wmessage.substr(msgidx).c_str(), MAX_PIXELS, MAX_STRING - 1, TRUE); LLWString wbuffer = wmessage.substr(msgidx, chars_this_time); font->render(wbuffer, 0, (F32)line_x, (F32)line_three_y, //LLColor4::white, gColors.getColor("LoginProgressBoxTextColor"), LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); msgidx += chars_this_time; chars_left -= chars_this_time; line_three_y -= LINE_SPACING; } } // draw children LLView::draw(); }