From 4799f2e33865cf11b692dd95c594ae4d128d5866 Mon Sep 17 00:00:00 2001 From: Darl Date: Wed, 23 Jul 2025 19:03:15 -0500 Subject: [PATCH 01/10] Media first click interact group check fix --- indra/newview/lltoolpie.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index dc27e11a0b..48c8470381 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1580,11 +1580,9 @@ bool LLToolPie::shouldAllowFirstMediaInteraction(const LLPickInfo& pick, bool mo // Check for objects set to or owned by the active group if(FirstClickPref & MEDIA_FIRST_CLICK_GROUP) { - // Get our active group - LLUUID active_group = gAgent.getGroupID(); - if(active_group.notNull() && (active_group == group_id || active_group == owner_id)) + if(gAgent.isInGroup(group_id) || gAgent.isInGroup(owner_id)) { - LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_GROUP.Active group: " << active_group << ", group_id:" << group_id << ", owner_id: " << owner_id << LL_ENDL; + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_GROUP. group_id:" << group_id << ", owner_id: " << owner_id << LL_ENDL; return true; } } From a588addc68e43c0558c5b18560f37fff350dc2f1 Mon Sep 17 00:00:00 2001 From: Darl Date: Wed, 23 Jul 2025 19:07:00 -0500 Subject: [PATCH 02/10] Media first click interact friend check fix --- indra/newview/lltoolpie.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 48c8470381..0fd9faab35 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -1573,8 +1573,11 @@ bool LLToolPie::shouldAllowFirstMediaInteraction(const LLPickInfo& pick, bool mo // Check if the object is owned by a friend of the agent if(FirstClickPref & MEDIA_FIRST_CLICK_FRIEND) { - LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_FRIEND. id: " << owner_id << LL_ENDL; - return LLAvatarTracker::instance().isBuddy(owner_id); + if(LLAvatarTracker::instance().isBuddy(owner_id)) + { + LL_DEBUGS_ONCE() << "FirstClickPref & MEDIA_FIRST_CLICK_FRIEND. id: " << owner_id << LL_ENDL; + return true; + } } // Check for objects set to or owned by the active group From 288bce100d1239dd98e1d0730c905cc5cbe6ad1b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 28 Jul 2025 19:58:57 +0300 Subject: [PATCH 03/10] #4455 Division by zero in updateFrameStats --- indra/newview/llviewerstats.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 4ec7c6dfac..63fb7d4a17 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -277,9 +277,9 @@ private: F64Seconds mLastTimeDiff; // used for time stat updates F64Seconds mTotalFrametimeJitter; - U32 mFrameJitterEvents; - U32 mFrameJitterEventsLastMinute; - U32 mEventMinutes; + U32 mFrameJitterEvents = 0; + U32 mFrameJitterEventsLastMinute = 0; + U32 mEventMinutes = 0; F64Seconds mTotalTime; F64Seconds mLastFrameTimeSample; // used for frame time stats From a33fda4f288859222a1d2409e340f42b5aa5dd20 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 31 Jul 2025 00:08:08 +0300 Subject: [PATCH 04/10] #4339 Remade fix for world map's find button --- indra/newview/llfloaterworldmap.cpp | 36 ++++++++++++++++++++++++----- indra/newview/llfloaterworldmap.h | 3 ++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 565642e683..6e6eaa3a20 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -325,6 +325,7 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mWaitingForTracker(false), mIsClosing(false), mSetToUserPosition(true), + mProcessingSearchUpdate(false), mTrackedLocation(0.0,0.0,0.0), mTrackedStatus(LLTracker::TRACKING_NOTHING), mParcelInfoObserver(nullptr), @@ -338,7 +339,7 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this)); mCommitCallbackRegistrar.add("WMap.AvatarCombo", boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this)); mCommitCallbackRegistrar.add("WMap.Landmark", boost::bind(&LLFloaterWorldMap::onLandmarkComboCommit, this)); - mCommitCallbackRegistrar.add("WMap.SearchResult", boost::bind(&LLFloaterWorldMap::onCommitSearchResult, this)); + mCommitCallbackRegistrar.add("WMap.SearchResult", [this](LLUICtrl* ctrl, const LLSD& data) { LLFloaterWorldMap::onCommitSearchResult(false); }); mCommitCallbackRegistrar.add("WMap.GoHome", boost::bind(&LLFloaterWorldMap::onGoHome, this)); mCommitCallbackRegistrar.add("WMap.Teleport", boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); mCommitCallbackRegistrar.add("WMap.ShowTarget", boost::bind(&LLFloaterWorldMap::onShowTargetBtn, this)); @@ -783,6 +784,7 @@ void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item) void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) { + mProcessingSearchUpdate = false; LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); if (!sim_info) { @@ -922,7 +924,10 @@ void LLFloaterWorldMap::updateLocation() } } - mLocationEditor->setValue(sim_name); + if (!mProcessingSearchUpdate) + { + mLocationEditor->setValue(sim_name); + } // refresh coordinate display to reflect where user clicked. LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal(); @@ -1196,6 +1201,7 @@ void LLFloaterWorldMap::onGoHome() { gAgent.teleportHome(); closeFloater(); + mProcessingSearchUpdate = false; } @@ -1365,6 +1371,7 @@ void LLFloaterWorldMap::onLocationCommit() { return; } + mProcessingSearchUpdate = true; LLStringUtil::toLower(str); mCompletingRegionName = str; @@ -1386,6 +1393,7 @@ void LLFloaterWorldMap::onCoordinatesCommit() { return; } + mProcessingSearchUpdate = false; S32 x_coord = (S32)mTeleportCoordSpinX->getValue().asReal(); S32 y_coord = (S32)mTeleportCoordSpinY->getValue().asReal(); @@ -1399,6 +1407,7 @@ void LLFloaterWorldMap::onCoordinatesCommit() void LLFloaterWorldMap::onClearBtn() { mTrackedStatus = LLTracker::TRACKING_NOTHING; + mProcessingSearchUpdate = false; LLTracker::stopTracking(true); LLWorldMap::getInstance()->cancelTracking(); mSLURL = LLSLURL(); // Clear the SLURL since it's invalid @@ -1415,6 +1424,7 @@ void LLFloaterWorldMap::onShowAgentBtn() mMapView->setPanWithInterpTime(0, 0, false, 0.1f); // false == animate // Set flag so user's location will be displayed if not tracking anything else mSetToUserPosition = true; + mProcessingSearchUpdate = false; } void LLFloaterWorldMap::onClickTeleportBtn() @@ -1570,6 +1580,12 @@ void LLFloaterWorldMap::teleport() gAgent.teleportViaLocation( pos_global ); } } + + if (mProcessingSearchUpdate) + { + mProcessingSearchUpdate = false; + mTrackedSimName.clear(); + } } void LLFloaterWorldMap::flyToLandmark() @@ -1695,18 +1711,20 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) { mSearchResults->selectByValue(match); mSearchResults->setFocus(true); - onCommitSearchResult(); + onCommitSearchResult(false /*fully commit the only option*/); } // else let user decide else { - mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT); + mSearchResults->selectFirstItem(); mSearchResults->setFocus(true); + onCommitSearchResult(true /*don't update text field*/); } } else { // if we found nothing, say "none" + mProcessingSearchUpdate = false; mSearchResults->setCommentText(LLTrans::getString("worldmap_results_none_found")); mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT); } @@ -1720,7 +1738,7 @@ void LLFloaterWorldMap::onTeleportFinished() } } -void LLFloaterWorldMap::onCommitSearchResult() +void LLFloaterWorldMap::onCommitSearchResult(bool from_search) { std::string sim_name = mSearchResults->getSelectedValue().asString(); if (sim_name.empty()) @@ -1751,8 +1769,14 @@ void LLFloaterWorldMap::onCommitSearchResult() pos_global.mdV[VY] += (F64)pos_local.mV[VY]; pos_global.mdV[VZ] = (F64)pos_local.mV[VZ]; - mLocationEditor->setValue(sim_name); + // Commiting search string automatically selects first item in the search list, + // in such case onCommitSearchResult shouldn't modify search string + if (!from_search) + { + mLocationEditor->setValue(sim_name); + } trackLocation(pos_global); + mProcessingSearchUpdate = from_search; mTrackCtrlsPanel->setDefaultBtn(mTeleportButton); break; } diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index bf1650eb7c..9558ca2615 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -176,7 +176,7 @@ protected: void onLocationFocusChanged( LLFocusableElement* ctrl ); void onLocationCommit(); void onCoordinatesCommit(); - void onCommitSearchResult(); + void onCommitSearchResult(bool from_search); void onTeleportFinished(); @@ -213,6 +213,7 @@ private: bool mIsClosing; bool mSetToUserPosition; + bool mProcessingSearchUpdate; // Don't update search string from what user set it to LLVector3d mTrackedLocation; LLTracker::ETrackingStatus mTrackedStatus; From 8240af03b9c64572ce0594052e18d374d6e8941c Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 31 Jul 2025 19:55:28 +0300 Subject: [PATCH 05/10] #4465 modify vertex limit threshold for starting splitting --- indra/newview/gltf/llgltfloader.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp index 950e98c96d..dd1d327683 100644 --- a/indra/newview/gltf/llgltfloader.cpp +++ b/indra/newview/gltf/llgltfloader.cpp @@ -87,7 +87,8 @@ static const glm::mat4 coord_system_rotationxy( 0.f, 0.f, 0.f, 1.f ); -static const S32 VERTICIES_LIMIT = USHRT_MAX - 2; +static const S32 VERTEX_SPLIT_SAFETY_MARGIN = 3 * 3 + 1; // 10 vertices: 3 complete triangles plus remapping overhead +static const S32 VERTEX_LIMIT = USHRT_MAX - VERTEX_SPLIT_SAFETY_MARGIN; LLGLTFLoader::LLGLTFLoader(std::string filename, S32 lod, @@ -951,7 +952,7 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& bas } // Indices handling - if (faceVertices.size() >= VERTICIES_LIMIT) + if (faceVertices.size() >= VERTEX_LIMIT) { // Will have to remap 32 bit indices into 16 bit indices // For the sake of simplicity build vector of 32 bit indices first @@ -1036,7 +1037,7 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const std::string& bas } indices_16.push_back((U16)vert_index); - if (indices_16.size() % 3 == 0 && face_verts.size() >= VERTICIES_LIMIT - 1) + if (indices_16.size() % 3 == 0 && face_verts.size() >= VERTEX_LIMIT) { LLVolumeFace face; face.fillFromLegacyData(face_verts, indices_16); From 7255933d2ac9c2a9101b817e7b880702f453c72b Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Sat, 2 Aug 2025 05:31:35 +0300 Subject: [PATCH 06/10] #3785 Set default `MediaFirstClickInteract` value to 31 (Landowner objects) --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b0b7430c97..5b5551dbe0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -16243,7 +16243,7 @@ Type S32 Value - 1 + 31 From f338b91f7c9dbfe999b5ea9a1facb9eaeafb3407 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 4 Aug 2025 17:47:24 +0300 Subject: [PATCH 07/10] #4483 Fix gltf not opening unicode paths --- indra/newview/gltf/accessor.cpp | 2 +- indra/newview/gltf/asset.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/gltf/accessor.cpp b/indra/newview/gltf/accessor.cpp index d1845605d4..03f7331893 100644 --- a/indra/newview/gltf/accessor.cpp +++ b/indra/newview/gltf/accessor.cpp @@ -159,7 +159,7 @@ bool Buffer::prep(Asset& asset) std::string dir = gDirUtilp->getDirName(asset.mFilename); std::string bin_file = dir + gDirUtilp->getDirDelimiter() + mUri; - std::ifstream file(bin_file, std::ios::binary); + llifstream file(bin_file.c_str(), std::ios::binary); if (!file.is_open()) { LL_WARNS("GLTF") << "Failed to open file: " << bin_file << LL_ENDL; diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp index 8c9f77686a..e24aea4a28 100644 --- a/indra/newview/gltf/asset.cpp +++ b/indra/newview/gltf/asset.cpp @@ -696,7 +696,7 @@ bool Asset::load(std::string_view filename, bool loadIntoVRAM) mFilename = filename; std::string ext = gDirUtilp->getExtension(mFilename); - std::ifstream file(filename.data(), std::ios::binary); + llifstream file(filename.data(), std::ios::binary); if (file.is_open()) { std::string str((std::istreambuf_iterator(file)), std::istreambuf_iterator()); From c8f1890f963a7c6ec288e3155e553f9411101417 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 5 Aug 2025 18:26:35 +0300 Subject: [PATCH 08/10] #4473 Permit zooming to self in people panel --- indra/newview/llpanelpeoplemenus.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index f8a73ddb46..939b1f12a9 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -154,11 +154,15 @@ void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata) { + std::string item = userdata.asString(); if(gAgent.getID() == mUUIDs.front()) { + if (item == std::string("can_zoom_in")) + { + return true; + } return false; } - std::string item = userdata.asString(); // Note: can_block and can_delete is used only for one person selected menu // so we don't need to go over all uuids. From c25df5224f7bf150ddc56014b0389985da2eb542 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 5 Aug 2025 23:13:42 +0300 Subject: [PATCH 09/10] #3564 Permit 'labeling' audio streams that play via media plugin People were using fmod's undocumented capability to ignore everything after the url to label their streams. --- .../newview/llviewermedia_streamingaudio.cpp | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp index b68ffbe1a2..4a1c433f8e 100644 --- a/indra/newview/llviewermedia_streamingaudio.cpp +++ b/indra/newview/llviewermedia_streamingaudio.cpp @@ -60,13 +60,26 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url) if(!mMediaPlugin) return; - if (!url.empty()) { + if (!url.empty()) + { LL_INFOS() << "Starting internet stream: " << url << LL_ENDL; - mURL = url; - mMediaPlugin->loadURI ( url ); + + mURL = url; // keep original url here for comparison purposes + std::string snt_url = url; + LLStringUtil::trim(snt_url); + size_t pos = snt_url.find(' '); + if (pos != std::string::npos) + { + // fmod permited having names after the url and people were using it. + // People label their streams this way, ignore the 'label'. + snt_url = snt_url.substr(0, pos); + } + mMediaPlugin->loadURI(snt_url); mMediaPlugin->start(); LL_INFOS() << "Playing stream..." << LL_ENDL; - } else { + } + else + { LL_INFOS() << "setting stream to NULL"<< LL_ENDL; mURL.clear(); mMediaPlugin->stop(); From 819817f5c9cebad353f5b86996b5426095dd73b8 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 6 Aug 2025 14:29:55 +0300 Subject: [PATCH 10/10] #4470 Temporarily disable Discord SDK --- autobuild.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4787ed168b..56c66b163f 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2975,7 +2975,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - -DUSE_DISCORD:BOOL=ON -DUSE_OPENAL:BOOL=ON @@ -3018,7 +3017,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - -DUSE_DISCORD:BOOL=ON -DUSE_OPENAL:BOOL=ON