diff --git a/autobuild.xml b/autobuild.xml
index a2e3e2b946..c8ecac8eeb 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1084,11 +1084,11 @@
archive
name
darwin
@@ -1158,9 +1158,9 @@
archive
name
linux64
@@ -1200,9 +1200,9 @@
archive
name
linux64
diff --git a/doc/contributions.txt b/doc/contributions.txt
index ee122c660c..1df816d6c2 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -238,6 +238,7 @@ Ansariel Hiller
SL-15226
SL-15227
SL-15398
+ SL-18432
Aralara Rajal
Arare Chantilly
CHUIBUG-191
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 18ed3b1e1c..cc27b96db0 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -253,7 +253,7 @@ elseif(LINUX)
libopenjp2.so
libuuid.so.16
libuuid.so.16.0.22
- libfontconfig.so.1.8.0
+ libfontconfig.so.1.10.1
libfontconfig.so.1
libaprutil-1.so.0
libapr-1.so.0
diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h
index d58b7ee812..3d74279977 100644
--- a/indra/llprimitive/llmaterial.h
+++ b/indra/llprimitive/llmaterial.h
@@ -66,6 +66,15 @@ public:
LLSD asLLSD() const;
void fromLLSD(const LLSD& material_data);
+ bool isEmpty() const
+ {
+ if( mNormalID.notNull() || mSpecularID.notNull() ) //|| mDiffuseAlphaMode != DIFFUSE_ALPHA_MODE_BLEND)
+ {
+ return false;
+ }
+ return true;
+ }
+
const LLUUID& getNormalID() const;
void setNormalID(const LLUUID& normal_id);
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 10abd6ae5b..5db1411e12 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.6.6
+6.6.7
diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi
index e8929e2898..2a8ea7ef1d 100644
Binary files a/indra/newview/installers/windows/lang_pl.nsi and b/indra/newview/installers/windows/lang_pl.nsi differ
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 57da1b18ae..b19e9ed9e6 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -55,6 +55,10 @@ exportMutliArchDRIPath() {
## driver bug, try enabling this option and report whether it helps:
#export LL_ATI_MOUSE_CURSOR_BUG=x
+## Help fontconfig find its default configuration file, otherwise the viewer will stall
+## with Fontconfig error: Cannot load default config file
+export FONTCONFIG_PATH=/etc/fonts
+
if [ "`uname -m`" = "x86_64" ]; then
echo '64-bit Linux detected.'
fi
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 0ea885d175..51d4e94430 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -803,7 +803,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
// we were tracking someone who went offline
deleteTrackingData();
}
- }
+ // } [FIRE-32324] least invasive change move this brace after the if. LL fix should follow sometime soon
//[FIX FIRE-3522 : SJ] Notify Online/Offline to Nearby Chat even if chat_notify isnt true
// Attempt to speed up things a little
@@ -815,6 +815,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
// Look up the name of this agent for the notification
LLAvatarNameCache::get(agent_id,boost::bind(&on_avatar_name_cache_notify,_1, _2, online, payload));
}
+ } // [FIRE-32324] least invasive change move this brace after the if
mModifyMask |= LLFriendObserver::ONLINE;
instance().notifyObservers();
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index dc52ff4f6a..6caecb9dab 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -52,6 +52,7 @@
#include "fsperfstats.h" // performance stats support
BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE;
+BOOL LLDrawPoolAlpha::sShowDebugAlphaRigged = FALSE;
#define current_shader (LLGLSLShader::sCurBoundShaderPtr)
@@ -300,15 +301,17 @@ void LLDrawPoolAlpha::renderDebugAlpha()
gGL.diffuseColor4f(0, 1, 0, 1);
pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
-
+ // FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
+ if (sShowDebugAlphaRigged)
+ {
+ //
gHighlightProgram.mRiggedVariant->bind();
- gGL.diffuseColor4f(1, 0, 0, 1);
-
+ gGL.diffuseColor4f(0, 1, 0, 1);// FIRE-32132 et al. (can plain PASS_ALPHA_MASK_RIGGED exist?) paint it green if so.
pushRiggedBatches(LLRenderPass::PASS_ALPHA_MASK_RIGGED, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushRiggedBatches(LLRenderPass::PASS_ALPHA_INVISIBLE_RIGGED, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
// Material alpha mask
- gGL.diffuseColor4f(0, 0, 1, 1);
+ gGL.diffuseColor4f(0, 1, 1, 1);// FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
pushRiggedBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK_RIGGED, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushRiggedBatches(LLRenderPass::PASS_NORMMAP_MASK_RIGGED, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
pushRiggedBatches(LLRenderPass::PASS_SPECMAP_MASK_RIGGED, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
@@ -317,6 +320,9 @@ void LLDrawPoolAlpha::renderDebugAlpha()
gGL.diffuseColor4f(0, 1, 0, 1);
pushRiggedBatches(LLRenderPass::PASS_INVISIBLE_RIGGED, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
+ // FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
+ }
+ //
LLGLSLShader::sCurBoundShaderPtr->unbind();
}
}
@@ -344,16 +350,6 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)
{
LLDrawInfo& params = **k;
- // Capture render times
- if(params.mFace)
- {
- LLViewerObject* vobj = (LLViewerObject *)params.mFace->getViewerObject();
- if(vobj->isAttachment())
- {
- trackAttachments( vobj, params.mFace->isState(LLFace::RIGGED), &ratPtr );
- }
- }
- //
if (params.mParticle)
{
@@ -361,7 +357,30 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
}
bool rigged = (params.mAvatar != nullptr);
+ // Capture render times
+ if(params.mFace)
+ {
+ LLViewerObject* vobj = (LLViewerObject *)params.mFace->getViewerObject();
+ if(vobj->isAttachment())
+ {
+ trackAttachments( vobj, rigged, &ratPtr );
+ }
+ }
+ //
gHighlightProgram.bind(rigged);
+ // FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
+ if (rigged && !sShowDebugAlphaRigged)
+ {
+ // if we don't want to show rigged alpha highlights then skip
+ continue;
+ }
+ else if (rigged && sShowDebugAlphaRigged)
+ {
+ // if we do and this is rigged then use a different colour
+ gGL.diffuseColor4f(1, 0.5, 0, 1);
+ }
+ else // NB dangling else to drop through to "normal behaviour"
+ //
gGL.diffuseColor4f(1, 0, 0, 1);
if (rigged)
diff --git a/indra/newview/lldrawpoolalpha.h b/indra/newview/lldrawpoolalpha.h
index fa8ef0f227..c6ea0045cb 100644
--- a/indra/newview/lldrawpoolalpha.h
+++ b/indra/newview/lldrawpoolalpha.h
@@ -66,6 +66,7 @@ public:
bool uploadMatrixPalette(const LLDrawInfo& params);
static BOOL sShowDebugAlpha;
+ static BOOL sShowDebugAlphaRigged;
private:
LLGLSLShader* target_shader;
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index b8fe84fadf..b35a1210e9 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -67,6 +67,8 @@
#include "llviewercontrol.h" // for gSavedSettings
#include "llvoavatarself.h"
+#include "aoengine.h" // FIRE-32315: Animation preview sometimes fails when FS AO is enabled
+
S32 LLFloaterBvhPreview::sOwnAvatarInstanceCount = 0; // Preview on own avatar
const S32 PREVIEW_BORDER_WIDTH = 2;
@@ -137,6 +139,13 @@ LLFloaterBvhPreview::LLFloaterBvhPreview(const std::string& filename) :
if (mUseOwnAvatar)
{
sOwnAvatarInstanceCount++;
+
+ // // Switch FS AO off during preview
+ mAOEnabled = gSavedPerAccountSettings.getBOOL("UseAO");
+ if (mAOEnabled)
+ {
+ AOEngine::getInstance()->enable(false);
+ }
}
//
@@ -535,6 +544,12 @@ LLFloaterBvhPreview::~LLFloaterBvhPreview()
gAgentAvatarp->startDefaultMotions();
gAgentAvatarp->startMotion(ANIM_AGENT_STAND);
}
+
+ // Switch FS AO back on if it was disabled during preview
+ if (mAOEnabled)
+ {
+ AOEngine::getInstance()->enable(true);
+ }
}
//
diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h
index 89fffe13cb..ec3122821a 100644
--- a/indra/newview/llfloaterbvhpreview.h
+++ b/indra/newview/llfloaterbvhpreview.h
@@ -158,6 +158,9 @@ protected:
// FIRE-17277: Allow entering Loop In/Loop Out as frames
S32 mNumFrames;
+
+ // FIRE-32315: Animation preview sometimes fails when FS AO is enabled
+ bool mAOEnabled;
};
#endif // LL_LLFLOATERBVHPREVIEW_H
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 4daadc1408..f098193774 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -51,7 +51,9 @@
// The minor cardinal direction labels are hidden if their height is more
// than this proportion of the map.
-const F32 MAP_MINOR_DIR_THRESHOLD = 0.035f;
+// FIRE-32341: Make minor directions visible at reasonable mini map size again
+//const F32 MAP_MINOR_DIR_THRESHOLD = 0.035f;
+const F32 MAP_MINOR_DIR_THRESHOLD = 0.07f;
const S32 MAP_PADDING_LEFT = 0;
const S32 MAP_PADDING_TOP = 2;
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index ff138dc229..417d11e179 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -467,26 +467,8 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) ));
LLSD payload;
- LLNotificationsUtil::add("PromptMFAToken", args, payload, [=](LLSD const & notif, LLSD const & response) {
- bool continue_clicked = response["continue"].asBoolean();
- std::string token = response["token"].asString();
- LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
-
- // strip out whitespace - SL-17034/BUG-231938
- token = boost::regex_replace(token, boost::regex("\\s"), "");
-
- if (continue_clicked && !token.empty())
- {
- LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
-
- // Set the request data to true and retry login.
- mRequestData["params"]["token"] = token;
- reconnect();
- } else {
- LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
- attemptComplete();
- }
- });
+ LLNotificationsUtil::add("PromptMFAToken", args, payload,
+ boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
}
else if( reason_response == "key"
|| reason_response == "presence"
@@ -563,23 +545,59 @@ void LLLoginInstance::handleIndeterminate(const LLSD& event)
bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
{
- if(accepted)
- {
- LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: accepted" << LL_ENDL;
+ if(accepted)
+ {
+ LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: accepted " << LL_ENDL;
- // Set the request data to true and retry login.
- mRequestData["params"][key] = true;
- reconnect();
- }
- else
- {
- LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: attemptComplete" << LL_ENDL;
+ // Set the request data to true and retry login.
+ mRequestData["params"][key] = true;
- attemptComplete();
- }
+ if (!mRequestData["params"]["token"].asString().empty())
+ {
+ // SL-18511 this TOS failure happened while we are in the middle of an MFA challenge/response.
+ // the previously entered token is very likely expired, so prompt again
+ LLSD args(llsd::map( "MESSAGE", LLTrans::getString("LoginFailedAuthenticationMFARequired") ));
+ LLSD payload;
+ LLNotificationsUtil::add("PromptMFAToken", args, payload,
+ boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
+ }
+ else
+ {
+ reconnect();
+ }
+ }
+ else
+ {
+ LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: attemptComplete" << LL_ENDL;
- LLEventPumps::instance().obtain(TOS_REPLY_PUMP).stopListening(TOS_LISTENER_NAME);
- return true;
+ attemptComplete();
+ }
+
+ LLEventPumps::instance().obtain(TOS_REPLY_PUMP).stopListening(TOS_LISTENER_NAME);
+ return true;
+}
+
+bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & response)
+{
+ bool continue_clicked = response["continue"].asBoolean();
+ std::string token = response["token"].asString();
+ LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
+
+ // strip out whitespace - SL-17034/BUG-231938
+ token = boost::regex_replace(token, boost::regex("\\s"), "");
+
+ if (continue_clicked && !token.empty())
+ {
+ LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
+
+ // Set the request data to true and retry login.
+ mRequestData["params"]["token"] = token;
+ reconnect();
+ } else {
+ LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
+ attemptComplete();
+ }
+ return true;
}
std::string construct_start_string()
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index c486773465..100f21101f 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -87,6 +87,7 @@ private:
void syncWithUpdater(ResponsePtr resp, const LLSD& notification, const LLSD& response);
bool handleTOSResponse(bool v, const std::string& key);
+ bool handleMFAChallenge(LLSD const & notif, LLSD const & response);
void attemptComplete() { mAttemptComplete = true; } // In the future an event?
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 1ed1158d3f..1f75e1b590 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -2509,14 +2509,17 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
{
// Log things properly
// LL_INFOS() << "Generating lod " << which_lod << " using meshoptimizer" << LL_ENDL;
- std::ostringstream out;
- out << "Generating lod " << which_lod << " using meshoptimizer";
- LL_INFOS("MeshUpload") << out.str() << LL_ENDL;
- LLFloaterModelPreview::addStringToLog(out, false);
+ {
+ std::ostringstream out;
+ out << "Generating lod " << which_lod << " using meshoptimizer";
+ LL_INFOS("MeshUpload") << out.str() << LL_ENDL;
+ LLFloaterModelPreview::addStringToLog(out, false);
+ }
+ //
// Allow LoD from -1 to LLModel::LOD_PHYSICS
if (which_lod < -1 || which_lod > LLModel::NUM_LODS - 1)
{
- // std::ostringstream out; // already instantiated
+ std::ostringstream out;
out << "Invalid level of detail: " << which_lod;
LL_WARNS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true); // if you don't flash the log tab on error when do you?
@@ -2726,7 +2729,11 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
// (indices_decimator / res_ratio) by itself is likely to overshoot to a differend
// side due to overal lack of precision, and we don't need an ideal result, which
// likely does not exist, just a better one, so a partial correction is enough.
- F32 sloppy_decimator = indices_decimator * (indices_decimator / sloppy_ratio + 1) / 2;
+ F32 sloppy_decimator{indices_decimator};
+ // if(sloppy_ratio > 0)
+ // {
+ sloppy_decimator = indices_decimator * (indices_decimator / sloppy_ratio + 1) / 2;
+ // }
sloppy_ratio = genMeshOptimizerPerModel(base, target_model, sloppy_decimator, lod_error_threshold, MESH_OPTIMIZER_NO_TOPOLOGY);
}
@@ -2777,12 +2784,16 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
// << " lod " << which_lod
// << " resulting ratio " << precise_ratio
// << " simplified using per model method." << LL_ENDL;
- out << "Model " << target_model->getName()
- << " lod " << which_lod
- << " resulting ratio " << precise_ratio
- << " simplified using per model method.";
- LL_INFOS() << out.str() << LL_ENDL;
- LLFloaterModelPreview::addStringToLog(out, false);
+ {
+ std::ostringstream out;
+ out << "Model " << target_model->getName()
+ << " lod " << which_lod
+ << " resulting ratio " << precise_ratio
+ << " simplified using per model method.";
+ LL_INFOS() << out.str() << LL_ENDL;
+ LLFloaterModelPreview::addStringToLog(out, false);
+ }
+ //
}
else
{
@@ -2791,12 +2802,14 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
// << " lod " << which_lod
// << " resulting ratio " << sloppy_ratio
// << " sloppily simplified using per model method." << LL_ENDL;
+ std::ostringstream out;
out << "Model " << target_model->getName()
<< " lod " << which_lod
<< " resulting ratio " << sloppy_ratio
<< " sloppily simplified using per model method.";
LL_INFOS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, false);
+ //
}
}
else
@@ -2806,12 +2819,14 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, S32 meshopt_mode, U32 d
// << " lod " << which_lod
// << " resulting ratio " << precise_ratio
// << " simplified using per model method." << LL_ENDL;
+ std::ostringstream out;
out << "Bad MeshOptimisation result for Model " << target_model->getName()
<< " lod " << which_lod
<< " resulting ratio " << precise_ratio
<< " simplified using per model method.";
LL_WARNS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
+ //
}
}
@@ -3278,7 +3293,6 @@ void LLModelPreview::updateStatusMessages()
out << "Loader returned errors, model can't be uploaded";
LL_INFOS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
- out.str("");
//
}
@@ -3296,7 +3310,6 @@ void LLModelPreview::updateStatusMessages()
out << "Invalid rig, there might be issues with uploading Joint positions";
LL_INFOS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
- out.str("");
//
}
}
@@ -3861,7 +3874,6 @@ void LLModelPreview::createPreviewAvatar(void)
out << "Failed to create preview avatar for upload model window";
LL_INFOS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
- out.str("");
//
}
}
@@ -3964,6 +3976,7 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)
out << "Auto Loading LOD" << next_lod << " from " << lod_filename;
LL_INFOS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
+ out.str("");
//
LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
if (fmp)
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index d4a9dc2cef..9ef304d08e 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -1697,6 +1697,9 @@ void LLNetMap::createParcelImage()
BOOL LLNetMap::handleMouseDown(S32 x, S32 y, MASK mask)
{
+ // FIRE-32339: Mini map can't be dragged anymore
+ if (!(mask & MASK_SHIFT)) return FALSE;
+
// Start panning
gFocusMgr.setMouseCapture(this);
@@ -1881,10 +1884,10 @@ BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
menu->buildDrawLabels();
menu->updateParent(LLMenuGL::sMenuContainer);
// [SL:KB] - Patch: World-MiniMap | Checked: 2012-07-08 (Catznip-3.3)
- menu->setItemVisible("Stop tracking", LLTracker::isTracking(0));
+ menu->setItemVisible("Stop Tracking", LLTracker::isTracking(0));
menu->setItemVisible("Stop Tracking Separator", LLTracker::isTracking(0));
// [/SL:KB]
-// menu->setItemEnabled("Stop tracking", LLTracker::isTracking(0));
+// menu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0));
LLMenuGL::showPopup(this, menu, x, y);
}
return TRUE;
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 48b5c34db7..d0c67fdb0a 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -275,7 +275,7 @@ public:
return lhs->mAvatarp < rhs->mAvatarp;
}
- return lhs->mRenderOrder < rhs->mRenderOrder;
+ return lhs->mRenderOrder > rhs->mRenderOrder;
}
};
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index bbae79bd24..10c968051b 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -524,7 +524,11 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
{
errorMessage = "Failed reading animation file";
}
+
+ delete motionp; // Memory leak fix
}
+
+ delete[] buffer; // Memory leak fix
}
}
else
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 62db046fa0..af394f0808 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -10997,6 +10997,26 @@ class LLViewCheckHighlightTransparent : public view_listener_t
return new_value;
}
};
+// FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
+class LLViewHighlightTransparentRigged : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLDrawPoolAlpha::sShowDebugAlphaRigged = !LLDrawPoolAlpha::sShowDebugAlphaRigged;
+ gPipeline.resetVertexBuffers();
+ return true;
+ }
+};
+
+class LLViewCheckHighlightTransparentRigged : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool new_value = LLDrawPoolAlpha::sShowDebugAlphaRigged;
+ return new_value;
+ }
+};
+//
class LLViewBeaconWidth : public view_listener_t
{
@@ -12019,6 +12039,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter");
view_listener_t::addMenu(new LLViewShowHoverTips(), "View.ShowHoverTips");
view_listener_t::addMenu(new LLViewHighlightTransparent(), "View.HighlightTransparent");
+ view_listener_t::addMenu(new LLViewHighlightTransparentRigged(), "View.HighlightTransparentRigged"); // FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
view_listener_t::addMenu(new LLViewToggleRenderType(), "View.ToggleRenderType");
view_listener_t::addMenu(new LLViewShowHUDAttachments(), "View.ShowHUDAttachments");
view_listener_t::addMenu(new LLZoomer(1.2f), "View.ZoomOut");
@@ -12035,6 +12056,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLViewCheckJoystickFlycam(), "View.CheckJoystickFlycam");
view_listener_t::addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips");
view_listener_t::addMenu(new LLViewCheckHighlightTransparent(), "View.CheckHighlightTransparent");
+ view_listener_t::addMenu(new LLViewCheckHighlightTransparentRigged(), "View.CheckHighlightTransparentRigged");// FIRE-32132 et al. Allow rigged mesh transparency highlights to be toggled
view_listener_t::addMenu(new LLViewCheckRenderType(), "View.CheckRenderType");
view_listener_t::addMenu(new LLViewStatusAway(), "View.Status.CheckAway");
view_listener_t::addMenu(new LLViewStatusDoNotDisturb(), "View.Status.CheckDoNotDisturb");
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index b5dfedf021..e096d00aaf 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -835,6 +835,13 @@ public:
ypos += y_inc;
}
+ // FIRE-32311 - Only show particle text when showing render debug info (relocate pre-existing change by Liny)
+ if (LLPipeline::toggleRenderTypeControlNegated(LLPipeline::RENDER_TYPE_PARTICLES))
+ {
+ addText(xpos, ypos, particle_hiding);
+ ypos += y_inc;
+ }
+ //
LLVertexBuffer::sBindCount = LLImageGL::sBindCount =
LLVertexBuffer::sSetCount = LLImageGL::sUniqueCount =
gPipeline.mNumVisibleNodes = LLPipeline::sVisibleLightCount = 0;
@@ -932,14 +939,6 @@ public:
}
//
- // pull the text saying if particles are hidden out from beacons
- if (LLPipeline::toggleRenderTypeControlNegated(LLPipeline::RENDER_TYPE_PARTICLES))
- {
- addText(xpos, ypos, particle_hiding);
- ypos += y_inc;
- }
- //
-
// only display these messages if we are actually rendering beacons at this moment
// Always show the beacon text regardless if the floater is visible
// ...and if we want to see it
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 6905fb137d..1be7373fb1 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5375,21 +5375,22 @@ LLControlAVBridge::LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regi
bool can_batch_texture(LLFace* facep)
{
- // fix batching when materials disabled and alpha none/masked.
if (facep->getTextureEntry()->getBumpmap())
{ //bump maps aren't worked into texture batching yet
return false;
}
+ // fix batching when materials disabled and alpha none/masked.
// if (facep->getTextureEntry()->getMaterialParams().notNull())
// { //materials don't work with texture batching yet
// return false;
// }
const auto te = facep->getTextureEntry();
- if (LLPipeline::sRenderDeferred && te )
+ if ( LLPipeline::sRenderDeferred && te )
{
auto mat = te->getMaterialParams();
- if(mat.notNull() && (mat->getNormalID() != LLUUID::null || mat->getSpecularID() != LLUUID::null || (te->getAlpha() >0.f && te->getAlpha() < 1.f ) ) )
+ // if(mat.notNull() && (mat->getNormalID() != LLUUID::null || mat->getSpecularID() != LLUUID::null || (te->getAlpha() >0.f && te->getAlpha() < 1.f ) ) )
+ if( mat.notNull() && ( !mat->isEmpty() || ( (te->getAlpha() >0.f && te->getAlpha() < 1.f ) && mat->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) ) )
{
// we have a materials block but we cannot batch materials.
// however, materials blocks can and do exist due to alpha masking and those are batchable,
@@ -5582,6 +5583,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
U32 shader_mask = 0xFFFFFFFF; //no shader
+ if(mat && mat->isEmpty() && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)
+ {
+ mat = nullptr;
+ }
+
if (mat)
{
if (type == LLRenderPass::PASS_ALPHA)
@@ -5836,7 +5842,7 @@ static inline void add_face(T*** list, U32* count, T* face)
{
if (count[1] < MAX_FACE_COUNT)
{
- //face->setDrawOrderIndex(count[1]);
+ face->setDrawOrderIndex(count[1]);
list[1][count[1]++] = face;
}
}
@@ -5844,36 +5850,12 @@ static inline void add_face(T*** list, U32* count, T* face)
{
if (count[0] < MAX_FACE_COUNT)
{
- //face->setDrawOrderIndex(count[0]);
+ face->setDrawOrderIndex(count[0]);
list[0][count[0]++] = face;
}
}
}
-// return index into linkset for given object (0 for root prim)
-U32 get_linkset_index(LLVOVolume* vobj)
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE;
- if (vobj->isRootEdit())
- {
- return 0;
- }
-
- LLViewerObject* root = vobj->getRootEdit();
- U32 idx = 1;
- for (const auto& child : root->getChildren())
- {
- if (child == vobj)
- {
- return idx;
- }
- ++idx;
- }
-
- llassert(false);
- return idx; //should never get here
-}
-
void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME;
@@ -6081,8 +6063,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
avatar->addAttachmentOverridesForObject(vobj, NULL, false);
}
-
- U32 linkset_index = get_linkset_index(vobj);
// Standard rigged mesh attachments:
bool rigged = !vobj->isAnimatedObject() && skinInfo && vobj->isAttachment();
@@ -6103,9 +6083,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
continue;
}
- // order by linkset index first and face index second
- facep->setDrawOrderIndex(linkset_index * 100 + i);
-
//ALWAYS null out vertex buffer on rebuild -- if the face lands in a render
// batch, it will recover its vertex buffer reference from the spatial group
facep->setVertexBuffer(NULL);
@@ -6130,6 +6107,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (facep->isState(LLFace::RIGGED))
{
//face is not rigged but used to be, remove from rigged face pool
+ LLDrawPoolAvatar* pool = (LLDrawPoolAvatar*)facep->getPool();
+ if (pool)
+ {
+ pool->removeFace(facep);
+ }
facep->clearState(LLFace::RIGGED);
facep->mAvatar = NULL;
facep->mSkinInfo = NULL;
@@ -6604,14 +6586,6 @@ struct CompareBatchBreakerRigged
}
};
-struct CompareDrawOrder
-{
- bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
- {
- return lhs->getDrawOrderIndex() < rhs->getDrawOrderIndex();
- }
-};
-
U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace** faces, U32 face_count, BOOL distance_sort, BOOL batch_textures, BOOL rigged)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME;
@@ -6655,11 +6629,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
//sort faces by things that break batches, including avatar and mesh id
std::sort(faces, faces + face_count, CompareBatchBreakerRigged());
}
- else
- {
- // preserve legacy draw order for rigged faces
- std::sort(faces, faces + face_count, CompareDrawOrder());
- }
}
else if (!distance_sort)
{
@@ -6716,10 +6685,10 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
LLMaterialPtr mat = te->getMaterialParams();
LLMaterialID matId = te->getMaterialID();
- if (distance_sort)
- {
- tex = NULL;
- }
+ // if (distance_sort)
+ // {
+ // tex = NULL;
+ // }
if (last_tex == tex)
{
@@ -6804,7 +6773,11 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
tex = facep->getTexture();
- if (texture_count < MAX_TEXTURE_COUNT)
+ // Quick hack test of proper batching logic
+ // if (texture_count < MAX_TEXTURE_COUNT)
+ // only add to the batch if this is a new texture
+ if (cur_tex == texture_count && texture_count < MAX_TEXTURE_COUNT)
+ //
{
texture_list[texture_count++] = tex;
}
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index f0c23579bc..586c9d1eda 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -321,6 +321,7 @@
+