diff options
46 files changed, 283 insertions, 352 deletions
| diff --git a/indra/llappearance/llavatarappearancedefines.cpp b/indra/llappearance/llavatarappearancedefines.cpp index 5f98f2c8c1..47798844bc 100644 --- a/indra/llappearance/llavatarappearancedefines.cpp +++ b/indra/llappearance/llavatarappearancedefines.cpp @@ -300,7 +300,8 @@ EBakedTextureIndex LLAvatarAppearanceDictionary::findBakedByImageName(std::strin  LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIndex index ) const  { -    return getTexture(index)->mWearableType; +    auto* tex = getTexture(index); +    return tex ? tex->mWearableType : LLWearableType::WT_INVALID;  }  // static diff --git a/indra/llappearance/llwearable.cpp b/indra/llappearance/llwearable.cpp index a7e5292fed..f30c147b91 100644 --- a/indra/llappearance/llwearable.cpp +++ b/indra/llappearance/llwearable.cpp @@ -652,7 +652,7 @@ void LLWearable::setVisualParamWeight(S32 param_index, F32 value)      }      else      { -        LL_ERRS() << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << LL_ENDL; +        LL_WARNS() << "LLWearable::setVisualParam passed invalid parameter index: " << param_index << " for wearable type: " << this->getName() << LL_ENDL;      }  } @@ -665,7 +665,7 @@ F32 LLWearable::getVisualParamWeight(S32 param_index) const      }      else      { -        LL_WARNS() << "LLWerable::getVisualParam passed invalid parameter index: "  << param_index << " for wearable type: " << this->getName() << LL_ENDL; +        LL_WARNS() << "LLWearable::getVisualParam passed invalid parameter index: "  << param_index << " for wearable type: " << this->getName() << LL_ENDL;      }      return (F32)-1.0;  } diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index 45396ce9c7..42ee2a6d2c 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -2033,43 +2033,43 @@ F32 LLSettingsSky::getGamma() const      return mGamma;  } -F32 LLSettingsSky::getHDRMin() const +F32 LLSettingsSky::getHDRMin(bool auto_adjust) const  { -    if (mCanAutoAdjust) +    if (mCanAutoAdjust && !auto_adjust)          return 0.f;      return mHDRMin;  } -F32 LLSettingsSky::getHDRMax() const +F32 LLSettingsSky::getHDRMax(bool auto_adjust) const  { -    if (mCanAutoAdjust) +    if (mCanAutoAdjust && !auto_adjust)          return 0.f;      return mHDRMax;  } -F32 LLSettingsSky::getHDROffset() const +F32 LLSettingsSky::getHDROffset(bool auto_adjust) const  { -    if (mCanAutoAdjust) +    if (mCanAutoAdjust && !auto_adjust)          return 1.0f;      return mHDROffset;  } -F32 LLSettingsSky::getTonemapMix() const +F32 LLSettingsSky::getTonemapMix(bool auto_adjust) const  { -    if (mCanAutoAdjust) +    if (mCanAutoAdjust && !auto_adjust) +    { +        // legacy settings do not support tonemaping          return 0.0f; +    }      return mTonemapMix;  }  void LLSettingsSky::setTonemapMix(F32 mix)  { -    if (mCanAutoAdjust) -        return; -      mTonemapMix = mix;  } diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h index 4c635fd946..801fafff4b 100644 --- a/indra/llinventory/llsettingssky.h +++ b/indra/llinventory/llsettingssky.h @@ -209,10 +209,10 @@ public:      F32 getGamma() const; -    F32 getHDRMin() const; -    F32 getHDRMax() const; -    F32 getHDROffset() const; -    F32 getTonemapMix() const; +    F32 getHDRMin(bool auto_adjust = false) const; +    F32 getHDRMax(bool auto_adjust = false) const; +    F32 getHDROffset(bool auto_adjust = false) const; +    F32 getTonemapMix(bool auto_adjust = false) const;      void setTonemapMix(F32 mix);      void setGamma(F32 val); diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp index 4e7fa7316e..253286fb1c 100644 --- a/indra/llrender/llcubemaparray.cpp +++ b/indra/llrender/llcubemaparray.cpp @@ -109,7 +109,7 @@ LLCubeMapArray::~LLCubeMapArray()  {  } -void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool use_mips) +void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool use_mips, bool hdr)  {      U32 texname = 0;      mWidth = resolution; @@ -128,6 +128,10 @@ void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool us      free_cur_tex_image();      U32 format = components == 4 ? GL_RGBA16F : GL_RGB16F; +    if (!hdr) +    { +        format = components == 4 ? GL_RGBA8 : GL_RGB8; +    }      U32 mip = 0;      U32 mip_resolution = resolution;      while (mip_resolution >= 1) diff --git a/indra/llrender/llcubemaparray.h b/indra/llrender/llcubemaparray.h index 675aaaf07c..bfc72a321d 100644 --- a/indra/llrender/llcubemaparray.h +++ b/indra/llrender/llcubemaparray.h @@ -52,7 +52,7 @@ public:      // components - number of components per pixel      // count - number of cube maps in the array      // use_mips - if true, mipmaps will be allocated for this cube map array and anisotropic filtering will be used -    void allocate(U32 res, U32 components, U32 count, bool use_mips = true); +    void allocate(U32 res, U32 components, U32 count, bool use_mips = true, bool hdr = true);      void bind(S32 stage);      void unbind(); diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index fa76669258..1ca4c8c079 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -554,7 +554,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l          return NULL;      llassert(!mIsFallback); -    fontp->renderGlyph(requested_glyph_type, glyph_index); +    fontp->renderGlyph(requested_glyph_type, glyph_index, wch);      EFontGlyphType bitmap_glyph_type = EFontGlyphType::Unspecified;      switch (fontp->mFTFace->glyph->bitmap.pixel_mode) @@ -699,7 +699,7 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const      }  } -void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const +void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const  {      if (mFTFace == NULL)          return; @@ -714,11 +714,28 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) co      FT_Error error = FT_Load_Glyph(mFTFace, glyph_index, load_flags);      if (FT_Err_Ok != error)      { +        if (error == FT_Err_Out_Of_Memory) +        { +            LLError::LLUserWarningMsg::showOutOfMemory(); +            LL_ERRS() << "Out of memory loading glyph for character " << wch << LL_ENDL; +        } +          std::string message = llformat( -            "Error %d (%s) loading glyph %u: bitmap_type=%u, load_flags=%d", -            error, FT_Error_String(error), glyph_index, bitmap_type, load_flags); +            "Error %d (%s) loading wchar %u glyph %u/%u: bitmap_type=%u, load_flags=%d", +            error, FT_Error_String(error), wch, glyph_index, mFTFace->num_glyphs, bitmap_type, load_flags);          LL_WARNS_ONCE() << message << LL_ENDL;          error = FT_Load_Glyph(mFTFace, glyph_index, load_flags ^ FT_LOAD_COLOR); +        if (FT_Err_Invalid_Outline == error +            || FT_Err_Invalid_Composite == error +            || (FT_Err_Ok != error && LLStringOps::isEmoji(wch))) +        { +            glyph_index = FT_Get_Char_Index(mFTFace, '?'); +            // if '?' is not present, potentially can use last index, that's supposed to be null glyph +            if (glyph_index > 0) +            { +                error = FT_Load_Glyph(mFTFace, glyph_index, load_flags ^ FT_LOAD_COLOR); +            } +        }          llassert_always_msg(FT_Err_Ok == error, message.c_str());      } diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index eba89f5def..1ad795060a 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -156,7 +156,7 @@ private:      bool hasGlyph(llwchar wch) const;       // Has a glyph for this character      LLFontGlyphInfo* addGlyph(llwchar wch, EFontGlyphType glyph_type) const;        // Add a new character to the font if necessary      LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) -    void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const; +    void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const;      void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const;      std::string mName; diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index 62ef2a0626..82637e33ea 100644 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -414,6 +414,7 @@ public:      virtual void doItem(LLFolderViewItem* item) {}      void setApply(bool apply);      void clearOpenFolders() { mOpenFolders.clear(); } +    bool hasOpenFolders() { return !mOpenFolders.empty(); }  protected:      std::set<LLUUID> mOpenFolders;      bool mApply; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index a48bd35765..fe2224b845 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -44,6 +44,7 @@  #include "llstring.h"  #include "lldir.h"  #include "llsdutil.h" +#include "llsys.h"  #include "llglslshader.h"  #include "llthreadsafequeue.h"  #include "stringize.h" @@ -4670,6 +4671,23 @@ void LLWindowWin32::LLWindowWin32Thread::checkDXMem()                      // Alternatively use GetDesc from below to get adapter's memory                      UINT64 budget_mb = info.Budget / (1024 * 1024); +                    if (gGLManager.mIsIntel) +                    { +                        U32Megabytes phys_mb = gSysMemory.getPhysicalMemoryKB(); +                        LL_WARNS() << "Physical memory: " << phys_mb << " MB" << LL_ENDL; + +                        if (phys_mb > 0) +                        { +                            // Intel uses 'shared' vram, cap it to 25% of total memory +                            // Todo: consider caping all adapters at least to 50% ram +                            budget_mb = llmin(budget_mb, (UINT64)(phys_mb * 0.25)); +                        } +                        else +                        { +                            // if no data available, cap to 2Gb +                            budget_mb = llmin(budget_mb, (UINT64)2048); +                        } +                    }                      if (gGLManager.mVRAM < (S32)budget_mb)                      {                          gGLManager.mVRAM = (S32)budget_mb; diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index e0eaaa0bbc..0f9f025fe4 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.11 +7.1.12 diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index d6569cda33..50b40e9c20 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -150,7 +150,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec          float amb_da = 0.0;//ambiance;          if (da > 0.0)          { -            lit = max(da * dist_atten,0.0); +            lit = clamp(da * dist_atten, 0.0, 1.0);              col = lit * light_col * diffuse;              amb_da += (da*0.5+0.5) * ambiance;          } diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index a4d3962d12..f8803f1a29 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -140,7 +140,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe          float amb_da = ambiance;          if (da >= 0.0)          { -            lit = max(da * dist_atten, 0.0); +            lit = clamp(da * dist_atten, 0.0, 1.0);              col = lit * light_col * diffuse;              amb_da += (da*0.5 + 0.5) * ambiance;          } diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 4bae7b6deb..6df0403198 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -38,6 +38,8 @@ uniform float max_probe_lod;  uniform bool transparent_surface; +uniform int classic_mode; +  #define MAX_REFMAP_COUNT 256  // must match LL_MAX_REFLECTION_PROBE_COUNT  layout (std140) uniform ReflectionProbes @@ -739,7 +741,10 @@ void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,      vec3 refnormpersp = reflect(pos.xyz, norm.xyz); -    ambenv = sampleProbeAmbient(pos, norm, amblit); +    ambenv = amblit; + +    if (classic_mode == 0) +        ambenv = sampleProbeAmbient(pos, norm, amblit);      float lod = (1.0-glossiness)*reflection_lods;      glossenv = sampleProbes(pos, normalize(refnormpersp), lod); @@ -845,7 +850,10 @@ void sampleReflectionProbesLegacy(out vec3 ambenv, out vec3 glossenv, out vec3 l      vec3 refnormpersp = reflect(pos.xyz, norm.xyz); -    ambenv = sampleProbeAmbient(pos, norm, amblit); +    ambenv = amblit; + +    if (classic_mode == 0) +        ambenv = sampleProbeAmbient(pos, norm, amblit);      if (glossiness > 0.0)      { diff --git a/indra/newview/llheroprobemanager.cpp b/indra/newview/llheroprobemanager.cpp index 368306ded8..cf606e8863 100644 --- a/indra/newview/llheroprobemanager.cpp +++ b/indra/newview/llheroprobemanager.cpp @@ -89,9 +89,11 @@ void LLHeroProbeManager::update()      initReflectionMaps(); +    static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); +      if (!mRenderTarget.isComplete())      { -        U32 color_fmt = GL_RGBA16F; +        U32 color_fmt = render_hdr ? GL_RGBA16F : GL_RGBA8;          mRenderTarget.allocate(mProbeResolution, mProbeResolution, color_fmt, true);      } @@ -103,7 +105,7 @@ void LLHeroProbeManager::update()          mMipChain.resize(count);          for (U32 i = 0; i < count; ++i)          { -            mMipChain[i].allocate(res, res, GL_RGBA16F); +            mMipChain[i].allocate(res, res, render_hdr ? GL_RGBA16F : GL_RGBA8);              res /= 2;          }      } @@ -220,7 +222,7 @@ void LLHeroProbeManager::renderProbes()      static LLCachedControl<S32> sUpdateRate(gSavedSettings, "RenderHeroProbeUpdateRate", 0);      F32 near_clip = 0.01f; -    if (mNearestHero != nullptr && +    if (mNearestHero != nullptr && !mNearestHero->isDead() &&          !gTeleportDisplay && !gDisconnected && !LLAppViewer::instance()->logoutRequestSent())      {          LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("hpmu - realtime"); @@ -249,12 +251,13 @@ void LLHeroProbeManager::renderProbes()              LL_PROFILE_ZONE_NUM(gFrameCount % rate);              LL_PROFILE_ZONE_NUM(rate); +            bool dynamic = mNearestHero->getReflectionProbeIsDynamic() && sDetail() > 0;              for (U32 i = 0; i < 6; ++i)              {                  if ((gFrameCount % rate) == (i % rate))                  { // update 6/rate faces per frame                      LL_PROFILE_ZONE_NUM(i); -                    updateProbeFace(mProbes[0], i, mNearestHero->getReflectionProbeIsDynamic() && sDetail > 0, near_clip); +                    updateProbeFace(mProbes[0], i, dynamic, near_clip);                  }              }              generateRadiance(mProbes[0]); @@ -539,8 +542,10 @@ void LLHeroProbeManager::initReflectionMaps()          mTexture = new LLCubeMapArray(); +        static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); +          // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source) -        mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2); +        mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr);          if (mDefaultProbe.isNull())          { diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index dbf56c2b6d..7910bcb41d 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -139,32 +139,60 @@ void LLPanelContents::getState(LLViewerObject *objectp )  void LLPanelContents::onFilterEdit()  {      const std::string& filter_substring = mFilterEditor->getText(); -    if (filter_substring.empty()) +    if (!mPanelInventoryObject->hasInventory())      { -        if (mPanelInventoryObject->getFilter().getFilterSubString().empty()) -        { -            // The current filter and the new filter are empty, nothing to do -            return; -        } - -        mSavedFolderState.setApply(true); -        mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState); - -        // Add a folder with the current item to the list of previously opened folders -        LLOpenFoldersWithSelection opener; -        mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(opener); -        mPanelInventoryObject->getRootFolder()->scrollToShowSelection(); +        mDirtyFilter = true;      } -    else if (mPanelInventoryObject->getFilter().getFilterSubString().empty()) +    else      { -        // The first letter in search term, save existing folder open state -        if (!mPanelInventoryObject->getFilter().isNotDefault()) +        LLFolderView* root_folder = mPanelInventoryObject->getRootFolder(); +        if (filter_substring.empty())          { -            mSavedFolderState.setApply(false); -            mPanelInventoryObject->getRootFolder()->applyFunctorRecursively(mSavedFolderState); +            if (mPanelInventoryObject->getFilter().getFilterSubString().empty()) +            { +                // The current filter and the new filter are empty, nothing to do +                return; +            } + +            if (mDirtyFilter && !mSavedFolderState.hasOpenFolders()) +            { +                if (root_folder) +                { +                    root_folder->setOpenArrangeRecursively(true, LLFolderViewFolder::ERecurseType::RECURSE_DOWN); +                } +            } +            else +            { +                mSavedFolderState.setApply(true); +                if (root_folder) +                { +                    root_folder->applyFunctorRecursively(mSavedFolderState); +                } +            } +            mDirtyFilter = false; + +            // Add a folder with the current item to the list of previously opened folders +            if (root_folder) +            { +                LLOpenFoldersWithSelection opener; +                root_folder->applyFunctorRecursively(opener); +                root_folder->scrollToShowSelection(); +            } +        } +        else if (mPanelInventoryObject->getFilter().getFilterSubString().empty()) +        { +            // The first letter in search term, save existing folder open state +            if (!mPanelInventoryObject->getFilter().isNotDefault()) +            { +                mSavedFolderState.setApply(false); +                if (root_folder) +                { +                    root_folder->applyFunctorRecursively(mSavedFolderState); +                } +                mDirtyFilter = false; +            }          }      } -      mPanelInventoryObject->getFilter().setFilterSubString(filter_substring);  } diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index bb6308e8b8..6e02b17bab 100644 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -70,6 +70,8 @@ protected:      void getState(LLViewerObject *object);      void onFilterEdit(); +    bool mDirtyFilter { false }; +  public:      class LLFilterEditor* mFilterEditor;      LLSaveFolderState mSavedFolderState; diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index abb48dbeed..154639e4bb 100644 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -85,6 +85,8 @@ public:      static void idle(void* user_data); +    bool hasInventory(){ return mHaveInventory; }; +  protected:      void reset();      /*virtual*/ void inventoryChanged(LLViewerObject* object, diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 3add43a3c0..2c09943b83 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -81,10 +81,9 @@ bool LLProgressView::postBuild()  {      mProgressBar = getChild<LLProgressBar>("login_progress_bar"); -    mLogosLabel = getChild<LLTextBox>("logos_lbl"); -      mProgressText = getChild<LLTextBox>("progress_text");      mMessageText = getChild<LLTextBox>("message_text"); +    mMessageTextRectInitial = mMessageText->getRect(); // auto resizes, save initial size      // media control that is used to play intro video      mMediaCtrl = getChild<LLMediaCtrl>("login_media_panel"); @@ -96,6 +95,12 @@ bool LLProgressView::postBuild()      mCancelBtn = getChild<LLButton>("cancel_btn");      mCancelBtn->setClickedCallback(  LLProgressView::onCancelButtonClicked, NULL ); +    mLayoutPanel4 = getChild<LLView>("panel4"); +    mLayoutPanel4RectInitial = mLayoutPanel4->getRect(); + +    mLayoutMOTD = getChild<LLView>("panel_motd"); +    mLayoutMOTDRectInitial = mLayoutMOTD->getRect(); +      getChild<LLTextBox>("title_text")->setText(LLStringExplicit(LLAppViewer::instance()->getSecondLifeTitle()));      getChild<LLTextBox>("message_text")->setClickedCallback(onClickMessage, this); @@ -234,33 +239,6 @@ void LLProgressView::drawStartTexture(F32 alpha)      gGL.popMatrix();  } -void LLProgressView::drawLogos(F32 alpha) -{ -    if (mLogosList.empty()) -    { -        return; -    } - -    // logos are tied to label, -    // due to potential resizes we have to figure offsets out on draw or resize -    S32 offset_x, offset_y; -    mLogosLabel->localPointToScreen(0, 0, &offset_x, &offset_y); -    std::vector<TextureData>::const_iterator iter = mLogosList.begin(); -    std::vector<TextureData>::const_iterator end = mLogosList.end(); -    for (; iter != end; iter++) -    { -        gl_draw_scaled_image_with_border(iter->mDrawRect.mLeft + offset_x, -                             iter->mDrawRect.mBottom + offset_y, -                             iter->mDrawRect.getWidth(), -                             iter->mDrawRect.getHeight(), -                             iter->mTexturep.get(), -                             UI_VERTEX_COLOR % alpha, -                             false, -                             iter->mClipRect, -                             iter->mOffsetRect); -    } -} -  void LLProgressView::draw()  {      static LLTimer timer; @@ -276,7 +254,6 @@ void LLProgressView::draw()          }          LLPanel::draw(); -        drawLogos(alpha);          return;      } @@ -289,7 +266,6 @@ void LLProgressView::draw()          drawStartTexture(alpha);          LLPanel::draw(); -        drawLogos(alpha);          // faded out completely - remove panel and reveal world          if (mFadeToWorldTimer.getElapsedTimeF32() > FADE_TO_WORLD_TIME ) @@ -324,7 +300,6 @@ void LLProgressView::draw()      drawStartTexture(1.0f);      // draw children      LLPanel::draw(); -    drawLogos(1.0f);  }  void LLProgressView::setText(const std::string& text) @@ -341,109 +316,18 @@ void LLProgressView::setMessage(const std::string& msg)  {      mMessage = msg;      mMessageText->setValue(mMessage); -} - -void LLProgressView::loadLogo(const std::string &path, -                              const U8 image_codec, -                              const LLRect &pos_rect, -                              const LLRectf &clip_rect, -                              const LLRectf &offset_rect) -{ -    // We need these images very early, so we have to force-load them, otherwise they might not load in time. -    if (!gDirUtilp->fileExists(path)) +    S32 height = mMessageText->getTextPixelHeight(); +    S32 delta  = height - mMessageTextRectInitial.getHeight(); +    if (delta > 0)      { -        return; +        mLayoutPanel4->reshape(mLayoutPanel4RectInitial.getWidth(), mLayoutPanel4RectInitial.getHeight() + delta); +        mLayoutMOTD->reshape(mLayoutMOTDRectInitial.getWidth(), mLayoutMOTDRectInitial.getHeight() + delta);      } - -    LLPointer<LLImageFormatted> start_image_frmted = LLImageFormatted::createFromType(image_codec); -    if (!start_image_frmted->load(path)) -    { -        LL_WARNS("AppInit") << "Image load failed: " << path << LL_ENDL; -        return; -    } - -    LLPointer<LLImageRaw> raw = new LLImageRaw; -    if (!start_image_frmted->decode(raw, 0.0f)) +    else      { -        LL_WARNS("AppInit") << "Image decode failed " << path << LL_ENDL; -        return; +        mLayoutPanel4->reshape(mLayoutPanel4RectInitial.getWidth(), mLayoutPanel4RectInitial.getHeight()); +        mLayoutMOTD->reshape(mLayoutMOTDRectInitial.getWidth(), mLayoutMOTDRectInitial.getHeight());      } -    // HACK: getLocalTexture allows only power of two dimentions -    raw->expandToPowerOfTwo(); - -    TextureData data; -    data.mTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), false); -    data.mDrawRect = pos_rect; -    data.mClipRect = clip_rect; -    data.mOffsetRect = offset_rect; -    mLogosList.push_back(data); -} - -void LLProgressView::initLogos() -{ -    mLogosList.clear(); - -#if LL_FMODSTUDIO || LL_HAVOK -    const U8 image_codec = IMG_CODEC_PNG; -    const LLRectf default_clip(0.f, 1.f, 1.f, 0.f); -    //const S32 default_height = 28; -    const S32 default_pad = 15; - -    S32 icon_width, icon_height; - -    // We don't know final screen rect yet, so we can't precalculate position fully -    S32 texture_start_x = (S32)mLogosLabel->getFont()->getWidthF32(mLogosLabel->getWText().c_str()) + default_pad; -    S32 texture_start_y = -7; -#endif //LL_FMODSTUDIO || LL_HAVOK - -    // Normally we would just preload these textures from textures.xml, -    // and display them via icon control, but they are only needed on -    // startup and preloaded/UI ones stay forever -    // (and this code was done already so simply reused it) -    std::string temp_str = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "textures", "3p_icons"); - -    temp_str += gDirUtilp->getDirDelimiter(); - -#ifdef LL_FMODSTUDIO -    // original image size is 264x96, it is on longer side but -    // with no internal paddings so it gets additional padding -    icon_width = 77; -    icon_height = 21; -    S32 pad_fmod_y = 4; -    texture_start_x++; -    loadLogo(temp_str + "fmod_logo.png", -        image_codec, -        LLRect(texture_start_x, texture_start_y + pad_fmod_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_fmod_y), -        default_clip, -        default_clip); - -    texture_start_x += icon_width + default_pad + 1; -#endif //LL_FMODSTUDIO -#ifdef LL_HAVOK -    // original image size is 342x113, central element is on a larger side -    // plus internal padding, so it gets slightly more height than desired 32 -    icon_width = 88; -    icon_height = 29; -    S32 pad_havok_y = -1; -    loadLogo(temp_str + "havok_logo.png", -        image_codec, -        LLRect(texture_start_x, texture_start_y + pad_havok_y + icon_height, texture_start_x + icon_width, texture_start_y + pad_havok_y), -        default_clip, -        default_clip); - -    texture_start_x += icon_width + default_pad; -#endif //LL_HAVOK - -/* -    // 108x41 -    icon_width = 74; -    icon_height = default_height; -    loadLogo(temp_str + "vivox_logo.png", -        image_codec, -        LLRect(texture_start_x, texture_start_y + icon_height, texture_start_x + icon_width, texture_start_y), -        default_clip, -        default_clip); -*/  }  void LLProgressView::initStartTexture(S32 location_id, bool is_in_production) @@ -524,19 +408,11 @@ void LLProgressView::initStartTexture(S32 location_id, bool is_in_production)  void LLProgressView::initTextures(S32 location_id, bool is_in_production)  {      initStartTexture(location_id, is_in_production); -    initLogos(); - -    childSetVisible("panel_icons", !mLogosList.empty()); -    childSetVisible("panel_top_spacer", mLogosList.empty());  }  void LLProgressView::releaseTextures()  {      gStartTexture = NULL; -    mLogosList.clear(); - -    childSetVisible("panel_top_spacer", true); -    childSetVisible("panel_icons", false);  }  void LLProgressView::setCancelButtonVisible(bool b, const std::string& label) diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 15b04a8eb9..250ee511d7 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -53,7 +53,6 @@ public:      /*virtual*/ void draw();      void drawStartTexture(F32 alpha); -    void drawLogos(F32 alpha);      /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask);      /*virtual*/ bool handleKeyHere(KEY key, MASK mask); @@ -86,7 +85,6 @@ public:  protected:      LLProgressBar* mProgressBar;      LLMediaCtrl* mMediaCtrl; -    LLTextBox* mLogosLabel = nullptr;      LLTextBox* mProgressText = nullptr;      LLTextBox* mMessageText = nullptr;      F32 mPercentDone; @@ -95,6 +93,13 @@ protected:      LLFrameTimer mFadeToWorldTimer;      LLFrameTimer mFadeFromLoginTimer;      LLRect mOutlineRect; +    LLView* mLayoutPanel4 = nullptr; +    LLView* mLayoutMOTD = nullptr; +    // Rects for resizing purposes +    LLRect mMessageTextRectInitial; +    LLRect mLayoutPanel4RectInitial; +    LLRect mLayoutMOTDRectInitial; +      bool mMouseDownInActiveArea;      bool mStartupComplete; @@ -105,25 +110,8 @@ protected:      bool handleUpdate(const LLSD& event_data);      static void onIdle(void* user_data); -    void loadLogo(const std::string &path, const U8 image_codec, const LLRect &pos_rect, const LLRectf &clip_rect, const LLRectf &offset_rect); -    // logos have unusual location and need to be preloaded to not appear grey, then deleted -    void initLogos();      // Loads a bitmap to display during load      void initStartTexture(S32 location_id, bool is_in_production); - -private: -    // We need to draw textures on login, but only once. -    // So this vector gets filled up for textures to render and gets cleaned later -    // Some textures have unusual requirements, so we are rendering directly -    class TextureData -    { -    public: -        LLPointer<LLViewerTexture> mTexturep; -        LLRect mDrawRect; -        LLRectf mClipRect; -        LLRectf mOffsetRect; -    }; -    std::vector<TextureData> mLogosList;  };  #endif // LL_LLPROGRESSVIEW_H diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp index f77d37f821..1196d138e9 100644 --- a/indra/newview/llreflectionmap.cpp +++ b/indra/newview/llreflectionmap.cpp @@ -65,8 +65,9 @@ void LLReflectionMap::update(U32 resolution, U32 face, bool force_dynamic, F32 n      }      F32 clip = (near_clip > 0) ? near_clip : getNearClip(); +    bool dynamic = force_dynamic || getIsDynamic(); -    gViewerWindow->cubeSnapshot(LLVector3(mOrigin), mCubeArray, mCubeIndex, face, clip, getIsDynamic() || force_dynamic, useClipPlane, clipPlane); +    gViewerWindow->cubeSnapshot(LLVector3(mOrigin), mCubeArray, mCubeIndex, face, clip, dynamic, useClipPlane, clipPlane);  }  void LLReflectionMap::autoAdjustOrigin() @@ -185,7 +186,7 @@ void LLReflectionMap::autoAdjustOrigin()      }  } -bool LLReflectionMap::intersects(LLReflectionMap* other) +bool LLReflectionMap::intersects(LLReflectionMap* other) const  {      LLVector4a delta;      delta.setSub(other->mOrigin, mOrigin); @@ -201,24 +202,24 @@ bool LLReflectionMap::intersects(LLReflectionMap* other)  extern LLControlGroup gSavedSettings; -F32 LLReflectionMap::getAmbiance() +F32 LLReflectionMap::getAmbiance() const  {      F32 ret = 0.f; -    if (mViewerObject && mViewerObject->getVolume()) +    if (mViewerObject && mViewerObject->getVolumeConst())      { -        ret = ((LLVOVolume*)mViewerObject)->getReflectionProbeAmbiance(); +        ret = mViewerObject->getReflectionProbeAmbiance();      }      return ret;  } -F32 LLReflectionMap::getNearClip() +F32 LLReflectionMap::getNearClip() const  {      const F32 MINIMUM_NEAR_CLIP = 0.1f;      F32 ret = 0.f; -    if (mViewerObject && mViewerObject->getVolume()) +    if (mViewerObject && mViewerObject->getVolumeConst())      {          ret = mViewerObject->getReflectionProbeNearClip();      } @@ -234,11 +235,13 @@ F32 LLReflectionMap::getNearClip()      return llmax(ret, MINIMUM_NEAR_CLIP);  } -bool LLReflectionMap::getIsDynamic() +bool LLReflectionMap::getIsDynamic() const  { -    if (gSavedSettings.getS32("RenderReflectionProbeDetail") > (S32) LLReflectionMapManager::DetailLevel::STATIC_ONLY && +    static LLCachedControl<S32> detail(gSavedSettings, "RenderReflectionProbeDetail", 1); +    if (detail() > (S32)LLReflectionMapManager::DetailLevel::STATIC_ONLY &&          mViewerObject && -        mViewerObject->getVolume()) +        !mViewerObject->isDead() && +        mViewerObject->getVolumeConst())      {          return mViewerObject->getReflectionProbeIsDynamic();      } @@ -278,12 +281,12 @@ bool LLReflectionMap::getBox(LLMatrix4& box)      return false;  } -bool LLReflectionMap::isActive() +bool LLReflectionMap::isActive() const  {      return mCubeIndex != -1;  } -bool LLReflectionMap::isRelevant() +bool LLReflectionMap::isRelevant() const  {      static LLCachedControl<S32> RenderReflectionProbeLevel(gSavedSettings, "RenderReflectionProbeLevel", 3); diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h index 117ea4cfa6..d20bba7059 100644 --- a/indra/newview/llreflectionmap.h +++ b/indra/newview/llreflectionmap.h @@ -58,16 +58,16 @@ public:      void autoAdjustOrigin();      // return true if given Reflection Map's influence volume intersect's with this one's -    bool intersects(LLReflectionMap* other); +    bool intersects(LLReflectionMap* other) const;      // Get the ambiance value to use for this probe -    F32 getAmbiance(); +    F32 getAmbiance() const;      // Get the near clip plane distance to use for this probe -    F32 getNearClip(); +    F32 getNearClip() const;      // Return true if this probe should include avatars in its reflection map -    bool getIsDynamic(); +    bool getIsDynamic() const;      // get the encoded bounding box of this probe's influence volume      // will only return a box if this probe is associated with a VOVolume @@ -76,13 +76,13 @@ public:      bool getBox(LLMatrix4& box);      // return true if this probe is active for rendering -    bool isActive(); +    bool isActive() const;      // perform occlusion query/readback      void doOcclusion(const LLVector4a& eye);      // return false if this probe isn't currently relevant (for example, disabled due to graphics preferences) -    bool isRelevant(); +    bool isRelevant() const;      // point at which environment map was last generated from (in agent space)      LLVector4a mOrigin; diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index 69ade8d796..c03f5e7b79 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -223,9 +223,11 @@ void LLReflectionMapManager::update()      initReflectionMaps(); +    static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); +      if (!mRenderTarget.isComplete())      { -        U32 color_fmt = GL_RGB16F; +        U32 color_fmt = render_hdr ? GL_RGBA16F : GL_RGBA8;          U32 targetRes = mProbeResolution * 4; // super sample          mRenderTarget.allocate(targetRes, targetRes, color_fmt, true);      } @@ -238,7 +240,7 @@ void LLReflectionMapManager::update()          mMipChain.resize(count);          for (U32 i = 0; i < count; ++i)          { -            mMipChain[i].allocate(res, res, GL_RGB16F); +            mMipChain[i].allocate(res, res, render_hdr ? GL_RGB16F : GL_RGB8);              res /= 2;          }      } @@ -306,7 +308,7 @@ void LLReflectionMapManager::update()          LLReflectionMap* probe = mProbes[i];          llassert(probe != nullptr); -        if (probe->mCubeIndex != -1 && mUpdatingProbe != probe) +        if (probe && probe->mCubeIndex != -1 && mUpdatingProbe != probe)          { // free this index              mCubeFree.push_back(probe->mCubeIndex); @@ -1425,11 +1427,13 @@ void LLReflectionMapManager::initReflectionMaps()          {              mTexture = new LLCubeMapArray(); +            static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); +              // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source) -            mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2); +            mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr);              mIrradianceMaps = new LLCubeMapArray(); -            mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false); +            mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false, render_hdr);          }          // reset probe state diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index cf96072ae2..6f9d4a24bc 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -807,7 +807,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)      static LLCachedControl<F32> tonemap_mix_setting(gSavedSettings, "RenderTonemapMix", 1.f);      // sky is a "classic" sky following pre SL 7.0 shading -    bool classic_mode = psky->canAutoAdjust(); +    bool classic_mode = psky->canAutoAdjust() && !should_auto_adjust();      if (!classic_mode)      { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9b715be26e..3a7aaaeca1 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1534,7 +1534,7 @@ bool idle_startup()          // create a container's instance for start a controlling conversation windows          // by the voice's events          LLFloaterIMContainer *im_inst = LLFloaterIMContainer::getInstance(); -        if(gAgent.isFirstLogin()) +        if(gAgent.isFirstLogin() && im_inst)          {              im_inst->openFloater(im_inst->getKey());          } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 18746e76fc..d4a033bd42 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -261,6 +261,8 @@ static bool handleDisableVintageMode(const LLSD& newvalue)  static bool handleEnableHDR(const LLSD& newvalue)  { +    gPipeline.mReflectionMapManager.reset(); +    gPipeline.mHeroProbeManager.reset();      return handleReleaseGLBufferChanged(newvalue) && handleSetShaderChanged(newvalue);  } @@ -448,11 +450,11 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)      if (gPipeline.isInit())      {          LLPipeline::refreshCachedSettings(); +        gPipeline.mReflectionMapManager.reset(); +        gPipeline.mHeroProbeManager.reset();          gPipeline.releaseGLBuffers();          gPipeline.createGLBuffers();          LLViewerShaderMgr::instance()->setShaders(); -        gPipeline.mReflectionMapManager.reset(); -        gPipeline.mHeroProbeManager.reset();      }      return true;  } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index cbc615b01a..bdae400f1d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -5211,15 +5211,16 @@ void handle_take(bool take_separate)      // MAINT-290      // Reason: Showing the confirmation dialog resets object selection, thus there is nothing to derez.      // Fix: pass selection to the confirm_take, so that selection doesn't "die" after confirmation dialog is opened -    params.functor.function([take_separate](const LLSD ¬ification, const LLSD &response) +    LLObjectSelectionHandle obj_selection = LLSelectMgr::instance().getSelection(); +    params.functor.function([take_separate, obj_selection](const LLSD ¬ification, const LLSD &response)      {          if (take_separate)          { -            confirm_take_separate(notification, response, LLSelectMgr::instance().getSelection()); +            confirm_take_separate(notification, response, obj_selection);          }          else          { -            confirm_take(notification, response, LLSelectMgr::instance().getSelection()); +            confirm_take(notification, response, obj_selection);          }      }); diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 09f813accc..9c9d2f62cf 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -728,6 +728,9 @@ public:      // index into LLViewerObjectList::mActiveObjects or -1 if not in list      S32             mListIndex; +    // last index data for mIndexAndLocalIDToUUID +    U32             mRegionIndex; +      LLPointer<LLViewerTexture> *mTEImages;      LLPointer<LLViewerTexture> *mTENormalMaps;      LLPointer<LLViewerTexture> *mTESpecularMaps; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index d667fdbea8..cd9d152437 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -164,21 +164,14 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,      return (((U64)index) << 32) | (U64)local_id;  } -bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp) +bool LLViewerObjectList::removeFromLocalIDTable(LLViewerObject* objectp)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; -    if(objectp && objectp->getRegion()) +    if(objectp && objectp->mRegionIndex != 0)      {          U32 local_id = objectp->mLocalID; -        U32 ip = objectp->getRegion()->getHost().getAddress(); -        U32 port = objectp->getRegion()->getHost().getPort(); -        U64 ipport = (((U64)ip) << 32) | (U64)port; -        U32 index = mIPAndPortToIndex[ipport]; - -        // LL_INFOS() << "Removing object from table, local ID " << local_id << ", ip " << ip << ":" << port << LL_ENDL; - -        U64 indexid = (((U64)index) << 32) | (U64)local_id; +        U64 indexid = (((U64)objectp->mRegionIndex) << 32) | (U64)local_id;          std::map<U64, LLUUID>::iterator iter = mIndexAndLocalIDToUUID.find(indexid);          if (iter == mIndexAndLocalIDToUUID.end()) @@ -190,6 +183,7 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)          if (iter->second == objectp->getID())          {   // Full UUIDs match, so remove the entry              mIndexAndLocalIDToUUID.erase(iter); +            objectp->mRegionIndex = 0;              return true;          }          // UUIDs did not match - this would zap a valid entry, so don't erase it @@ -203,7 +197,8 @@ bool LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)  void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,                                            const U32 local_id,                                            const U32 ip, -                                          const U32 port) +                                          const U32 port, +                                          LLViewerObject* objectp)  {      U64 ipport = (((U64)ip) << 32) | (U64)port; @@ -215,6 +210,7 @@ void LLViewerObjectList::setUUIDAndLocal(const LLUUID &id,          mIPAndPortToIndex[ipport] = index;      } +    objectp->mRegionIndex = index; // should never be zero, sSimulatorMachineIndex starts from 1      U64 indexid = (((U64)index) << 32) | (U64)local_id;      mIndexAndLocalIDToUUID[indexid] = id; @@ -335,7 +331,8 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry*              removeFromLocalIDTable(objectp);              setUUIDAndLocal(fullid, entry->getLocalID(),                              regionp->getHost().getAddress(), -                            regionp->getHost().getPort()); +                            regionp->getHost().getPort(), +                            objectp);              if (objectp->mLocalID != entry->getLocalID())              {   // Update local ID in object with the one sent from the region @@ -582,7 +579,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,              setUUIDAndLocal(fullid,                              local_id,                              gMessageSystem->getSenderIP(), -                            gMessageSystem->getSenderPort()); +                            gMessageSystem->getSenderPort(), +                            objectp);              if (objectp->mLocalID != local_id)              {   // Update local ID in object with the one sent from the region @@ -1381,11 +1379,20 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp)  void LLViewerObjectList::killAllObjects()  {      // Used only on global destruction. -    LLViewerObject *objectp; +    // Mass cleanup to not clear lists one item at a time +    mIndexAndLocalIDToUUID.clear(); +    mActiveObjects.clear(); +    mMapObjects.clear(); + +    LLViewerObject *objectp;      for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)      {          objectp = *iter; +        objectp->setOnActiveList(false); +        objectp->setListIndex(-1); +        objectp->mRegionIndex = 0; +        objectp->mOnMap = false;          killObject(objectp);          // Object must be dead, or it's the LLVOAvatarSelf which never dies.          llassert((objectp == gAgentAvatarp) || objectp->isDead()); @@ -1398,18 +1405,6 @@ void LLViewerObjectList::killAllObjects()          LL_WARNS() << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.size() << LL_ENDL;          mObjects.clear();      } - -    if (!mActiveObjects.empty()) -    { -        LL_WARNS() << "Some objects still on active object list!" << LL_ENDL; -        mActiveObjects.clear(); -    } - -    if (!mMapObjects.empty()) -    { -        LL_WARNS() << "Some objects still on map object list!" << LL_ENDL; -        mMapObjects.clear(); -    }  }  void LLViewerObjectList::cleanDeadObjects(bool use_timer) @@ -1509,9 +1504,9 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)                  mActiveObjects.push_back(objectp);                  objectp->setListIndex(static_cast<S32>(mActiveObjects.size()) - 1);              objectp->setOnActiveList(true); -        } -        else -        { +            } +            else +            {                  llassert(idx < mActiveObjects.size());                  llassert(mActiveObjects[idx] == objectp); @@ -1863,7 +1858,8 @@ LLViewerObject *LLViewerObjectList::createObjectFromCache(const LLPCode pcode, L      setUUIDAndLocal(uuid,                      local_id,                      regionp->getHost().getAddress(), -                    regionp->getHost().getPort()); +                    regionp->getHost().getPort(), +                    objectp);      mObjects.push_back(objectp);      updateActive(objectp); @@ -1901,7 +1897,8 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe      setUUIDAndLocal(fullid,                      local_id,                      gMessageSystem->getSenderIP(), -                    gMessageSystem->getSenderPort()); +                    gMessageSystem->getSenderPort(), +                    objectp);      mObjects.push_back(objectp); diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index dc31995eb1..547ef9fb2d 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -179,9 +179,10 @@ public:      void setUUIDAndLocal(const LLUUID &id,                                  const U32 local_id,                                  const U32 ip, -                                const U32 port); // Requires knowledge of message system info! +                                const U32 port, +                                LLViewerObject* objectp); // Requires knowledge of message system info! -    bool removeFromLocalIDTable(const LLViewerObject* objectp); +    bool removeFromLocalIDTable(LLViewerObject* objectp);      // Used ONLY by the orphaned object code.      U64 getIndex(const U32 local_id, const U32 ip, const U32 port); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 36b6787ace..271460f2cc 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -87,6 +87,7 @@ S32 LLViewerTexture::sRawCount = 0;  S32 LLViewerTexture::sAuxCount = 0;  LLFrameTimer LLViewerTexture::sEvaluationTimer;  F32 LLViewerTexture::sDesiredDiscardBias = 0.f; +U32 LLViewerTexture::sBiasTexturesUpdated = 0;  S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size  constexpr S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64; @@ -518,6 +519,7 @@ void LLViewerTexture::updateClass()      bool is_sys_low = isSystemMemoryLow();      bool is_low = is_sys_low || over_pct > 0.f; +    F32 discard_bias = sDesiredDiscardBias;      static bool was_low = false;      static bool was_sys_low = false; @@ -556,12 +558,13 @@ void LLViewerTexture::updateClass()          // don't execute above until the slam to 1.5 has a chance to take effect          sEvaluationTimer.reset(); -        // lower discard bias over time when free memory is available -        if (sDesiredDiscardBias > 1.f && over_pct < 0.f) +        // lower discard bias over time when at least 10% of budget is free +        const F32 FREE_PERCENTAGE_TRESHOLD = -0.1f; +        if (sDesiredDiscardBias > 1.f && over_pct < FREE_PERCENTAGE_TRESHOLD)          {              static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f); -            F32 decrement = high_mem_discard_decrement - llmin(over_pct, 0.f); +            F32 decrement = high_mem_discard_decrement - llmin(over_pct - FREE_PERCENTAGE_TRESHOLD, 0.f);              sDesiredDiscardBias -= decrement * gFrameIntervalSeconds;          }      } @@ -603,6 +606,12 @@ void LLViewerTexture::updateClass()      }      sDesiredDiscardBias = llclamp(sDesiredDiscardBias, 1.f, 4.f); +    if (discard_bias != sDesiredDiscardBias) +    { +        // bias changed, reset texture update counter to +        // let updates happen at an increased rate. +        sBiasTexturesUpdated = 0; +    }      LLViewerTexture::sFreezeImageUpdates = false;  } diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 4241ef958f..31b089226f 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -220,6 +220,7 @@ public:      static S32 sAuxCount;      static LLFrameTimer sEvaluationTimer;      static F32 sDesiredDiscardBias; +    static U32 sBiasTexturesUpdated;      static S32 sMaxSculptRez ;      static U32 sMinLargeImageSize ;      static U32 sMaxSmallImageSize ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index c2eb8ddd25..126a77ad6f 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1208,10 +1208,17 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)      //update MIN_UPDATE_COUNT or 5% of other textures, whichever is greater      update_count = llmax((U32) MIN_UPDATE_COUNT, (U32) mUUIDMap.size()/20); -    if (LLViewerTexture::sDesiredDiscardBias > 1.f) +    if (LLViewerTexture::sDesiredDiscardBias > 1.f +        && LLViewerTexture::sBiasTexturesUpdated < (U32)mUUIDMap.size())      { -        // we are over memory target, update more agresively +        // We are over memory target. Bias affects discard rates, so update +        // existing textures agresively to free memory faster.          update_count = (S32)(update_count * LLViewerTexture::sDesiredDiscardBias); + +        // This isn't particularly precise and can overshoot, but it doesn't need +        // to be, just making sure it did a full circle and doesn't get stuck updating +        // at bias = 4 with 4 times the rate permanently. +        LLViewerTexture::sBiasTexturesUpdated += update_count;      }      update_count = llmin(update_count, (U32) mUUIDMap.size()); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 7740376d5c..a3e9e862fe 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -645,8 +645,12 @@ void LLVOVolume::animateTextures()                          // LLVOVolume::updateTextureVirtualSize when the                          // mTextureMatrix is not yet present                          gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); -                        mDrawable->getSpatialGroup()->dirtyGeom(); -                        gPipeline.markRebuild(mDrawable->getSpatialGroup()); +                        LLSpatialGroup* group = mDrawable->getSpatialGroup(); +                        if (group) +                        { +                            group->dirtyGeom(); +                            gPipeline.markRebuild(group); +                        }                      }                  } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 3240e2a663..8740578eac 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7118,7 +7118,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool          LLSettingsSky::ptr_t sky = LLEnvironment::instance().getCurrentSky(); -        F32 probe_ambiance = LLEnvironment::instance().getCurrentSky()->getReflectionProbeAmbiance(should_auto_adjust); +        F32 probe_ambiance = LLEnvironment::instance().getCurrentSky()->getReflectionProbeAmbiance(should_auto_adjust());          F32 exp_min = 1.f;          F32 exp_max = 1.f; @@ -7129,13 +7129,13 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool          {              if (dynamic_exposure_enabled)              { -                exp_min = sky->getHDROffset() - sky->getHDRMin(); -                exp_max = sky->getHDROffset() + sky->getHDRMax(); +                exp_min = sky->getHDROffset(should_auto_adjust()) - sky->getHDRMin(should_auto_adjust()); +                exp_max = sky->getHDROffset(should_auto_adjust()) + sky->getHDRMax(should_auto_adjust());              }              else              { -                exp_min = sky->getHDROffset(); -                exp_max = sky->getHDROffset(); +                exp_min = sky->getHDROffset(should_auto_adjust()); +                exp_max = sky->getHDROffset(should_auto_adjust());              }          }          else if (dynamic_exposure_enabled) @@ -7155,7 +7155,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool          shader->uniform1f(dt, gFrameIntervalSeconds);          shader->uniform2f(noiseVec, ll_frand() * 2.0f - 1.0f, ll_frand() * 2.0f - 1.0f);          shader->uniform4f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max, dynamic_exposure_speed_error); -        shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(), exp_min, exp_max, dynamic_exposure_speed_target); +        shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(should_auto_adjust()), exp_min, exp_max, dynamic_exposure_speed_target);          mScreenTriangleVB->setBuffer();          mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -7213,7 +7213,7 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)          static LLCachedControl<U32> tonemap_type_setting(gSavedSettings, "RenderTonemapType", 0U);          shader.uniform1i(tonemap_type, tonemap_type_setting); -        shader.uniform1f(tonemap_mix, psky->getTonemapMix()); +        shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));          mScreenTriangleVB->setBuffer();          mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); diff --git a/indra/newview/skins/default/textures/3p_icons/fmod_logo.png b/indra/newview/skins/default/textures/3p_icons/fmod_logo.pngBinary files differ deleted file mode 100644 index 5a50e0ad34..0000000000 --- a/indra/newview/skins/default/textures/3p_icons/fmod_logo.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/3p_icons/havok_logo.png b/indra/newview/skins/default/textures/3p_icons/havok_logo.pngBinary files differ deleted file mode 100644 index ff1ea3a72e..0000000000 --- a/indra/newview/skins/default/textures/3p_icons/havok_logo.png +++ /dev/null diff --git a/indra/newview/skins/default/textures/3p_icons/vivox_logo.png b/indra/newview/skins/default/textures/3p_icons/vivox_logo.pngBinary files differ deleted file mode 100644 index 6f20e87b7a..0000000000 --- a/indra/newview/skins/default/textures/3p_icons/vivox_logo.png +++ /dev/null diff --git a/indra/newview/skins/default/xui/de/panel_progress.xml b/indra/newview/skins/default/xui/de/panel_progress.xml index 8d1abdcac1..c9bed9fd9b 100644 --- a/indra/newview/skins/default/xui/de/panel_progress.xml +++ b/indra/newview/skins/default/xui/de/panel_progress.xml @@ -1,10 +1,8 @@  <?xml version="1.0" ?>  <panel name="login_progress_panel"> -	<layout_panel name="panel_icons"/>  	<layout_stack name="vertical_centering"/>  	<layout_panel name="panel4"/>  	<layout_panel name="center"/>  	<layout_stack name="horizontal_centering"> -		<text name="logos_lbl">Second Life verwendet</text>  	</layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml index 0742cef7c7..6b19907372 100644 --- a/indra/newview/skins/default/xui/en/panel_progress.xml +++ b/indra/newview/skins/default/xui/en/panel_progress.xml @@ -33,7 +33,7 @@               layout="topleft"               left="0"               orientation="vertical"  -             name="vertical_centering" +             name="vertical_centering1"               top="0"               width="670">                  <layout_panel @@ -44,40 +44,32 @@                   width="670" />                  <layout_panel                   auto_resize="false" -                 height="275" +                 height="220"                   layout="topleft" -                 min_height="275" +                 min_height="220"                   name="panel4"                   width="670">                      <icon                       color="LoginProgressBoxCenterColor"                       follows="left|right|bottom|top" -                     height="275"                       image_name="Rounded_Square"                       layout="topleft"                       left="0"                       top="0" +                     height="220"                       width="670" />                      <layout_stack                       follows="left|right|top|bottom" -                     height="275" +                     height="220"                       layout="topleft"                       left="0"                       orientation="vertical" -                     name="vertical_centering" +                     name="vertical_centering2"                       animate="false"                       top="0"                       width="670">                        <layout_panel                         auto_resize="false" -                       height="30" -                       layout="topleft" -                       min_height="30" -                       name="panel_top_spacer" -                       width="670"> -                      </layout_panel> -                      <layout_panel -                       auto_resize="false"                         height="100"                         layout="topleft"                         min_height="100" @@ -121,9 +113,9 @@                        </layout_panel>                        <layout_panel                         auto_resize="false" -                       height="110" +                       height="90"                         layout="topleft" -                       min_height="110" +                       min_height="90"                         name="panel_motd"                         width="670">                          <text @@ -132,7 +124,7 @@                           font_shadow="none"                           halign="left"                           valign="center" -                         height="100" +                         height="80"                           layout="topleft"                           left="45"                           line_spacing.pixels="2" @@ -142,30 +134,6 @@                           right="-90"                           word_wrap="true"/>                        </layout_panel> -                      <layout_panel -                       auto_resize="false" -                       height="40" -                       layout="topleft" -                       min_height="40" -                       name="panel_icons" -                       width="670"> -                        <!--Logos are tied to following label from code--> -                        <text -                         follows="left|right|top" -                         layout="topleft" -                         font="SansSerifLarge" -                         font_shadow="none" -                         halign="left" -                         height="16" -                         width="240" -                         left="47" -                         top="6" -                         line_spacing.pixels="2" -                         name="logos_lbl" -                         text_color="LoginProgressBoxTextColor"> -                          Megapahit uses -                        </text> -                      </layout_panel>                      </layout_stack>                  </layout_panel>                  <layout_panel diff --git a/indra/newview/skins/default/xui/es/panel_progress.xml b/indra/newview/skins/default/xui/es/panel_progress.xml index 64aaf246f8..c9bed9fd9b 100644 --- a/indra/newview/skins/default/xui/es/panel_progress.xml +++ b/indra/newview/skins/default/xui/es/panel_progress.xml @@ -1,10 +1,8 @@  <?xml version="1.0" ?>  <panel name="login_progress_panel"> -	<layout_panel name="panel_icons"/>  	<layout_stack name="vertical_centering"/>  	<layout_panel name="panel4"/>  	<layout_panel name="center"/>  	<layout_stack name="horizontal_centering"> -		<text name="logos_lbl">Usos de Second Life</text>  	</layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_progress.xml b/indra/newview/skins/default/xui/fr/panel_progress.xml index 673ec63642..c9bed9fd9b 100644 --- a/indra/newview/skins/default/xui/fr/panel_progress.xml +++ b/indra/newview/skins/default/xui/fr/panel_progress.xml @@ -1,10 +1,8 @@  <?xml version="1.0" ?>  <panel name="login_progress_panel"> -	<layout_panel name="panel_icons"/>  	<layout_stack name="vertical_centering"/>  	<layout_panel name="panel4"/>  	<layout_panel name="center"/>  	<layout_stack name="horizontal_centering"> -		<text name="logos_lbl">Second Life utilise</text>  	</layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/it/panel_progress.xml b/indra/newview/skins/default/xui/it/panel_progress.xml index fd2892a88f..c9bed9fd9b 100644 --- a/indra/newview/skins/default/xui/it/panel_progress.xml +++ b/indra/newview/skins/default/xui/it/panel_progress.xml @@ -1,10 +1,8 @@  <?xml version="1.0" ?>  <panel name="login_progress_panel"> -	<layout_panel name="panel_icons"/>  	<layout_stack name="vertical_centering"/>  	<layout_panel name="panel4"/>  	<layout_panel name="center"/>  	<layout_stack name="horizontal_centering"> -		<text name="logos_lbl">Utilizzi di Second Life</text>  	</layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_progress.xml b/indra/newview/skins/default/xui/ja/panel_progress.xml index 7fd7d5ab5c..1edada6098 100644 --- a/indra/newview/skins/default/xui/ja/panel_progress.xml +++ b/indra/newview/skins/default/xui/ja/panel_progress.xml @@ -1,12 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel name="login_progress_panel"> -	<layout_panel name="panel_icons"/>  	<layout_stack name="vertical_centering"/>  	<layout_panel name="panel4"/>  	<layout_panel name="center"/>  	<layout_stack name="horizontal_centering"> -		<text name="logos_lbl"> -			セカンドライフ使用 -		</text>  	</layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_progress.xml b/indra/newview/skins/default/xui/pl/panel_progress.xml index 22b6a8fcf5..8da982cc3f 100644 --- a/indra/newview/skins/default/xui/pl/panel_progress.xml +++ b/indra/newview/skins/default/xui/pl/panel_progress.xml @@ -2,14 +2,9 @@  <panel name="login_progress_panel">  	<layout_stack name="horizontal_centering">  		<layout_panel name="center"> -			<layout_stack name="vertical_centering"> +			<layout_stack name="vertical_centering1">  				<layout_panel name="panel4"> -					<layout_stack name="vertical_centering"> -						<layout_panel name="panel_icons"> -							<text name="logos_lbl"> -								Second Life używa -							</text> -						</layout_panel> +					<layout_stack name="vertical_centering2">  					</layout_stack>  				</layout_panel>  			</layout_stack> diff --git a/indra/newview/skins/default/xui/pt/panel_progress.xml b/indra/newview/skins/default/xui/pt/panel_progress.xml index 63bb663cfc..c9bed9fd9b 100644 --- a/indra/newview/skins/default/xui/pt/panel_progress.xml +++ b/indra/newview/skins/default/xui/pt/panel_progress.xml @@ -1,10 +1,8 @@  <?xml version="1.0" ?>  <panel name="login_progress_panel"> -	<layout_panel name="panel_icons"/>  	<layout_stack name="vertical_centering"/>  	<layout_panel name="panel4"/>  	<layout_panel name="center"/>  	<layout_stack name="horizontal_centering"> -		<text name="logos_lbl">Usos do Second Life</text>  	</layout_stack>  </panel> | 
