diff options
Diffstat (limited to 'indra')
34 files changed, 582 insertions, 231 deletions
| diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 46e1cb4922..2e4b013b77 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -2584,7 +2584,8 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo  			next->mLabel = model_name + (char)((int)'a' + next->mSubmodelID) + lod_suffix[mLod];  			next->getVolumeFaces() = remainder;  			next->mNormalizedScale = ret->mNormalizedScale; -			 +			next->mNormalizedTranslation = ret->mNormalizedTranslation; +  			if ( ret->mMaterialList.size() > LL_SCULPT_MESH_MAX_FACES)  			{  				next->mMaterialList.assign(ret->mMaterialList.begin() + LL_SCULPT_MESH_MAX_FACES, ret->mMaterialList.end()); diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp index ae165f7fa4..237636bd0b 100644 --- a/indra/llprimitive/llgltfmaterial.cpp +++ b/indra/llprimitive/llgltfmaterial.cpp @@ -699,24 +699,44 @@ void LLGLTFMaterial::applyOverrideLLSD(const LLSD& data)      if (bc.isDefined())      {          mBaseColor.setValue(bc); +        if (mBaseColor == getDefaultBaseColor()) +        { +            // HACK -- nudge by epsilon if we receive a default value (indicates override to default) +            mBaseColor.mV[3] -= FLT_EPSILON; +        }      }      const LLSD& ec = data["ec"];      if (ec.isDefined())      {          mEmissiveColor.setValue(ec); +        if (mEmissiveColor == getDefaultEmissiveColor()) +        { +            // HACK -- nudge by epsilon if we receive a default value (indicates override to default) +            mEmissiveColor.mV[0] += FLT_EPSILON; +        }      }      const LLSD& mf = data["mf"];      if (mf.isReal())      {          mMetallicFactor = mf.asReal(); +        if (mMetallicFactor == getDefaultMetallicFactor()) +        {  +            // HACK -- nudge by epsilon if we receive a default value (indicates override to default) +            mMetallicFactor -= FLT_EPSILON; +        }      }      const LLSD& rf = data["rf"];      if (rf.isReal())      {          mRoughnessFactor = rf.asReal(); +        if (mRoughnessFactor == getDefaultRoughnessFactor()) +        {  +            // HACK -- nudge by epsilon if we receive a default value (indicates override to default) +            mRoughnessFactor -= FLT_EPSILON; +        }      }      const LLSD& am = data["am"]; @@ -730,6 +750,11 @@ void LLGLTFMaterial::applyOverrideLLSD(const LLSD& data)      if (ac.isReal())      {          mAlphaCutoff = ac.asReal(); +        if (mAlphaCutoff == getDefaultAlphaCutoff()) +        { +            // HACK -- nudge by epsilon if we receive a default value (indicates override to default) +            mAlphaCutoff -= FLT_EPSILON; +        }      }      const LLSD& ds = data["ds"]; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index ee493968de..99a5697a84 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -52,7 +52,8 @@ const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);  LLModel::LLModel(LLVolumeParams& params, F32 detail)  	: LLVolume(params, detail),  -      mNormalizedScale(1,1,1),  +      mNormalizedScale(1,1,1), +      mNormalizedTranslation(0, 0, 0),        mPelvisOffset( 0.0f ),         mStatus(NO_ERRORS),         mSubmodelID(0) diff --git a/indra/llrender/llgltexture.cpp b/indra/llrender/llgltexture.cpp index 7fdef4a3b7..b616002b49 100644 --- a/indra/llrender/llgltexture.cpp +++ b/indra/llrender/llgltexture.cpp @@ -94,7 +94,8 @@ void LLGLTexture::setBoostLevel(S32 level)  	{  		mBoostLevel = level ;  		if(mBoostLevel != LLGLTexture::BOOST_NONE -		   && mBoostLevel != LLGLTexture::BOOST_ICON) +		   && mBoostLevel != LLGLTexture::BOOST_ICON +           && mBoostLevel != LLGLTexture::BOOST_THUMBNAIL)  		{  			setNoDelete() ;		  		} diff --git a/indra/llrender/llgltexture.h b/indra/llrender/llgltexture.h index 5c693fc93c..24849d1d1b 100644 --- a/indra/llrender/llgltexture.h +++ b/indra/llrender/llgltexture.h @@ -62,6 +62,7 @@ public:  		BOOST_SUPER_HIGH    , //textures higher than this need to be downloaded at the required resolution without delay.  		BOOST_HUD			,  		BOOST_ICON			, +        BOOST_THUMBNAIL		,  		BOOST_UI			,  		BOOST_PREVIEW		,  		BOOST_MAP			, diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b9025ef7cd..00b59f9a4d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -533,6 +533,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>RenderSnapshotNoPost</key> +    <map> +      <key>Comment</key> +      <string>Disable tone mapping and exposure correction when snapshot is being rendered</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutomaticFly</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp index 1a47293523..46b9dffae9 100644 --- a/indra/newview/llfetchedgltfmaterial.cpp +++ b/indra/newview/llfetchedgltfmaterial.cpp @@ -29,6 +29,8 @@  #include "llviewertexturelist.h"  #include "llavatarappearancedefines.h" +#include "llviewerobject.h" +#include "llselectmgr.h"  #include "llshadermgr.h"  #include "pipeline.h" @@ -252,3 +254,55 @@ void LLFetchedGLTFMaterial::materialComplete()      materialCompleteCallbacks.clear();      materialCompleteCallbacks.shrink_to_fit();  } + +LLPointer<LLViewerFetchedTexture> LLFetchedGLTFMaterial::getUITexture() +{ +    if (mFetching) +    { +        return nullptr; +    } + +    auto fetch_texture_for_ui = [](LLPointer<LLViewerFetchedTexture>& img, const LLUUID& id) +    { +        if (id.notNull()) +        { +            if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id)) +            { +                LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); +                if (obj) +                { +                    LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(id); +                    img = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL; +                } + +            } +            else +            { +                img = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +            } +        } +        if (img) +        { +            img->setBoostLevel(LLGLTexture::BOOST_PREVIEW); +            img->forceToSaveRawImage(0); +        } +    }; + +    fetch_texture_for_ui(mBaseColorTexture, mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR]); +    fetch_texture_for_ui(mNormalTexture, mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL]); +    fetch_texture_for_ui(mMetallicRoughnessTexture, mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS]); +    fetch_texture_for_ui(mEmissiveTexture, mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE]); + +    if ((mBaseColorTexture && (mBaseColorTexture->getRawImageLevel() != 0)) || +        (mNormalTexture && (mNormalTexture->getRawImageLevel() != 0)) || +        (mMetallicRoughnessTexture && (mMetallicRoughnessTexture->getRawImageLevel() != 0)) || +        (mEmissiveTexture && (mEmissiveTexture->getRawImageLevel() != 0))) +    { +        return nullptr; +    } + +    // *HACK: Use one of the PBR texture components as the preview texture for now +    mPreviewTexture = mBaseColorTexture; + +    return mPreviewTexture; +} diff --git a/indra/newview/llfetchedgltfmaterial.h b/indra/newview/llfetchedgltfmaterial.h index 2559aa46cc..a9e539633d 100644 --- a/indra/newview/llfetchedgltfmaterial.h +++ b/indra/newview/llfetchedgltfmaterial.h @@ -50,6 +50,8 @@ public:      bool isFetching() const { return mFetching; } +    LLPointer<LLViewerFetchedTexture> getUITexture(); +      void addTextureEntry(LLTextureEntry* te) override;      void removeTextureEntry(LLTextureEntry* te) override;      virtual bool replaceLocalTexture(const LLUUID& tracking_id, const LLUUID& old_id, const LLUUID& new_id) override; @@ -63,6 +65,9 @@ public:      std::set<LLTextureEntry*> mTextureEntires; +    // Texture used for previewing the material in the UI +    LLPointer<LLViewerFetchedTexture> mPreviewTexture; +  protected:      // Lifetime management diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 6b9d4580dc..ca2069cbfc 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -461,8 +461,8 @@ void LLFloaterSnapshotBase::ImplBase::onClickAutoSnap(LLUICtrl *ctrl, void* data  {  	LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;  	gSavedSettings.setBOOL( "AutoSnapshot", check->get() ); -	 -	LLFloaterSnapshotBase *view = (LLFloaterSnapshotBase *)data;		 + +	LLFloaterSnapshotBase *view = (LLFloaterSnapshotBase *)data;  	if (view)  	{  		view->impl->checkAutoSnapshot(view->getPreviewView()); @@ -471,6 +471,17 @@ void LLFloaterSnapshotBase::ImplBase::onClickAutoSnap(LLUICtrl *ctrl, void* data  }  // static +void LLFloaterSnapshotBase::ImplBase::onClickNoPost(LLUICtrl *ctrl, void* data) +{ +    BOOL no_post = ((LLCheckBoxCtrl*)ctrl)->get(); +    gSavedSettings.setBOOL("RenderSnapshotNoPost", no_post); + +    LLFloaterSnapshotBase* view = (LLFloaterSnapshotBase*)data; +    view->getPreviewView()->updateSnapshot(TRUE, TRUE); +    view->impl->updateControls(view); +} + +// static  void LLFloaterSnapshotBase::ImplBase::onClickFilter(LLUICtrl *ctrl, void* data)  {  	LLFloaterSnapshotBase *view = (LLFloaterSnapshotBase *)data; @@ -997,6 +1008,9 @@ BOOL LLFloaterSnapshot::postBuild()  	getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot"));  	childSetCommitCallback("auto_snapshot_check", ImplBase::onClickAutoSnap, this); +    getChild<LLUICtrl>("no_post_check")->setValue(gSavedSettings.getBOOL("RenderSnapshotNoPost")); +    childSetCommitCallback("no_post_check", ImplBase::onClickNoPost, this); +      getChild<LLButton>("retract_btn")->setCommitCallback(boost::bind(&LLFloaterSnapshot::onExtendFloater, this));      getChild<LLButton>("extend_btn")->setCommitCallback(boost::bind(&LLFloaterSnapshot::onExtendFloater, this)); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 7fc62a2746..89cb2bc809 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -100,6 +100,7 @@ public:  	static void onClickNewSnapshot(void* data);  	static void onClickAutoSnap(LLUICtrl *ctrl, void* data); +	static void onClickNoPost(LLUICtrl *ctrl, void* data);  	static void onClickFilter(LLUICtrl *ctrl, void* data);  	static void onClickUICheck(LLUICtrl *ctrl, void* data);  	static void onClickHUDCheck(LLUICtrl *ctrl, void* data); diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 62180bb066..68581d04eb 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -58,6 +58,7 @@  static LLPanelInjector<LLInventoryGallery> t_inventory_gallery("inventory_gallery");  const S32 GALLERY_ITEMS_PER_ROW_MIN = 2; +const S32 FAST_LOAD_THUMBNAIL_TRSHOLD = 50; // load folders below this value immediately  // Helper dnd functions  BOOL dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, BOOL drop, std::string& tooltip_msg, BOOL is_link); @@ -106,6 +107,7 @@ LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p)        mGalleryWidthFactor(p.gallery_width_factor),        mIsInitialized(false),        mRootDirty(false), +      mLoadThumbnailsImmediately(true),        mNeedsArrange(false),        mSearchType(LLInventoryFilter::SEARCHTYPE_NAME),        mSortOrder(LLInventoryFilter::SO_DATE) @@ -540,6 +542,12 @@ void LLInventoryGallery::addToGallery(LLInventoryGalleryItem* item)      int n_prev = n - 1;      int row_count_prev = (n_prev % mItemsInRow) == 0 ? n_prev / mItemsInRow : n_prev / mItemsInRow + 1; +    // Avoid loading too many items. +    // Intent is for small folders to display all content fast +    // and for large folders to load content mostly as needed +    // Todo: ideally needs to unload images outside visible area +    mLoadThumbnailsImmediately = mItemsAddedCount < FAST_LOAD_THUMBNAIL_TRSHOLD; +      bool add_row = row_count != row_count_prev;      int pos = 0;      if (add_row) @@ -573,6 +581,8 @@ void LLInventoryGallery::removeFromGalleryLast(LLInventoryGalleryItem* item, boo      mItemsAddedCount--;      mIndexToItemMap.erase(mItemsAddedCount); +    mLoadThumbnailsImmediately = mItemsAddedCount < FAST_LOAD_THUMBNAIL_TRSHOLD; +      bool remove_row = row_count != row_count_prev;      removeFromLastRow(mItems[mItemsAddedCount]);      mItems.pop_back(); @@ -636,6 +646,7 @@ LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, L      gitem->setUUID(item_id);      gitem->setGallery(this);      gitem->setType(type, inventory_type, flags, is_link); +    gitem->setLoadImmediately(mLoadThumbnailsImmediately);      gitem->setThumbnail(thumbnail_id);      gitem->setWorn(is_worn);      gitem->setCreatorName(get_searchable_creator_name(&gInventory, item_id)); @@ -997,6 +1008,7 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id)      if (mItemMap[item_id])      { +        mItemMap[item_id]->setLoadImmediately(mLoadThumbnailsImmediately);          mItemMap[item_id]->setThumbnail(thumbnail_id);          bool passes_filter = checkAgainstFilters(mItemMap[item_id], mFilterSubString); @@ -2557,6 +2569,7 @@ BOOL LLInventoryGalleryItem::postBuild()  {      mNameText = getChild<LLTextBox>("item_name");      mTextBgPanel = getChild<LLPanel>("text_bg_panel"); +    mThumbnailCtrl = getChild<LLThumbnailCtrl>("preview_thumbnail");      return TRUE;  } @@ -2632,14 +2645,19 @@ void LLInventoryGalleryItem::setThumbnail(LLUUID id)      mDefaultImage = id.isNull();      if(mDefaultImage)      { -        getChild<LLThumbnailCtrl>("preview_thumbnail")->clearTexture(); +        mThumbnailCtrl->clearTexture();      }      else      { -        getChild<LLThumbnailCtrl>("preview_thumbnail")->setValue(id); +        mThumbnailCtrl->setValue(id);      }  } +void LLInventoryGalleryItem::setLoadImmediately(bool val) +{ +    mThumbnailCtrl->setInitImmediately(val); +} +  void LLInventoryGalleryItem::draw()  {      if (isFadeItem()) @@ -2654,7 +2672,7 @@ void LLInventoryGalleryItem::draw()          // Draw border          LLUIColor border_color = LLUIColorTable::instance().getColor(mSelected ? "MenuItemHighlightBgColor" : "TextFgTentativeColor", LLColor4::white); -        LLRect border = getChildView("preview_thumbnail")->getRect(); +        LLRect border = mThumbnailCtrl->getRect();          border.mRight = border.mRight + 1;          border.mTop = border.mTop + 1;          gl_rect_2d(border, border_color.get(), FALSE); @@ -2876,7 +2894,7 @@ void LLInventoryGalleryItem::updateNameText()      mNameText->setFont(getTextFont());      mNameText->setText(mItemName + mPermSuffix + mWornSuffix);      mNameText->setToolTip(mItemName + mPermSuffix + mWornSuffix); -    getChild<LLThumbnailCtrl>("preview_thumbnail")->setToolTip(mItemName + mPermSuffix + mWornSuffix); +    mThumbnailCtrl->setToolTip(mItemName + mPermSuffix + mWornSuffix);  }  bool LLInventoryGalleryItem::isFadeItem() diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 9b3f12701f..0c52e7b713 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -39,6 +39,7 @@ class LLInventoryGalleryItem;  class LLScrollContainer;  class LLTextBox;  class LLThumbnailsObserver; +class LLThumbnailCtrl;  class LLGalleryGestureObserver;  class LLInventoryGalleryContextMenu; @@ -246,6 +247,7 @@ private:      int mRowCount;      int mItemsAddedCount;      bool mGalleryCreated; +    bool mLoadThumbnailsImmediately;      bool mNeedsArrange;      /* Params */ @@ -342,6 +344,7 @@ public:      LLAssetType::EType getAssetType() { return mType; }      void setThumbnail(LLUUID id);      void setGallery(LLInventoryGallery* gallery) { mGallery = gallery; } +    void setLoadImmediately(bool val);      bool isFolder() { return mIsFolder; }      bool isLink() { return mIsLink; }      EInventorySortGroup getSortGroup() { return mSortGroup; } @@ -354,6 +357,7 @@ private:      LLUUID mUUID;      LLTextBox* mNameText;      LLPanel* mTextBgPanel; +    LLThumbnailCtrl* mThumbnailCtrl;      bool     mSelected;      bool     mWorn;      bool     mDefaultImage; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 8583cca103..05aa2e423f 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1465,6 +1465,10 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask)  		{  			mask |= LLInventoryObserver::LABEL;  		} +        if (old_item->getPermissions() != item->getPermissions()) +        { +            mask |= LLInventoryObserver::INTERNAL; +        }  		old_item->copyViewerItem(item);  		if (update_parent_on_server)  		{ diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index a5437f7a88..70e21cae73 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -38,6 +38,7 @@  #include "llgltfmateriallist.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h" +#include "llinventoryfunctions.h"  #include "lllocalgltfmaterials.h"  #include "llnotificationsutil.h"  #include "lltexturectrl.h" @@ -1495,16 +1496,22 @@ public:              return;          } +        // Name may or may not have already been applied +        const bool changed_name = item->getName() != mNewName;          // create_inventory_item/copy_inventory_item don't allow presetting some permissions, fix it now -        item->setPermissions(mPermissions); -        item->updateServer(FALSE); -        gInventory.updateItem(item); -        gInventory.notifyObservers(); - -        if (item->getName() != mNewName) +        const bool changed_permissions = item->getPermissions() != mPermissions; +        const bool changed = changed_name || changed_permissions; +        LLSD updates; +        if (changed)          { -            LLSD updates; -            updates["name"] = mNewName; +            if (changed_name) +            { +                updates["name"] = mNewName; +            } +            if (changed_permissions) +            { +                updates["permissions"] = ll_create_sd_from_permissions(mPermissions); +            }              update_inventory_item(inv_item_id, updates, NULL);          } @@ -1514,10 +1521,16 @@ public:                  inv_item_id,                  LLAssetType::AT_MATERIAL,                  mAssetData, -                [](LLUUID item_id, LLUUID new_asset_id, LLUUID new_item_id, LLSD response) +                [changed, updates](LLUUID item_id, LLUUID new_asset_id, LLUUID new_item_id, LLSD response)                  {                      // done callback                      LL_INFOS("Material") << "inventory item uploaded.  item: " << item_id << " new_item_id: " << new_item_id << " response: " << response << LL_ENDL; + +                    // *HACK: Sometimes permissions do not stick in the UI. They are correct on the server-side, though. +                    if (changed) +                    { +                        update_inventory_item(new_item_id, updates, NULL); +                    }                  },                  nullptr // failure callback, floater already closed              ); @@ -2014,8 +2027,49 @@ void LLMaterialEditor::loadLive()      }  } +namespace +{ +    // Which inventory to consult for item permissions +    enum class ItemSource +    { +        // Consult the permissions of the item in the object's inventory. If +        // the item is not present, then usage of the asset is allowed. +        OBJECT, +        // Consult the permissions of the item in the agent's inventory. If +        // the item is not present, then usage of the asset is not allowed. +        AGENT +    }; + +    class LLAssetIDMatchesWithPerms : public LLInventoryCollectFunctor +    { +    public: +        LLAssetIDMatchesWithPerms(const LLUUID& asset_id, const std::vector<PermissionBit>& ops) : mAssetID(asset_id), mOps(ops) {} +        virtual ~LLAssetIDMatchesWithPerms() {} +        bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +        { +            if (!item || item->getAssetUUID() != mAssetID) +            { +                return false; +            } +            LLPermissions item_permissions = item->getPermissions(); +            for (PermissionBit op : mOps) +            { +                if (!gAgent.allowOperation(op, item_permissions, GP_OBJECT_MANIPULATE)) +                { +                    return false; +                } +            } +            return true; +        } + +    protected: +        LLUUID mAssetID; +        std::vector<PermissionBit> mOps; +    }; +}; +  // *NOTE: permissions_out includes user preferences for new item creation (LLFloaterPerms) -bool can_use_objects_material(LLSelectedTEGetMatData& func, const std::vector<PermissionBit>& ops, LLPermissions& permissions_out, LLViewerInventoryItem*& item_out) +bool can_use_objects_material(LLSelectedTEGetMatData& func, const std::vector<PermissionBit>& ops, const ItemSource item_source, LLPermissions& permissions_out, LLViewerInventoryItem*& item_out)  {      if (!LLMaterialEditor::capabilitiesAvailable())      { @@ -2028,6 +2082,10 @@ bool can_use_objects_material(LLSelectedTEGetMatData& func, const std::vector<Pe      llassert(func.mIsOverride);      LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, true /*first applicable*/); +    if (item_source == ItemSource::AGENT) +    { +        func.mObjectId = LLUUID::null; +    }      LLViewerObject* selected_object = func.mObject;      if (!selected_object)      { @@ -2048,19 +2106,47 @@ bool can_use_objects_material(LLSelectedTEGetMatData& func, const std::vector<Pe          }      } -    item_out = selected_object->getInventoryItemByAsset(func.mMaterialId); - -    LLPermissions item_permissions; -    if (item_out) +    // Look for the item to base permissions off of +    item_out = nullptr; +    const bool blank_material = func.mMaterialId == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID; +    if (!blank_material)      { -        item_permissions.set(item_out->getPermissions()); -        for (PermissionBit op : ops) +        LLAssetIDMatchesWithPerms item_has_perms(func.mMaterialId, ops); +        if (item_source == ItemSource::OBJECT)          { -            if (!gAgent.allowOperation(op, item_permissions, GP_OBJECT_MANIPULATE)) +            LLViewerInventoryItem* item = selected_object->getInventoryItemByAsset(func.mMaterialId); +            if (item && !item_has_perms(nullptr, item))              {                  return false;              } +            item_out = item;          } +        else +        { +            llassert(item_source == ItemSource::AGENT); + +            LLViewerInventoryCategory::cat_array_t cats; +            LLViewerInventoryItem::item_array_t items; +            gInventory.collectDescendentsIf(LLUUID::null, +                                    cats, +                                    items, +                                    // *NOTE: PBRPickerAgentListener will need +                                    // to be changed if checking the trash is +                                    // disabled +                                    LLInventoryModel::INCLUDE_TRASH, +                                    item_has_perms); +            if (items.empty()) +            { +                return false; +            } +            item_out = items[0]; +        } +    } + +    LLPermissions item_permissions; +    if (item_out) +    { +        item_permissions = item_out->getPermissions();          // Update flags for new owner          if (!item_permissions.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true))          { @@ -2113,13 +2199,24 @@ bool can_use_objects_material(LLSelectedTEGetMatData& func, const std::vector<Pe      // creation history when there's no material item present. In that case,      // the agent who saved the material will be considered the creator.      // -Cosmic,2023-08-07 -    if (item_out) +    if (item_source == ItemSource::AGENT)      { +        llassert(blank_material || item_out); // See comment at ItemSource::AGENT definition +          permissions_out.set(item_permissions);      }      else      { -        permissions_out.set(object_permissions); +        llassert(item_source == ItemSource::OBJECT); + +        if (item_out) +        { +            permissions_out.set(item_permissions); +        } +        else +        { +            permissions_out.set(object_permissions); +        }      }      permissions_out.accumulate(floater_perm); @@ -2131,7 +2228,7 @@ bool LLMaterialEditor::canModifyObjectsMaterial()      LLSelectedTEGetMatData func(true);      LLPermissions permissions;      LLViewerInventoryItem* item_out; -    return can_use_objects_material(func, std::vector({PERM_MODIFY}), permissions, item_out); +    return can_use_objects_material(func, std::vector({PERM_MODIFY}), ItemSource::OBJECT, permissions, item_out);  }  bool LLMaterialEditor::canSaveObjectsMaterial() @@ -2139,7 +2236,7 @@ bool LLMaterialEditor::canSaveObjectsMaterial()      LLSelectedTEGetMatData func(true);      LLPermissions permissions;      LLViewerInventoryItem* item_out; -    return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item_out); +    return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item_out);  }  bool LLMaterialEditor::canClipboardObjectsMaterial() @@ -2165,7 +2262,7 @@ bool LLMaterialEditor::canClipboardObjectsMaterial()      LLSelectedTEGetMatData func(true);      LLPermissions permissions;      LLViewerInventoryItem* item_out; -    return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), permissions, item_out); +    return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), ItemSource::OBJECT, permissions, item_out);  }  void LLMaterialEditor::saveObjectsMaterialAs() @@ -2173,7 +2270,7 @@ void LLMaterialEditor::saveObjectsMaterialAs()      LLSelectedTEGetMatData func(true);      LLPermissions permissions;      LLViewerInventoryItem* item = nullptr; -    bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item); +    bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item);      if (!allowed)      {          LL_WARNS("MaterialEditor") << "Failed to save GLTF material from object" << LL_ENDL; @@ -2268,62 +2365,9 @@ void LLMaterialEditor::saveObjectsMaterialAs(const LLGLTFMaterial* render_materi      }      else      { -        if (item_id.notNull()) -        { -            // Copy existing item from object inventory, and create new composite asset on top of it -            LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onCopyObjectsMaterialAsMsgCallback, _1, _2, permissions, object_id, item_id)); -        } -        else -        { -            LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback, _1, _2, permissions)); -        } -    } -} - -// static -void LLMaterialEditor::onCopyObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions, const LLUUID& object_id, const LLUUID& item_id) -{ -    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -    if (0 != option) -    { -        return; -    } - -    LLSD asset; -    asset["version"] = LLGLTFMaterial::ASSET_VERSION; -    asset["type"] = LLGLTFMaterial::ASSET_TYPE; -    // This is the string serialized from LLGLTFMaterial::asJSON -    asset["data"] = notification["payload"]["data"]; - -    std::ostringstream str; -    LLSDSerialize::serialize(asset, str, LLSDSerialize::LLSD_BINARY); - -    LLViewerObject* object = gObjectList.findObject(object_id); -    if (!object) -    { -        return; +        llassert(object_id.isNull()); // Case for copying item from object inventory is no longer implemented +        LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback, _1, _2, permissions));      } -    const LLInventoryItem* item = object->getInventoryItem(item_id); -    if (!item) -    { -        return; -    } - -    std::string new_name = response["message"].asString(); -    LLInventoryObject::correctInventoryName(new_name); -    if (new_name.empty()) -    { -        return; -    } - -    const LLUUID destination_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL); - -    LLPointer<LLInventoryCallback> cb = new LLObjectsMaterialItemCallback(permissions, str.str(), new_name); -    // NOTE: This should be an item copy. Saving a material to an inventory should be disabled when the associated material is no-copy. -    move_or_copy_inventory_from_object(destination_id, -                                       object_id, -                                       item_id, -                                       cb);  }  // static diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h index 95a4c4572d..4e0350b4cc 100644 --- a/indra/newview/llmaterialeditor.h +++ b/indra/newview/llmaterialeditor.h @@ -117,7 +117,6 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener      static bool canSaveObjectsMaterial();      static bool canClipboardObjectsMaterial();      static void saveObjectsMaterialAs(); -    static void onCopyObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions, const LLUUID& object_id, const LLUUID& item_id);      static void onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions);      static void onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 9150b89de3..e7b856f743 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -1880,15 +1880,53 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  	}  } +// One-off listener that updates the build floater UI when the agent inventory adds or removes an item +class PBRPickerAgentListener : public LLInventoryObserver +{ +protected: +    bool mChangePending = true; +public: +	PBRPickerAgentListener() : LLInventoryObserver() +    { +        gInventory.addObserver(this); +    } + +    const bool isListening() +    { +        return mChangePending; +    } + +	void changed(U32 mask) override +    { +        if (!(mask & (ADD | REMOVE))) +        { +            return; +        } + +        if (gFloaterTools) +        { +            gFloaterTools->dirty(); +        } +        gInventory.removeObserver(this); +        mChangePending = false; +    } + +    ~PBRPickerAgentListener() override +    { +        gInventory.removeObserver(this); +        mChangePending = false; +    } +}; +  // One-off listener that updates the build floater UI when the prim inventory updates -class PBRPickerItemListener : public LLVOInventoryListener +class PBRPickerObjectListener : public LLVOInventoryListener  {  protected:      LLViewerObject* mObjectp;      bool mChangePending = true;  public: -    PBRPickerItemListener(LLViewerObject* object) +    PBRPickerObjectListener(LLViewerObject* object)      : mObjectp(object)      {          registerVOInventoryListener(mObjectp, nullptr); @@ -1912,7 +1950,7 @@ public:          mChangePending = false;      } -    ~PBRPickerItemListener() +    ~PBRPickerObjectListener()      {          removeVOInventoryListener();          mChangePending = false; @@ -1931,9 +1969,9 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,      // pbr material      LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control"); +    LLUUID pbr_id;      if (pbr_ctrl)      { -        LLUUID pbr_id;          LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr, has_pbr_material, has_faces_without_pbr);          pbr_ctrl->setTentative(identical_pbr ? FALSE : TRUE); @@ -1943,6 +1981,7 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,          if (objectp->isAttachment())          {              pbr_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER | PERM_MODIFY); +            pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER | PERM_MODIFY);          }          else          { @@ -1956,14 +1995,25 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,      if (objectp->isInventoryPending())      {          // Reuse the same listener when possible -        if (!mInventoryListener || !mInventoryListener->isListeningFor(objectp)) +        if (!mVOInventoryListener || !mVOInventoryListener->isListeningFor(objectp))          { -            mInventoryListener = std::make_unique<PBRPickerItemListener>(objectp); +            mVOInventoryListener = std::make_unique<PBRPickerObjectListener>(objectp);          }      }      else      { -        mInventoryListener = nullptr; +        mVOInventoryListener = nullptr; +    } +    if (!identical_pbr || pbr_id.isNull() || pbr_id == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID) +    { +        mAgentInventoryListener = nullptr; +    } +    else +    { +        if (!mAgentInventoryListener || !mAgentInventoryListener->isListening()) +        { +            mAgentInventoryListener = std::make_unique<PBRPickerAgentListener>(); +        }      }      const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled(); diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index d36662c11b..5ca6a95699 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -53,7 +53,8 @@ class LLMaterialID;  class LLMediaCtrl;  class LLMenuButton; -class PBRPickerItemListener; +class PBRPickerAgentListener; +class PBRPickerObjectListener;  // Represents an edit for use in replicating the op across one or more materials in the selection set.  // @@ -508,7 +509,8 @@ private:      static Selection sMaterialOverrideSelection; -    std::unique_ptr<PBRPickerItemListener> mInventoryListener; +    std::unique_ptr<PBRPickerAgentListener> mAgentInventoryListener; +    std::unique_ptr<PBRPickerObjectListener> mVOInventoryListener;  public:  	#if defined(DEF_GET_MAT_STATE) diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index d6c36bbfb7..595609b4de 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -746,6 +746,14 @@ void LLPanelVolume::sendIsLight()  	LL_INFOS() << "update light sent" << LL_ENDL;  } +void notify_cant_select_reflection_probe() +{ +    if (!gSavedSettings.getBOOL("SelectReflectionProbes")) +    { +        LLNotificationsUtil::add("CantSelectReflectionProbe"); +    } +} +  void LLPanelVolume::sendIsReflectionProbe()  {      LLViewerObject* objectp = mObject; @@ -764,6 +772,20 @@ void LLPanelVolume::sendIsReflectionProbe()      }      else      { +        if (value) +        { +            notify_cant_select_reflection_probe(); +        } +        else if (objectp->flagPhantom()) +        { +            LLViewerObject* root = objectp->getRootEdit(); +            bool in_linkeset = root != objectp || objectp->numChildren() > 0; +            if (in_linkeset) +            { +                // In linkset with a phantom flag +                objectp->setFlags(FLAGS_PHANTOM, FALSE); +            } +        }          volobjp->setIsReflectionProbe(value);      }  } @@ -780,6 +802,7 @@ void LLPanelVolume::doSendIsReflectionProbe(const LLSD & notification, const LLS          }          LLVOVolume* volobjp = (LLVOVolume*)objectp; +        notify_cant_select_reflection_probe();          volobjp->setIsReflectionProbe(true);          { // has become a reflection probe, slam to a 10m sphere and pop up a message @@ -1211,6 +1234,17 @@ void LLPanelVolume::onPasteLight()          }          else          { +            if (objectp->flagPhantom()) +            { +                LLViewerObject* root = objectp->getRootEdit(); +                bool in_linkeset = root != objectp || objectp->numChildren() > 0; +                if (in_linkeset) +                { +                    // In linkset with a phantom flag +                    objectp->setFlags(FLAGS_PHANTOM, FALSE); +                } +            } +              volobjp->setIsReflectionProbe(false);          }      } diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index b7a1832b17..2ff8f50277 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -559,6 +559,7 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)                                           mAllowRenderUI && gSavedSettings.getBOOL("RenderUIInSnapshot"),                                           gSavedSettings.getBOOL("RenderHUDInSnapshot"),                                           FALSE, +                                         gSavedSettings.getBOOL("RenderSnapshotNoPost"),                                           mSnapshotBufferType) )          {              raw = NULL ; @@ -718,6 +719,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )                  previewp->mAllowRenderUI && gSavedSettings.getBOOL("RenderUIInSnapshot"),                  gSavedSettings.getBOOL("RenderHUDInSnapshot"),                  FALSE, +                gSavedSettings.getBOOL("RenderSnapshotNoPost"),                  previewp->mSnapshotBufferType,                  previewp->getMaxImageSize()))          { diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 3988bceb4e..f302426a43 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -719,17 +719,27 @@ void LLFloaterTexturePicker::draw()  		// If the floater is focused, don't apply its alpha to the texture (STORM-677).  		const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); -		if( mTexturep ) +        LLViewerTexture* texture = nullptr; +        if (mGLTFMaterial) +        { +            texture = mGLTFMaterial->getUITexture(); +        } +        else +        { +            texture = mTexturep.get(); +        } + +		if( texture )  		{ -			if( mTexturep->getComponents() == 4 ) +			if( texture->getComponents() == 4 )  			{  				gl_rect_2d_checkerboard( interior, alpha );  			} -			gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha ); +			gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), texture, UI_VERTEX_COLOR % alpha );  			// Pump the priority -			mTexturep->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) ); +			texture->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) );  		}  		else if (!mFallbackImage.isNull())  		{ @@ -2140,11 +2150,21 @@ void LLTextureCtrl::draw()  		if (texture.isNull())  		{ -			texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +            if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) +            { +                LLPointer<LLFetchedGLTFMaterial> material = gGLTFMaterialList.getMaterial(mImageAssetID); +                if (material) +                { +                    texture = material->getUITexture(); +                } +            } +            else +            { +                texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +                texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW); +                texture->forceToSaveRawImage(0); +            }  		} -		 -		texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW); -		texture->forceToSaveRawImage(0) ;  		mTexturep = texture;  	} diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp index 04130fc724..b558c249cb 100644 --- a/indra/newview/llthumbnailctrl.cpp +++ b/indra/newview/llthumbnailctrl.cpp @@ -57,7 +57,8 @@ LLThumbnailCtrl::LLThumbnailCtrl(const LLThumbnailCtrl::Params& p)  ,   mFallbackImagep(p.fallback_image)  ,   mInteractable(p.interactable())  ,   mShowLoadingPlaceholder(p.show_loading()) -,	mPriority(LLGLTexture::BOOST_PREVIEW) +,   mInited(false) +,   mInitImmediately(true)  {      mLoadingPlaceholderString = LLTrans::getString("texture_loading"); @@ -84,6 +85,10 @@ LLThumbnailCtrl::~LLThumbnailCtrl()  void LLThumbnailCtrl::draw()  { +    if (!mInited) +    { +        initImage(); +    }      LLRect draw_rect = getLocalRect();      if (mBorderVisible) @@ -171,11 +176,19 @@ void LLThumbnailCtrl::draw()      LLUICtrl::draw();  } +void LLThumbnailCtrl::setVisible(BOOL visible) +{ +    if (!visible && mInited) +    { +        unloadImage(); +    } +    LLUICtrl::setVisible(visible); +} +  void LLThumbnailCtrl::clearTexture()  { -    mImageAssetID = LLUUID::null; -    mTexturep = nullptr; -    mImagep = nullptr; +    setValue(LLSD()); +    mInited = true; // nothing to do  }  // virtual @@ -191,34 +204,55 @@ void LLThumbnailCtrl::setValue(const LLSD& value)  	LLUICtrl::setValue(tvalue); -    mImageAssetID = LLUUID::null; -    mTexturep = nullptr; -    mImagep = nullptr; -     -	if (tvalue.isUUID()) -	{ +    unloadImage(); + +    if (mInitImmediately) +    { +        initImage(); +    } +} + +BOOL LLThumbnailCtrl::handleHover(S32 x, S32 y, MASK mask) +{ +    if (mInteractable && getEnabled()) +    { +        getWindow()->setCursor(UI_CURSOR_HAND); +        return TRUE; +    } +    return LLUICtrl::handleHover(x, y, mask); +} + +void LLThumbnailCtrl::initImage() +{ +    if (mInited) +    { +        return; +    } +    mInited = true; +    LLSD tvalue = getValue(); + +    if (tvalue.isUUID()) +    {          mImageAssetID = tvalue.asUUID();          if (mImageAssetID.notNull())          {              // Should it support baked textures? -            mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); -             -            mTexturep->setBoostLevel(mPriority); +            mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL); +              mTexturep->forceToSaveRawImage(0); -             -            S32 desired_draw_width = mTexturep->getWidth(); -            S32 desired_draw_height = mTexturep->getHeight(); -             + +            S32 desired_draw_width = MAX_IMAGE_SIZE; +            S32 desired_draw_height = MAX_IMAGE_SIZE;              mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height);          } -	} +    }      else if (tvalue.isString())      {          mImagep = LLUI::getUIImage(tvalue.asString(), LLGLTexture::BOOST_UI);          if (mImagep)          {              LLViewerFetchedTexture* texture = dynamic_cast<LLViewerFetchedTexture*>(mImagep->getImage().get()); -            if(texture) +            if (texture)              {                  mImageAssetID = texture->getID();              } @@ -226,14 +260,12 @@ void LLThumbnailCtrl::setValue(const LLSD& value)      }  } -BOOL LLThumbnailCtrl::handleHover(S32 x, S32 y, MASK mask) +void LLThumbnailCtrl::unloadImage()  { -    if (mInteractable && getEnabled()) -    { -        getWindow()->setCursor(UI_CURSOR_HAND); -        return TRUE; -    } -    return LLUICtrl::handleHover(x, y, mask); +    mImageAssetID = LLUUID::null; +    mTexturep = nullptr; +    mImagep = nullptr; +    mInited = false;  } diff --git a/indra/newview/llthumbnailctrl.h b/indra/newview/llthumbnailctrl.h index 686603b373..f84a583271 100644 --- a/indra/newview/llthumbnailctrl.h +++ b/indra/newview/llthumbnailctrl.h @@ -64,17 +64,24 @@ public:  	virtual ~LLThumbnailCtrl();  	virtual void draw() override; +    void setVisible(BOOL visible) override;  	virtual void setValue(const LLSD& value ) override; +    void setInitImmediately(bool val) { mInitImmediately = val; }      void clearTexture();      virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + +protected: +    void initImage(); +    void unloadImage();  private: -	S32 mPriority;      bool mBorderVisible;      bool mInteractable;      bool mShowLoadingPlaceholder; +    bool mInited; +    bool mInitImmediately;      std::string mLoadingPlaceholderString;      LLUUID mImageAssetID;      LLViewBorder* mBorder; diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 04ca62e0ec..a936012781 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -100,6 +100,7 @@ BOOL gResizeShadowTexture = FALSE;  BOOL gWindowResized = FALSE;  BOOL gSnapshot = FALSE;  BOOL gCubeSnapshot = FALSE; +BOOL gSnapshotNoPost = FALSE;  BOOL gShaderProfileFrame = FALSE;  // This is how long the sim will try to teleport you before giving up. @@ -410,13 +411,13 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		gResizeShadowTexture = FALSE;  	} +	gSnapshot = for_snapshot; +  	if (LLPipeline::sRenderDeferred)  	{ //hack to make sky show up in deferred snapshots  		for_snapshot = FALSE;  	} -	gSnapshot = for_snapshot; -  	LLGLSDefault gls_default;  	LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE, GL_LEQUAL); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 5ee613d49d..1b70e5f84f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1658,67 +1658,6 @@ void copy_inventory_from_notecard(const LLUUID& destination_id,      }  } -void move_or_copy_inventory_from_object(const LLUUID& destination_id, -                                        const LLUUID& object_id, -                                        const LLUUID& item_id, -                                        LLPointer<LLInventoryCallback> cb) -{ -    LLViewerObject* object = gObjectList.findObject(object_id); -    if (!object) -    { -        return; -    } -    const LLInventoryItem* item = object->getInventoryItem(item_id); -    if (!item) -    { -        return; -    } - -    class LLItemAddedObserver : public LLInventoryObserver -    { -    public: -        LLItemAddedObserver(const LLUUID& copied_asset_id, LLPointer<LLInventoryCallback> cb) -        : LLInventoryObserver(), -          mAssetId(copied_asset_id), -          mCallback(cb) -        { -        } - -        void changed(U32 mask) override -        { -            if((mask & (LLInventoryObserver::ADD)) == 0) -            { -                return; -            } -            for (const LLUUID& changed_id : gInventory.getChangedIDs()) -            { -                LLViewerInventoryItem* changed_item = gInventory.getItem(changed_id); -                if (changed_item->getAssetUUID() == mAssetId) -                { -                    changeComplete(changed_item->getUUID()); -                    return; -                } -            } -        } - -    private: -        void changeComplete(const LLUUID& item_id) -        { -			mCallback->fire(item_id); -            gInventory.removeObserver(this); -            delete this; -        } - -        LLUUID mAssetId; -        LLPointer<LLInventoryCallback> mCallback; -    }; - -	const LLUUID& asset_id = item->getAssetUUID(); -    LLItemAddedObserver* observer = new LLItemAddedObserver(asset_id, cb); -    gInventory.addObserver(observer); -    object->moveInventory(destination_id, item_id); -} -  void create_new_item(const std::string& name,  				   const LLUUID& parent_id,  				   LLAssetType::EType asset_type, diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index bce8da0a69..e043285ffb 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -463,11 +463,6 @@ void copy_inventory_from_notecard(const LLUUID& destination_id,  								  const LLInventoryItem *src,  								  U32 callback_id = 0); -void move_or_copy_inventory_from_object(const LLUUID& destination_id, -                                        const LLUUID& object_id, -                                        const LLUUID& item_id, -                                        LLPointer<LLInventoryCallback> cb); -  void menu_create_inventory_item(LLInventoryPanel* root,  								LLFolderBridge* bridge,  								const LLSD& userdata, diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index e2791ba128..5461e0f362 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -863,8 +863,9 @@ class LLFileTakeSnapshotToDisk : public view_listener_t  		S32 width = gViewerWindow->getWindowWidthRaw();  		S32 height = gViewerWindow->getWindowHeightRaw(); -		bool render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot"); -		bool render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot"); +		BOOL render_ui = gSavedSettings.getBOOL("RenderUIInSnapshot"); +		BOOL render_hud = gSavedSettings.getBOOL("RenderHUDInSnapshot"); +		BOOL render_no_post = gSavedSettings.getBOOL("RenderSnapshotNoPost");  		BOOL high_res = gSavedSettings.getBOOL("HighResSnapshot");  		if (high_res) @@ -884,6 +885,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t  									   render_ui,  									   render_hud,  									   FALSE, +									   render_no_post,  									   LLSnapshotModel::SNAPSHOT_TYPE_COLOR,  									   high_res ? S32_MAX : MAX_SNAPSHOT_IMAGE_SIZE)) //per side  		{ diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 4a1cf0109e..ec6f2c848f 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -93,7 +93,8 @@ S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size  const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;  const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez;  const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128; -const S32 DEFAULT_ICON_DIMENTIONS = 32; +const S32 DEFAULT_ICON_DIMENSIONS = 32; +const S32 DEFAULT_THUMBNAIL_DIMENSIONS = 256;  U32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.  U32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;  bool LLViewerTexture::sFreezeImageUpdates = false; @@ -665,7 +666,8 @@ void LLViewerTexture::setBoostLevel(S32 level)  		mBoostLevel = level;  		if(mBoostLevel != LLViewerTexture::BOOST_NONE &&   			mBoostLevel != LLViewerTexture::BOOST_SELECTED &&  -			mBoostLevel != LLViewerTexture::BOOST_ICON) +			mBoostLevel != LLViewerTexture::BOOST_ICON && +            mBoostLevel != LLViewerTexture::BOOST_THUMBNAIL)  		{  			setNoDelete();		  		} @@ -1180,8 +1182,19 @@ void LLViewerFetchedTexture::loadFromFastCache()              {                  // Shouldn't do anything usefull since texures in fast cache are 16x16,                  // it is here in case fast cache changes. -                S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; -                S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +                S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; +                S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; +                if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) +                { +                    // scale oversized icon, no need to give more work to gl +                    mRawImage->scale(expected_width, expected_height); +                } +            } + +            if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) +            { +                S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; +                S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;                  if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height))                  {                      // scale oversized icon, no need to give more work to gl @@ -1682,7 +1695,7 @@ void LLViewerFetchedTexture::processTextureStats()  		{  			mDesiredDiscardLevel = 0;  		} -        else if (mDontDiscard && mBoostLevel == LLGLTexture::BOOST_ICON) +        else if (mDontDiscard && (mBoostLevel == LLGLTexture::BOOST_ICON || mBoostLevel == LLGLTexture::BOOST_THUMBNAIL))          {              if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)              { @@ -1916,8 +1929,20 @@ bool LLViewerFetchedTexture::updateFetch()                  if (mBoostLevel == LLGLTexture::BOOST_ICON)                  { -                    S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; -                    S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +                    S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; +                    S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; +                    if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)) +                    { +                        // scale oversized icon, no need to give more work to gl +                        // since we got mRawImage from thread worker and image may be in use (ex: writing cache), make a copy +                        mRawImage = mRawImage->scaled(expected_width, expected_height); +                    } +                } + +                if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) +                { +                    S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; +                    S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;                      if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height))                      {                          // scale oversized icon, no need to give more work to gl @@ -2652,7 +2677,9 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)  	if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)  	{ -		if (mSavedRawDiscardLevel != discard_level && mBoostLevel != BOOST_ICON) +		if (mSavedRawDiscardLevel != discard_level +            && mBoostLevel != BOOST_ICON +            && mBoostLevel != BOOST_THUMBNAIL)  		{  			mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents());  			mRawImage->copy(getSavedRawImage()); @@ -2759,8 +2786,22 @@ void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* im      {          if (mBoostLevel == LLGLTexture::BOOST_ICON)          { -            S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; -            S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +            S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; +            S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; +            if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +            { +                mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents()); +                mCachedRawImage->copyScaled(imageraw); +            } +            else +            { +                mCachedRawImage = imageraw; +            } +        } +        else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) +        { +            S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; +            S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;              if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)              {                  mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents()); @@ -2867,8 +2908,22 @@ void LLViewerFetchedTexture::saveRawImage()  	mSavedRawDiscardLevel = mRawDiscardLevel;      if (mBoostLevel == LLGLTexture::BOOST_ICON)      { -        S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS; -        S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; +        S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENSIONS; +        S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENSIONS; +        if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +        { +            mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents()); +            mSavedRawImage->copyScaled(mRawImage); +        } +        else +        { +            mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()); +        } +    } +    else if (mBoostLevel == LLGLTexture::BOOST_THUMBNAIL) +    { +        S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_THUMBNAIL_DIMENSIONS; +        S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_THUMBNAIL_DIMENSIONS;          if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)          {              mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents()); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 9ee6f88183..f898fb7142 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -72,7 +72,7 @@ LLViewerTextureList gTextureList;  ETexListType get_element_type(S32 priority)  { -    return (priority == LLViewerFetchedTexture::BOOST_ICON) ? TEX_LIST_SCALE : TEX_LIST_STANDARD; +    return (priority == LLViewerFetchedTexture::BOOST_ICON || priority == LLViewerFetchedTexture::BOOST_THUMBNAIL) ? TEX_LIST_SCALE : TEX_LIST_STANDARD;  }  /////////////////////////////////////////////////////////////////////////////// @@ -492,7 +492,8 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&  			{  				imagep->dontDiscard();  			} -			if (boost_priority == LLViewerFetchedTexture::BOOST_ICON) +			if (boost_priority == LLViewerFetchedTexture::BOOST_ICON +                || boost_priority == LLViewerFetchedTexture::BOOST_THUMBNAIL)  			{  				// Agent and group Icons are downloadable content, nothing manages  				// icon deletion yet, so they should not persist @@ -604,7 +605,8 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,  		{  			imagep->dontDiscard();  		} -		if (boost_priority == LLViewerFetchedTexture::BOOST_ICON) +		if (boost_priority == LLViewerFetchedTexture::BOOST_ICON +            || boost_priority == LLViewerFetchedTexture::BOOST_THUMBNAIL)  		{  			// Agent and group Icons are downloadable content, nothing manages  			// icon deletion yet, so they should not persist. @@ -1510,8 +1512,9 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st  	LLUIImagePtr new_imagep = new LLUIImage(name, imagep);  	new_imagep->setScaleStyle(scale_style); -	if (imagep->getBoostLevel() != LLGLTexture::BOOST_ICON && -		imagep->getBoostLevel() != LLGLTexture::BOOST_PREVIEW) +	if (imagep->getBoostLevel() != LLGLTexture::BOOST_ICON +        && imagep->getBoostLevel() != LLGLTexture::BOOST_THUMBNAIL +		&& imagep->getBoostLevel() != LLGLTexture::BOOST_PREVIEW)  	{  		// Don't add downloadable content into this list  		// all UI images are non-deletable and list does not support deletion diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ba2b6e1c7c..ed671fe849 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -229,6 +229,7 @@ extern BOOL gDisplaySwapBuffers;  extern BOOL gDepthDirty;  extern BOOL gResizeScreenTexture;  extern BOOL gCubeSnapshot; +extern BOOL gSnapshotNoPost;  LLViewerWindow	*gViewerWindow = NULL; @@ -4875,16 +4876,16 @@ void LLViewerWindow::resetSnapshotLoc() const  	gSavedPerAccountSettings.setString("SnapshotBaseDir", std::string());  } -BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL show_hud, BOOL do_rebuild, LLSnapshotModel::ESnapshotLayerType type) +BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL show_hud, BOOL do_rebuild, BOOL no_post, LLSnapshotModel::ESnapshotLayerType type)  { -	return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, show_hud, do_rebuild, type); +	return rawSnapshot(raw, preview_width, preview_height, FALSE, FALSE, show_ui, show_hud, do_rebuild, no_post, type);  }  // Saves the image from the screen to a raw image  // Since the required size might be bigger than the available screen, this method rerenders the scene in parts (called subimages) and copy  // the results over to the final raw image.  BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,  -    BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL show_hud, BOOL do_rebuild, LLSnapshotModel::ESnapshotLayerType type, S32 max_size) +    BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL show_hud, BOOL do_rebuild, BOOL no_post, LLSnapshotModel::ESnapshotLayerType type, S32 max_size)  {  	if (!raw)  	{ @@ -4901,6 +4902,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	}  	// PRE SNAPSHOT +	gSnapshotNoPost = no_post;  	gDisplaySwapBuffers = FALSE;      glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // stencil buffer is deprecated | GL_STENCIL_BUFFER_BIT); @@ -5131,6 +5133,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	}  	gDisplaySwapBuffers = FALSE; +	gSnapshotNoPost = FALSE;  	gDepthDirty = TRUE;  	// POST SNAPSHOT diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 6e8a5b2f4e..ccef006a07 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -362,7 +362,7 @@ public:  	BOOL			saveSnapshot(const std::string&  filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL show_hud = TRUE, BOOL do_rebuild = FALSE, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, LLSnapshotModel::ESnapshotFormat format = LLSnapshotModel::SNAPSHOT_FORMAT_BMP);  	BOOL			rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE, -		BOOL show_ui = TRUE, BOOL show_hud = TRUE, BOOL do_rebuild = FALSE, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE); +		BOOL show_ui = TRUE, BOOL show_hud = TRUE, BOOL do_rebuild = FALSE, BOOL no_post = FALSE, LLSnapshotModel::ESnapshotLayerType type = LLSnapshotModel::SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE);      BOOL			simpleSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, const int num_render_passes); @@ -380,7 +380,7 @@ public:      // special implementation of simpleSnapshot for reflection maps      BOOL			reflectionSnapshot(LLImageRaw* raw, S32 image_width, S32 image_height, const int num_render_passes); -    BOOL			thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL show_hud, BOOL do_rebuild, LLSnapshotModel::ESnapshotLayerType type); +    BOOL			thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL show_hud, BOOL do_rebuild, BOOL no_post, LLSnapshotModel::ESnapshotLayerType type);  	BOOL			isSnapshotLocSet() const;  	void			resetSnapshotLoc() const; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 9266c84540..64d247a202 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -211,6 +211,7 @@ extern S32 gBoxFrame;  extern BOOL gDisplaySwapBuffers;  extern BOOL gDebugGL;  extern BOOL gCubeSnapshot; +extern BOOL gSnapshotNoPost;  bool	gAvatarBacklight = false; @@ -6791,7 +6792,7 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) {  	{  		LL_PROFILE_GPU_ZONE("gamma correct"); -        static LLCachedControl<bool> no_post(gSavedSettings, "RenderDisablePostProcessing", false); +        static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false);  		LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -6801,7 +6802,8 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) {          LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); -        LLGLSLShader& shader = no_post && gFloaterTools->isAvailable() ? gNoPostGammaCorrectProgram : // no post (no gamma, no exposure, no tonemapping) +        bool no_post = gSnapshotNoPost || (buildNoPost && gFloaterTools->isAvailable()); +        LLGLSLShader& shader = no_post ? gNoPostGammaCorrectProgram : // no post (no gamma, no exposure, no tonemapping)              psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f ? gLegacyPostGammaCorrectProgram :              gDeferredPostGammaCorrectProgram; diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index fcd24d83bb..1a1131e24c 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -5,7 +5,7 @@   can_minimize="true"   can_resize="false"   can_close="true" - height="455" + height="475"   layout="topleft"   name="Snapshot"   single_instance="true" @@ -115,7 +115,7 @@  	   top_delta="0"         width="31" />  	<panel -     height="159" +     height="179"       layout="topleft"  	 follows="top|left"       left="0" @@ -193,6 +193,14 @@           top_pad="1"           width="180"           name="auto_snapshot_check" /> +        <check_box +         label="No post-processing" +         layout="topleft" +         height="16" +         left="10" +         top_pad="1" +         width="180" +         name="no_post_check" />          <text           type="string"           length="1" @@ -391,8 +399,8 @@      name="thumbnail_placeholder"      top="23"  	left="215" -	width="400" -	height="400" +	width="420" +	height="420"      follows="top|left"/>    <view_border      bevel_style="in"  diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 0bfdead6e7..2c4b03251a 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1545,7 +1545,7 @@ function="World.EnvPreset"          <menu_item_separator/>            <menu_item_check -            label="No Post" +            label="No Post-processing"              name="No Post">              <menu_item_check.on_check               control="RenderDisablePostProcessing" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d1838fc7ef..6c841ac049 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -7014,6 +7014,19 @@ Please try again.    </notification>    <notification +   icon="alertmodal.tga" +   name="CantSelectReflectionProbe" +   type="alertmodal"> +    <unique/> +    You have placed a reflection probe, but 'Select Reflection Probes' is disabled. To be able to select reflection probes, check Build > Options > Select Reflection Probes. +    <tag>confirm</tag> +    <usetemplate +     ignoretext="Don't show again." +     name="okignore" +     yestext="OK"/> +  </notification> + +  <notification     icon="notifytip.tga"     name="ScriptMissing"     type="notifytip"> | 
