# Conflicts:
#	indra/llrender/llrendertarget.cpp
#	indra/newview/gltf/asset.cpp
#	indra/newview/llagentcamera.cpp
#	indra/newview/lldrawpoolwater.cpp
#	indra/newview/llstartup.cpp
#	indra/newview/llviewertexture.cpp
#	indra/newview/llvoavatar.cpp
#	indra/newview/llvoicewebrtc.cpp
#	indra/newview/viewer_manifest.py
master
Ansariel 2025-08-12 22:50:51 +02:00
commit b0b8328c5c
17 changed files with 75 additions and 178 deletions

View File

@ -43,7 +43,11 @@ jobs:
artifact: Windows-installer
install-path: 'C:\viewer-automation-main'
- os: windows
runner: qa-dan-asus
runner: qa-windows-asus-dan
artifact: Windows-installer
install-path: 'C:\viewer-automation-main'
- os: windows
runner: qa-windows-z600-dan
artifact: Windows-installer
install-path: 'C:\viewer-automation-main'
- os: mac

View File

@ -497,24 +497,6 @@ U32 LLRenderTarget::getNumTextures() const
void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)
{
gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index), filter_options == LLTexUnit::TFO_TRILINEAR || filter_options == LLTexUnit::TFO_ANISOTROPIC);
// <FS:Beq> Unused variable warning fix (Macos) none of this code is needed.
// bool isSRGB = false;
// llassert(mInternalFormat.size() > index);
// switch (mInternalFormat[index])
// {
// case GL_SRGB:
// case GL_SRGB8:
// case GL_SRGB_ALPHA:
// case GL_SRGB8_ALPHA8:
// isSRGB = true;
// break;
// default:
// break;
// }
// </FS:Beq>
gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options);
}

View File

