From a073df908415929f44d14c890140dce33380ab0c Mon Sep 17 00:00:00 2001 From: Beq Date: Tue, 18 Jul 2023 17:06:08 +0100 Subject: [PATCH 01/10] [OPENSIM] Only show the adv perms export flag (X) when in OS --- indra/llinventory/llpermissions.cpp | 26 +++++++++++------- indra/llinventory/llpermissions.h | 4 +-- indra/newview/llfloaterproperties.cpp | 20 +++++++++----- indra/newview/llpanelpermissions.cpp | 39 ++++++++++++++++----------- indra/newview/llsidepaneliteminfo.cpp | 21 +++++++++++---- indra/newview/llsidepaneltaskinfo.cpp | 22 ++++++++++----- 6 files changed, 88 insertions(+), 44 deletions(-) diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index fd9997b885..d3b5734616 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -947,7 +947,7 @@ std::ostream& operator<<(std::ostream &s, const LLAggregatePermissions &perm) } // This converts a permissions mask into a string for debugging use. -void mask_to_string(U32 mask, char* str) +void mask_to_string(U32 mask, char* str, bool isOpenSim /*=false*/) // remove misleading X for export when not in OpenSim { if (mask & PERM_MOVE) { @@ -990,23 +990,29 @@ void mask_to_string(U32 mask, char* str) str++; // OpenSim export permission - if (mask & PERM_EXPORT) +#ifdef OPENSIM + // The export permission is only available in OpenSim. + if (isOpenSim) { - *str = 'X'; + if (mask & PERM_EXPORT) + { + *str = 'X'; + } + else + { + *str = ' '; + } + str++; } - else - { - *str = ' '; - } - str++; +#endif // *str = '\0'; } -std::string mask_to_string(U32 mask) +std::string mask_to_string(U32 mask, bool isOpenSim /*=false*/) // remove misleading X for export when not in OpenSim { char str[16]; - mask_to_string(mask, str); + mask_to_string(mask, str, isOpenSim); // remove misleading X for export when not in OpenSim return std::string(str); } diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h index 8646224b7e..bcf03b8e41 100644 --- a/indra/llinventory/llpermissions.h +++ b/indra/llinventory/llpermissions.h @@ -35,8 +35,8 @@ // prototypes class LLMessageSystem; -extern void mask_to_string(U32 mask, char* str); -extern std::string mask_to_string(U32 mask); +extern void mask_to_string(U32 mask, char* str, bool isOpenSim=false); +extern std::string mask_to_string(U32 mask, bool isOpenSim=false); template class LLMetaClassT; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 1c6d370478..116139a576 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -453,32 +453,40 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) } std::string perm_string; - +// remove misleading X for export when not in OpenSim + bool isOpenSim {false}; +#ifdef OPENSIM + if( LLGridManager::instance().isInOpenSim() ) + { + isOpenSim = true; + } +#endif +// perm_string = "B: "; - perm_string += mask_to_string(base_mask); + perm_string += mask_to_string(base_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("BaseMaskDebug")->setValue(perm_string); getChildView("BaseMaskDebug")->setVisible(TRUE); perm_string = "O: "; - perm_string += mask_to_string(owner_mask); + perm_string += mask_to_string(owner_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("OwnerMaskDebug")->setValue(perm_string); getChildView("OwnerMaskDebug")->setVisible(TRUE); perm_string = "G"; perm_string += overwrite_group ? "*: " : ": "; - perm_string += mask_to_string(group_mask); + perm_string += mask_to_string(group_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("GroupMaskDebug")->setValue(perm_string); getChildView("GroupMaskDebug")->setVisible(TRUE); perm_string = "E"; perm_string += overwrite_everyone ? "*: " : ": "; - perm_string += mask_to_string(everyone_mask); + perm_string += mask_to_string(everyone_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("EveryoneMaskDebug")->setValue(perm_string); getChildView("EveryoneMaskDebug")->setVisible(TRUE); perm_string = "N"; perm_string += slam_perm ? "*: " : ": "; - perm_string += mask_to_string(next_owner_mask); + perm_string += mask_to_string(next_owner_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("NextMaskDebug")->setValue(perm_string); getChildView("NextMaskDebug")->setVisible(TRUE); } diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 55c6de7696..315ffa203a 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -74,6 +74,7 @@ #include "rlvcommon.h" // [/RLVa:KB] // For OpenSim export permisson +#include "llviewernetwork.h" // for gridmanager #include "lfsimfeaturehandler.h" #include "llinventoryfunctions.h" @@ -630,7 +631,7 @@ void LLPanelPermissions::refresh() } else { -// FIRE-777: allow batch edit for name and description +// FIRE-777:οΏ½allow batch edit for name and description // getChild("Object Name")->setValue(LLStringUtil::null); // LineEditorObjectDesc->setText(LLStringUtil::null); if (keyboard_focus_view != LineEditorObjectName) @@ -650,7 +651,7 @@ void LLPanelPermissions::refresh() // figure out the contents of the name, description, & category BOOL edit_name_desc = FALSE; -// FIRE-777: allow batch edit for name and description +// FIRE-777:οΏ½allow batch edit for name and description // if (is_one_object && objectp->permModify() && !objectp->isPermanentEnforced()) if (objectp->permModify()) // /FIRE-777 @@ -811,20 +812,28 @@ void LLPanelPermissions::refresh() &next_owner_mask_on, &next_owner_mask_off); - if (gSavedSettings.getBOOL("DebugPermissions") ) { +// remove misleading X for export when not in OpenSim + bool isOpenSim {false}; +#ifdef OPENSIM + if( LLGridManager::instance().isInOpenSim() ) + { + isOpenSim = true; + } +#endif +// if (valid_base_perms) { - getChild("B:")->setValue("B: " + mask_to_string(base_mask_on)); + getChild("B:")->setValue("B: " + mask_to_string(base_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("B:")->setVisible(TRUE); - getChild("O:")->setValue("O: " + mask_to_string(owner_mask_on)); + getChild("O:")->setValue("O: " + mask_to_string(owner_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("O:")->setVisible(TRUE); - getChild("G:")->setValue("G: " + mask_to_string(group_mask_on)); + getChild("G:")->setValue("G: " + mask_to_string(group_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("G:")->setVisible(TRUE); - getChild("E:")->setValue("E: " + mask_to_string(everyone_mask_on)); + getChild("E:")->setValue("E: " + mask_to_string(everyone_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("E:")->setVisible(TRUE); - getChild("N:")->setValue("N: " + mask_to_string(next_owner_mask_on)); + getChild("N:")->setValue("N: " + mask_to_string(next_owner_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("N:")->setVisible(TRUE); } else if(!root_selected) @@ -834,15 +843,15 @@ void LLPanelPermissions::refresh() LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(); if (node && node->mValid) { - getChild("B:")->setValue("B: " + mask_to_string( node->mPermissions->getMaskBase())); + getChild("B:")->setValue("B: " + mask_to_string( node->mPermissions->getMaskBase(), isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("B:")->setVisible(TRUE); - getChild("O:")->setValue("O: " + mask_to_string(node->mPermissions->getMaskOwner())); + getChild("O:")->setValue("O: " + mask_to_string(node->mPermissions->getMaskOwner(), isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("O:")->setVisible(TRUE); - getChild("G:")->setValue("G: " + mask_to_string(node->mPermissions->getMaskGroup())); + getChild("G:")->setValue("G: " + mask_to_string(node->mPermissions->getMaskGroup(), isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("G:")->setVisible(TRUE); - getChild("E:")->setValue("E: " + mask_to_string(node->mPermissions->getMaskEveryone())); + getChild("E:")->setValue("E: " + mask_to_string(node->mPermissions->getMaskEveryone(), isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("E:")->setVisible(TRUE); - getChild("N:")->setValue("N: " + mask_to_string(node->mPermissions->getMaskNextOwner())); + getChild("N:")->setValue("N: " + mask_to_string(node->mPermissions->getMaskNextOwner(), isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("N:")->setVisible(TRUE); } } @@ -864,7 +873,7 @@ void LLPanelPermissions::refresh() //if (objectp->permExport()) flag_mask |= PERM_EXPORT; // OpenSim export permissions - getChild("F:")->setValue("F:" + mask_to_string(flag_mask)); + getChild("F:")->setValue("F:" + mask_to_string(flag_mask, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("F:")->setVisible( TRUE); } else @@ -910,7 +919,7 @@ void LLPanelPermissions::refresh() getChildView("checkbox allow everyone copy")->setEnabled(FALSE); } - // Opensim export permissions - Codeblock courtesy of Liru Fζrs. + // Opensim export permissions - Codeblock courtesy of Liru FοΏ½rs. // Is this user allowed to toggle export on this object? if (LFSimFeatureHandler::instance().simSupportsExport() && self_owned && mCreatorID == mOwnerID diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 72309bd7e3..9f0d43fefa 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -47,6 +47,7 @@ #include "llexperiencecache.h" #include "lltrans.h" #include "llviewerregion.h" +#include "llviewernetwork.h" // for gridmanager // [RLVa:KB] - Checked: RLVa-2.0.1 #include "rlvactions.h" #include "rlvcommon.h" @@ -586,31 +587,41 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) std::string perm_string; +// remove misleading X for export when not in OpenSim + bool isOpenSim {false}; +#ifdef OPENSIM + if( LLGridManager::instance().isInOpenSim() ) + { + isOpenSim = true; + } +#endif +// + perm_string = "B: "; - perm_string += mask_to_string(base_mask); + perm_string += mask_to_string(base_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("BaseMaskDebug")->setValue(perm_string); getChildView("BaseMaskDebug")->setVisible(TRUE); perm_string = "O: "; - perm_string += mask_to_string(owner_mask); + perm_string += mask_to_string(owner_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("OwnerMaskDebug")->setValue(perm_string); getChildView("OwnerMaskDebug")->setVisible(TRUE); perm_string = "G"; perm_string += overwrite_group ? "*: " : ": "; - perm_string += mask_to_string(group_mask); + perm_string += mask_to_string(group_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("GroupMaskDebug")->setValue(perm_string); getChildView("GroupMaskDebug")->setVisible(TRUE); perm_string = "E"; perm_string += overwrite_everyone ? "*: " : ": "; - perm_string += mask_to_string(everyone_mask); + perm_string += mask_to_string(everyone_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("EveryoneMaskDebug")->setValue(perm_string); getChildView("EveryoneMaskDebug")->setVisible(TRUE); perm_string = "N"; perm_string += slam_perm ? "*: " : ": "; - perm_string += mask_to_string(next_owner_mask); + perm_string += mask_to_string(next_owner_mask, isOpenSim); // remove misleading X for export when not in OpenSim getChild("NextMaskDebug")->setValue(perm_string); getChildView("NextMaskDebug")->setVisible(TRUE); } diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 5bcc7865f0..4fa9c54b44 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -64,6 +64,7 @@ #include "lltextbase.h" #include "llstring.h" #include "lltrans.h" +#include "llviewernetwork.h" // for gridmanager // [RLVa:KB] - Checked: 2010-08-25 (RLVa-1.2.2a) #include "llslurl.h" #include "rlvhandler.h" @@ -635,21 +636,30 @@ void LLSidepanelTaskInfo::refresh() if (gSavedSettings.getBOOL("DebugPermissions") ) { +// remove misleading X for export when not in OpenSim + bool isOpenSim {false}; +#ifdef OPENSIM + if( LLGridManager::instance().isInOpenSim() ) + { + isOpenSim = true; + } +#endif +// if (valid_base_perms) { - getChild("B:")->setValue("B: " + mask_to_string(base_mask_on)); + getChild("B:")->setValue("B: " + mask_to_string(base_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("B:")->setVisible( TRUE); - getChild("O:")->setValue("O: " + mask_to_string(owner_mask_on)); + getChild("O:")->setValue("O: " + mask_to_string(owner_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("O:")->setVisible( TRUE); - getChild("G:")->setValue("G: " + mask_to_string(group_mask_on)); + getChild("G:")->setValue("G: " + mask_to_string(group_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("G:")->setVisible( TRUE); - getChild("E:")->setValue("E: " + mask_to_string(everyone_mask_on)); + getChild("E:")->setValue("E: " + mask_to_string(everyone_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("E:")->setVisible( TRUE); - getChild("N:")->setValue("N: " + mask_to_string(next_owner_mask_on)); + getChild("N:")->setValue("N: " + mask_to_string(next_owner_mask_on, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("N:")->setVisible( TRUE); } @@ -659,7 +669,7 @@ void LLSidepanelTaskInfo::refresh() if (objectp->permCopy()) flag_mask |= PERM_COPY; if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER; - getChild("F:")->setValue("F:" + mask_to_string(flag_mask)); + getChild("F:")->setValue("F:" + mask_to_string(flag_mask, isOpenSim)); // remove misleading X for export when not in OpenSim getChildView("F:")->setVisible( TRUE); } else From f3aab4cecd95bae858b2f4dfce23357c50578885 Mon Sep 17 00:00:00 2001 From: Beq Date: Tue, 18 Jul 2023 17:11:46 +0100 Subject: [PATCH 02/10] [FIRE-33062] reduce verbosity when queue full situation occurs --- indra/llcommon/llthreadsafequeue.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h index 48b50a2cea..082337cf3e 100644 --- a/indra/llcommon/llthreadsafequeue.h +++ b/indra/llcommon/llthreadsafequeue.h @@ -311,7 +311,7 @@ bool LLThreadSafeQueue::push_(lock_t& lock, T&& element) // Make thread queue capacity hangs visible // return false; { - LL_WARNS("ThreadPool") << "Threadsafe queue push_(lockacquired) queue full " << mStorage.size() << " >= " << mCapacity << LL_ENDL; + LL_WARNS_ONCE("ThreadPool") << "Threadsafe queue push_(lockacquired) queue full " << mStorage.size() << " >= " << mCapacity << LL_ENDL; return false; } // From 4ec632eebb5c943edbb0e85bab19a59b5526ee6c Mon Sep 17 00:00:00 2001 From: Beq Date: Wed, 19 Jul 2023 08:01:10 +0100 Subject: [PATCH 03/10] [FIRE-32550] LODS stuck when out of view Reducing the excessive aggression of the VOCache purging seems to improve this a lot. It also improves other things such as area search and 360 photos. It may also help with the race track vanishing issues. --- indra/newview/app_settings/settings.xml | 6 +++--- indra/newview/llvocache.cpp | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5228040c88..ae8a970891 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9948,7 +9948,7 @@ Type U32 Value - 64 + 0 NoPreload @@ -14282,7 +14282,7 @@ Change of this parameter will affect the layout of buttons in notification toast Type U32 Value - 2048 + 4096 SceneLoadLowMemoryBound @@ -14293,7 +14293,7 @@ Change of this parameter will affect the layout of buttons in notification toast Type U32 Value - 750 + 2048 SceneLoadMinRadius diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index be7b2b1453..b92f147506 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -383,6 +383,21 @@ void LLVOCacheEntry::updateDebugSettings() LLMemory::updateMemoryInfo() ; U32 allocated_mem = LLMemory::getAllocatedMemKB().value(); static const F32 KB_to_MB = 1.f / 1024.f; + // FIRE-32688 Area search and other visibility issues + // If this machine has limited RAM, then restore the LL defaults. + // So long as we have at least 8GB of RAM, then we will use our values. + if( LLMemory::getAvailableMemKB() * KB_to_MB < 8096 ) + { + if( (U32)low_mem_bound_MB > 768 ) + { + gSavedSettings.setU32("SceneLoadLowMemoryBound", 768); + } + if( (U32)high_mem_bound_MB > 2048 ) + { + gSavedSettings.setU32("SceneLoadLowMemoryBound", 2048); + } + } + // U32 clamped_memory = llclamp(allocated_mem * KB_to_MB, (F32) low_mem_bound_MB, (F32) high_mem_bound_MB); const F32 adjust_range = high_mem_bound_MB - low_mem_bound_MB; const F32 adjust_factor = (high_mem_bound_MB - clamped_memory) / adjust_range; // [0, 1] @@ -404,7 +419,11 @@ void LLVOCacheEntry::updateDebugSettings() //the number of frames invisible objects stay in memory static LLCachedControl inv_obj_time(gSavedSettings,"NonvisibleObjectsInMemoryTime"); static const U32 MIN_FRAMES = 10; - static const U32 MAX_FRAMES = 64; + // FIRE-32688 Area search and other visibility + // static const U32 MAX_FRAMES = 64; + // 64 frames for many users now is about a second. Having this as the longest we wait before purging leads to excessively aggressive purging. + static const U32 MAX_FRAMES = 1024; + // const U32 clamped_frames = inv_obj_time ? llclamp((U32) inv_obj_time, MIN_FRAMES, MAX_FRAMES) : MAX_FRAMES; // [10, 64], with zero => 64 sMinFrameRange = MIN_FRAMES + ((clamped_frames - MIN_FRAMES) * adjust_factor); } From c911de1e8a657aea81135ad76d90fb14ba7aa239 Mon Sep 17 00:00:00 2001 From: Beq Date: Wed, 19 Jul 2023 13:53:55 +0100 Subject: [PATCH 04/10] 360 photo and Area Search Improvements Ensure that full update interest list is re-established for the current region after a TP Ensure that it works properly with both 360 and Area Search overlapping Make the Developer menu full update toggle show current state and allow it to reset to 0/default when floaters are in use as an override. --- indra/newview/fsareasearch.cpp | 49 ++++++-- indra/newview/fsareasearch.h | 3 +- indra/newview/llfloater360capture.cpp | 119 ++++++++++++------ indra/newview/llfloater360capture.h | 7 +- indra/newview/llviewermenu.cpp | 115 +++++++++++------ indra/newview/llviewerregion.cpp | 48 +++++++ indra/newview/llviewerregion.h | 6 +- .../skins/default/xui/en/menu_viewer.xml | 10 +- 8 files changed, 267 insertions(+), 90 deletions(-) diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp index b81a20454f..e1cf90b490 100644 --- a/indra/newview/fsareasearch.cpp +++ b/indra/newview/fsareasearch.cpp @@ -174,6 +174,11 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) : mRlvBehaviorCallbackConnection() { LLViewerRegion::sFSAreaSearchActive = true; + if( LLViewerRegion* region = gAgent.getRegion() ) + { + checkRegion(); + } + mFactoryMap["area_search_list_panel"] = LLCallbackMap(createPanelList, this); mFactoryMap["area_search_find_panel"] = LLCallbackMap(createPanelFind, this); mFactoryMap["area_search_filter_panel"] = LLCallbackMap(createPanelFilter, this); @@ -185,11 +190,24 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) : mParcelChangedObserver = std::make_unique(this); LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver.get()); + mRegionChangeConnection = gAgent.addRegionChangedCallback(boost::bind(&FSAreaSearch::checkRegion, this)); } FSAreaSearch::~FSAreaSearch() { LLViewerRegion::sFSAreaSearchActive = false; + + // Tell the Simulator not to send us everything anymore + // and revert to the regular "keyhole" frustum of interest + // list updates. + if( !LLApp::isExiting() ) + { + if( LLViewerRegion* region = gAgent.getRegion() ) + { + region->useFullUpdateInterestListMode(false); + } + } + if (!gIdleCallbacks.deleteFunction(idle, this)) { LL_WARNS("FSAreaSearch") << "FSAreaSearch::~FSAreaSearch() failed to delete callback" << LL_ENDL; @@ -214,6 +232,11 @@ FSAreaSearch::~FSAreaSearch() LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver.get()); mParcelChangedObserver = nullptr; } + + if (mRegionChangeConnection.connected()) + { + mRegionChangeConnection.disconnect(); + } } BOOL FSAreaSearch::postBuild() @@ -320,24 +343,27 @@ void FSAreaSearch::updateRlvRestrictions(ERlvBehaviour behavior) void FSAreaSearch::checkRegion() { - if (mActive) - { - // Check if we changed region, and if we did, clear the object details cache. - if (LLViewerRegion* region = gAgent.getRegion(); region && (region != mLastRegion)) + static LLViewerRegion *last_region = nullptr; + // Check if we changed region, if so reset the interest list to full, + LLViewerRegion* region = gAgent.getRegion(); + if( region && (region != last_region) ) + { + region->useFullUpdateInterestListMode(true, true); // we force this because we want a true count + if ( mActive ) { - if (!mExcludeNeighborRegions) + // and if we did and are active, clear the object details cache. + if( !mExcludeNeighborRegions ) { std::vector uniqueRegions; region->getNeighboringRegions(uniqueRegions); - if (std::find(uniqueRegions.begin(), uniqueRegions.end(), mLastRegion) != uniqueRegions.end()) + if( std::find( uniqueRegions.begin(), uniqueRegions.end(), last_region ) != uniqueRegions.end() ) { // Crossed into a neighboring region, no need to clear everything. - mLastRegion = region; + last_region = region; return; } // else teleported into a new region } - mLastRegion = region; mRequested = 0; mObjectDetails.clear(); mRegionRequests.clear(); @@ -347,7 +373,14 @@ void FSAreaSearch::checkRegion() mPanelList->setAgentLastPosition(gAgent.getPositionGlobal()); mRefresh = true; } + if( last_region ) + { + // we clear the old region status, because the instance may persist for us + // but the region itself will have reset when we left. + last_region->clearFullUpdateInterestList(); + } } + last_region = region; } void FSAreaSearch::refreshList(bool cache_clear) diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h index 95939f17d7..b7dc2be0f3 100644 --- a/indra/newview/fsareasearch.h +++ b/indra/newview/fsareasearch.h @@ -213,7 +213,8 @@ private: typedef std::map name_cache_connection_map_t; name_cache_connection_map_t mNameCacheConnections; - LLViewerRegion* mLastRegion; + boost::signals2::connection mRegionChangeConnection; // reset interest list verbosity after TP + class FSParcelChangeObserver; friend class FSParcelChangeObserver; diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index 0648d651d1..975beca295 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -51,6 +51,27 @@ #include +// Fix 360 capture missing objects after TP +void LLFloater360Capture::checkRegion() +{ + static LLViewerRegion *last_region = nullptr; + // Check if we changed region, if so reset the interest list to full, + LLViewerRegion* region = gAgent.getRegion(); + if( region && (region != last_region) ) + { + region->useFullUpdateInterestListMode(true, true); + if( last_region ) + { + // we clear the old region status, because the instance may persist for us + // but the region itself will have reset when we left. + last_region->clearFullUpdateInterestList(); + } + } + last_region = region; +} + +// + LLFloater360Capture::LLFloater360Capture(const LLSD& key) : LLFloater(key) { @@ -66,10 +87,19 @@ LLFloater360Capture::LLFloater360Capture(const LLSD& key) // will take care of cleaning up for us. if (gSavedSettings.getBOOL("360CaptureUseInterestListCap")) { +// Fix 360 capture missing objects after TP // send everything to us for as long as this floater is open - const bool send_everything = true; - changeInterestListMode(send_everything); + // const bool send_everything = true; + // changeInterestListMode(send_everything); + // } + // } + if( LLViewerRegion* region = gAgent.getRegion() ) + { + checkRegion(); + } } + mRegionChangeConnection = gAgent.addRegionChangedCallback(boost::bind(&LLFloater360Capture::checkRegion, this)); +// } LLFloater360Capture::~LLFloater360Capture() @@ -86,9 +116,22 @@ LLFloater360Capture::~LLFloater360Capture() // list updates. if (!LLApp::isExiting() && gSavedSettings.getBOOL("360CaptureUseInterestListCap")) { - const bool send_everything = false; - changeInterestListMode(send_everything); +// Fix 360 capture missing objects after TP +// const bool send_everything = false; +// changeInterestListMode(send_everything); +// } +// } + + if( LLViewerRegion* region = gAgent.getRegion() ) + { + region->useFullUpdateInterestListMode(false); + } } + if (mRegionChangeConnection.connected()) + { + mRegionChangeConnection.disconnect(); + } +// } BOOL LLFloater360Capture::postBuild() @@ -171,6 +214,8 @@ void LLFloater360Capture::onChooseQualityRadioGroup() setSourceImageSize(); } +// Area search improvements - allow area search and 360 to coexist nicely. +// Code moved to LLViewerRegion.cpp // Using a new capability, tell the simulator that we want it to send everything // it knows about and not just what is in front of the camera, in its view // frustum. We need this feature so that the contents of the region that appears @@ -183,40 +228,40 @@ void LLFloater360Capture::onChooseQualityRadioGroup() // (hopefully) small period of time while the full contents resolves. // Pass in a flag to ask the simulator/interest list to "send everything" or // not (the default mode) -void LLFloater360Capture::changeInterestListMode(bool send_everything) -{ - LLSD body; +// void LLFloater360Capture::changeInterestListMode(bool send_everything) +// { +// LLSD body; +// if (send_everything) +// { +// body["mode"] = LLSD::String("360"); +// } +// else +// { +// body["mode"] = LLSD::String("default"); +// } - if (send_everything) - { - body["mode"] = LLSD::String("360"); - } - else - { - body["mode"] = LLSD::String("default"); - } - - if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response) - { - LL_INFOS("360Capture") << - "InterestList capability responded: \n" << - ll_pretty_print_sd(response) << - LL_ENDL; - })) - { - LL_INFOS("360Capture") << - "Successfully posted an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; - } - else - { - LL_INFOS("360Capture") << - "Unable to post an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; - } -} +// if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response) +// { +// LL_INFOS("360Capture") << +// "InterestList capability responded: \n" << +// ll_pretty_print_sd(response) << +// LL_ENDL; +// })) +// { +// LL_INFOS("360Capture") << +// "Successfully posted an InterestList capability request with payload: \n" << +// ll_pretty_print_sd(body) << +// LL_ENDL; +// } +// else +// { +// LL_INFOS("360Capture") << +// "Unable to post an InterestList capability request with payload: \n" << +// ll_pretty_print_sd(body) << +// LL_ENDL; +// } +// } +// // There is is a setting (360CaptureSourceImageSize) that holds the size // (width == height since it's a square) of each of the 6 source snapshots. diff --git a/indra/newview/llfloater360capture.h b/indra/newview/llfloater360capture.h index 8f765c0b1b..ccaab5ce6d 100644 --- a/indra/newview/llfloater360capture.h +++ b/indra/newview/llfloater360capture.h @@ -50,11 +50,14 @@ class LLFloater360Capture: void onOpen(const LLSD& key) override; void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override; - void changeInterestListMode(bool send_everything); + // void changeInterestListMode(bool send_everything); // Area search improvements - code relocated to LLViewerRegion const std::string getHTMLBaseFolder(); void capture360Images(); - + // make 360 work properly after region crossing/TP + void checkRegion(); + boost::signals2::connection mRegionChangeConnection; + // const std::string makeFullPathToJS(const std::string filename); void writeDataURLHeader(const std::string filename); void writeDataURLFooter(const std::string filename); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 628ca47bee..d0b119a24d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1480,49 +1480,85 @@ class LLAdvancedDumpRegionObjectCache : public view_listener_t } }; -class LLAdvancedInterestListFullUpdate : public view_listener_t +// Handle InterestListFullUpdate as a proper state toggle +// class LLAdvancedInterestListFullUpdate : public view_listener_t +// { +// bool handleEvent(const LLSD& userdata) +// { +// LLSD request; +// LLSD body; +// static bool using_360 = false; + +// if (using_360) +// { +// body["mode"] = LLSD::String("default"); +// } +// else +// { +// body["mode"] = LLSD::String("360"); +// } +// using_360 = !using_360; + +// if (gAgent.requestPostCapability("InterestList", body, [](const LLSD& response) +// { +// LL_INFOS("Int") << +// "InterestList capability responded: \n" << +// ll_pretty_print_sd(response) << +// LL_ENDL; +// })) +// { +// LL_INFOS("360Capture") << +// "Successfully posted an InterestList capability request with payload: \n" << +// ll_pretty_print_sd(body) << +// LL_ENDL; +// return true; +// } +// else +// { +// LL_INFOS("360Capture") << +// "Unable to post an InterestList capability request with payload: \n" << +// ll_pretty_print_sd(body) << +// LL_ENDL; +// return false; +// } +// } +// }; +class LLAdvancedCheckInterestListFullUpdate : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLSD request; - LLSD body; - static bool using_360 = false; - - if (using_360) + LLViewerRegion* regionp = gAgent.getRegion(); + if (regionp) { - body["mode"] = LLSD::String("default"); + bool current_value = ( regionp->mFullUpdateInUseCount > 0 ); + return current_value; } - else - { - body["mode"] = LLSD::String("360"); - } - using_360 = !using_360; - - if (gAgent.requestPostCapability("InterestList", body, [](const LLSD& response) - { - LL_INFOS("360Capture") << - "InterestList capability responded: \n" << - ll_pretty_print_sd(response) << - LL_ENDL; - })) - { - LL_INFOS("360Capture") << - "Successfully posted an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; - return true; - } - else - { - LL_INFOS("360Capture") << - "Unable to post an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; - return false; - } + return false; } }; - +class LLAdvancedToggleInterestListFullUpdate : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLViewerRegion* regionp = gAgent.getRegion(); + if (regionp) + { + bool current_value = ( regionp->mFullUpdateInUseCount > 0 ); + if(current_value) + { + regionp->useFullUpdateInterestListMode(false, true); + return false; + } + else + { + regionp->useFullUpdateInterestListMode(true); + return true; + } + } + return false; + } +}; +// class LLAdvancedBuyCurrencyTest : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -12238,7 +12274,12 @@ void initialize_menus() // Advanced > World view_listener_t::addMenu(new LLAdvancedDumpScriptedCamera(), "Advanced.DumpScriptedCamera"); view_listener_t::addMenu(new LLAdvancedDumpRegionObjectCache(), "Advanced.DumpRegionObjectCache"); - view_listener_t::addMenu(new LLAdvancedInterestListFullUpdate(), "Advanced.InterestListFullUpdate"); + + // Make InterestList a proper stateful toggle + // view_listener_t::addMenu(new LLAdvancedInterestListFullUpdate(), "Advanced.InterestListFullUpdate"); + view_listener_t::addMenu(new LLAdvancedCheckInterestListFullUpdate(), "Advanced.CheckInterestListFullUpdate"); + view_listener_t::addMenu(new LLAdvancedToggleInterestListFullUpdate(), "Advanced.ToggleInterestListFullUpdate"); + // // Advanced > UI commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 5fd65c3405..4e069b5842 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1728,6 +1728,7 @@ BOOL LLViewerRegion::isViewerCameraStatic() void LLViewerRegion::killInvisibleObjects(F32 max_time) { + if(sFSAreaSearchActive){ return; } // FIRE-32668 Area Search improvements if(!sVOCacheCullingEnabled) { return; @@ -3554,6 +3555,53 @@ void LLViewerRegion::logActiveCapabilities() const log_capabilities(mImpl->mCapabilities); } +// Area Search improvement +void LLViewerRegion::useFullUpdateInterestListMode(bool send_everything, bool force_update) +{ + static const char *FSLogTag = "InterestListMode"; + U32 previousCount = mFullUpdateInUseCount; + LLSD body; + LL_DEBUGS(FSLogTag) << "useFullUpdateInterestListMode" << " send_everything:" << send_everything << " inUse: " << mFullUpdateInUseCount << LL_ENDL; + if (send_everything) + { + body["mode"] = LLSD::String("360"); + mFullUpdateInUseCount++; // we increment irrespective of the actual success as we're really just tracking the attempts. + } + else + { + if(mFullUpdateInUseCount > 0) + { + mFullUpdateInUseCount--; // see above. + } + if(force_update) + { + mFullUpdateInUseCount=0; // when we are forcing the off state then we need to clear the count to zero. + } + body["mode"] = LLSD::String("default"); + } + + if( force_update || ( send_everything && mFullUpdateInUseCount == 1 ) || ( ( !send_everything ) && mFullUpdateInUseCount == 0 && previousCount != 0) ) // Only send if this is the first enable or last disable. + { + if (gAgent.requestPostCapability("InterestList", body, + [](const LLSD &response) + { + LL_INFOS(FSLogTag) << "InterestList capability responded: \n" + << ll_pretty_print_sd(response) << LL_ENDL; + })) + { + LL_INFOS(FSLogTag) << "Successfully posted an InterestList capability request with payload: \n" + << ll_pretty_print_sd(body) << LL_ENDL; + } + else + { + LL_INFOS(FSLogTag) << "Unable to post an InterestList capability request with payload: \n" + << ll_pretty_print_sd(body) << LL_ENDL; + } + } + LL_DEBUGS(FSLogTag) << "useFullUpdateInterestListMode" << " (AFTER): inUse: " << mFullUpdateInUseCount << LL_ENDL; +} +// + LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type) { if (type < mImpl->mObjectPartition.size() && type < PARTITION_VO_CACHE) diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 786b530ab9..e1ab37b890 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -351,7 +351,11 @@ public: bool dynamicPathfindingEnabled() const; bool avatarHoverHeightEnabled() const; - +// Area search improvements + U32 mFullUpdateInUseCount {0}; + void clearFullUpdateInterestList(){ LL_DEBUGS("InterestListMode") << "Resetting for previous region" << LL_ENDL; mFullUpdateInUseCount = 0; }; + void useFullUpdateInterestListMode(bool full_update, bool force_update=false); +// // #ifdef OPENSIM std::set getGods() { return mGodNames; }; diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 06fbe361a8..d5ef57b1b3 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -4756,13 +4756,15 @@ function="Advanced.DumpRegionObjectCache" /> - - - + + + From 44d61da1855a5907efaebf6de90efd1605a91631 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Wed, 19 Jul 2023 15:27:38 +0200 Subject: [PATCH 05/10] Modify menu option for all languages --- indra/newview/skins/default/xui/de/menu_viewer.xml | 2 +- indra/newview/skins/default/xui/fr/menu_viewer.xml | 2 +- indra/newview/skins/default/xui/pl/menu_viewer.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 9558b115fa..74a7a2223d 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -553,7 +553,7 @@ - + diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index aedfc165cb..afde1862c1 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -494,7 +494,7 @@ - + diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 77d8db0bef..0a8bf734f3 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -542,7 +542,7 @@ - + From 31f84a0547a7283d06d1157421543adff163817e Mon Sep 17 00:00:00 2001 From: Beq Date: Wed, 19 Jul 2023 15:12:32 +0100 Subject: [PATCH 06/10] Fix Linux amnesia --- indra/llcommon/llmemory.cpp | 85 +++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 26 deletions(-) diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index d6ae1284d3..1064c6d5bc 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -225,38 +225,71 @@ U64 LLMemory::getCurrentRSS() } #elif defined(LL_LINUX) +// Linux RSS appears to have drifted from the implementation below. +// U64 LLMemory::getCurrentRSS() +// { +// static const char statPath[] = "/proc/self/stat"; +// LLFILE *fp = LLFile::fopen(statPath, "r"); +// U64 rss = 0; -U64 LLMemory::getCurrentRSS() -{ - static const char statPath[] = "/proc/self/stat"; - LLFILE *fp = LLFile::fopen(statPath, "r"); - U64 rss = 0; +// if (fp == NULL) +// { +// LL_WARNS() << "couldn't open " << statPath << LL_ENDL; +// return 0; +// } - if (fp == NULL) - { - LL_WARNS() << "couldn't open " << statPath << LL_ENDL; - return 0; - } - - // Eee-yew! See Documentation/filesystems/proc.txt in your - // nearest friendly kernel tree for details. +// // Eee-yew! See Documentation/filesystems/proc.txt in your +// // nearest friendly kernel tree for details. - { - int ret = fscanf(fp, "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*d %*d " - "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %Lu", - &rss); - if (ret != 1) - { - LL_WARNS() << "couldn't parse contents of " << statPath << LL_ENDL; - rss = 0; - } - } +// { +// int ret = fscanf(fp, "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*d %*d " +// "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %Lu", +// &rss); +// if (ret != 1) +// { +// LL_WARNS() << "couldn't parse contents of " << statPath << LL_ENDL; +// rss = 0; +// } +// } - fclose(fp); +// fclose(fp); - return rss; +// return rss; +// } +#include +#include +#include +#include +#include +#include + +U64 LLMemory::getCurrentRSS() { + namespace fs = std::filesystem; + + // Get the page size (static variable) + static const long pageSize = sysconf(_SC_PAGESIZE); + + // Open the /proc/self/statm file + static const auto statmPath = fs::path("/proc/self/statm"); + std::ifstream statmFile(statmPath); + if (!statmFile.is_open()) { + return 0; // Return 0 if the file cannot be opened + } + + // Read the entire line from statm file + std::string line; + std::getline(statmFile, line); + statmFile.close(); + + // Extract the values from the line + std::istringstream iss(line); + long size, rss, shared, text, lib, data, dt; + iss >> size >> rss >> shared >> text >> lib >> data >> dt; + + // Convert pages to kilobytes and return RSS + return static_cast(rss * pageSize / 1024); } - +// #else U64 LLMemory::getCurrentRSS() From 2a54d9efd084246df22c6f2296065b13e30f69b9 Mon Sep 17 00:00:00 2001 From: Beq Date: Wed, 19 Jul 2023 15:32:36 +0100 Subject: [PATCH 07/10] header name derpfix --- indra/llcommon/llmemory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 1064c6d5bc..d0a8cac951 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -261,7 +261,7 @@ U64 LLMemory::getCurrentRSS() #include #include #include -#include +#include U64 LLMemory::getCurrentRSS() { namespace fs = std::filesystem; From 73f188f54ac99b0ee3513a88cc71d23489cbb845 Mon Sep 17 00:00:00 2001 From: Beq Date: Thu, 20 Jul 2023 15:15:45 +0100 Subject: [PATCH 08/10] fix unit conversion error in Linux RSS --- indra/llcommon/llmemory.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index d0a8cac951..9bade9ea69 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -263,6 +263,7 @@ U64 LLMemory::getCurrentRSS() #include #include +// return the RSS in bytes. This value is converted to kilobytes implicitly elsewhere. U64 LLMemory::getCurrentRSS() { namespace fs = std::filesystem; @@ -286,8 +287,8 @@ U64 LLMemory::getCurrentRSS() { long size, rss, shared, text, lib, data, dt; iss >> size >> rss >> shared >> text >> lib >> data >> dt; - // Convert pages to kilobytes and return RSS - return static_cast(rss * pageSize / 1024); + // Convert pages to bytes and return RSS + return static_cast( rss * pageSize ); } // #else From 3a6a4e9e8f53ecb4fd2bb16890a54ad128845766 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Fri, 21 Jul 2023 21:56:49 +0200 Subject: [PATCH 09/10] FIRE-33097 Russian translation update, by Romka Swallowtail --- .../xui/ru/floater_translation_settings.xml | 92 +++++++++++++------ .../skins/default/xui/ru/menu_viewer.xml | 1 + .../skins/default/xui/ru/notifications.xml | 3 + .../xui/ru/panel_profile_secondlife.xml | 12 +++ .../xui/ru/panel_profile_secondlife.xml | 7 ++ 5 files changed, 85 insertions(+), 30 deletions(-) diff --git a/indra/newview/skins/default/xui/ru/floater_translation_settings.xml b/indra/newview/skins/default/xui/ru/floater_translation_settings.xml index 466897d9a3..c15ff3afa8 100644 --- a/indra/newview/skins/default/xui/ru/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/ru/floater_translation_settings.xml @@ -1,58 +1,90 @@ - - Bing appID Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ. + + Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ слуТбы Azure Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. Бтатус: [STATUS]. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ваши настройки ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ. - ΠšΠ»ΡŽΡ‡ Google API Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ. + ΠšΠ»ΡŽΡ‡ API Google Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. Бтатус: [STATUS]. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свой ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ. - - Bing appID ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. + + ΠšΠ»ΡŽΡ‡ API DeepL Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. Бтатус: [STATUS]. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свой ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ. + + + Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ слуТбы Azure ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. - ΠšΠ»ΡŽΡ‡ Google API ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. + ΠšΠ»ΡŽΡ‡ API Google ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. - + + ΠšΠ»ΡŽΡ‡ API DeepL ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½. + + ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π°Ρ‚ Π½Π°: - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ сСрвис ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°: - - + + + - - Bing [http://www.bing.com/developers/createapp.aspx AppID]: + + [https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Установка] - diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index a926b0a248..1c706a05e5 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -2536,6 +2536,9 @@ Π’Π°ΡˆΠ° ΠΊΠΎΡ€Π·ΠΈΠ½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅. + + Π’ вашСм ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ Π² слуТбу ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ вашСй сСтки. + Π’Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» своих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ, Π²Π΅Π±-страниц ΠΈ поиска? diff --git a/indra/newview/skins/default/xui/ru/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/ru/panel_profile_secondlife.xml index a17d3368b7..30db74528b 100644 --- a/indra/newview/skins/default/xui/ru/panel_profile_secondlife.xml +++ b/indra/newview/skins/default/xui/ru/panel_profile_secondlife.xml @@ -3,6 +3,13 @@ Π’ сСти НС Π² сСти НСизвСстно + + + + + + + @@ -31,6 +38,11 @@ + + + + + diff --git a/indra/newview/skins/vintage/xui/ru/panel_profile_secondlife.xml b/indra/newview/skins/vintage/xui/ru/panel_profile_secondlife.xml index 4ff4ca0c89..96100cc00a 100644 --- a/indra/newview/skins/vintage/xui/ru/panel_profile_secondlife.xml +++ b/indra/newview/skins/vintage/xui/ru/panel_profile_secondlife.xml @@ -3,6 +3,13 @@ Π’ сСти НС Π² сСти НСизвСстно + + + + + + + From d7103b8d1f3df6ae09da5a3315356545222bef3e Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Fri, 21 Jul 2023 21:57:20 +0200 Subject: [PATCH 10/10] Minor change in Polish translation --- indra/newview/skins/default/xui/pl/panel_profile_secondlife.xml | 2 +- indra/newview/skins/vintage/xui/pl/panel_profile_secondlife.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/pl/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/pl/panel_profile_secondlife.xml index b4fb11d0fe..2eadb13bb2 100644 --- a/indra/newview/skins/default/xui/pl/panel_profile_secondlife.xml +++ b/indra/newview/skins/default/xui/pl/panel_profile_secondlife.xml @@ -9,7 +9,7 @@ - + diff --git a/indra/newview/skins/vintage/xui/pl/panel_profile_secondlife.xml b/indra/newview/skins/vintage/xui/pl/panel_profile_secondlife.xml index 1b410b0ba7..4b60b7d35f 100644 --- a/indra/newview/skins/vintage/xui/pl/panel_profile_secondlife.xml +++ b/indra/newview/skins/vintage/xui/pl/panel_profile_secondlife.xml @@ -9,7 +9,7 @@ - +