summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rwxr-xr-xindra/llcommon/tests/llleap_test.cpp10
-rw-r--r--indra/llprimitive/lldaeloader.cpp106
-rw-r--r--indra/llprimitive/lldaeloader.h11
-rwxr-xr-xindra/llrender/llglslshader.cpp18
-rwxr-xr-xindra/llrender/llglslshader.h4
-rwxr-xr-xindra/llui/lliconctrl.cpp14
-rwxr-xr-xindra/llui/lliconctrl.h4
-rwxr-xr-xindra/llui/llurlentry.cpp2
-rwxr-xr-xindra/llui/tests/llurlentry_test.cpp8
-rwxr-xr-xindra/newview/llagent.cpp16
-rwxr-xr-xindra/newview/llagent.h2
-rwxr-xr-xindra/newview/llaisapi.cpp18
-rwxr-xr-xindra/newview/llavatariconctrl.cpp36
-rwxr-xr-xindra/newview/llfavoritesbar.cpp9
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp166
-rwxr-xr-xindra/newview/llfloatermodelpreview.h5
-rwxr-xr-xindra/newview/llfloaterregioninfo.cpp2
-rwxr-xr-xindra/newview/llfriendcard.cpp43
-rwxr-xr-xindra/newview/llfriendcard.h19
-rwxr-xr-xindra/newview/llgroupiconctrl.cpp11
-rwxr-xr-xindra/newview/llinspectgroup.cpp98
-rwxr-xr-xindra/newview/llinventorymodel.cpp2
-rwxr-xr-xindra/newview/llnamelistctrl.cpp8
-rwxr-xr-xindra/newview/llnamelistctrl.h2
-rwxr-xr-xindra/newview/llpanelgroupinvite.cpp29
-rwxr-xr-xindra/newview/llpanelvolume.cpp20
-rwxr-xr-xindra/newview/llpreviewscript.cpp11
-rwxr-xr-xindra/newview/llpreviewscript.h2
-rwxr-xr-xindra/newview/llscreenchannel.cpp8
-rwxr-xr-xindra/newview/llselectmgr.cpp6
-rwxr-xr-xindra/newview/llsidepaneltaskinfo.cpp9
-rwxr-xr-xindra/newview/lltoolpie.cpp44
-rwxr-xr-xindra/newview/lltoolpie.h1
-rwxr-xr-xindra/newview/llviewermessage.cpp11
-rwxr-xr-xindra/newview/llviewertexture.cpp76
-rwxr-xr-xindra/newview/llwatchdog.cpp11
-rwxr-xr-xindra/newview/llworld.cpp2
-rwxr-xr-xindra/newview/pipeline.cpp7
-rw-r--r--indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml8
-rwxr-xr-xindra/newview/skins/default/xui/en/fonts.xml1
-rwxr-xr-xindra/newview/skins/default/xui/es/floater_about_land.xml4
41 files changed, 523 insertions, 341 deletions
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index 2d88e2c676..d342dece84 100755
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -36,10 +36,18 @@ StringVec sv(const StringVec& listof) { return listof; }
#if defined(LL_WINDOWS)
#define sleep(secs) _sleep((secs) * 1000)
-#endif
+// WOLF-300: It appears that driving a megabyte of data through an LLLeap pipe
+// causes Windows abdominal pain such that it later fails code-signing in some
+// mysterious way. Entirely suppressing these LLLeap tests pushes the failure
+// rate MUCH lower. Can we re-enable them with a smaller data size on Windows?
+const size_t BUFFERED_LENGTH = 100*1024;
+
+#else // not Windows
const size_t BUFFERED_LENGTH = 1023*1024; // try wrangling just under a megabyte of data
+#endif
+
void waitfor(const std::vector<LLLeap*>& instances, int timeout=60)
{
int i;
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index afc88fc861..9a1f8d09e8 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -62,6 +62,9 @@
#include "glh/glh_linear.h"
#include "llmatrix4a.h"
+#include <boost/regex.hpp>
+#include <boost/algorithm/string/replace.hpp>
+
std::string colladaVersion[VERSIONTYPE_COUNT+1] =
{
"1.4.0",
@@ -236,7 +239,10 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
// Don't share verts within the same tri, degenerate
//
- if ((indices.size() % 3) && (indices[indices.size()-1] != shared_index))
+ U32 indx_size = indices.size();
+ U32 verts_new_tri = indx_size % 3;
+ if ((verts_new_tri < 1 || indices[indx_size - 1] != shared_index)
+ && (verts_new_tri < 2 || indices[indx_size - 2] != shared_index))
{
found = true;
indices.push_back(shared_index);
@@ -821,8 +827,7 @@ LLDAELoader::LLDAELoader(
opaque_userdata,
jointMap,
jointsFromNodes),
-mGeneratedModelLimit(modelLimit),
-mForceIdNaming(false)
+mGeneratedModelLimit(modelLimit)
{
}
@@ -846,7 +851,9 @@ bool LLDAELoader::OpenFile(const std::string& filename)
{
//no suitable slm exists, load from the .dae file
DAE dae;
- domCOLLADA* dom = dae.open(filename);
+
+ std::string fileURI = "from memory"; // set to a null device
+ domCOLLADA* dom = dae.openFromMemory(fileURI, preprocessDAE(filename).c_str());
if (!dom)
{
@@ -874,7 +881,7 @@ bool LLDAELoader::OpenFile(const std::string& filename)
daeInt count = db->getElementCount(NULL, COLLADA_TYPE_MESH);
- daeDocument* doc = dae.getDoc(mFilename);
+ daeDocument* doc = dae.getDoc(fileURI);
if (!doc)
{
LL_WARNS() << "can't find internal doc" << LL_ENDL;
@@ -945,32 +952,6 @@ bool LLDAELoader::OpenFile(const std::string& filename)
mTransform.condition();
- mForceIdNaming = false;
- std::vector<std::string> checkNames;
- for (daeInt idx = 0; idx < count; ++idx)
- {
- domMesh* mesh = NULL;
- db->getElement((daeElement**)&mesh, idx, NULL, COLLADA_TYPE_MESH);
-
- if (mesh)
- {
- std::string name = getLodlessLabel(mesh, false);
-
- std::vector<std::string>::iterator it;
- it = std::find(checkNames.begin(), checkNames.end(), name);
- if (it != checkNames.end())
- {
- LL_WARNS() << "document has duplicate names, using IDs instead" << LL_ENDL;
- mForceIdNaming = true;
- break;
- }
- else
- {
- checkNames.push_back(name);
- }
- }
- }
-
U32 submodel_limit = count > 0 ? mGeneratedModelLimit/count : 0;
for (daeInt idx = 0; idx < count; ++idx)
{ //build map of domEntities to LLModel
@@ -1078,6 +1059,41 @@ bool LLDAELoader::OpenFile(const std::string& filename)
return true;
}
+std::string LLDAELoader::preprocessDAE(std::string filename)
+{
+ // Open a DAE file for some preprocessing (like removing space characters in IDs), see MAINT-5678
+ std::ifstream inFile;
+ inFile.open(filename.c_str(), std::ios_base::in);
+ std::stringstream strStream;
+ strStream << inFile.rdbuf();
+ std::string buffer = strStream.str();
+
+ LL_INFOS() << "Preprocessing dae file to remove spaces from the names, ids, etc." << LL_ENDL;
+
+ try
+ {
+ boost::regex re("\"[\\w\\.@#$-]*(\\s[\\w\\.@#$-]*)+\"");
+ boost::sregex_iterator next(buffer.begin(), buffer.end(), re);
+ boost::sregex_iterator end;
+ while (next != end)
+ {
+ boost::smatch match = *next;
+ std::string s = match.str();
+ LL_INFOS() << s << " found" << LL_ENDL;
+ boost::replace_all(s, " ", "_");
+ LL_INFOS() << "Replacing with " << s << LL_ENDL;
+ boost::replace_all(buffer, match.str(), s);
+ next++;
+ }
+ }
+ catch (boost::regex_error &)
+ {
+ LL_INFOS() << "Regex error" << LL_ENDL;
+ }
+
+ return buffer;
+}
+
void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, domMesh* mesh, domSkin* skin)
{
llassert(model && dae && mesh && skin);
@@ -1971,7 +1987,7 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da
if (model->mLabel.empty())
{
- label = getLodlessLabel(instance_geo, mForceIdNaming);
+ label = getLodlessLabel(instance_geo);
llassert(!label.empty());
@@ -2186,17 +2202,12 @@ LLImportMaterial LLDAELoader::profileToMaterial(domProfile_COMMON* material, DAE
return mat;
}
-std::string LLDAELoader::getElementLabel(daeElement *element)
-{
- return getElementLabel(element, mForceIdNaming);
-}
-
// try to get a decent label for this element
-std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming)
+std::string LLDAELoader::getElementLabel(daeElement *element)
{
// if we have a name attribute, use it
std::string name = element->getAttribute("name");
- if (name.length() && !forceIdNaming)
+ if (name.length())
{
return name;
}
@@ -2219,7 +2230,7 @@ std::string LLDAELoader::getElementLabel(daeElement *element, bool forceIdNaming
// if parent has a name or ID, use it
std::string name = parent->getAttribute("name");
- if (!name.length() || forceIdNaming)
+ if (!name.length())
{
name = std::string(parent->getID());
}
@@ -2262,9 +2273,9 @@ size_t LLDAELoader::getSuffixPosition(std::string label)
}
// static
-std::string LLDAELoader::getLodlessLabel(daeElement *element, bool forceIdNaming)
+std::string LLDAELoader::getLodlessLabel(daeElement *element)
{
- std::string label = getElementLabel(element, forceIdNaming);
+ std::string label = getElementLabel(element);
size_t ext_pos = getSuffixPosition(label);
if (ext_pos != -1)
{
@@ -2335,13 +2346,8 @@ bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)
return (status == LLModel::NO_ERRORS);
}
-LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
-{
- return loadModelFromDomMesh(mesh, mForceIdNaming);
-}
-
//static
-LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming)
+LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh)
{
LLVolumeParams volume_params;
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
@@ -2349,7 +2355,7 @@ LLModel* LLDAELoader::loadModelFromDomMesh(domMesh *mesh, bool forceIdNaming)
createVolumeFacesFromDomMesh(ret, mesh);
if (ret->mLabel.empty())
{
- ret->mLabel = getElementLabel(mesh, forceIdNaming);
+ ret->mLabel = getElementLabel(mesh);
}
return ret;
}
@@ -2367,7 +2373,7 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
LLModel* ret = new LLModel(volume_params, 0.f);
- std::string model_name = getLodlessLabel(mesh, mForceIdNaming);
+ std::string model_name = getLodlessLabel(mesh);
ret->mLabel = model_name + lod_suffix[mLod];
llassert(!ret->mLabel.empty());
diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h
index 3ababd3156..19a85a5339 100644
--- a/indra/llprimitive/lldaeloader.h
+++ b/indra/llprimitive/lldaeloader.h
@@ -89,22 +89,21 @@ protected:
static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh);
static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh);
- static LLModel* loadModelFromDomMesh(domMesh* mesh, bool forceIdNaming);
- LLModel* loadModelFromDomMesh(domMesh* mesh);
+ static LLModel* loadModelFromDomMesh(domMesh* mesh);
// Loads a mesh breaking it into one or more models as necessary
// to get around volume face limitations while retaining >8 materials
//
bool loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& models_out, U32 submodel_limit);
- static std::string getElementLabel(daeElement *element, bool forceIdNaming);
- std::string getElementLabel(daeElement *element);
+ static std::string getElementLabel(daeElement *element);
static size_t getSuffixPosition(std::string label);
- static std::string getLodlessLabel(daeElement *element, bool forceIdNaming = false);
+ static std::string getLodlessLabel(daeElement *element);
+
+ static std::string preprocessDAE(std::string filename);
private:
U32 mGeneratedModelLimit; // Attempt to limit amount of generated submodels
- bool mForceIdNaming;
};
#endif // LL_LLDAELLOADER_H
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 0f260674ed..52b8de8365 100755
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -325,14 +325,20 @@ LLGLSLShader::~LLGLSLShader()
void LLGLSLShader::unload()
{
+ mShaderFiles.clear();
+ mDefines.clear();
+
+ unloadInternal();
+}
+
+void LLGLSLShader::unloadInternal()
+{
sInstances.erase(this);
stop_glerror();
mAttribute.clear();
mTexture.clear();
mUniform.clear();
- mShaderFiles.clear();
- mDefines.clear();
if (mProgramObject)
{
@@ -354,13 +360,13 @@ void LLGLSLShader::unload()
mProgramObject = 0;
}
-
+
if (mTimerQuery)
{
glDeleteQueriesARB(1, &mTimerQuery);
mTimerQuery = 0;
}
-
+
if (mSamplesQuery)
{
glDeleteQueriesARB(1, &mSamplesQuery);
@@ -369,7 +375,7 @@ void LLGLSLShader::unload()
//hack to make apple not complain
glGetError();
-
+
stop_glerror();
}
@@ -378,6 +384,8 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes,
U32 varying_count,
const char** varyings)
{
+ unloadInternal();
+
sInstances.insert(this);
//reloading, reset matrix hash values
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 5abddf274b..0746e8760a 100755
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -198,7 +198,9 @@ public:
bool mTextureStateFetched;
std::vector<U32> mTextureMagFilter;
std::vector<U32> mTextureMinFilter;
-
+
+private:
+ void unloadInternal();
};
//UI shader (declared here so llui_libtest will link properly)
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 58b66f60ca..f841901801 100755
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -54,7 +54,9 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
mUseDrawContextAlpha(p.use_draw_context_alpha),
mPriority(0),
mMinWidth(p.min_width),
- mMinHeight(p.min_height)
+ mMinHeight(p.min_height),
+ mMaxWidth(0),
+ mMaxHeight(0)
{
if (mImagep.notNull())
{
@@ -104,7 +106,15 @@ void LLIconCtrl::setValue(const LLSD& value )
&& mMinWidth
&& mMinHeight)
{
- mImagep->getImage()->setKnownDrawSize(llmax(mMinWidth, mImagep->getWidth()), llmax(mMinHeight, mImagep->getHeight()));
+ S32 desired_draw_width = llmax(mMinWidth, mImagep->getWidth());
+ S32 desired_draw_height = llmax(mMinHeight, mImagep->getHeight());
+ if (mMaxWidth && mMaxHeight)
+ {
+ desired_draw_width = llmin(desired_draw_width, mMaxWidth);
+ desired_draw_height = llmin(desired_draw_height, mMaxHeight);
+ }
+
+ mImagep->getImage()->setKnownDrawSize(desired_draw_width, desired_draw_height);
}
}
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 8b1092df46..7971cd44d3 100755
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -79,7 +79,9 @@ protected:
//the output size of the icon image if set.
S32 mMinWidth,
- mMinHeight;
+ mMinHeight,
+ mMaxWidth,
+ mMaxHeight;
// If set to true (default), use the draw context transparency.
// If false, will use transparency returned by getCurrentTransparency(). See STORM-698.
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 576fff5fb2..57de35dfde 100755
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -229,7 +229,7 @@ static std::string getStringAfterToken(const std::string str, const std::string
LLUrlEntryHTTP::LLUrlEntryHTTP()
: LLUrlEntryBase()
{
- mPattern = boost::regex("https?://([-\\w\\.]+)+(:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?\\.[a-z](:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?/?\\S*",
+ mPattern = boost::regex("https?://([^\\s/?\\.#]+\\.?)+\\.\\w+(:\\d+)?(/\\S*)?",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_http.xml";
mTooltip = LLTrans::getString("TooltipHttpUrl");
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index dde54c78c4..d41930a492 100755
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -232,6 +232,14 @@ namespace tut
testRegex("http url with newlines", url,
"XX\nhttp://www.secondlife.com/\nXX",
"http://www.secondlife.com/");
+
+ testRegex("http url without tld shouldn't be decorated (1)", url,
+ "http://test",
+ "");
+
+ testRegex("http url without tld shouldn't be decorated (2)", url,
+ "http://test .com",
+ "");
}
template<> template<>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 3f32be1d68..a2211d7356 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -3849,6 +3849,7 @@ void LLAgent::startTeleportRequest()
}
if (hasPendingTeleportRequest())
{
+ mTeleportCanceled.reset();
if (!isMaturityPreferenceSyncedWithServer())
{
gTeleportDisplay = TRUE;
@@ -3878,6 +3879,7 @@ void LLAgent::startTeleportRequest()
void LLAgent::handleTeleportFinished()
{
clearTeleportRequest();
+ mTeleportCanceled.reset();
if (mIsMaturityRatingChangingDuringTeleport)
{
// notify user that the maturity preference has been changed
@@ -4021,13 +4023,25 @@ void LLAgent::teleportCancel()
msg->addUUIDFast(_PREHASH_AgentID, getID());
msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
sendReliableMessage();
- }
+ }
+ mTeleportCanceled = mTeleportRequest;
}
clearTeleportRequest();
gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
gPipeline.resetVertexBuffers();
}
+void LLAgent::restoreCanceledTeleportRequest()
+{
+ if (mTeleportCanceled != NULL)
+ {
+ gAgent.setTeleportState( LLAgent::TELEPORT_REQUESTED );
+ mTeleportRequest = mTeleportCanceled;
+ mTeleportCanceled.reset();
+ gTeleportDisplay = TRUE;
+ gTeleportDisplayTimer.reset();
+ }
+}
void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
{
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 4830cb754b..a8689dd5a6 100755
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -616,6 +616,7 @@ public:
void teleportViaLocation(const LLVector3d& pos_global); // To a global location - this will probably need to be deprecated
void teleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation
void teleportCancel(); // May or may not be allowed by server
+ void restoreCanceledTeleportRequest();
bool getTeleportKeepsLookAt() { return mbTeleportKeepsLookAt; } // Whether look-at reset after teleport
protected:
bool teleportCore(bool is_local = false); // Stuff for all teleports; returns true if the teleport can proceed
@@ -638,6 +639,7 @@ private:
friend class LLTeleportRequestViaLocationLookAt;
LLTeleportRequestPtr mTeleportRequest;
+ LLTeleportRequestPtr mTeleportCanceled;
boost::signals2::connection mTeleportFinishedSlot;
boost::signals2::connection mTeleportFailedSlot;
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 714b456ae7..d8b6cc729d 100755
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -567,13 +567,25 @@ void AISUpdate::parseCategory(const LLSD& category_map)
parseDescendentCount(category_id, category_map["_embedded"]);
}
- LLPointer<LLViewerInventoryCategory> new_cat(new LLViewerInventoryCategory(category_id));
+ LLPointer<LLViewerInventoryCategory> new_cat;
LLViewerInventoryCategory *curr_cat = gInventory.getCategory(category_id);
if (curr_cat)
{
// Default to current values where not provided.
- new_cat->copyViewerCategory(curr_cat);
- }
+ new_cat = new LLViewerInventoryCategory(curr_cat);
+ }
+ else
+ {
+ if (category_map.has("agent_id"))
+ {
+ new_cat = new LLViewerInventoryCategory(category_map["agent_id"].asUUID());
+ }
+ else
+ {
+ LL_DEBUGS() << "No owner provided, folder might be assigned wrong owner" << LL_ENDL;
+ new_cat = new LLViewerInventoryCategory(LLUUID::null);
+ }
+ }
BOOL rv = new_cat->unpackMessage(category_map);
// *NOTE: unpackMessage does not unpack version or descendent count.
//if (category_map.has("version"))
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 25a5df9781..932326acae 100755
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -182,38 +182,12 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
mSymbolPos(p.symbol_pos)
{
mPriority = LLViewerFetchedTexture::BOOST_ICON;
-
- LLRect rect = p.rect;
-
- // BottomRight is the default position
- S32 left = rect.getWidth() - mSymbolSize - mSymbolHpad;
- S32 bottom = mSymbolVpad;
- switch(mSymbolPos)
- {
- case LLAvatarIconCtrlEnums::BOTTOM_LEFT:
- {
- left = mSymbolHpad;
- bottom = mSymbolVpad;
- }
-
- case LLAvatarIconCtrlEnums::TOP_LEFT:
- {
- left = mSymbolHpad;
- bottom = rect.getHeight() - mSymbolSize - mSymbolVpad;
- }
-
- case LLAvatarIconCtrlEnums::TOP_RIGHT:
- {
- left = rect.getWidth() - mSymbolSize - mSymbolHpad;
- bottom = rect.getHeight() - mSymbolSize - mSymbolVpad;
- }
-
- case LLAvatarIconCtrlEnums::BOTTOM_RIGHT:
- // fallthrough, is default
- default:
- rect.setOriginAndSize(left, bottom, mSymbolSize, mSymbolSize);
- }
+ // don't request larger image then necessary to save gl memory,
+ // but ensure that quality is sufficient
+ LLRect rect = p.rect;
+ mMaxHeight = llmax((S32)p.min_height, rect.getHeight());
+ mMaxWidth = llmax((S32)p.min_width, rect.getWidth());
if (p.avatar_id.isProvided())
{
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index d6b86cd746..8d48ce69ea 100755
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -969,6 +969,7 @@ BOOL LLFavoritesBarCtrl::collectFavoriteItems(LLInventoryModel::item_array_t &it
{
LLFavoritesOrderStorage::instance().setSortIndex((*i), ++sortField);
}
+ LLFavoritesOrderStorage::instance().mSaveOnExit = true;
}
return TRUE;
@@ -1530,10 +1531,10 @@ void LLFavoritesOrderStorage::destroyClass()
{
file.close();
LLFile::remove(filename);
- if(mSaveOnExit)
- {
- LLFavoritesOrderStorage::instance().saveFavoritesRecord(true);
- }
+ }
+ if(mSaveOnExit)
+ {
+ LLFavoritesOrderStorage::instance().saveFavoritesRecord(true);
}
}
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 861dc88983..29bbf7d01e 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -610,7 +610,7 @@ void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata)
{
LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata;
- fp->mModelPreview->genLODs();
+ fp->mModelPreview->queryLODs();
}
void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
@@ -638,7 +638,12 @@ void LLFloaterModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
//-----------------------------------------------------------------------------
void LLFloaterModelPreview::draw()
{
- LLFloater::draw();
+ LLFloater::draw();
+
+ if (!mModelPreview)
+ {
+ return;
+ }
mModelPreview->update();
@@ -668,7 +673,7 @@ void LLFloaterModelPreview::draw()
childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost));
childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size()));
- if (mModelPreview)
+ if (mModelPreview->lodsReady())
{
gGL.color3f(1.f, 1.f, 1.f);
@@ -1178,6 +1183,7 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl
LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL)
+, mLodsQuery()
, mPelvisZOffset( 0.0f )
, mLegacyRigValid( false )
, mRigValidJointUpload( false )
@@ -2573,112 +2579,6 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
shader->bind();
}
}
-void LLModelPreview::genModelBBox()
-{
- LLVector3 min, max;
- min = this->mModelLoader->mExtents[0];
- max = this->mModelLoader->mExtents[1];
- std::vector<LLVector3> v_list;
- v_list.resize(4);
- std::map<U8, std::vector<LLVector3> > face_list;
-
- // Face 0
- v_list[0] = LLVector3(min.mV[VX], max.mV[VY], max.mV[VZ]);
- v_list[1] = LLVector3(min.mV[VX], min.mV[VY], max.mV[VZ]);
- v_list[2] = LLVector3(max.mV[VX], min.mV[VY], max.mV[VZ]);
- v_list[3] = LLVector3(max.mV[VX], max.mV[VY], max.mV[VZ]);
- face_list.insert(std::pair<U8, std::vector<LLVector3> >(0, v_list));
-
- // Face 1
- v_list[0] = LLVector3(max.mV[VX], min.mV[VY], max.mV[VZ]);
- v_list[1] = LLVector3(max.mV[VX], min.mV[VY], min.mV[VZ]);
- v_list[2] = LLVector3(max.mV[VX], max.mV[VY], min.mV[VZ]);
- v_list[3] = LLVector3(max.mV[VX], max.mV[VY], max.mV[VZ]);
- face_list.insert(std::pair<U8, std::vector<LLVector3> >(1, v_list));
-
- // Face 2
- v_list[0] = LLVector3(min.mV[VX], max.mV[VY], min.mV[VZ]);
- v_list[1] = LLVector3(min.mV[VX], max.mV[VY], max.mV[VZ]);
- v_list[2] = LLVector3(max.mV[VX], max.mV[VY], max.mV[VZ]);
- v_list[3] = LLVector3(max.mV[VX], max.mV[VY], min.mV[VZ]);
- face_list.insert(std::pair<U8, std::vector<LLVector3> >(2, v_list));
-
- // Face 3
- v_list[0] = LLVector3(min.mV[VX], max.mV[VY], max.mV[VZ]);
- v_list[1] = LLVector3(min.mV[VX], max.mV[VY], min.mV[VZ]);
- v_list[2] = LLVector3(min.mV[VX], min.mV[VY], min.mV[VZ]);
- v_list[3] = LLVector3(min.mV[VX], min.mV[VY], max.mV[VZ]);
- face_list.insert(std::pair<U8, std::vector<LLVector3> >(3, v_list));
-
- // Face 4
- v_list[0] = LLVector3(min.mV[VX], min.mV[VY], max.mV[VZ]);
- v_list[1] = LLVector3(min.mV[VX], min.mV[VY], min.mV[VZ]);
- v_list[2] = LLVector3(max.mV[VX], min.mV[VY], min.mV[VZ]);
- v_list[3] = LLVector3(max.mV[VX], min.mV[VY], max.mV[VZ]);
- face_list.insert(std::pair<U8, std::vector<LLVector3> >(4, v_list));
-
- // Face 5
- v_list[0] = LLVector3(min.mV[VX], min.mV[VY], min.mV[VZ]);
- v_list[1] = LLVector3(min.mV[VX], max.mV[VY], min.mV[VZ]);
- v_list[2] = LLVector3(max.mV[VX], max.mV[VY], min.mV[VZ]);
- v_list[3] = LLVector3(max.mV[VX], min.mV[VY], min.mV[VZ]);
- face_list.insert(std::pair<U8, std::vector<LLVector3> >(5, v_list));
-
- U16 Idx[] = { 0, 1, 2, 3, 0, 2, };
-
- U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0;
- LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);
- buff->allocateBuffer(4, 6, true);
-
- LLStrider<LLVector3> pos;
- LLStrider<U16> idx;
- LLStrider<LLVector3> norm;
- LLStrider<LLVector2> tc;
-
- buff->getVertexStrider(pos);
- buff->getIndexStrider(idx);
-
- buff->getNormalStrider(norm);
- buff->getTexCoord0Strider(tc);
-
- for (U32 i = 0; i < 6; ++i)
- {
- idx[i] = Idx[i];
- }
-
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
- LLModel* mdl = new LLModel(volume_params, 0.f);
- mdl->mLabel = "BBOX"; // please adopt name from high LOD (mBaseModel) or from original model otherwise it breaks search mechanics which is name based
-
- mdl->setNumVolumeFaces(6);
- for (U8 i = 0; i < 6; ++i)
- {
- for (U8 j = 0; j < 4; ++j)
- {
- pos[j] = face_list[i][j];
- }
-
- mdl->setVolumeFaceData(i, pos, norm, tc, idx, buff->getNumVerts(), buff->getNumIndices());
- }
-
- if (validate_model(mdl))
- {
- LLMatrix4 mat;
- std::map<std::string, LLImportMaterial> materials;
- std::vector<LLModelInstance> instance_list;
- instance_list.push_back(LLModelInstance(mdl, mdl->mLabel, mat, materials));
-
- for (S32 i = LLModel::LOD_HIGH - 1; i >= 0; i--)
- {
- mModel[i].clear();
- mModel[i].push_back(mdl);
-
- mScene[i].clear();
- mScene[i].insert(std::pair<LLMatrix4, std::vector<LLModelInstance> >(mat, instance_list));
- }
- }
-}
void LLModelPreview::updateStatusMessages()
{
@@ -3422,14 +3322,25 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
void LLModelPreview::update()
{
if (mGenLOD)
- {
- mGenLOD = false;
- genLODs();
- refresh();
- updateStatusMessages();
- }
+ {
+ bool subscribe_for_generation = mLodsQuery.empty();
+ mGenLOD = false;
+ mDirty = true;
+ mLodsQuery.clear();
+
+ for (S32 lod = LLModel::LOD_HIGH; lod >= 0; --lod)
+ {
+ // adding all lods into query for generation
+ mLodsQuery.push_back(lod);
+ }
- if (mDirty)
+ if (subscribe_for_generation)
+ {
+ doOnIdleRepeating(lodQueryCallback);
+ }
+ }
+
+ if (mDirty && mLodsQuery.empty())
{
mDirty = false;
mResourceCost = calcResourceCost();
@@ -4350,6 +4261,29 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture
}
}
+// static
+bool LLModelPreview::lodQueryCallback()
+{
+ // not the best solution, but model preview belongs to floater
+ // so it is an easy way to check that preview still exists.
+ LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance;
+ if (fmp && fmp->mModelPreview)
+ {
+ LLModelPreview* preview = fmp->mModelPreview;
+ if (preview->mLodsQuery.size() > 0)
+ {
+ S32 lod = preview->mLodsQuery.back();
+ preview->mLodsQuery.pop_back();
+ preview->genLODs(lod);
+
+ // return false to continue cycle
+ return false;
+ }
+ }
+ // nothing to process
+ return true;
+}
+
void LLModelPreview::onLODParamCommit(S32 lod, bool enforce_tri_limit)
{
if (!mLODFrozen)
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 07e29d09c7..b2bb15ef05 100755
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -261,8 +261,9 @@ public:
void clearModel(S32 lod);
void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);
void loadModelCallback(S32 lod);
+ bool lodsReady() { return !mGenLOD && mLodsQuery.empty(); }
+ void queryLODs() { mGenLOD = true; };
void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
- void genModelBBox(); // Generate just a model BBox if we can't generate proper LOD
void generateNormals();
void restoreNormals();
U32 calcResourceCost();
@@ -290,6 +291,7 @@ public:
void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
+ static bool lodQueryCallback();
boost::signals2::connection setDetailsCallback( const details_signal_t::slot_type& cb ){ return mDetailsSignal.connect(cb); }
boost::signals2::connection setModelLoadedCallback( const model_loaded_signal_t::slot_type& cb ){ return mModelLoadedSignal.connect(cb); }
@@ -303,6 +305,7 @@ public:
LLVector3 getTranslationForJointOffset( std::string joint );
static bool sIgnoreLoadedCallback;
+ std::vector<S32> mLodsQuery;
protected:
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 5d1e01c1f7..16566bea73 100755
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -2049,6 +2049,8 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
BOOL manager = (region && region->isEstateManager());
setCtrlsEnabled(god || owner || manager);
+ getChildView("apply_btn")->setEnabled(FALSE);
+
BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ? TRUE : FALSE;
BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ? TRUE : FALSE;
BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ? TRUE : FALSE;
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 307e259006..62cbea6401 100755
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -162,6 +162,7 @@ void LLInitialFriendCardsFetch::done()
// LLFriendCardsManager Constructor / Destructor
LLFriendCardsManager::LLFriendCardsManager()
+: mState(INIT)
{
LLAvatarTracker::instance().addObserver(this);
}
@@ -423,6 +424,7 @@ void LLFriendCardsManager::ensureFriendsFolderExists()
LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
if (friends_folder_ID.notNull())
{
+ mState = LOADING_FRIENDS_FOLDER;
fetchAndCheckFolderDescendents(friends_folder_ID,
boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this));
}
@@ -452,6 +454,7 @@ void LLFriendCardsManager::ensureFriendsAllFolderExists()
LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl();
if (friends_all_folder_ID.notNull())
{
+ mState = LOADING_ALL_FOLDER;
fetchAndCheckFolderDescendents(friends_all_folder_ID,
boost::bind(&LLFriendCardsManager::syncFriendsFolder, this));
}
@@ -506,6 +509,9 @@ void LLFriendCardsManager::syncFriendsFolder()
NULL);
}
+ // All folders created and updated.
+ mState = MANAGER_READY;
+
// 2. Add missing Friend Cards for friends
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
LL_INFOS() << "try to build friends, count: " << all_buddies.size() << LL_ENDL;
@@ -540,6 +546,12 @@ void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
<< ", id: " << avatarID
<< LL_ENDL;
+ if (shouldBeAdded && !isManagerReady())
+ {
+ shouldBeAdded = false;
+ LL_DEBUGS() << "Calling cards manager not ready, state: " << getManagerState() << LL_ENDL;
+ }
+
if (shouldBeAdded && findFriendCardInventoryUUIDImpl(avatarID).notNull())
{
shouldBeAdded = false;
@@ -583,13 +595,30 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask)
switch(changed_mask) {
case LLFriendObserver::ADD:
{
- const std::set<LLUUID>& changed_items = at.getChangedIDs();
- std::set<LLUUID>::const_iterator id_it = changed_items.begin();
- std::set<LLUUID>::const_iterator id_end = changed_items.end();
- for (;id_it != id_end; ++id_it)
- {
- LLFriendCardsManager::instance().addFriendCardToInventory(*id_it);
- }
+ LLFriendCardsManager& cards_manager = LLFriendCardsManager::instance();
+ if (cards_manager.isManagerReady())
+ {
+ // Try to add cards into inventory.
+ // If cards already exist they won't be created.
+ const std::set<LLUUID>& changed_items = at.getChangedIDs();
+ std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+ std::set<LLUUID>::const_iterator id_end = changed_items.end();
+ for (; id_it != id_end; ++id_it)
+ {
+ cards_manager.addFriendCardToInventory(*id_it);
+ }
+ }
+ else
+ {
+ // User either removed calling cards' folders and manager is loading them
+ // or update came too early, before viewer had chance to load all folders.
+ // Either way don't process 'add' operation - manager will recreate all
+ // cards after fetching folders.
+ LL_INFOS_ONCE() << "Calling cards manager not ready, state: "
+ << cards_manager.getManagerState()
+ << ", postponing update."
+ << LL_ENDL;
+ }
}
break;
case LLFriendObserver::REMOVE:
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index 48a9f70079..ae3800e17b 100755
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -45,6 +45,14 @@ class LLFriendCardsManager
public:
typedef std::map<LLUUID, uuid_vec_t > folderid_buddies_map_t;
+ enum EManagerState
+ {
+ INIT = 1,
+ LOADING_FRIENDS_FOLDER,
+ LOADING_ALL_FOLDER,
+ MANAGER_READY
+ };
+
// LLFriendObserver implementation
void changed(U32 mask)
{
@@ -71,7 +79,14 @@ public:
/**
* Checks is the specified category is a Friend folder or any its subfolder
*/
- bool isAnyFriendCategory(const LLUUID& catID) const;
+ bool isAnyFriendCategory(const LLUUID& catID) const;
+
+ /**
+ * Indicates that all calling card related folders are created or loaded
+ */
+ bool isManagerReady() const { return mState == MANAGER_READY; }
+
+ EManagerState getManagerState() const { return mState; }
/**
* Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category
@@ -144,6 +159,8 @@ private:
typedef std::set<LLUUID> avatar_uuid_set_t;
avatar_uuid_set_t mBuddyIDSet;
+ EManagerState mState;
+
};
#endif // LL_LLFRIENDCARD_H
diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp
index 6abf9ea637..1974a073dd 100755
--- a/indra/newview/llgroupiconctrl.cpp
+++ b/indra/newview/llgroupiconctrl.cpp
@@ -37,7 +37,10 @@ LLGroupIconCtrl::Params::Params()
: group_id("group_id"),
draw_tooltip("draw_tooltip", true),
default_icon_name("default_icon_name")
-{}
+{
+ changeDefault(min_width, 32);
+ changeDefault(min_height, 32);
+}
LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p)
@@ -48,6 +51,12 @@ LLGroupIconCtrl::LLGroupIconCtrl(const LLGroupIconCtrl::Params& p)
{
mPriority = LLViewerFetchedTexture::BOOST_ICON;
+ // don't request larger image then necessary to save gl memory,
+ // but ensure that quality is sufficient
+ LLRect rect = p.rect;
+ mMaxHeight = llmax((S32)p.min_height, rect.getHeight());
+ mMaxWidth = llmax((S32)p.min_width, rect.getWidth());
+
if (p.group_id.isProvided())
{
LLSD value(p.group_id);
diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp
index 76617b55bf..8e91af321e 100755
--- a/indra/newview/llinspectgroup.cpp
+++ b/indra/newview/llinspectgroup.cpp
@@ -42,16 +42,13 @@
#include "lltrans.h"
#include "lluictrl.h"
-class LLFetchGroupData;
-
-
//////////////////////////////////////////////////////////////////////////////
// LLInspectGroup
//////////////////////////////////////////////////////////////////////////////
/// Group Inspector, a small information window used when clicking
/// on group names in the 2D UI
-class LLInspectGroup : public LLInspect
+class LLInspectGroup : public LLInspect, public LLGroupMgrObserver
{
friend class LLFloaterReg;
@@ -65,12 +62,16 @@ public:
// (for example, inspector about same group but in different position)
/*virtual*/ void onOpen(const LLSD& group_id);
+ void setGroupID(const LLUUID& group_id);
+
// When closing they should close their gear menu
/*virtual*/ void onClose(bool app_quitting);
// Update view based on information from group manager
void processGroupData();
-
+
+ virtual void changed(LLGroupChange gc);
+
// Make network requests for all the data to display in this view.
// Used on construction and if avatar id changes.
void requestUpdate();
@@ -88,53 +89,12 @@ public:
private:
LLUUID mGroupID;
- // an in-flight network request for group properties
- // is represented by this object
- LLFetchGroupData* mPropertiesRequest;
};
-//////////////////////////////////////////////////////////////////////////////
-// LLFetchGroupData
-//////////////////////////////////////////////////////////////////////////////
-
-// This object represents a pending request for avatar properties information
-class LLFetchGroupData : public LLGroupMgrObserver
-{
-public:
- // If the inspector closes it will delete the pending request object, so the
- // inspector pointer will be valid for the lifetime of this object
- LLFetchGroupData(const LLUUID& group_id, LLInspectGroup* inspector)
- : LLGroupMgrObserver(group_id),
- mInspector(inspector)
- {
- LLGroupMgr* mgr = LLGroupMgr::getInstance();
- // register ourselves as an observer
- mgr->addObserver(this);
- // send a request
- mgr->sendGroupPropertiesRequest(group_id);
- }
-
- ~LLFetchGroupData()
- {
- // remove ourselves as an observer
- LLGroupMgr::getInstance()->removeObserver(this);
- }
-
- void changed(LLGroupChange gc)
- {
- if (gc == GC_PROPERTIES)
- {
- mInspector->processGroupData();
- }
- }
-
- LLInspectGroup* mInspector;
-};
LLInspectGroup::LLInspectGroup(const LLSD& sd)
: LLInspect( LLSD() ), // single_instance, doesn't really need key
- mGroupID(), // set in onOpen()
- mPropertiesRequest(NULL)
+ mGroupID() // set in onOpen()
{
mCommitCallbackRegistrar.add("InspectGroup.ViewProfile",
boost::bind(&LLInspectGroup::onClickViewProfile, this));
@@ -149,10 +109,7 @@ LLInspectGroup::LLInspectGroup(const LLSD& sd)
LLInspectGroup::~LLInspectGroup()
{
- // clean up any pending requests so they don't call back into a deleted
- // view
- delete mPropertiesRequest;
- mPropertiesRequest = NULL;
+ LLGroupMgr::getInstance()->removeObserver(this);
}
@@ -164,7 +121,7 @@ void LLInspectGroup::onOpen(const LLSD& data)
// start fade animation
LLInspect::onOpen(data);
- mGroupID = data["group_id"];
+ setGroupID(data["group_id"]);
// Position the inspector relative to the mouse cursor
// Similar to how tooltips are positioned
@@ -185,7 +142,8 @@ void LLInspectGroup::onOpen(const LLSD& data)
// virtual
void LLInspectGroup::onClose(bool app_quitting)
{
- // *TODO: If we add a gear menu, close it here
+ LLGroupMgr::getInstance()->removeObserver(this);
+ // *TODO: If we add a gear menu, close it here
}
void LLInspectGroup::requestUpdate()
@@ -213,9 +171,15 @@ void LLInspectGroup::requestUpdate()
getChild<LLUICtrl>("leave_btn")->setVisible(false);
getChild<LLUICtrl>("join_btn")->setVisible(false);
- // Make a new request for properties
- delete mPropertiesRequest;
- mPropertiesRequest = new LLFetchGroupData(mGroupID, this);
+ LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
+ if (!gdatap || !gdatap->isGroupPropertiesDataComplete() )
+ {
+ LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mGroupID);
+ }
+ else
+ {
+ processGroupData();
+ }
// Name lookup will be faster out of cache, use that
gCacheName->getGroup(mGroupID,
@@ -223,6 +187,16 @@ void LLInspectGroup::requestUpdate()
this, _1, _2, _3));
}
+void LLInspectGroup::setGroupID(const LLUUID& group_id)
+{
+ LLGroupMgr::getInstance()->removeObserver(this);
+
+ mID = group_id;
+ mGroupID = group_id;
+
+ LLGroupMgr::getInstance()->addObserver(this);
+}
+
void LLInspectGroup::nameUpdatedCallback(
const LLUUID& id,
const std::string& name,
@@ -236,6 +210,14 @@ void LLInspectGroup::nameUpdatedCallback(
// Otherwise possibly a request for an older inspector, ignore it
}
+void LLInspectGroup::changed(LLGroupChange gc)
+{
+ if (gc == GC_PROPERTIES)
+ {
+ processGroupData();
+ }
+}
+
void LLInspectGroup::processGroupData()
{
LLGroupMgrGroupData* data =
@@ -288,10 +270,6 @@ void LLInspectGroup::processGroupData()
bool can_join = !is_member && data->mOpenEnrollment;
getChild<LLUICtrl>("join_btn")->setEnabled(can_join);
}
-
- // Delete the request object as it has been satisfied
- delete mPropertiesRequest;
- mPropertiesRequest = NULL;
}
void LLInspectGroup::onClickViewProfile()
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 0bad4702e0..e123a3e68a 100755
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -1075,7 +1075,7 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
else
{
// add this category
- LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat->getParentUUID());
+ LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat->getOwnerID());
new_cat->copyViewerCategory(cat);
addCategory(new_cat);
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 5510598ae7..fe75ab8e50 100755
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -345,7 +345,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow(
}
mAvatarNameCacheConnections.erase(it);
}
- mAvatarNameCacheConnections[id] = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, suffix, item->getHandle()));
+ mAvatarNameCacheConnections[id] = LLAvatarNameCache::get(id,boost::bind(&LLNameListCtrl::onAvatarNameCache,this, _1, _2, suffix, prefix, item->getHandle()));
if(mPendingLookupsRemaining <= 0)
{
@@ -418,6 +418,7 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
const LLAvatarName& av_name,
std::string suffix,
+ std::string prefix,
LLHandle<LLNameListItem> item)
{
avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(agent_id);
@@ -442,6 +443,11 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
name.append(suffix);
}
+ if (!prefix.empty())
+ {
+ name.insert(0, prefix);
+ }
+
LLNameListItem* list_item = item.get();
if (list_item && list_item->getUUID() == agent_id)
{
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 19ce3c7aed..677b49e667 100755
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -170,7 +170,7 @@ public:
/*virtual*/ void mouseOverHighlightNthItem( S32 index );
private:
void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);
- void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, LLHandle<LLNameListItem> item);
+ void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item);
private:
S32 mNameColumnIndex;
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 866cb8dbef..82ea8377de 100755
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -501,25 +501,22 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
}
else
{
- //looks like user try to invite offline friend
+ //looks like user try to invite offline avatar (or the avatar from the other region)
//for offline avatar_id gObjectList.findObject() will return null
//so we need to do this additional search in avatar tracker, see EXT-4732
- if (LLAvatarTracker::instance().isBuddy(agent_id))
+ LLAvatarName av_name;
+ if (!LLAvatarNameCache::get(agent_id, &av_name))
{
- LLAvatarName av_name;
- if (!LLAvatarNameCache::get(agent_id, &av_name))
- {
- // actually it should happen, just in case
- //LLAvatarNameCache::get(LLUUID(agent_id), boost::bind(&LLPanelGroupInvite::addUserCallback, this, _1, _2));
- // for this special case!
- //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
- // removed id will be added in callback
- agent_ids.erase(agent_ids.begin() + i);
- }
- else
- {
- names.push_back(av_name.getAccountName());
- }
+ // actually it should happen, just in case
+ //LLAvatarNameCache::get(LLUUID(agent_id), boost::bind(&LLPanelGroupInvite::addUserCallback, this, _1, _2));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(av_name.getAccountName());
}
}
}
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index f1f87e212d..c9f8683e0e 100755
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -713,7 +713,7 @@ void LLPanelVolume::onLightCancelTexture(const LLSD& data)
if (LightTextureCtrl)
{
- LightTextureCtrl->setImageAssetID(LLUUID::null);
+ LightTextureCtrl->setImageAssetID(mLightSavedTexture);
}
LLVOVolume *volobjp = (LLVOVolume *) mObject.get();
@@ -722,7 +722,16 @@ void LLPanelVolume::onLightCancelTexture(const LLSD& data)
// Cancel the light texture as requested
// NORSPEC-292
//
- volobjp->setLightTextureID(LLUUID::null);
+ bool is_spotlight = volobjp->isLightSpotlight();
+ volobjp->setLightTextureID(mLightSavedTexture); //updates spotlight
+
+ if (!is_spotlight && mLightSavedTexture.notNull())
+ {
+ LLVector3 spot_params = volobjp->getSpotLightParams();
+ getChild<LLUICtrl>("Light FOV")->setValue(spot_params.mV[0]);
+ getChild<LLUICtrl>("Light Focus")->setValue(spot_params.mV[1]);
+ getChild<LLUICtrl>("Light Ambiance")->setValue(spot_params.mV[2]);
+ }
}
}
@@ -821,7 +830,12 @@ void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )
self->getChild<LLUICtrl>("Light Ambiance")->setValue(spot_params.mV[2]);
}
else
- { //modifying existing params
+ { //modifying existing params, this time volobjp won't change params on its own.
+ if (volobjp->getLightTextureID() != id)
+ {
+ volobjp->setLightTextureID(id);
+ }
+
LLVector3 spot_params;
spot_params.mV[0] = (F32) self->getChild<LLUICtrl>("Light FOV")->getValue().asReal();
spot_params.mV[1] = (F32) self->getChild<LLUICtrl>("Light Focus")->getValue().asReal();
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 67832c5994..33847b7885 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -1961,7 +1961,8 @@ LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) :
mCloseAfterSave(FALSE),
mPendingUploads(0),
mIsModifiable(FALSE),
- mIsNew(false)
+ mIsNew(false),
+ mIsSaving(FALSE)
{
mFactoryMap["script ed panel"] = LLCallbackMap(LLLiveLSLEditor::createScriptEdPanel, this);
}
@@ -2002,6 +2003,8 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id,
LL_DEBUGS() << "LSL Bytecode saved" << LL_ENDL;
mScriptEd->mErrorList->setCommentText(LLTrans::getString("CompileSuccessful"));
mScriptEd->mErrorList->setCommentText(LLTrans::getString("SaveComplete"));
+ getChild<LLCheckBoxCtrl>("running")->set(is_script_running);
+ mIsSaving = FALSE;
closeIfNeeded();
}
@@ -2022,6 +2025,7 @@ void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors)
mScriptEd->mErrorList->addElement(row);
}
mScriptEd->selectFirstError();
+ mIsSaving = FALSE;
closeIfNeeded();
}
@@ -2249,12 +2253,12 @@ void LLLiveLSLEditor::draw()
if(object->permAnyOwner())
{
runningCheckbox->setLabel(getString("script_running"));
- runningCheckbox->setEnabled(TRUE);
+ runningCheckbox->setEnabled(!mIsSaving);
if(object->permAnyOwner())
{
runningCheckbox->setLabel(getString("script_running"));
- runningCheckbox->setEnabled(TRUE);
+ runningCheckbox->setEnabled(!mIsSaving);
}
else
{
@@ -2387,6 +2391,7 @@ void LLLiveLSLEditor::saveIfNeeded(bool sync /*= true*/)
getWindow()->incBusyCount();
mPendingUploads++;
BOOL is_running = getChild<LLCheckBoxCtrl>( "running")->get();
+ mIsSaving = TRUE;
if (!url.empty())
{
uploadAssetViaCaps(url, filename, mObjectUUID, mItemUUID, is_running, mScriptEd->getAssociatedExperience());
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 5f65be7383..d403214c22 100755
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -315,6 +315,8 @@ private:
// need to save both text and script, so need to decide when done
S32 mPendingUploads;
+ BOOL mIsSaving;
+
BOOL getIsModifiable() const { return mIsModifiable; } // Evaluated on load assert
LLCheckBoxCtrl* mMonoCheckbox;
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 6d94b178dd..ba2c37ce7c 100755
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -36,7 +36,7 @@
#include "llviewerwindow.h"
#include "llfloaterreg.h"
#include "lltrans.h"
-
+#include "llagent.h"
#include "lldockablefloater.h"
#include "llsyswellwindow.h"
#include "llfloaterimsession.h"
@@ -265,7 +265,11 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
if(!show_toast && !store_toast)
{
- LLNotificationPtr notification = LLNotifications::instance().find(p.notif_id);
+ if(gAgent.isDoNotDisturb())
+ {
+ return;
+ }
+ LLNotificationPtr notification = LLNotifications::instance().find(p.notif_id);
if (notification &&
(!notification->canLogToIM() || !notification->hasFormElements()))
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 7620046ee3..4f63df1ea2 100755
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1628,7 +1628,11 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {}
bool apply(LLViewerObject* objectp, S32 te)
{
- if (mItem)
+ if(objectp && !objectp->permModify())
+ {
+ return false;
+ }
+ if (mItem)
{
if (te == -1) // all faces
{
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 2548d730f0..403ca7bcbf 100755
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -380,6 +380,10 @@ void LLSidepanelTaskInfo::refresh()
mDACreatorName->setValue(creator_name);
mCreatorID = creator_id;
}
+ if(mDACreatorName->getValue().asString() == LLStringUtil::null)
+ {
+ mDACreatorName->setValue(creator_name);
+ }
mDACreatorName->setEnabled(TRUE);
// Update owner text field
@@ -415,6 +419,11 @@ void LLSidepanelTaskInfo::refresh()
mDAOwnerName->setValue(owner_name);
mOwnerID = owner_id;
}
+ if(mDAOwnerName->getValue().asString() == LLStringUtil::null)
+ {
+ mDAOwnerName->setValue(owner_name);
+ }
+
getChildView("Owner Name")->setEnabled(TRUE);
// update group text field
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d96f09b880..0db3297550 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -86,7 +86,8 @@ LLToolPie::LLToolPie()
mBlockClickToWalk(false),
mClickAction(0),
mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
- mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
+ mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ),
+ mDoubleClickTimer()
{
}
@@ -102,7 +103,12 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
{
- mMouseOutsideSlop = FALSE;
+ if (mDoubleClickTimer.getStarted())
+ {
+ mDoubleClickTimer.stop();
+ }
+
+ mMouseOutsideSlop = FALSE;
mMouseDownX = x;
mMouseDownY = y;
@@ -644,7 +650,15 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
{
- LLViewerObject* obj = mPick.getObject();
+ if (!mDoubleClickTimer.getStarted())
+ {
+ mDoubleClickTimer.start();
+ }
+ else
+ {
+ mDoubleClickTimer.reset();
+ }
+ LLViewerObject* obj = mPick.getObject();
U8 click_action = final_click_action(obj);
// let media have first pass at click
@@ -738,10 +752,17 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
LL_INFOS() << "LLToolPie handleDoubleClick (becoming mouseDown)" << LL_ENDL;
}
- if (handleMediaDblClick(mPick))
- {
- return TRUE;
- }
+ if (handleMediaDblClick(mPick))
+ {
+ return TRUE;
+ }
+
+ if (!mDoubleClickTimer.getStarted() || (mDoubleClickTimer.getElapsedTimeF32() > 0.3f))
+ {
+ mDoubleClickTimer.stop();
+ return FALSE;
+ }
+ mDoubleClickTimer.stop();
if (gSavedSettings.getBOOL("DoubleClickAutoPilot"))
{
@@ -754,6 +775,15 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
FALSE /* ignore transparent */,
FALSE /* ignore particles */);
+ if(mPick.mPickType == LLPickInfo::PICK_OBJECT)
+ {
+ if (mPick.getObject() && mPick.getObject()->isHUDAttachment())
+ {
+ mPick = savedPick;
+ return FALSE;
+ }
+ }
+
if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) ||
(mPick.mObjectID.notNull() && !mPick.mPosGlobal.isExactlyZero()))
{
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index c4a2f4a35b..6391e675c5 100755
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -119,6 +119,7 @@ private:
LLSafeHandle<LLObjectSelection> mLeftClickSelection;
BOOL mClickActionBuyEnabled;
BOOL mClickActionPayEnabled;
+ LLFrameTimer mDoubleClickTimer;
};
#endif
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 6ba10373b9..f3d0369da6 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3061,6 +3061,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
send_do_not_disturb_message(msg, from_id);
}
+ else if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL))
+ {
+ return;
+ }
else
{
LLVector3 pos, look_at;
@@ -3992,6 +3996,13 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL;
return;
}
+
+ if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
+ {
+ // Server either ignored teleport cancel message or did not receive it in time.
+ // This message can't be ignored since teleport is complete at server side
+ gAgent.restoreCanceledTeleportRequest();
+ }
// Teleport is finished; it can't be cancelled now.
gViewerWindow->setProgressCancelButtonVisible(FALSE);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index a957367f61..c8c71b74b7 100755
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -97,6 +97,7 @@ S32 LLViewerTexture::sMaxSculptRez = 128; //max sculpt image size
const S32 MAX_CACHED_RAW_IMAGE_AREA = 64 * 64;
const S32 MAX_CACHED_RAW_SCULPT_IMAGE_AREA = LLViewerTexture::sMaxSculptRez * LLViewerTexture::sMaxSculptRez;
const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128;
+const S32 DEFAULT_ICON_DIMENTIONS = 32;
S32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256.
S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA;
BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE;
@@ -1178,6 +1179,17 @@ void LLViewerFetchedTexture::loadFromFastCache()
}
else
{
+ if (mBoostLevel == LLGLTexture::BOOST_ICON)
+ {
+ S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS;
+ S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS;
+ if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
+ {
+ // scale oversized icon, no need to give more work to gl
+ mRawImage->scale(expected_width, expected_height);
+ }
+ }
+
mRequestedDiscardLevel = mDesiredDiscardLevel + 1;
mIsRawImageValid = TRUE;
addToCreateTexture();
@@ -1506,6 +1518,17 @@ void LLViewerFetchedTexture::processTextureStats()
{
mDesiredDiscardLevel = 0;
}
+ else if (mDontDiscard && mBoostLevel == LLGLTexture::BOOST_ICON)
+ {
+ if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+ {
+ mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+ }
+ else
+ {
+ mDesiredDiscardLevel = 0;
+ }
+ }
else if(!mFullWidth || !mFullHeight)
{
mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel);
@@ -1936,6 +1959,17 @@ bool LLViewerFetchedTexture::updateFetch()
addToCreateTexture();
}
+ if (mBoostLevel == LLGLTexture::BOOST_ICON)
+ {
+ S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS;
+ S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS;
+ if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
+ {
+ // scale oversized icon, no need to give more work to gl
+ mRawImage->scale(expected_width, expected_height);
+ }
+ }
+
return TRUE;
}
else
@@ -2670,7 +2704,7 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)
{
- if(mSavedRawDiscardLevel != discard_level)
+ if (mSavedRawDiscardLevel != discard_level && mBoostLevel != BOOST_ICON)
{
mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents());
mRawImage->copy(getSavedRawImage());
@@ -2771,8 +2805,25 @@ void LLViewerFetchedTexture::switchToCachedImage()
void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
{
if(imageraw != mRawImage.get())
- {
- mCachedRawImage = imageraw;
+ {
+ if (mBoostLevel == LLGLTexture::BOOST_ICON)
+ {
+ S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS;
+ S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS;
+ if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
+ {
+ mCachedRawImage = new LLImageRaw(expected_width, expected_height, imageraw->getComponents());
+ mCachedRawImage->copyScaled(imageraw);
+ }
+ else
+ {
+ mCachedRawImage = imageraw;
+ }
+ }
+ else
+ {
+ mCachedRawImage = imageraw;
+ }
mCachedRawDiscardLevel = discard_level;
mCachedRawImageReady = TRUE;
}
@@ -2862,7 +2913,24 @@ void LLViewerFetchedTexture::saveRawImage()
}
mSavedRawDiscardLevel = mRawDiscardLevel;
- mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents());
+ if (mBoostLevel == LLGLTexture::BOOST_ICON)
+ {
+ S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS;
+ S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS;
+ if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height)
+ {
+ mSavedRawImage = new LLImageRaw(expected_width, expected_height, mRawImage->getComponents());
+ mSavedRawImage->copyScaled(mRawImage);
+ }
+ else
+ {
+ mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents());
+ }
+ }
+ else
+ {
+ mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents());
+ }
if(mForceToSaveRawImage && mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel)
{
diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp
index 7b5bcf4db0..2782cd9545 100755
--- a/indra/newview/llwatchdog.cpp
+++ b/indra/newview/llwatchdog.cpp
@@ -124,11 +124,17 @@ void LLWatchdogTimeout::setTimeout(F32 d)
void LLWatchdogTimeout::start(const std::string& state)
{
- // Order of operation is very impmortant here.
+ if (mTimeout == 0)
+ {
+ LL_WARNS() << "Cant' start watchdog entry - no timeout set" << LL_ENDL;
+ return;
+ }
+ // Order of operation is very important here.
// After LLWatchdogEntry::start() is called
// LLWatchdogTimeout::isAlive() will be called asynchronously.
ping(state);
- mTimer.start();
+ mTimer.start();
+ mTimer.setTimerExpirySec(mTimeout); // timer expiration set to 0 by start()
LLWatchdogEntry::start();
}
@@ -235,7 +241,6 @@ void LLWatchdog::run()
mSuspects.end(),
std::not1(std::mem_fun(&LLWatchdogEntry::isAlive))
);
-
if(result != mSuspects.end())
{
// error!!!
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 5d657f7eef..11d3706821 100755
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -1281,7 +1281,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
{
LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
- if (!pVOAvatar->isDead() && !pVOAvatar->mIsDummy)
+ if (!pVOAvatar->isDead() && !pVOAvatar->mIsDummy && !pVOAvatar->isOrphaned())
{
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
LLUUID uuid = pVOAvatar->getID();
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 3c58ce0c09..771881c44a 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6111,6 +6111,13 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
{
const Light* light = &(*iter);
LLDrawable* drawable = light->drawable;
+ const LLViewerObject *vobj = light->drawable->getVObj();
+ if(vobj && vobj->getAvatar() && vobj->getAvatar()->isInMuteList())
+ {
+ drawable->clearState(LLDrawable::NEARBY_LIGHT);
+ continue;
+ }
+
LLVOVolume* volight = drawable->getVOVolume();
if (!volight || !drawable->isState(LLDrawable::LIGHT))
{
diff --git a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml
index c17d2a1f37..b5ae9db7e9 100644
--- a/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml
+++ b/indra/newview/skins/default/xui/en/floater_notifications_tabbed.xml
@@ -136,16 +136,16 @@
</tab_container>
<layout_stack width="336" height="26" enabled="true" orientation="horizontal" follows="left|right" name="ButtonsStack">
- <layout_panel width="336" height="30" enabled="true" name="CondenseAllButtonPanel">
+ <layout_panel width="93" height="30" enabled="true" name="CondenseAllButtonPanel">
<button width="93" height="21" left="2" label="Collapse all" name="collapse_all_button">
</button>
</layout_panel>
- <layout_panel width="336" height="30" enabled="true" name="GapLayoutPanel">
+ <layout_panel width="93" height="30" enabled="true" name="GapLayoutPanel">
<panel width="90" height="21" left="2" label="Gap Panel" border="false" name="GapPanel">
</panel>
</layout_panel>
- <layout_panel width="336" height="30" enabled="true" name="DeleteAllButtonPanel">
- <button width="93" height="21" left="2" label="Delete all" name="delete_all_button">
+ <layout_panel width="100" height="30" enabled="true" name="DeleteAllButtonPanel">
+ <button width="93" height="21" left="0" label="Delete all" follows="right" name="delete_all_button">
</button>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index ebbb53729d..170b7177fb 100755
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -14,6 +14,7 @@
<file>ヒラギノ角ゴ ProN W3.otf</file>
<file>AppleGothic.dfont</file>
<file>AppleGothic.ttf</file>
+ <file>AppleSDGothicNeo-Regular.otf</file>
<file>华文细黑.ttf</file>
</os>
</font>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 10907344ae..79493d3885 100755
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -353,10 +353,10 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
- <text name="allow_label5">
+ <text name="allow_label5" top="170">
Los avatares de otras parcelas pueden ver a los avatares de esta parcela y chatear con ellos
</text>
- <check_box label="Ver los avatares" name="SeeAvatarsCheck" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
+ <check_box label="Ver los avatares" name="SeeAvatarsCheck" top="170" tool_tip="Permite que los avatares de otras parcelas vean a los avatares de ésta y chateen con ellos, y también que tú puedas verles y chatear con ellos."/>
<text name="landing_point">
Punto de llegada: [LANDING]
</text>