@ -2148,7 +2148,7 @@ set(viewer_APPSETTINGS_FILES
#app_settings/toolbars.xml FS:AO moved to skins
app_settings/trees.xml
app_settings/viewerart.xml
${CMAKE_SOURCE_DIR}/../etc/message.xml
app_settings/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
packages-info.txt
featuretable.txt
@ -2284,7 +2284,7 @@ if (WINDOWS)
set(COPY_INPUT_DEPENDENCIES
# The following commented dependencies are determined at variably at build time. Can't do this here.
${CMAKE_SOURCE_DIR}/../etc/message.xml
app_settings/message.xml
${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
#${SHARED_LIB_STAGING_DIR}/openjp2.dll # <FS:Ansariel> Only copy OpenJPEG dll if needed
${SHARED_LIB_STAGING_DIR}/llwebrtc.dll

View File

@ -2776,7 +2776,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>ShowDiscordActivityDetails</key>
<map>

View File

@ -589,7 +589,7 @@ bool Asset::prep()
for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)
{
#if SHOW_ASSERT
#ifdef SHOW_ASSERT
U32 attribute_mask = 0;
#endif
// for each mesh
@ -609,7 +609,7 @@ bool Asset::prep()
// all primitives of a given variant and material should all have the same attribute mask
llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask);
#if SHOW_ASSERT
#ifdef SHOW_ASSERT
attribute_mask |= primitive.mAttributeMask;
#endif
}

View File

@ -1903,7 +1903,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor()
LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
{
// Compute base camera position and look-at points.
F32 camera_land_height;
LLVector3d frame_center_global = !isAgentAvatarValid() ?
gAgent.getPositionGlobal() :
gAgent.getPosGlobalFromAgent(getAvatarRootPosition());
@ -2184,19 +2183,11 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)
}
// [/RLVa:KB]
// <FS:humbletim> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
F32 camera_ground_plane{ F_ALMOST_ZERO };
// integrate OpenSimExtras.MinSimHeight into the camera ground plane calculation
if (auto regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global))
{
camera_ground_plane += regionp->getMinSimHeight();
}
// </FS:humbletim>
// Don't let camera go underground
F32 camera_min_off_ground = getCameraMinOffGround();
camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
F32 minZ = llmax(camera_ground_plane, camera_land_height + camera_min_off_ground); // <FS:humbletim/> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
// Don't let camera go underground if constrained
// If not constrained, permit going 1000m below 0, use case: retrieving objects
F32 camera_min_off_ground = getCameraMinOffGround(); // checks isDisableCameraConstraints
F32 camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
F32 minZ = camera_land_height + camera_min_off_ground;
if (camera_position_global.mdV[VZ] < minZ)
{
camera_position_global.mdV[VZ] = minZ;

View File

@ -6914,100 +6914,21 @@ void LLAppViewer::initDiscordSocial()
gDiscordPartyMaxSize = 0;
gDiscordTimestampsStart = time(nullptr);
gDiscordClient = std::make_shared<discordpp::Client>();
gDiscordClient->SetStatusChangedCallback([](discordpp::Client::Status status, discordpp::Client::Error, int32_t) {
if (status == discordpp::Client::Status::Ready)
{
updateDiscordActivity();
}
});
if (gSavedSettings.getBOOL("EnableDiscord"))
{
auto credential = gSecAPIHandler->loadCredential("Discord");
if (credential.notNull())
{
gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, credential->getAuthenticator()["token"].asString(), [](discordpp::ClientResult result) {
if (result.Successful())
gDiscordClient->Connect();
else
LL_WARNS("Discord") << result.Error() << LL_ENDL;
});
}
else
{
LL_WARNS("Discord") << "Integration was enabled, but no credentials. Disabling integration." << LL_ENDL;
gSavedSettings.setBOOL("EnableDiscord", false);
}
}
}
void LLAppViewer::toggleDiscordIntegration(const LLSD& value)
{
static const uint64_t APPLICATION_ID = 1394782217405862001;
if (value.asBoolean())
{
discordpp::AuthorizationArgs args{};
args.SetClientId(APPLICATION_ID);
args.SetScopes(discordpp::Client::GetDefaultPresenceScopes());
auto codeVerifier = gDiscordClient->CreateAuthorizationCodeVerifier();
args.SetCodeChallenge(codeVerifier.Challenge());
gDiscordClient->Authorize(args, [codeVerifier](auto result, auto code, auto redirectUri) {
if (result.Successful())
{
gDiscordClient->GetToken(APPLICATION_ID, code, codeVerifier.Verifier(), redirectUri, [](discordpp::ClientResult result, std::string accessToken, std::string, discordpp::AuthorizationTokenType, int32_t, std::string) {
if (result.Successful())
{
gDiscordClient->UpdateToken(discordpp::AuthorizationTokenType::Bearer, accessToken, [accessToken](discordpp::ClientResult result) {
if (result.Successful())
{
LLSD authenticator = LLSD::emptyMap();
authenticator["token"] = accessToken;
gSecAPIHandler->saveCredential(gSecAPIHandler->createCredential("Discord", LLSD::emptyMap(), authenticator), true);
gDiscordClient->Connect();
}
else
{
LL_WARNS("Discord") << result.Error() << LL_ENDL;
}
});
}
else
{
LL_WARNS("Discord") << result.Error() << LL_ENDL;
}
});
}
else
{
LL_WARNS("Discord") << result.Error() << LL_ENDL;
gSavedSettings.setBOOL("EnableDiscord", false);
}
});
}
else
{
gDiscordClient->Disconnect();
auto credential = gSecAPIHandler->loadCredential("Discord");
if (credential.notNull())
{
gDiscordClient->RevokeToken(APPLICATION_ID, credential->getAuthenticator()["token"].asString(), [](discordpp::ClientResult result) {
if (result.Successful())
LL_INFOS("Discord") << "Access token successfully revoked." << LL_ENDL;
else
LL_WARNS("Discord") << "No access token to revoke." << LL_ENDL;
});
auto cred = new LLCredential("Discord");
gSecAPIHandler->deleteCredential(cred);
}
else
{
LL_WARNS("Discord") << "Credentials are already nonexistent." << LL_ENDL;
}
}
gDiscordClient->SetApplicationId(1394782217405862001);
updateDiscordActivity();
}
void LLAppViewer::updateDiscordActivity()
{
LL_PROFILE_ZONE_SCOPED;
static LLCachedControl<bool> integration_enabled(gSavedSettings, "EnableDiscord", true);
if (!integration_enabled)
{
gDiscordClient->ClearRichPresence();
return;
}
discordpp::Activity activity;
activity.SetType(discordpp::ActivityTypes::Playing);
discordpp::ActivityTimestamps timestamps;
@ -7035,37 +6956,39 @@ void LLAppViewer::updateDiscordActivity()
activity.SetDetails(gDiscordActivityDetails);
}
auto agent_pos_region = gAgent.getPositionAgent();
S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
const F32 FLY_CUTOFF = 6.f;
const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
const F32 WALK_CUTOFF = 1.5f;
const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
if (velocity_mag_sq > FLY_CUTOFF_SQ)
{
pos_x -= pos_x % 4;
pos_y -= pos_y % 4;
}
else if (velocity_mag_sq > WALK_CUTOFF_SQ)
{
pos_x -= pos_x % 2;
pos_y -= pos_y % 2;
}
std::string location = "Hidden Region";
static LLCachedControl<bool> show_state(gSavedSettings, "ShowDiscordActivityState", false);
if (show_state)
{
auto agent_pos_region = gAgent.getPositionAgent();
S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
const F32 FLY_CUTOFF = 6.f;
const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
const F32 WALK_CUTOFF = 1.5f;
const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
if (velocity_mag_sq > FLY_CUTOFF_SQ)
{
pos_x -= pos_x % 4;
pos_y -= pos_y % 4;
}
else if (velocity_mag_sq > WALK_CUTOFF_SQ)
{
pos_x -= pos_x % 2;
pos_y -= pos_y % 2;
}
auto location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
activity.SetState(location);
discordpp::ActivityParty party;
party.SetId(location);
party.SetCurrentSize(gDiscordPartyCurrentSize);
party.SetMaxSize(gDiscordPartyMaxSize);
activity.SetParty(party);
location = llformat("%s (%d, %d, %d)", gAgent.getRegion()->getName().c_str(), pos_x, pos_y, pos_z);
}
activity.SetState(location);
discordpp::ActivityParty party;
party.SetId(location);
party.SetCurrentSize(gDiscordPartyCurrentSize);
party.SetMaxSize(gDiscordPartyMaxSize);
activity.SetParty(party);
gDiscordClient->UpdateRichPresence(activity, [](discordpp::ClientResult) {});
}

