Merge branch 'master' into Texture_VRAM_Optimizations

This commit is contained in:
minerjr
2025-05-23 05:40:03 -03:00
24 changed files with 441 additions and 74 deletions
@@ -74,11 +74,13 @@
<string>RenderShaderLightingMaxLevel</string>
<string>RenderShadowDetail</string>
<string>RenderShadowResolutionScale</string>
<string>RenderSkyAmbientScale</string>
<string>RenderSkyAutoAdjustAmbientScale</string>
<string>RenderSkyAutoAdjustBlueDensityScale</string>
<string>RenderSkyAutoAdjustBlueHorizonScale</string>
<string>RenderSkyAutoAdjustSunColorScale</string>
<string>RenderSkyAutoAdjustHDRScale</string>
<string>RenderSkyAutoAdjustLegacy</string>
<string>RenderSkyAutoAdjustProbeAmbiance</string>
<string>RenderSkySunlightScale</string>
<string>RenderSSAOIrradianceScale</string>
+33
View File
@@ -156,6 +156,7 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
mFilterPhantom(false),
mFilterAttachment(false),
mFilterMoaP(false),
mFilterReflectionProbe(false),
mFilterDistance(false),
mFilterDistanceMin(0),
mFilterDistanceMax(999999),
@@ -166,6 +167,7 @@ FSAreaSearch::FSAreaSearch(const LLSD& key) :
mBeacons(false),
mExcludeAttachment(true),
mExcludeTemporary(true),
mExcludeReflectionProbe(false),
mExcludePhysics(true),
mExcludeChildPrims(true),
mExcludeNeighborRegions(true),
@@ -545,6 +547,11 @@ bool FSAreaSearch::isSearchableObject(LLViewerObject* objectp, LLViewerRegion* o
return false;
}
if (mExcludeReflectionProbe && objectp->mReflectionProbe.notNull())
{
return false;
}
return true;
}
@@ -908,6 +915,11 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje
return;
}
if (mFilterReflectionProbe && !objectp->mReflectionProbe.notNull())
{
return;
}
//-----------------------------------------------------------------------
// Find text
//-----------------------------------------------------------------------
@@ -2217,6 +2229,10 @@ bool FSPanelAreaSearchFilter::postBuild()
mCheckboxExcludetemporary->set(true);
mCheckboxExcludetemporary->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxExcludeReflectionProbes = getChild<LLCheckBoxCtrl>("exclude_reflection_probes");
mCheckboxExcludeReflectionProbes->set(false);
mCheckboxExcludeReflectionProbes->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxExcludeChildPrim = getChild<LLCheckBoxCtrl>("exclude_childprim");
mCheckboxExcludeChildPrim->set(true);
mCheckboxExcludeChildPrim->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
@@ -2240,6 +2256,9 @@ bool FSPanelAreaSearchFilter::postBuild()
mCheckboxMoaP = getChild<LLCheckBoxCtrl>("filter_moap");
mCheckboxMoaP->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxReflectionProbe = getChild<LLCheckBoxCtrl>("filter_reflection_probe");
mCheckboxReflectionProbe->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
mCheckboxPermCopy = getChild<LLCheckBoxCtrl>("filter_perm_copy");
mCheckboxPermCopy->setCommitCallback(boost::bind(&FSPanelAreaSearchFilter::onCommitCheckbox, this));
@@ -2262,6 +2281,7 @@ void FSPanelAreaSearchFilter::onCommitCheckbox()
mFSAreaSearch->setFilterForSale(mCheckboxForSale->get());
mFSAreaSearch->setFilterDistance(mCheckboxDistance->get());
mFSAreaSearch->setFilterMoaP(mCheckboxMoaP->get());
mFSAreaSearch->setFilterReflectionProbe(mCheckboxReflectionProbe->get());
if (mCheckboxExcludePhysics->get())
{
@@ -2291,6 +2311,19 @@ void FSPanelAreaSearchFilter::onCommitCheckbox()
}
mFSAreaSearch->setFilterTemporary(mCheckboxTemporary->get());
if (mCheckboxExcludeReflectionProbes->get())
{
mFSAreaSearch->setFilterReflectionProbe(false);
mCheckboxReflectionProbe->set(false);
mCheckboxReflectionProbe->setEnabled(false);
mFSAreaSearch->setExcludeReflectionProbe(true);
}
else
{
mCheckboxReflectionProbe->setEnabled(true);
mFSAreaSearch->setExcludeReflectionProbe(false);
}
if (mCheckboxExcludeAttachment->get())
{
mFSAreaSearch->setFilterAttachment(false);
+6
View File
@@ -141,12 +141,14 @@ public:
void setFilterPhantom(bool b) { mFilterPhantom = b; }
void setFilterAttachment(bool b) { mFilterAttachment = b; }
void setFilterMoaP(bool b) { mFilterMoaP = b; }
void setFilterReflectionProbe(bool b) { mFilterReflectionProbe = b; }
void setRegexSearch(bool b) { mRegexSearch = b; }
void setBeacons(bool b) { mBeacons = b; }
void setExcludeAttachment(bool b) { mExcludeAttachment = b; }
void setExcludetemporary(bool b) { mExcludeTemporary = b; }
void setExcludeReflectionProbe(bool b) { mExcludeReflectionProbe = b; }
void setExcludePhysics(bool b) { mExcludePhysics = b; }
void setExcludeChildPrims(bool b) { mExcludeChildPrims = b; }
void setExcludeNeighborRegions(bool b) { mExcludeNeighborRegions = b; }
@@ -230,6 +232,7 @@ private:
bool mExcludeAttachment;
bool mExcludeTemporary;
bool mExcludeReflectionProbe;
bool mExcludePhysics;
bool mExcludeChildPrims;
bool mExcludeNeighborRegions;
@@ -240,6 +243,7 @@ private:
bool mFilterPhantom;
bool mFilterAttachment;
bool mFilterMoaP;
bool mFilterReflectionProbe;
bool mFilterForSale;
S32 mFilterForSaleMin;
@@ -382,6 +386,7 @@ private:
LLCheckBoxCtrl* mCheckboxLocked;
LLCheckBoxCtrl* mCheckboxPhantom;
LLCheckBoxCtrl* mCheckboxMoaP;
LLCheckBoxCtrl* mCheckboxReflectionProbe;
LLCheckBoxCtrl* mCheckboxDistance;
LLSpinCtrl* mSpinDistanceMinValue;
LLSpinCtrl* mSpinDistanceMaxValue;
@@ -393,6 +398,7 @@ private:
LLCheckBoxCtrl* mCheckboxExcludeAttachment;
LLCheckBoxCtrl* mCheckboxExcludePhysics;
LLCheckBoxCtrl* mCheckboxExcludetemporary;
LLCheckBoxCtrl* mCheckboxExcludeReflectionProbes;
LLCheckBoxCtrl* mCheckboxExcludeChildPrim;
LLCheckBoxCtrl* mCheckboxExcludeNeighborRegions;
LLCheckBoxCtrl* mCheckboxPermCopy;
+16
View File
@@ -1253,6 +1253,22 @@ FSFloaterIM* FSFloaterIM::show(const LLUUID& session_id)
if (!gIMMgr->hasSession(session_id))
return nullptr;
// <AS:chanayane> [FIRE-34494] fixes unable to open an IM with someone who started a group chat
// Prevent showing non-IM sessions in FSFloaterIM::show()
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
if (!session || (
IM_NOTHING_SPECIAL != session->mType
&& IM_SESSION_P2P_INVITE != session->mType
&& IM_SESSION_INVITE != session->mType
&& IM_SESSION_CONFERENCE_START != session->mType
&& IM_SESSION_GROUP_START != session->mType))
{
LL_WARNS("IMVIEW") << "Attempted to show FSFloaterIM for non-IM session: "
<< (session ? std::to_string(session->mType) : "null") << LL_ENDL;
return nullptr;
}
// </AS:chanayane>
if (!isChatMultiTab())
{
//hide all
+17 -10
View File
@@ -197,6 +197,8 @@ void FSPrimfeedPhotoPanel::draw()
mRefreshBtn->setEnabled(can_post);
mBtnPreview->setEnabled(can_post);
mLocationCheckbox->setEnabled(can_post);
mPublicGalleryCheckbox->setEnabled(can_post);
mCommercialCheckbox->setEnabled(can_post);
// Reassign the preview floater if we have the focus and the preview exists
if (hasFocus() && isPreviewVisible())
@@ -538,6 +540,8 @@ void FSPrimfeedPhotoPanel::onOpen(const LLSD& key)
{
// Reauthorise if necessary.
FSPrimfeedAuth::initiateAuthRequest();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
}
}
@@ -660,15 +664,14 @@ bool FSPrimfeedAccountPanel::postBuild()
void FSPrimfeedAccountPanel::draw()
{
FSPrimfeedConnect::EConnectionState connection_state = FSPrimfeedConnect::instance().getConnectionState();
static FSPrimfeedConnect::EConnectionState last_state = FSPrimfeedConnect::PRIMFEED_DISCONNECTED;
// Disable the 'disconnect' button and the 'use another account' button when disconnecting in progress
bool disconnecting = connection_state == FSPrimfeedConnect::PRIMFEED_DISCONNECTING;
mDisconnectButton->setEnabled(!disconnecting);
// Disable the 'connect' button when a connection is in progress
bool connecting =
(connection_state == FSPrimfeedConnect::PRIMFEED_CONNECTING || connection_state == FSPrimfeedConnect::PRIMFEED_CONNECTED);
mConnectButton->setEnabled(!connecting);
// Update the connection state if it has changed
if (connection_state != last_state)
{
onPrimfeedConnectStateChange(LLSD());
last_state = connection_state;
}
LLPanel::draw();
}
@@ -701,7 +704,7 @@ void FSPrimfeedAccountPanel::onVisibilityChange(bool visible)
bool FSPrimfeedAccountPanel::onPrimfeedConnectStateChange(const LLSD&)
{
if (FSPrimfeedAuth::isAuthorized())
if (FSPrimfeedAuth::isAuthorized() || FSPrimfeedConnect::instance().getConnectionState() == FSPrimfeedConnect::PRIMFEED_CONNECTING)
{
showConnectedLayout();
}
@@ -768,11 +771,15 @@ void FSPrimfeedAccountPanel::showConnectedLayout()
void FSPrimfeedAccountPanel::onConnect()
{
FSPrimfeedAuth::initiateAuthRequest();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
}
void FSPrimfeedAccountPanel::onDisconnect()
{
FSPrimfeedAuth::resetAuthStatus();
LLSD dummy;
onPrimfeedConnectStateChange(dummy);
}
////////////////////////
@@ -867,7 +874,7 @@ void FSFloaterPrimfeed::draw()
}
default:
{
LL_WARNS("Prmfeed") << "unexpected state" << connection_state << LL_ENDL;
// LL_WARNS("Prmfeed") << "unexpected state" << connection_state << LL_ENDL;
break;
}
}
+5 -24
View File
@@ -131,6 +131,7 @@ void FSPrimfeedAuth::initiateAuthRequest()
sPrimfeedAuth.reset();
}
);
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_CONNECTING);
}
else
{
@@ -149,20 +150,16 @@ void FSPrimfeedAuth::resetAuthStatus()
event_data["status"] = "reset";
event_data["success"] = "false";
sPrimfeedAuthPump->post(event_data);
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_DISCONNECTED);
}
FSPrimfeedAuth::FSPrimfeedAuth(authorized_callback_t callback)
: mCallback(callback), mAuthenticating(false)
: mCallback(callback)
{
mInstantMessageConnection = LLIMModel::instance().addNewMsgCallback(
[this](const LLSD &message) {
LL_DEBUGS("FSPrimfeedAuth") << "Received chat message: " << message["message"].asString() << LL_ENDL;
this->onChatMessage(message);
});
mChatMessageConnection = LLNotificationsUI::LLNotificationManager::instance().getChatHandler()->addNewChatCallback(
[this](const LLSD &message) {
LL_DEBUGS("FSPrimfeedAuth") << "Received instant message: " << message["message"].asString() << LL_ENDL;
LL_DEBUGS("FSPrimfeedAuth") << "Received chat message: " << message["message"].asString() << LL_ENDL;
this->onChatMessage(message);
});
}
@@ -184,21 +181,6 @@ FSPrimfeedAuth::~FSPrimfeedAuth()
LL_WARNS("FSPrimfeedAuth") << "Unknown exception during chat connection disconnect." << LL_ENDL;
}
}
if (mInstantMessageConnection.connected())
{
try
{
mInstantMessageConnection.disconnect();
}
catch (const std::exception& e)
{
LL_WARNS("FSPrimfeedAuth") << "Exception during instant message disconnect: " << e.what() << LL_ENDL;
}
catch (...)
{
LL_WARNS("FSPrimfeedAuth") << "Unknown exception during instant message disconnect." << LL_ENDL;
}
}
}
// Factory method to create a shared pointer to FSPrimfeedAuth.
@@ -216,7 +198,7 @@ std::shared_ptr<FSPrimfeedAuth> FSPrimfeedAuth::create(authorized_callback_t cal
return nullptr;
}
auth->mAuthenticating = true;
FSPrimfeedConnect::instance().setConnectionState(FSPrimfeedConnect::PRIMFEED_CONNECTING);
// If no token stored, begin the login request; otherwise check user status.
if (gSavedPerAccountSettings.getString("FSPrimfeedOAuthToken").empty())
@@ -453,7 +435,6 @@ void FSPrimfeedAuth::gotUserStatus(bool success, const LLSD &response)
if (success && response.has("plan"))
{
gSavedPerAccountSettings.setString("FSPrimfeedOAuthToken", mOauthToken);
gSavedPerAccountSettings.setString("FSPrimfeedRequestId", mRequestId);
gSavedPerAccountSettings.setString("FSPrimfeedPlan", response["plan"].asString());
gSavedPerAccountSettings.setString("FSPrimfeedProfileLink", response["link"].asString());
gSavedPerAccountSettings.setString("FSPrimfeedUsername", response["username"].asString());
-1
View File
@@ -69,7 +69,6 @@ private:
explicit FSPrimfeedAuth(authorized_callback_t callback);
authorized_callback_t mCallback;
bool mAuthenticating;
std::string mOauthToken;
std::string mRequestId;
@@ -670,7 +670,14 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
}
}
// <FS:Beq> Hide Primfeed OAuth message from chat to prevent accidental leak of secret.
const std::string primfeed_oauth = "#PRIMFEED_OAUTH: ";
if( chat_msg.mText.compare(0, primfeed_oauth.length(), primfeed_oauth) == 0 && chat_msg.mChatType == CHAT_TYPE_IM && chat_msg.mSourceType == CHAT_SOURCE_OBJECT )
{
// Don't show the message in chat.
return;
}
// </FS:Beq>
nearby_chat->addMessage(chat_msg, true, args);
if (chat_msg.mSourceType == CHAT_SOURCE_AGENT
+42 -3
View File
@@ -3905,16 +3905,55 @@ LLUUID LLIMMgr::addSession(
//works only for outgoing ad-hoc sessions
if (new_session &&
((IM_NOTHING_SPECIAL == dialog) || (IM_SESSION_P2P_INVITE == dialog) || (IM_SESSION_CONFERENCE_START == dialog)) &&
ids.size())
// <AS:chanayane> [FIRE-34494] fix unable to open an IM with someone who started a group chat
//ids.size())
!ids.empty())
// </AS:chanayane>
{
session = LLIMModel::getInstance()->findAdHocIMSession(ids);
if (session)
{
new_session = false;
session_id = session->mSessionID;
// <AS:chanayane> [FIRE-34494] fix unable to open an IM with someone who started a group chat
// new_session = false;
// session_id = session->mSessionID;
// Protect against wrong session type reuse (e.g., conference reused for IM)
if (session->mType != dialog)
{
LL_WARNS("IMVIEW") << "Discarding mismatched session type reuse: expected "
<< dialog << " but found " << session->mType
<< " for session " << session->mSessionID
<< ". This may indicate improper reuse of a session object." << LL_ENDL;
session = nullptr;
new_session = true;
session_id = computeSessionID(dialog, other_participant_id);
}
else
{
new_session = false;
session_id = session->mSessionID;
}
}
}
if (session && session->mType != dialog)
{
// Prevent reusing a session of the wrong type
session = nullptr;
new_session = true;
// Recompute session ID depending on dialog type
if (dialog == IM_SESSION_CONFERENCE_START)
{
session_id.generate();
}
else
{
session_id = computeSessionID(dialog, other_participant_id);
}
// </AS:chanayane>
}
//Notify observers that a session was added
if (new_session)
{
+27
View File
@@ -346,6 +346,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
LL_DEBUGS("LLLogin") << "reason " << reason_response
<< " message " << message_response
<< LL_ENDL;
if (response.has("mfa_hash"))
{
mRequestData["params"]["mfa_hash"] = response["mfa_hash"];
mRequestData["params"]["token"] = "";
saveMFAHash(response);
}
// For the cases of critical message or TOS agreement,
// start the TOS dialog. The dialog response will be handled
// by the LLLoginInstance::handleTOSResponse() callback.
@@ -609,6 +618,24 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon
return true;
}
void LLLoginInstance::saveMFAHash(LLSD const& response)
{
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(LLStartUp::getUserId());
// Only save mfa_hash for future logins if the user wants their info remembered.
if (response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && LLLoginInstance::getInstance()->saveMFA())
{
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
}
else if (!LLLoginInstance::getInstance()->saveMFA())
{
gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id);
}
// TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
gSecAPIHandler->syncProtectedMap();
}
std::string construct_start_string()
{
std::string start;
+2
View File
@@ -73,6 +73,8 @@ public:
void setNotificationsInterface(LLNotificationsInterface* ni) { mNotifications = ni; }
LLNotificationsInterface& getNotificationsInterface() const { return *mNotifications; }
void saveMFAHash(LLSD const& response);
private:
typedef std::shared_ptr<LLEventAPI::Response> ResponsePtr;
void constructAuthParams(LLPointer<LLCredential> user_credentials);
+2 -18
View File
@@ -4973,24 +4973,7 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);
}
// Only save mfa_hash for future logins if the user wants their info remembered.
if(response.has("mfa_hash")
&& gSavedSettings.getBOOL("RememberUser")
&& LLLoginInstance::getInstance()->saveMFA())
{
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(gUserCredential->userID());
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
// TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
gSecAPIHandler->syncProtectedMap();
}
else if (!LLLoginInstance::getInstance()->saveMFA())
{
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(gUserCredential->userID());
gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id);
gSecAPIHandler->syncProtectedMap();
}
LLLoginInstance::getInstance()->saveMFAHash(response);
// <FS:Ansariel> OpenSim legacy economy support
#ifdef OPENSIM
@@ -5093,6 +5076,7 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
}
// </FS:Techwolf Lupindo>
bool success = false;
// JC: gesture loading done below, when we have an asset system
// in place. Don't delete/clear gUserCredentials until then.
+92
View File
@@ -44,6 +44,10 @@
#include "llavatarname.h"
#include "llavatarnamecache.h"
#include "llviewernetwork.h" // <FS/> Access to GridManager
#include "lfsimfeaturehandler.h" // <FS/> Access to hyperGridURL
#include "llworldmapmessage.h" // <FS/> Access to sendNamedRegionRequest
// [RLVa:KB] - Checked: 2010-09-03 (RLVa-1.2.1b)
#include "rlvhandler.h"
// [/RLVa:KB]
@@ -98,6 +102,46 @@ void LLTeleportHistory::goToItem(int idx)
return;
}
// <FS> [FIRE-35355] OpenSim global position is dependent on the Grid you are on
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
if (mItems[mCurrentItem].mRegionID != mItems[idx].mRegionID)
{
LLSLURL slurl = mItems[idx].mSLURL;
std::string grid = slurl.getGrid();
std::string current_grid = LFSimFeatureHandler::instance().hyperGridURL();
std::string gatekeeper = LLGridManager::getInstance()->getGatekeeper(grid);
// Requesting region information from the server is only required when changing grid
if (slurl.isValid() && grid != current_grid)
{
if (!gatekeeper.empty())
{
slurl = LLSLURL(gatekeeper + ":" + slurl.getRegion(), slurl.getPosition(), true);
}
if (mRequestedItem != -1)
{
return; // We already have a request in progress and don't want to spam the server
}
mRequestedItem = idx;
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(
slurl.getRegion(),
boost::bind(&LLTeleportHistory::regionNameCallback, this, idx, _1, _2, _3, _4),
slurl.getSLURLString(),
true
);
return; // The teleport will occur in the callback with the correct global position
}
}
}
#endif
// </FS>
// Attempt to teleport to the requested item.
gAgent.teleportViaLocation(mItems[idx].mGlobalPos);
mRequestedItem = idx;
@@ -210,6 +254,22 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
mItems[mCurrentItem] = LLTeleportHistoryItem(RlvStrings::getString(RlvStringKeys::Hidden::Parcel), LLVector3d::zero);
}
// [/RLVa:KB]
// <FS> [FIRE-35355] OpenSim global position is dependent on the Grid you are on,
// so we need to store the slurl so we can request the global position later
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
auto regionp = gAgent.getRegion();
if (regionp)
{
LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
LLSLURL slurl = LLSLURL(LFSimFeatureHandler::instance().hyperGridURL(), regionp->getName(), new_pos_local);
mItems[mCurrentItem].mSLURL = slurl;
}
}
#endif
// </FS>
}
//dump(); // LO - removing the dump from happening every time we TP.
@@ -287,3 +347,35 @@ void LLTeleportHistory::dump() const
LL_INFOS() << line.str() << LL_ENDL;
}
}
// <FS> [FIRE-35355] Callback for OpenSim so we can teleport to the correct global position on another grid
void LLTeleportHistory::regionNameCallback(int idx, U64 region_handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport)
{
if (region_handle)
{
// Sanity checks again just in case since time has passed since the request was made
if (idx < 0 || idx >= (int)mItems.size())
{
LL_WARNS() << "Invalid teleport history index (" << idx << ") specified" << LL_ENDL;
return;
}
if (idx == mCurrentItem)
{
LL_WARNS() << "Will not teleport to the same location." << LL_ENDL;
return;
}
LLVector3d origin_pos = from_region_handle(region_handle);
LLVector3d global_pos(origin_pos + LLVector3d(slurl.getPosition()));
// Attempt to teleport to the target grids region
gAgent.teleportViaLocation(global_pos);
}
else
{
LL_WARNS() << "Invalid teleport history region handle" << LL_ENDL;
onTeleportFailed();
}
}
// </FS>
+12 -2
View File
@@ -35,6 +35,8 @@
#include <boost/signals2.hpp>
#include "llteleporthistorystorage.h"
#include "llslurl.h" // <FS/> Access to LLSLURL
/**
* An item of the teleport history.
@@ -47,8 +49,11 @@ public:
LLTeleportHistoryItem()
{}
LLTeleportHistoryItem(std::string title, LLVector3d global_pos)
: mTitle(title), mGlobalPos(global_pos)
// <FS> [FIRE-35355] OpenSim requires knowing the grid to teleport correctly if changing grids
//LLTeleportHistoryItem(std::string title, LLVector3d global_pos)
// : mTitle(title), mGlobalPos(global_pos)
LLTeleportHistoryItem(std::string title, LLVector3d global_pos, const LLSLURL& slurl = LLSLURL())
: mTitle(title), mGlobalPos(global_pos), mSLURL(slurl)
{}
/**
@@ -61,6 +66,7 @@ public:
std::string mFullTitle; // human-readable location title including coordinates
LLVector3d mGlobalPos; // global position
LLUUID mRegionID; // region ID for getting the region info
LLSLURL mSLURL; // <FS/> [FIRE-35355] slurl for the location required for OpenSim
};
/**
@@ -180,6 +186,10 @@ private:
*/
static std::string getCurrentLocationTitle(bool full, const LLVector3& local_pos_override);
// <FS> [FIRE-35355] Callback for OpenSim so we can teleport to the correct global position on another grid
void regionNameCallback(int idx, U64 handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport);
// </FS>
/**
* Actually, the teleport history.
*/
@@ -378,6 +378,15 @@
name="filter_perm_transfer"
label="Transfer"
width="100"/>
<check_box
follows="top|left"
top_pad="10"
layout="topleft"
left="10"
name="filter_reflection_probe"
label="Reflection Probes"
tool_tip="Includes manual probes only, not auto-probes. Only includes mirror probes if mirrors are enabled in graphics preferences. If reflection coverage is set to 'none', or the probe is not baked, objects may not be identified."
width="100"/>
<check_box
follows="top|left"
height="20"
@@ -416,7 +425,7 @@
layout="topleft"
left_pad="5"
max_val="999999999"
min_val="0"
min_val="0"
name="max_price"
top_delta="-4"
width="80"/>
@@ -525,7 +534,7 @@
layout="topleft"
left_pad="5"
max_val="999999999"
min_val="0"
min_val="0"
name="max_distance"
top_delta="-4"
width="80"/>
@@ -570,6 +579,14 @@
name="exclude_temporary"
label="Temporary"
width="80"/>
<check_box
follows="top|left"
top_pad="10"
layout="topleft"
left="10"
name="exclude_reflection_probes"
label="Reflection Probes"
width="80"/>
<check_box
follows="top|left"
top_pad="10"
@@ -214,7 +214,7 @@
left="10"
length="1"
top_pad="0"
max_length="700"
max_length="5000"
name="photo_description"
spellcheck="true"
type="string"
@@ -223,7 +223,7 @@
<check_box
follows="left|top"
layout="topleft"
initial_value="true"
initial_value="false"
label="Include location"
name="add_location_cb"
left="9"
@@ -13,11 +13,20 @@
<string name="header_mHindLimbsRoot">Membres postérieurs</string>
<string name="header_mWingsRoot">Ailes</string>
<string name="header_mFaceEar1Left">Oreilles/nez</string>
<string name="header_mSkull">Corps</string>
<string name="header_HEAD">Corps</string>
<string name="header_L_UPPER_ARM">Bras</string>
<string name="header_L_UPPER_LEG">Jambes</string>
<string name="title_mPelvis">Tout l'avatar</string>
<string name="title_mTorso">Torse</string>
<string name="title_mSpine1">Colonne vertébrale 1</string>
<string name="title_mSpine2">Colonne vertébrale 2</string>
<string name="title_mSpine3">Colonne vertébrale 3</string>
<string name="title_mSpine4">Colonne vertébrale 4</string>
<string name="title_mChest">Poitrine</string>
<string name="title_mNeck">Cou</string>
<string name="title_mHead">Tête</string>
<string name="title_mSkull">Crâne</string>
<string name="title_mEyeRight">Oeil droit</string>
<string name="title_mEyeLeft">Oeil gauche</string>
<string name="title_mFaceForeheadLeft">Front, côté gauche</string>
@@ -29,13 +38,17 @@
<string name="title_mFaceEyebrowCenterRight">Sourcil, milieu droit</string>
<string name="title_mFaceEyebrowInnerRight">Sourcil, intérieur droit</string>
<string name="title_mFaceEyeLidUpperLeft">Paupière, en haut à gauche</string>
<string name="title_mFaceEyecornerInnerLeft">Coin interne gauche de l'œil</string>
<string name="title_mFaceEyeLidLowerLeft">Paupière, en bas à gauche</string>
<string name="title_mFaceEyeLidUpperRight">Paupière, en haut à droite</string>
<string name="title_mFaceEyecornerInnerRight">Coin interne droit de l'œil</string>
<string name="title_mFaceEyeLidLowerRight">Paupière en bas à droite</string>
<string name="title_mFaceEar1Left">Oreille en haut à gauche</string>
<string name="title_mFaceEar2Left">Oreille en bas à gauche</string>
<string name="title_mFaceEar1Right">Oreille en haut à droite</string>
<string name="title_mFaceEar2Right">Oreille en bas à droite</string>
<string name="title_mFaceNoseBase">Base du nez</string>
<string name="title_mFaceNoseBridge">Arête du nez</string>
<string name="title_mFaceNoseLeft">Nez à gauche</string>
<string name="title_mFaceNoseCenter">Nez au milieu</string>
<string name="title_mFaceNoseRight">Nez à droite</string>
@@ -52,16 +65,12 @@
<string name="title_mFaceTongueTip">Extrémité de la langue</string>
<string name="title_mFaceJawShaper">Forme de la mâchoire</string>
<string name="title_mFaceForeheadCenter">Milieu du front</string>
<string name="title_mFaceNoseBase">Base du nez</string>
<string name="title_mFaceTeethUpper">Dents du haut</string>
<string name="title_mFaceLipUpperLeft">Lèvre supérieure à gauche</string>
<string name="title_mFaceLipUpperRight">Lèvre supérieure à droite</string>
<string name="title_mFaceLipCornerLeft">Coin gauche de la bouche</string>
<string name="title_mFaceLipCornerRight">Coin droit de la bouche</string>
<string name="title_mFaceLipUpperCenter">Milieu de la lèvre supérieure</string>
<string name="title_mFaceEyecornerInnerLeft">Coin interne gauche de l'œil</string>
<string name="title_mFaceEyecornerInnerRight">Coin interne droit de l'œil</string>
<string name="title_mFaceNoseBridge">Arête du nez</string>
<string name="title_mCollarLeft">Col</string>
<string name="title_mShoulderLeft">Bras entier</string>
<string name="title_mElbowLeft">Avant-bras</string>
@@ -137,10 +146,31 @@
<string name="title_mHindLimb2Right">Droite 2</string>
<string name="title_mHindLimb3Right">Droite 3</string>
<string name="title_mHindLimb4Right">Droite 4</string>
<string name="title_HEAD">Tête</string>
<string name="title_NECK">Nuque</string>
<string name="title_CHEST">Poitrine</string>
<string name="title_BUTT">Fesses</string>
<string name="title_BELLY">Ventre</string>
<string name="title_LEFT_PEC">Sein gauche</string>
<string name="title_RIGHT_PEC">Sein droit</string>
<string name="title_L_CLAVICLE">Clavicule gauche</string>
<string name="title_R_CLAVICLE">Clavicule droite</string>
<string name="title_L_UPPER_ARM">Haut du bras gauche</string>
<string name="title_R_UPPER_ARM">Haut du bras droit</string>
<string name="title_L_LOWER_ARM">Bas du bras gauche</string>
<string name="title_R_LOWER_ARM">Bas du bras droit</string>
<string name="title_L_HAND">Main gauche</string>
<string name="title_R_HAND">Main droite</string>
<string name="title_UPPER_BACK">Haut du dos</string>
<string name="title_LEFT_HANDLE">Taille à gauche</string>
<string name="title_RIGHT_HANDLE">Taille à droite</string>
<string name="title_PELVIS">Bassin</string>
<string name="title_L_UPPER_LEG">Haut de la jambe gauche</string>
<string name="title_R_UPPER_LEG">Haut de la jambe droite</string>
<string name="title_L_LOWER_LEG">Bas de la jambe gauche</string>
<string name="title_R_LOWER_LEG">Bas de la jambe droite</string>
<string name="title_L_FOOT">Pied gauche</string>
<string name="title_R_FOOT">Pied droit</string>
<string name="LoadPoseLabel">Charger pose</string>
<string name="SavePoseLabel">Enr. pose</string>
<string name="LoadDiffLabel">Charger diff</string>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<floater name="floater_primfeed" title="Partager sur Primfeed">
<panel name="background">
<tab_container name="tabs">
<panel label="Photo" name="panel_primfeed_photo"/>
<panel label="Compte" name="panel_primfeed_account"/>
</tab_container>
<panel name="connection_status_panel">
<text name="connection_error_text">
Erreur
</text>
<text name="connection_loading_text">
Chargement...
</text>
</panel>
</panel>
</floater>
@@ -93,6 +93,7 @@
<menu_item_check label="Conversations..." name="Conversations"/>
<menu_item_check label="Gestes..." name="Gestures"/>
<menu_item_call label="Flickr..." name="Flickr"/>
<menu_item_call label="Primfeed..." name="Primfeed"/>
<menu_item_call label="Discord..." name="Discord"/>
<menu label="Effets de voix" name="VoiceMorphing">
<menu_item_check label="Aucun effet de voix" name="NoVoiceMorphing"/>
@@ -616,6 +617,8 @@
<menu_item_check label="Textures HTTP" name="HTTP Textures"/>
<menu_item_call label="Compresser les images" name="Compress Images"/>
<menu_item_call label="Test de compression de fichiers" name="Compress File Test" />
<menu_item_call label="Test d'authentification Primfeed" name="primfeed_auth_test" />
<menu_item_call label="Réinitialisation de l'authentification Primfeed" name="primfeed_auth_clear" />
<menu_item_call label="Activer Visual Leak Detector" name="Enable Visual Leak Detector"/>
<menu_item_check label="Aperçu du Journal de débogage" name="Output Debug Minidump"/>
<menu_item_check label="Ouvrir la console de débogage au prochain lancement" name="Console Window"/>
@@ -3065,6 +3065,9 @@ Voulez-vous autoriser [APP_NAME] à poster sur votre compte Flickr?
<notification name="ExodusFlickrUploadComplete">
Votre photo est visible maintenant [https://www.flickr.com/photos/me/[ID] ici].
</notification>
<notification name="FSPrimfeedUploadComplete">
Votre message Primfeed peut maintenant être consulté [[PF_POSTURL] ici].
</notification>
<notification name="EventNotification">
Avis d&apos;événement :
@@ -5636,4 +5639,25 @@ https://wiki.firestormviewer.org/antivirus_whitelisting
Remplacer la pose “[POSE_NAME]”?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Ok"/>
</notification>
<notification name="PrimfeedLoginRequestFailed">
Demande de connexion refusée par Primfeed.
</notification>
<notification name="PrimfeedAuthorizationFailed">
L'autorisation Primfeed a échoué. La séquence d'autorisation n'a pas été achevée.
</notification>
<notification name="PrimfeedAuthorizationAlreadyInProgress">
L'autorisation Primfeed est déjà en cours. Veuillez compléter l'autorisation Primfeed dans votre navigateur web avant de réessayer.
</notification>
<notification name="PrimfeedAuthorizationSuccessful">
Autorisation Primfeed terminée. Vous pouvez maintenant poster des images sur Primfeed.
</notification>
<notification name="PrimfeedValidateFailed">
La validation de l'utilisateur Primfeed a échoué. Primfeed n'a pas reconnu ce compte ou la connexion a échoué.
</notification>
<notification name="PrimfeedAlreadyAuthorized">
Vous avez déjà lié ce compte à Primfeed. Utilisez le bouton de réinitialisation si vous souhaitez recommencer.
</notification>
<notification name="PrimfeedUserStatusFailed">
La connexion de l'utilisateur Primfeed a réussi, mais les vérifications d'état ont échoué. Veuillez vérifier que Primfeed fonctionne.
</notification>
</notifications>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<panel name="panel_primfeed_account">
<string name="primfeed_connected" value="Connecté(e) à Primfeed en tant que :"/>
<string name="primfeed_disconnected" value="Non connecté(e) à Primfeed"/>
<string name="primfeed_plan_unknown" value="Inconnu"/>
<text name="connected_as_label">
Non connecté(e) à Primfeed.
</text>
<text name="primfeed_account_plan_label">
Type de compte :
</text>
<panel name="panel_buttons">
<button label="Se connecter..." name="connect_btn"/>
<button label="Se déconnecter" name="disconnect_btn"/>
<text name="account_learn_more_label">
[https://docs.primfeed.com En savoir plus sur Primfeed]
</text>
</panel>
</panel>
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<panel name="panel_primfeed_photo">
<combo_box name="resolution_combobox" tool_tip="Résolution de l'image">
<combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
<combo_box.item label="Personnalisée" name="Custom"/>
</combo_box>
<combo_box name="filters_combobox" tool_tip="Filtres d'image">
<combo_box.item label="Pas de filtre" name="NoFilter"/>
</combo_box>
<check_box label="Garder les proportions" name="keep_aspect_ratio"/>
<text name="working_lbl">
Rafraichissement...
</text>
<check_box label="Cadre de la photo" tool_tip="Affiche un cadre à l'écran qui entoure la zones de la photo. Les parties de la scène qui se trouvent en dehors de la photo sont dé-saturées et légèrement floues." name="show_frame"/>
<check_box label="Guide de cadrage" tool_tip="Affiche le guide de cadrage (règle des tiers) à l'intérieur du cadre de la photo." name="show_guides"/>
<button label="Actualiser" name="new_snapshot_btn" tool_tip="Cliquez pour actualiser"/>
<button label="Aperçu" name="big_preview_btn" tool_tip="Cliquez pour afficher l'aperçu"/>
<text name="description_label">
Description :
</text>
<check_box label="Inclure l'emplacement" name="add_location_cb"/>
<check_box label="Ajouter à la galerie publique" name="primfeed_add_to_public_gallery"/>
<check_box label="Contenu commercial" name="primfeed_commercial_content"/>
<combo_box name="rating_combobox" tool_tip="Classification du contenu de Primfeed">
<combo_box.item label="Général" name="GeneralRating"/>
<combo_box.item label="Modéré" name="ModerateRating"/>
<combo_box.item label="Adulte" name="AdultRating"/>
<combo_box.item label="Adulte+" name="AdultPlusRating"/>
</combo_box>
<check_box label="Ouvrir dans le navigateur après l'envoi" tool_tip="Ouvrir automatiquement le message Primfeed dans votre navigateur web après l'avoir publié." name="primfeed_open_url_on_post"/>
<button label="Partager" name="post_photo_btn"/>
<button label="Annuler" name="cancel_photo_btn"/>
</panel>
@@ -1,13 +1,30 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<layout_stack name="option_buttons">
<layout_panel name="lp_download"><button label="Sur le disque" name="save_to_computer_btn"/></layout_panel>
<layout_panel name="lp_inventory"><button label="Dans l'inventaire" name="save_to_inventory_btn"/></layout_panel>
<layout_panel name="lp_profile"><button label="En ligne sur mon profil" name="save_to_profile_btn"/></layout_panel>
<layout_panel name="lp_facebook"><button label="En ligne sur Facebook" name="send_to_facebook_btn"/></layout_panel>
<layout_panel name="lp_twitter"><button label="En ligne sur Twitter" name="send_to_twitter_btn"/></layout_panel>
<layout_panel name="lp_flickr"><button label="En ligne sur Flickr" name="send_to_flickr_btn"/></layout_panel>
<layout_panel name="lp_email"><button label="Envoyer par E-mail" name="save_to_email_btn"/></layout_panel>
<layout_panel name="lp_download">
<button label="Sur le disque" name="save_to_computer_btn"/>
</layout_panel>
<layout_panel name="lp_inventory">
<button label="Dans l'inventaire" name="save_to_inventory_btn"/>
</layout_panel>
<layout_panel name="lp_profile">
<button label="En ligne sur mon profil" name="save_to_profile_btn"/>
</layout_panel>
<layout_panel name="lp_facebook">
<button label="En ligne sur Facebook" name="send_to_facebook_btn"/>
</layout_panel>
<layout_panel name="lp_twitter">
<button label="En ligne sur Twitter" name="send_to_twitter_btn"/>
</layout_panel>
<layout_panel name="lp_flickr">
<button label="En ligne sur Flickr" name="send_to_flickr_btn"/>
</layout_panel>
<layout_panel name="lp_email">
<button label="Envoyer par E-mail" name="save_to_email_btn"/>
</layout_panel>
<layout_panel name="lp_primfeed">
<button label="Partager sur Primfeed" name="send_to_primfeed_btn"/>
</layout_panel>
</layout_stack>
<text name="fee_hint_lbl">
Les frais sont basés sur votre niveau d'abonnement. Plus haut est ce niveau, plus bas sont les frais.
@@ -62,6 +62,7 @@
<check_box name="filter_perm_copy" label="Kopiowalne"/>
<check_box name="filter_perm_modify" label="Modyfikowalne"/>
<check_box name="filter_perm_transfer" label="Transferowalne"/>
<check_box name="filter_reflection_probe" label="Sondy refleksyjne" tool_tip="Obejmuje tylko sondy ręczne, nie sondy automatyczne. Obejmuje tylko sondy lustrzane, jeśli lustra są włączone w preferencjach graficznych. Jeśli zasięg odbić jest ustawiony na 'brak' lub sonda nie jest załadowana, to obiekty mogą nie zostać zidentyfikowane." />
<check_box name="filter_for_sale" label="Do kupienia między" width="135"/>
<text name="and" width="30">
oraz
@@ -91,6 +92,7 @@
<check_box name="exclude_attachment" label="Dodatkami"/>
<check_box name="exclude_physical" label="Fizyczne"/>
<check_box name="exclude_temporary" label="Tymczasowe"/>
<check_box name="exclude_reflection_probes" label="Sondy refleksyjne" />
<check_box name="exclude_childprim" label="Primami podrzędnymi / potomkami primy głównej"/>
<check_box name="exclude_neighbor_region" label="W sąsiadujących regionach"/>
<button name="apply" label="Zastosuj"/>