View File

@ -254,7 +254,6 @@ public:
#ifdef LL_DISCORD
static void initDiscordSocial();
static void toggleDiscordIntegration(const LLSD& value);
static void updateDiscordActivity();
static void updateDiscordPartyCurrentSize(int32_t size);
static void updateDiscordPartyMaxSize(int32_t size);

View File

@ -147,7 +147,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
gGL.setColorMask(true, true);
LLColor3 light_diffuse(0, 0, 0);
//F32 light_exp = 0.0f; // <FS:Ansariel> Remove unused variable
LLEnvironment& environment = LLEnvironment::instance();
LLSettingsWater::ptr_t pwater = environment.getCurrentWater();
@ -183,7 +182,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)
// Apply magic numbers translating light direction into intensities
light_dir.normalize();
F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1];
//light_exp = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f)); // <FS:Ansariel> Remove unused variable
if (0.f < light_diffuse.normalize()) // Normalizing a color? Puzzling...
{
light_diffuse *= (1.5f + (6.f * ground_proj_sq));

View File

@ -551,7 +551,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this));
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering
#ifdef LL_DISCORD
gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::toggleDiscordIntegration, _2));
gSavedSettings.getControl("EnableDiscord")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
gSavedSettings.getControl("ShowDiscordActivityDetails")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
gSavedSettings.getControl("ShowDiscordActivityState")->getCommitSignal()->connect(boost::bind(&LLAppViewer::updateDiscordActivity));
#endif

View File

@ -396,13 +396,11 @@ void pump_idle_startup_network(void)
{
// while there are message to process:
// process one then call display_startup()
// S32 num_messages = 0; // <FS:Beq/> Avoid set-but-unused in Clang
{
LockMessageChecker lmc(gMessageSystem);
while (lmc.checkAllMessages(gFrameCount, gServicePump))
{
display_startup();
// ++num_messages; // <FS:Beq/> Avoid set-but-unused in Clang
}
lmc.processAcks();
}

View File

@ -544,7 +544,6 @@ void LLViewerTexture::updateClass()
bool is_low = is_sys_low || over_pct > 0.f;
static bool was_low = false;
//static bool was_sys_low = false; // <FS:Ansariel> Remove unused variable
if (is_low && !was_low)
{
@ -562,7 +561,6 @@ void LLViewerTexture::updateClass()
}
was_low = is_low;
//was_sys_low = is_sys_low; // <FS:Ansariel> Remove unused variable
if (is_low)
{

View File

@ -5674,16 +5674,6 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent)
}
bool visible = isVisible();
// <FS:Beq> Set but not used
// bool is_control_avatar = isControlAvatar(); // capture state to simplify tracing
// bool is_attachment = false;
// if (is_control_avatar)
// {
// LLControlAvatar *cav = dynamic_cast<LLControlAvatar*>(this);
// is_attachment = cav && cav->mRootVolp && cav->mRootVolp->isAttachment(); // For attached animated objects
// }
// </FS:Beq>
// For fading out the names above heads, only let the timer
// run if we're visible.

View File

@ -2264,7 +2264,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
return;
}
// bool iceCompleted = false; // <FS:Beq/> Set but not used
LLSD body;
if (!connection->mIceCandidates.empty() || connection->mIceCompleted)
{
@ -2303,7 +2302,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)
LLSD body_candidate;
body_candidate["completed"] = true;
body["candidate"] = body_candidate;
// iceCompleted = connection->mIceCompleted; // <FS:Beq/> Set but not used
connection->mIceCompleted = false;
}
@ -2928,7 +2926,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
return;
}
boost::json::object voice_data = voice_data_parsed.as_object();
// bool new_participant = false; // <FS:Beq/> Set but not used
boost::json::object mute;
boost::json::object user_gain;
for (auto &participant_elem : voice_data)
@ -2981,7 +2978,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
}
}
// new_participant |= joined; // <FS:Beq/> Set but not used
if (!participant && joined && (primary || !isSpatial()))
{
participant = LLWebRTCVoiceClient::getInstance()->addParticipantByID(mChannelID, agent_id, mRegionID);

View File

@ -199,6 +199,25 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
function="People.DelFriend" />
</dnd_button>
</panel>
<slider
control_name="NearMeRange"
decimal_digits="0"
increment="1"
follows="left|top"
left="5"
min_val="0"
max_val="4096"
label="Range:"
name="near_me_range"
tool_tip="Nearby people range"
width="230"/>
<text
type="string"
follows="left|top"
left_delta="225"
name="near_me_range_text2">
m
</text>
<layout_stack
clip="false"
follows="all"
@ -239,7 +258,7 @@ Learn about [https://community.secondlife.com/knowledgebase/joining-and-particip
<avatar_list
allow_select="true"
follows="all"
height="211"
height="197"
ignore_online_status="true"
layout="topleft"
left="3"

View File

@ -72,7 +72,6 @@ class ViewerManifest(LLManifest,FSViewerManifest):
def construct(self):
super(ViewerManifest, self).construct()
self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
# <FS:LO> Copy dictionaries to a place where the viewer can find them if ran from visual studio
pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')