diff --git a/README_BUILD_FIRESTORM_LINUX.txt b/README_BUILD_FIRESTORM_LINUX.txt
index 8b1eec1314..29d7a3220f 100755
--- a/README_BUILD_FIRESTORM_LINUX.txt
+++ b/README_BUILD_FIRESTORM_LINUX.txt
@@ -1,4 +1,4 @@
-First, make sure gcc-4.7 and g++-4.7 are installed.
+First, make sure gcc-4.9 and g++-4.9 are installed.
Ensure you can build a stock viewer-development try as described in the SL wiki. Before asking for any help
compiling Firestorm, make sure you can build viewer-development first. If you try and skip this step, you may
@@ -15,16 +15,16 @@ mailing list. We've created a non-KDU build target to make this easier. Everywhe
"ReleaseFS_open" instead. This will perform the same build, using openjpeg instead of KDU.
Available premade firestorm-specific build targets:
- ReleaseFS (includes KDU, FMODEX)
- ReleaseFS_open (no KDU, no FMODEX)
- RelWithDebInfoFS_open (no KDU, no FMODEX)
+ ReleaseFS (includes KDU, FMODSTUDIO)
+ ReleaseFS_open (no KDU, no FMODSTUDIO)
+ RelWithDebInfoFS_open (no KDU, no FMODSTUDIO)
To build firestorm:
autobuild build -A64 -c ReleaseFS
Other examples:
- autobuild configure -A64 -c ReleaseFS # basic configuration step, don't build, just configure
- autobuild configure -A64 -c ReleaseFS -- --clean # clean the output area first, then configure
+ autobuild configure -A64 -c ReleaseFS # basic configuration step, don't build, just configure
+ autobuild configure -A64 -c ReleaseFS -- --clean # clean the output area first, then configure
autobuild configure -A64 -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel
autobuild build -A64 -c ReleaseFS --no-configure # default quick rebuild
diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp
index f53fe21f85..2bfaf0ddbe 100644
--- a/indra/llappearance/lltexlayer.cpp
+++ b/indra/llappearance/lltexlayer.cpp
@@ -44,6 +44,7 @@
#include "llvertexbuffer.h"
#include "llviewervisualparam.h"
#include "llfasttimer.h"
+#include "llrendertarget.h" // For copyContents
//#include "../tools/imdebug/imdebug.h"
@@ -1577,14 +1578,19 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
}
alpha_data = new U8[width * height];
mAlphaCache[cache_index] = alpha_data;
-
+
// nSight doesn't support use of glReadPixels
if (!LLRender::sNsightDebugSupport)
{
// Format GL_ALPHA is invalid for glReadPixels
//glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
+
U8* alpha_buffer = new U8[width * height * 4];
- glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_buffer);
+ if (!LLRenderTarget::getCurrentBoundTarget())
+ glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_buffer);
+ else
+ LLRenderTarget::getCurrentBoundTarget()->copyContents(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, alpha_buffer);
+
for (S32 i = 0; i < width * height; ++i)
{
alpha_data[i] = alpha_buffer[i * 4 + 3];
diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp
index db34ffc19e..9000e1b99a 100644
--- a/indra/llaudio/llaudioengine_fmodex.cpp
+++ b/indra/llaudio/llaudioengine_fmodex.cpp
@@ -75,14 +75,16 @@ void set_device(FMOD::System* system, const LLUUID& device_uuid)
for (int i = 0; i < drivercount; ++i)
{
- system->getDriverInfo(i, NULL, 0, &guid);
- LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
-
- if (driver_guid == device_uuid)
+ if (!Check_FMOD_Error(system->getDriverInfo(i, NULL, 0, &guid), "FMOD::System::getDriverInfo"))
{
- LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL;
- Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver");
- return;
+ LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
+
+ if (driver_guid == device_uuid)
+ {
+ LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL;
+ Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver");
+ return;
+ }
}
}
@@ -423,12 +425,14 @@ LLAudioEngine_FMODEX::output_device_map_t LLAudioEngine_FMODEX::getDevices()
{
for (int i = 0; i < drivercount; ++i)
{
- memset(r_name, 0, 512);
- mSystem->getDriverInfo(i, r_name, 511, &guid);
- LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
- driver_map.insert(std::make_pair(driver_guid, r_name));
+ memset(r_name, 0, sizeof(r_name));
+ if (!Check_FMOD_Error(mSystem->getDriverInfo(i, r_name, 511, &guid), "FMOD::System::getDriverInfo"))
+ {
+ LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
+ driver_map.insert(std::make_pair(driver_guid, r_name));
- LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL;
+ LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL;
+ }
}
}
diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp
index 2bd17d8d6a..48203b0371 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.cpp
+++ b/indra/llaudio/llaudioengine_fmodstudio.cpp
@@ -95,14 +95,16 @@ void set_device(FMOD::System* system, const LLUUID& device_uuid)
for (int i = 0; i < drivercount; ++i)
{
- system->getDriverInfo(i, NULL, 0, &guid, &r_samplerate, NULL, &r_channels);
- LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
-
- if (driver_guid == device_uuid)
+ if (!Check_FMOD_Error(system->getDriverInfo(i, NULL, 0, &guid, &r_samplerate, NULL, &r_channels), "FMOD::System::getDriverInfo"))
{
- LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL;
- Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver");
- return;
+ LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
+
+ if (driver_guid == device_uuid)
+ {
+ LL_INFOS() << "Setting driver " << i << ": " << driver_guid << LL_ENDL;
+ Check_FMOD_Error(system->setDriver(i), "FMOD::System::setDriver");
+ return;
+ }
}
}
@@ -353,12 +355,14 @@ LLAudioEngine_FMODSTUDIO::output_device_map_t LLAudioEngine_FMODSTUDIO::getDevic
{
for (int i = 0; i < drivercount; ++i)
{
- memset(r_name, 0, 512);
- mSystem->getDriverInfo(i, r_name, 511, &guid, &r_samplerate, NULL, &r_channels);
- LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
- driver_map.insert(std::make_pair(driver_guid, r_name));
+ memset(r_name, 0, sizeof(r_name));
+ if (!Check_FMOD_Error(mSystem->getDriverInfo(i, r_name, 511, &guid, &r_samplerate, NULL, &r_channels), "FMOD::System::getDriverInfo"))
+ {
+ LLUUID driver_guid = FMOD_GUID_to_LLUUID(guid);
+ driver_map.insert(std::make_pair(driver_guid, r_name));
- LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL;
+ LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::getDevices(): r_name=\"" << r_name << "\" - guid: " << driver_guid << LL_ENDL;
+ }
}
}
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 9fb4f7f2b0..86bd22f521 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -656,5 +656,133 @@ void LLRenderTarget::getViewport(S32* viewport)
viewport[3] = mResY;
}
+// Determine version of intel driver. We know anything >= 24 is problematic with glReadPixels
+#if LL_WINDOWS && ADDRESS_SIZE == 64
+U32 getIntelDriverVersionMajor()
+{
+ if (!gGLManager.mIsIntel)
+ return 0;
+ std::string strVersion = gGLManager.mDriverVersionVendorString;
+ auto i = strVersion.find("Build ");
+ if (i != std::string::npos)
+ {
+ i += sizeof("Build");
+ while (isspace(strVersion[i]) && strVersion[i])
+ ++i;
+ auto start = i;
+ while (strVersion[i] != '.' && strVersion[i])
+ i++;
+ if( strVersion[i] )
+ {
+ std::string strMajor(strVersion.begin() + start, strVersion.begin() + i);
+ U32 version = 0;
+ if (LLStringUtil::convertToU32(strMajor, version))
+ return version;
+ }
+ }
+
+ return 0;
+}
+#endif
+//ND>
+// Copy the contents of this FBO into memory
+void LLRenderTarget::copyContents(S32 x, S32 y, S32 w, S32 h, U32 format, U32 type, U8 *buffer)
+{
+#if LL_WINDOWS && ADDRESS_SIZE == 64
+ // If not Intel or driver < 24.*, be done with it
+ if (!gGLManager.mIsIntel || getIntelDriverVersionMajor() < 24)
+ {
+ glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer);
+ return;
+ }
+
+ std::vector< GLenum > vErrors;
+
+ // BUG-225655/FIRE-24049 some drivers (Intel 64 bit >= 24.* are behaving buggy when glReadPixels is called
+ if (mFBO)
+ {
+ // When a FBO is bound unbind/rebind it.
+ vErrors.push_back(glGetError());
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ vErrors.push_back(glGetError());
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ vErrors.push_back(glGetError());
+
+ glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer);
+ vErrors.push_back(glGetError());
+ }
+ else
+ {
+ llassert_always(type == GL_UNSIGNED_BYTE);
+ llassert_always(format == GL_RGBA || format == GL_ALPHA);
+
+ if (mUsage != LLTexUnit::TT_TEXTURE && mUsage != LLTexUnit::TT_RECT_TEXTURE )
+ {
+ LL_WARNS() << "Expected type TT_TEXTURE or TT_RECT_TEXTURE got 0x" << std::setw(8) << std::setfill('0') << std::hex << LLTexUnit::getInternalType(mUsage) <<
+ " internal type 0x" << std::setw(8) << std::setfill('0') << std::hex << mUsage << LL_ENDL;
+ }
+
+ // When using no FBO and avoid glReadPixels altogether, instead bind the texture and call glGetTexImage
+ vErrors.push_back(glGetError());
+ flush();
+ vErrors.push_back(glGetError());
+ gGL.getTexUnit(0)->bind(this);
+ vErrors.push_back(glGetError());
+
+ std::string sBuffer(mResX*mResY * 4, 0);
+
+ // Would be nice if GL_ALPHA would be allowed for glGetTexImage
+ glGetTexImage(LLTexUnit::getInternalType(mUsage), 0, GL_RGBA, GL_UNSIGNED_BYTE, &sBuffer[0]);
+ vErrors.push_back(glGetError());
+
+ // Now copy out the data.
+ // n.b. in case of:
+ // format == GL_RGBA && x == 0 ** y == 0 and w == mResX && h == mResY
+ // would could safe all this and glGetTexImage right into buffer
+ U8 const *pBuffer = reinterpret_cast(sBuffer.c_str());
+ pBuffer += (y * mResX * 4); // Adjust to skip to requested y coord
+ pBuffer += x * 4; // Skip to requested x coord
+
+ if (format == GL_RGBA)
+ {
+ for (S32 i = y; i < h; ++i)
+ {
+ std::memcpy(buffer, pBuffer, w * 4);
+ pBuffer += mResX * 4; // Skip one full row, row is already x adjusted
+ buffer += w * 4;
+ }
+ }
+ else if (format == GL_ALPHA)
+ {
+ for (S32 i = y; i < h; ++i)
+ {
+ for (S32 j = 0; j < w; ++j)
+ {
+ *buffer = pBuffer[3];
+ ++buffer;
+ pBuffer += 4;
+ }
+ pBuffer += (mResX - w) * 4; // Skip to end of row
+ pBuffer += x * 4; // Skip to requested x coordinate again
+ }
+ }
+ gGL.getTexUnit(0)->disable();
+ vErrors.push_back(glGetError());
+ }
+
+ std::stringstream strm;
+ for (GLenum err : vErrors )
+ strm << "0x" << std::hex << (U32)err << " ";
+
+ if (vErrors.end() != std::find_if(vErrors.begin(), vErrors.end(), [](GLenum err){return err != GL_NO_ERROR; }))
+ {
+ LL_WARNS() << "GL error occured: " << strm.str() << LL_ENDL;
+ }
+#else
+ // Every other OS just gets glReadPixels
+ glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer);
+#endif
+}
+//
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 6c07ac5b1c..8453e54552 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -160,6 +160,10 @@ protected:
LLTexUnit::eTextureType mUsage;
static LLRenderTarget* sBoundTarget;
+ // Copy the contents of this FBO into memory
+public:
+ void copyContents(S32 x, S32 y, S32 w, S32 h, U32 format, U32 type, U8 *buffer);
+ //
};
#endif
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index b6ddeda7a8..6039cf19e1 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -524,9 +524,9 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const
//
LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL()
{
- mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com)"
+ mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com)"
"|"
- "(https://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?))"
+ "(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?))"
"\\/\\S*",
boost::regex::perl|boost::regex::icase);
@@ -568,7 +568,7 @@ std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const
//
LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL()
{
- mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(?!\\S)",
+ mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(?!\\S)",
boost::regex::perl|boost::regex::icase);
mIcon = "Hand";
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13a732f752..0c6c7b5507 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1732,7 +1732,11 @@ if (LINUX)
set_source_files_properties(
llappviewerlinux.cpp
PROPERTIES
- COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}"
+# The next line causes a full rebuild of the entire newview
+# directory every time the Mercurial revision number changes.
+# Instead of doing that, we use the configure tool to build
+# fsversionstrings.h with the right numbers in it.
+# COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}"
)
LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp)
# [FS] Growl support
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 19b860c187..a6534bb333 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.0
+6.2.5
diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp
index a13f40f103..8646b4f165 100644
--- a/indra/newview/aoengine.cpp
+++ b/indra/newview/aoengine.cpp
@@ -81,6 +81,7 @@ AOEngine::~AOEngine()
void AOEngine::init()
{
BOOL do_enable = gSavedPerAccountSettings.getBOOL("UseAO");
+ BOOL do_enable_stands = gSavedPerAccountSettings.getBOOL("UseAOStands");
if (do_enable)
{
// enable_stands() calls enable(), but we need to set the
@@ -91,6 +92,7 @@ void AOEngine::init()
}
else
{
+ enable_stands(do_enable_stands);
enable(FALSE);
}
}
@@ -189,15 +191,37 @@ void AOEngine::setLastOverriddenMotion(const LLUUID& motion)
BOOL AOEngine::foreignAnimations(const LLUUID& seat)
{
+ LL_DEBUGS("AOEngine") << "Checking for foreign animation on seat " << seat << LL_ENDL;
+
for (LLVOAvatar::AnimSourceIterator sourceIterator = gAgentAvatarp->mAnimationSources.begin();
sourceIterator != gAgentAvatarp->mAnimationSources.end(); ++sourceIterator)
{
+ LL_DEBUGS("AOEngine") << "Source " << sourceIterator->first << " runs animation " << sourceIterator->second << LL_ENDL;
+
if (sourceIterator->first != gAgentID)
{
- if (seat.isNull() || sourceIterator->first == seat)
+ // special case when the AO gets disabled while sitting
+ if (seat.isNull())
{
return TRUE;
}
+
+ // find the source object where the animation came from
+ LLViewerObject* source=gObjectList.findObject(sourceIterator->first);
+
+ // proceed if it's not an attachment
+ if(!source->isAttachment())
+ {
+ // get the source's root prim
+ LLViewerObject* sourceRoot=dynamic_cast(source->getRoot());
+
+ // if the root prim is the same as the animation source, report back as TRUE
+ if (sourceRoot && source->getID() == seat)
+ {
+ LL_DEBUGS("AOEngine") << "foreign animation " << sourceIterator->second << " found on seat." << LL_ENDL;
+ return TRUE;
+ }
+ }
}
}
return FALSE;
@@ -598,10 +622,6 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start)
{
stopAllSitVariants();
}
-
- LL_DEBUGS("AOEngine") << "stopping cycle timer for motion " << gAnimLibrary.animationName(motion) <<
- " using animation " << animation <<
- " in state " << state->mName << LL_ENDL;
}
return animation;
@@ -1626,6 +1646,17 @@ void AOEngine::setSmart(AOSet* set, BOOL yes)
{
set->setSmart(yes);
set->setDirty(TRUE);
+
+ if (yes)
+ {
+ // make sure to restart the sit cancel timer to fix sit overrides when the object we are
+ // sitting on is playing its own animation
+ const LLViewerObject* agentRoot = dynamic_cast(gAgentAvatarp->getRoot());
+ if (agentRoot && agentRoot->getID() != gAgentID)
+ {
+ mSitCancelTimer.oneShot();
+ }
+ }
}
void AOEngine::setDisableStands(AOSet* set, BOOL yes)
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 28a6480d54..047d8fc78d 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -625,6 +625,14 @@
is_running_function="Floater.IsOpen"
is_running_parameters="beacons"
/>
+
Value
1
- FSSupportGroupChatPrefix2
+ FSSupportGroupChatPrefix3
diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp
index 288292860e..eb8a9aaebb 100644
--- a/indra/newview/fsfloaterim.cpp
+++ b/indra/newview/fsfloaterim.cpp
@@ -386,7 +386,7 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
utf8_text = FSCommon::applyMuPose(utf8_text);
// Support group chat prefix
- static LLCachedControl chat_prefix_support(gSavedSettings, "FSSupportGroupChatPrefix2");
+ static LLCachedControl chat_prefix_support(gSavedSettings, "FSSupportGroupChatPrefix3");
static LLCachedControl chat_prefix_testing(gSavedSettings, "FSSupportGroupChatPrefixTesting");
if ((chat_prefix_support || chat_prefix_testing) && FSData::getInstance()->isFirestormGroup(mSessionID))
{
@@ -427,9 +427,8 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
#endif
//RLV check
- static LLCachedControl chat_prefix_rlv(gSavedSettings, "RestrainedLove");
std::string str_rlv_enabled = "";
- if(chat_prefix_rlv)
+ if(RlvHandler::isEnabled())
str_rlv_enabled = "*";
@@ -917,20 +916,23 @@ BOOL FSFloaterIM::postBuild()
getChild("send_chat")->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL));
bool isFSSupportGroup = FSData::getInstance()->isFirestormGroup(mSessionID);
-
- childSetVisible("testing_panel", FSData::getInstance()->isTestingGroup(mSessionID));
- childSetVisible("support_panel", isFSSupportGroup);
+ bool isFSTestingGroup = FSData::getInstance()->isTestingGroup(mSessionID);
+
+ //We can show the testing group button simply by checking testing group
+ childSetVisible("testing_panel", isFSTestingGroup);
+ //But we cannot with the support group button, because testing groups are also support groups
+ childSetVisible("support_panel", isFSSupportGroup && !isFSTestingGroup);
// Viewer version popup
- if (isFSSupportGroup)
+ if (isFSSupportGroup || isFSTestingGroup)
{
// check if the dialog was set to ignore
- LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate("FirstJoinSupportGroup");
+ LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate("FirstJoinSupportGroup2");
if (!templatep.get()->mForm->getIgnored())
{
// if not, give the user a choice, whether to enable the version prefix or not
LLSD args;
- LLNotificationsUtil::add("FirstJoinSupportGroup", args, LLSD(),boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2));
+ LLNotificationsUtil::add("FirstJoinSupportGroup2", args, LLSD(),boost::bind(&FSFloaterIM::enableViewerVersionCallback, this, _1, _2));
}
}
// Viewer version popup
@@ -2181,7 +2183,8 @@ BOOL FSFloaterIM::enableViewerVersionCallback(const LLSD& notification,const LLS
result=TRUE;
}
- gSavedSettings.setBOOL("FSSupportGroupChatPrefix2",result);
+ gSavedSettings.setBOOL("FSSupportGroupChatPrefix3",result);
+ gSavedSettings.setBOOL("FSSupportGroupChatPrefixTesting",result);
return result;
}
//
diff --git a/indra/newview/fspanelprofile.cpp b/indra/newview/fspanelprofile.cpp
index b9f69adec7..f74e2f8e45 100644
--- a/indra/newview/fspanelprofile.cpp
+++ b/indra/newview/fspanelprofile.cpp
@@ -476,6 +476,12 @@ void FSPanelProfileSecondLife::fillCommonData(const LLAvatarData* avatar_data)
mDescriptionEdit->setValue(avatar_data->about_text);
mSecondLifePic->setValue(avatar_data->image_id);
+ LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(avatar_data->image_id);
+ if (!imagep->getFullHeight())
+ {
+ imagep->forceToRefetchTexture();
+ }
+
if (getSelfProfile())
{
mShowInSearchCheckbox->setValue((BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 2fa1c60d12..6f924f50b3 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -78,14 +78,17 @@ fi
export SDL_VIDEO_X11_DGAMOUSE=0
## - Works around a problem with misconfigured 64-bit systems not finding GL
-exportMutliArchDRIPath "i386"
exportMutliArchDRIPath "amd64"
+
if [ -z ${LIBGL_DRIVERS_PATH} ]
then
- export LIBGL_DRIVERS_PATH="/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri:/usr/lib/i386-linux-gnu/dri:/usr/lib/x86_64-linux-gnu/dri"
+ export LIBGL_DRIVERS_PATH="/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri"
else
- export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/dri:/usr/lib32/dri:/usr/lib/dri:/usr/lib/i386-linux-gnu/dri:/usr/lib/x86_64-linux-gnu/dri"
+ export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/dri:/usr/lib/dri:/usr/lib/x86_64-linux-gnu/dri"
fi
+
+export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH}:/usr/lib64/xorg/modules/dri"
+
echo "LIBGL_DRIVERS_PATH is ${LIBGL_DRIVERS_PATH}"
## - The 'scim' GTK IM module widely crashes the viewer. Avoid it.
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index ec3e3301c6..0558869451 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -2992,13 +2992,26 @@ bool LLAgentCamera::isfollowCamLocked()
BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position)
{
- // Ansariel: Remember the current object point pointed at - we might need it later
+ // Remember the current object point pointed at - we might need it later
mPointAtObject = object;
+ // Private point at
+ static LLCachedControl private_pointat(gSavedSettings, "PrivatePointAtTarget", false);
+ if (private_pointat)
+ {
+ if (mPointAt && !mPointAt->isDead())
+ {
+ mPointAt->clearPointAtTarget();
+ mPointAt->markDead();
+ }
+
+ return FALSE;
+ }
+ //
+
// disallow pointing at attachments and avatars
//this is the editing arm motion
- static LLCachedControl private_pointat(gSavedSettings, "PrivatePointAtTarget", false);
- if (object && (object->isAttachment() || object->isAvatar() || private_pointat))
+ if (object && (object->isAttachment() || object->isAvatar()))
{
return FALSE;
}
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index 83a6e9f279..2e5b77a895 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -125,11 +125,16 @@ BOOL LLViewerDynamicTexture::render()
//-----------------------------------------------------------------------------
void LLViewerDynamicTexture::preRender(BOOL clear_depth)
{
+ // changes to support higher resolution rendering in the preview
+ ////only images up to 512x512 are supported
+ //llassert(mFullHeight <= 512);
+ //llassert(mFullWidth <= 512);
gPipeline.allocatePhysicsBuffer();
llassert(mFullWidth <= static_cast(gPipeline.mPhysicsDisplay.getWidth()));
llassert(mFullHeight <= static_cast(gPipeline.mPhysicsDisplay.getHeight()));
if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI)
+ //
{ //using offscreen render target, just use the bottom left corner
mOrigin.set(0, 0);
}
@@ -216,9 +221,12 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
return TRUE;
}
+ // changes to support higher resolution rendering in the preview
+ // bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mWaterDis.isComplete() && !gGLManager.mIsATI;
bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI;
if (use_fbo)
{
+ // gPipeline.mWaterDis.bindTarget();
gPipeline.mPhysicsDisplay.bindTarget();
}
//
@@ -257,7 +265,10 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
if (use_fbo)
{
+ // changes to support higher resolution rendering in the preview
+ // gPipeline.mWaterDis.flush();
gPipeline.mPhysicsDisplay.flush();
+ //
}
return ret;
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
index 737c75fc7d..93fa43cd21 100644
--- a/indra/newview/llfloatersettingsdebug.cpp
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -60,7 +60,7 @@ LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key)
mCommitCallbackRegistrar.add("ClickDefault", boost::bind(&LLFloaterSettingsDebug::onClickDefault, this));
mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterSettingsDebug::onUpdateFilter, this));
mCommitCallbackRegistrar.add("ClickCopy", boost::bind(&LLFloaterSettingsDebug::onCopyToClipboard, this));
- mCommitCallbackRegistrar.add("ClickSanityIcon", boost::bind(&LLFloaterSettingsDebug::onSanityCheck, this));
+ mCommitCallbackRegistrar.add("ClickSanityIcon", boost::bind(&LLFloaterSettingsDebug::onClickSanityWarning, this));
// make sure that the first filter update succeeds
mOldSearchTerm = std::string("---");
@@ -249,6 +249,13 @@ void LLFloaterSettingsDebug::onSanityCheck()
SanityCheck::instance().onSanity(mCurrentControlVariable);
}
+void LLFloaterSettingsDebug::onClickSanityWarning()
+{
+ // pass "true" to tell the sanity checker to pop up the warning, even when
+ // it was shown before and would be suppressed otherwise
+ SanityCheck::instance().onSanity(mCurrentControlVariable, true);
+}
+
void LLFloaterSettingsDebug::onCommitSettings()
{
if (!mCurrentControlVariable)
diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h
index 1c0c3ed3bf..f9d0a8af6d 100644
--- a/indra/newview/llfloatersettingsdebug.h
+++ b/indra/newview/llfloatersettingsdebug.h
@@ -60,6 +60,7 @@ public:
void onClickDefault();
void onCopyToClipboard();
void onSanityCheck();
+ void onClickSanityWarning();
static void showControl(const std::string& control);
private:
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index dd68d247d9..cf8f890a3b 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -514,6 +514,9 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
bool lookAtShouldClamp = s_EnableLimiter &&
(*mAttentions)[mTargetType].mName != "None" &&
(*mAttentions)[mTargetType].mName != "Idle" &&
+ (*mAttentions)[mTargetType].mName != "Respond" &&
+ (*mAttentions)[mTargetType].mName != "Conversation" &&
+ (*mAttentions)[mTargetType].mName != "FreeLook" &&
(*mAttentions)[mTargetType].mName != "AutoListen";
if (!lookAtShouldClamp) //We do a similar but seperate calculation if we are doing limited distances
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 0a28e99955..e6d65f72b3 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -6821,6 +6821,37 @@ void handle_attachment_touch(const LLUUID& idItem)
}
//
+// Texture Refresh on worn attachments
+void handle_attachment_texture_refresh(const LLUUID& idItem)
+{
+ // get the associated worn attachment's UUID
+ const LLInventoryItem* pItem = gInventory.getItem(idItem);
+ if ( (!isAgentAvatarValid()) || (!pItem) )
+ {
+ return;
+ }
+
+ LLViewerObject* pAttachObj = gAgentAvatarp->getWornAttachment(pItem->getLinkedUUID());
+ if (!pAttachObj)
+ return;
+
+ // iterate through the list of child prims, call texture refresh on each one of them
+ LLViewerObject::const_child_list_t& children = pAttachObj->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = children.begin();
+ iter != children.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+
+ // NULL means, we don't have individual texture faces selected,
+ // so refresh them all
+ handle_object_tex_refresh(child, NULL);
+ }
+
+ // texture refresh the root prim, too
+ handle_object_tex_refresh(pAttachObj, NULL);
+}
+//
+
// virtual
void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
{
@@ -6867,6 +6898,12 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
handle_attachment_touch(mUUID);
}
//
+ // Texture Refresh on worn attachments
+ else if ("texture_refresh_attachment" == action)
+ {
+ handle_attachment_texture_refresh(mUUID);
+ }
+ //
else if (isRemoveAction(action))
{
LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);
@@ -7057,6 +7094,13 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if ( ((flags & FIRST_SELECTED_ITEM) == 0) || (!enable_attachment_touch(mUUID)) )
disabled_items.push_back(std::string("Touch Attachment"));
+ // Texture Refresh on worn attachments
+ if (item->getType() == LLAssetType::AT_OBJECT)
+ {
+ items.push_back(std::string("Texture Refresh Attachment"));
+ }
+ //
+
items.push_back(std::string("Detach From Yourself"));
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
if ( (rlv_handler_t::isEnabled()) && (!gRlvAttachmentLocks.canDetach(item)) )
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 6af410eda1..b27ce9b398 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -149,16 +149,44 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
if (item_id.isNull())
{
mInventoryPanel->getRootFolder()->clearSelection();
+ // Clear out the UUID instead of keeping the last value
+ getChild("TextureKey")->setText(LLUUID::null.asString());
+ //
}
else
{
LLInventoryItem* itemp = gInventory.getItem(image_id);
- if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ // Texture UUID picker
+ //if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ if (itemp)
{
- // no copy texture
- getChild("apply_immediate_check")->setValue(FALSE);
- mNoCopyTextureSelected = TRUE;
+ BOOL copy = itemp->getPermissions().allowCopyBy(gAgent.getID());
+ BOOL mod = itemp->getPermissions().allowModifyBy(gAgent.getID());
+ BOOL xfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+
+ if(!copy)
+ {
+ // no copy texture
+ getChild("apply_immediate_check")->setValue(FALSE);
+ mNoCopyTextureSelected = TRUE;
+ }
+
+ //Verify permissions before revealing UUID.
+ //Replicates behaviour of "Copy UUID" on inventory. If you can't copy it there, you can't copy it here.
+ if(copy&&mod&&xfer)
+ {
+ getChild("TextureKey")->setText(image_id.asString());
+ }
+ else
+ {
+ getChild("TextureKey")->setText(LLUUID::null.asString());
+ }
}
+ else
+ {
+ getChild("TextureKey")->setText(LLUUID::null.asString());
+ }
+ //
}
if (set_selection)
@@ -416,6 +444,9 @@ BOOL LLFloaterTexturePicker::postBuild()
}
getChild("Pipette")->setCommitCallback( boost::bind(&LLFloaterTexturePicker::onBtnPipette, this));
+ // UUID picker
+ childSetAction("TextureKeyApply", LLFloaterTexturePicker::onBtnApplyTexture,this);
+ //
childSetAction("Cancel", LLFloaterTexturePicker::onBtnCancel,this);
childSetAction("Select", LLFloaterTexturePicker::onBtnSelect,this);
@@ -655,6 +686,17 @@ void LLFloaterTexturePicker::onBtnRevert(void* userdata)
self->mViewModel->resetDirty();
}*/
+// UUID texture picker
+// static
+void LLFloaterTexturePicker::onBtnApplyTexture(void* userdata)
+{
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ self->setCanApply(true, true);
+ self->setImageID(LLUUID(self->getChild("TextureKey")->getText()));
+ self->commitIfImmediateSet();
+}
+//
+
// static
void LLFloaterTexturePicker::onBtnCancel(void* userdata)
{
@@ -715,16 +757,39 @@ void LLFloaterTexturePicker::onSelectionChange(const std::dequegetPermissions().allowCopyBy(gAgent.getID()))
+ // UUID texture picker uses extra permissions, so we do all the fancy stuff here
+
+ BOOL copy = itemp->getPermissions().allowCopyBy(gAgent.getID());
+ BOOL mod = itemp->getPermissions().allowModifyBy(gAgent.getID());
+ BOOL xfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+
+ //if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ if (!copy)
{
mNoCopyTextureSelected = TRUE;
}
+ //
// FIRE-8298: Apply now checkbox has no effect
setCanApply(true, true);
//
setImageID(itemp->getAssetUUID(),false);
+
+ // UUID texture picker permissions continued
+ //We also have to set this here because above passes the asset ID, not the inventory ID.
+ //Verify permissions before revealing UUID.
+ //Replicates behaviour of "Copy UUID" on inventory. If you can't copy it there, you can't copy it here.
+ if(copy&&mod&&xfer)
+ {
+ getChild("TextureKey")->setText(itemp->getAssetUUID().asString());
+ }
+ else
+ {
+ getChild("TextureKey")->setText(LLUUID::null.asString());
+ }
+ //
+
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
-
+
if(!mPreviewSettingChanged)
{
mCanPreview = gSavedSettings.getBOOL("TextureLivePreview");
@@ -740,6 +805,12 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque Clear texture key when item cant be found
+ else
+ {
+ getChild("TextureKey")->setText(LLUUID::null.asString());
+ }
+ //
}
}
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 24dc42cf48..612110aa1f 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -319,6 +319,9 @@ public:
const LLUUID& getBlankImageAssetID() { return mBlankImageAssetID; }
static void onBtnSetToDefault(void* userdata);
+ // UUID texture picker
+ static void onBtnApplyTexture(void* userdata);
+ //
static void onBtnSelect(void* userdata);
static void onBtnCancel(void* userdata);
void onBtnPipette();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index b78923209c..aea8916a77 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3117,6 +3117,67 @@ void destroy_texture(const LLUUID& id) // will be used by the texture refresh f
LLAppViewer::getTextureCache()->removeFromCache(id);
}
+void handle_object_tex_refresh(LLViewerObject* object, LLSelectNode* node)
+{
+ U8 te_count = object->getNumTEs();
+ // map from texture ID to list of faces using it
+ typedef std::map< LLUUID, std::vector > map_t;
+ map_t faces_per_texture;
+ for (U8 i = 0; i < te_count; ++i)
+ {
+ // "node" will be NULL when invoked from inventory menu,
+ // otherwise it will hold the root node of the selection and we
+ // need to make sure only to refresh the selected faces
+ if (node && !node->isTESelected(i)) continue;
+
+ LLViewerTexture* img = object->getTEImage(i);
+ faces_per_texture[img->getID()].push_back(i);
+
+ if (object->getTE(i)->getMaterialParams().notNull())
+ {
+ LLViewerTexture* norm_img = object->getTENormalMap(i);
+ faces_per_texture[norm_img->getID()].push_back(i);
+
+ LLViewerTexture* spec_img = object->getTESpecularMap(i);
+ faces_per_texture[spec_img->getID()].push_back(i);
+ }
+ }
+
+ map_t::iterator it;
+ for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it)
+ {
+ destroy_texture(it->first);
+ }
+
+ // Refresh sculpt texture
+ if (object->isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ if (sculpt_params)
+ {
+ LLUUID sculpt_uuid = sculpt_params->getSculptTexture();
+
+ LLViewerFetchedTexture* tx = LLViewerTextureManager::getFetchedTexture(sculpt_uuid);
+ if (tx)
+ {
+ S32 num_volumes = tx->getNumVolumes(LLRender::SCULPT_TEX);
+ const LLViewerTexture::ll_volume_list_t* pVolumeList = tx->getVolumeList(LLRender::SCULPT_TEX);
+
+ destroy_texture(sculpt_uuid);
+
+ for (S32 idxVolume = 0; idxVolume < num_volumes; ++idxVolume)
+ {
+ LLVOVolume* pVolume = pVolumeList->at(idxVolume);
+ if (pVolume)
+ {
+ pVolume->notifyMeshLoaded();
+ }
+ }
+ }
+ }
+ }
+}
+
class LLObjectTexRefresh : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -3126,61 +3187,7 @@ class LLObjectTexRefresh : public view_listener_t
iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++)
{
LLSelectNode* node = *iter;
-
- U8 te_count = node->getObject()->getNumTEs();
- // map from texture ID to list of faces using it
- typedef std::map< LLUUID, std::vector > map_t;
- map_t faces_per_texture;
- for (U8 i = 0; i < te_count; ++i)
- {
- if (!node->isTESelected(i)) continue;
-
- LLViewerTexture* img = node->getObject()->getTEImage(i);
- faces_per_texture[img->getID()].push_back(i);
-
- if (node->getObject()->getTE(i)->getMaterialParams().notNull())
- {
- LLViewerTexture* norm_img = node->getObject()->getTENormalMap(i);
- faces_per_texture[norm_img->getID()].push_back(i);
-
- LLViewerTexture* spec_img = node->getObject()->getTESpecularMap(i);
- faces_per_texture[spec_img->getID()].push_back(i);
- }
- }
-
- map_t::iterator it;
- for (it = faces_per_texture.begin(); it != faces_per_texture.end(); ++it)
- {
- destroy_texture(it->first);
- }
-
- // Refresh sculpt texture
- if (node->getObject()->isSculpted())
- {
- LLSculptParams *sculpt_params = (LLSculptParams *)node->getObject()->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- if (sculpt_params)
- {
- LLUUID sculpt_uuid = sculpt_params->getSculptTexture();
-
- LLViewerFetchedTexture* tx = LLViewerTextureManager::getFetchedTexture(sculpt_uuid);
- if (tx)
- {
- S32 num_volumes = tx->getNumVolumes(LLRender::SCULPT_TEX);
- const LLViewerTexture::ll_volume_list_t* pVolumeList = tx->getVolumeList(LLRender::SCULPT_TEX);
-
- destroy_texture(sculpt_uuid);
-
- for (S32 idxVolume = 0; idxVolume < num_volumes; ++idxVolume)
- {
- LLVOVolume* pVolume = pVolumeList->at(idxVolume);
- if (pVolume)
- {
- pVolume->notifyMeshLoaded();
- }
- }
- }
- }
- }
+ handle_object_tex_refresh(node->getObject(),node);
}
return true;
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index d40dcdfce4..b84d55ff83 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -38,6 +38,7 @@ class LLView;
class LLParcelSelection;
class LLObjectSelection;
class LLSelectNode;
+class LLViewerObject;
// [RLVa:KB] - Checked: RLVa-2.0.0
void set_use_wireframe(bool useWireframe);
@@ -103,6 +104,7 @@ void handle_object_build(void*);
void handle_object_touch();
bool enable_object_open();
void handle_object_open();
+void handle_object_tex_refresh(LLViewerObject* object, LLSelectNode* node);
bool visible_take_object();
bool tools_visible_take_object();
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 3bc2f78f54..7b0be41620 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -1325,8 +1325,14 @@ void LLVOAvatarSelf::idleUpdateTractorBeam()
{
LLColor4U rgb = gLggBeamMaps.getCurrentColor(LLColor4U(gAgent.getEffectColor()));
+ // Private point at
+ static LLCachedControl private_pointat(gSavedSettings, "PrivatePointAtTarget", false);
+
// This is only done for yourself (maybe it should be in the agent?)
- if (!needsRenderBeam() || !isBuilt())
+ // Private point at
+ //if (!needsRenderBeam() || !isBuilt())
+ if (!needsRenderBeam() || !isBuilt() || private_pointat)
+ //
{
mBeam = NULL;
gLggBeamMaps.stopBeamChat();
diff --git a/indra/newview/sanitycheck.cpp b/indra/newview/sanitycheck.cpp
index 547503d7b0..6044e36bf4 100644
--- a/indra/newview/sanitycheck.cpp
+++ b/indra/newview/sanitycheck.cpp
@@ -22,11 +22,14 @@
#include "llviewerprecompiledheaders.h"
#include "llcontrol.h"
+#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "sanitycheck.h"
+#define SANITY_CHECK "SanityCheck" // name of the notification we display
+
void SanityCheck::init()
{
struct f : public LLControlGroup::ApplyFunctor
@@ -37,7 +40,7 @@ void SanityCheck::init()
{
if (control->getSanityType() != SANITY_TYPE_NONE)
{
- control->getSanitySignal()->connect(boost::bind(&SanityCheck::onSanity, _1));
+ control->getSanitySignal()->connect(boost::bind(&SanityCheck::onSanity, _1, false));
SanityCheck::instance().onSanity(control);
}
}
@@ -48,19 +51,28 @@ void SanityCheck::init()
}
// static
-void SanityCheck::onSanity(LLControlVariable* controlp)
+void SanityCheck::onSanity(LLControlVariable* controlp, bool disregardLastControl /*= false*/)
{
- static LLControlVariable* lastControl = NULL;
+ static LLControlVariable* lastControl = nullptr;
if (controlp->isSane())
+ {
return;
+ }
- if (controlp == lastControl)
+ if (disregardLastControl)
+ {
+ // clear "ignored" status for this control, so it can actually show up
+ LLNotifications::instance().setIgnored(SANITY_CHECK, false);
+ }
+ else if (controlp == lastControl)
+ {
return;
+ }
lastControl = controlp;
- std::string checkType = "SanityCheck" + LLControlGroup::sanityTypeEnumToString(controlp->getSanityType());
+ std::string checkType = SANITY_CHECK + LLControlGroup::sanityTypeEnumToString(controlp->getSanityType());
std::vector sanityValues = controlp->getSanityValues();
LLSD args;
@@ -71,7 +83,7 @@ void SanityCheck::onSanity(LLControlVariable* controlp)
args["SANITY_MESSAGE"] = LLTrans::getString(checkType, map);
args["SANITY_COMMENT"] = controlp->getSanityComment();
args["CURRENT_VALUE"] = controlp->getValue().asString();
- LLNotificationsUtil::add("SanityCheck", args, LLSD(), boost::bind(SanityCheck::onFixIt, _1, _2, controlp));
+ LLNotificationsUtil::add(SANITY_CHECK, args, LLSD(), boost::bind(SanityCheck::onFixIt, _1, _2, controlp));
}
void SanityCheck::onFixIt(const LLSD& notification, const LLSD& response, LLControlVariable* controlp)
diff --git a/indra/newview/sanitycheck.h b/indra/newview/sanitycheck.h
index d2faf23ea8..c5c66b6cb3 100644
--- a/indra/newview/sanitycheck.h
+++ b/indra/newview/sanitycheck.h
@@ -34,7 +34,7 @@ class SanityCheck : public LLSingleton
public:
void init();
- static void onSanity(LLControlVariable* controlp);
+ static void onSanity(LLControlVariable* controlp, bool disregardLastControl = false);
static void onFixIt(const LLSD& notification, const LLSD& response, LLControlVariable* controlp);
};
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index c02a1cc425..891716ac24 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -804,6 +804,7 @@ with the same filename but different name
+
diff --git a/indra/newview/skins/default/textures/toolbar_icons/stop_animations.png b/indra/newview/skins/default/textures/toolbar_icons/stop_animations.png
new file mode 100644
index 0000000000..978ed2ddce
Binary files /dev/null and b/indra/newview/skins/default/textures/toolbar_icons/stop_animations.png differ
diff --git a/indra/newview/skins/default/xui/de/floater_fs_im_session.xml b/indra/newview/skins/default/xui/de/floater_fs_im_session.xml
index 20fd70b615..694ed38c7b 100644
--- a/indra/newview/skins/default/xui/de/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/de/floater_fs_im_session.xml
@@ -46,10 +46,10 @@
-
+
-
+
diff --git a/indra/newview/skins/default/xui/de/floater_settings_debug.xml b/indra/newview/skins/default/xui/de/floater_settings_debug.xml
index 2163e1c964..1e23435a2d 100644
--- a/indra/newview/skins/default/xui/de/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/de/floater_settings_debug.xml
@@ -15,7 +15,8 @@
+
-
+
diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
index ce718db404..67d3c13aac 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
@@ -35,7 +35,8 @@
-
+
+
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 937ff7ddde..5ba56a0e5b 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -114,6 +114,7 @@
+
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index fd6ebc4ada..a1f3f3b395 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -4990,14 +4990,15 @@ URL: [AUDIOURL]
-
+
Willkommen in der Phoenix/Firestorm Viewer Support-Gruppe!
-Um den Support zu vereinfachen wird empfohlen, die aktuelle Version deines Viewers der Gruppe mitzuteilen. Du kannst daher entscheiden, ob du die Version deines Viewers jeder Nachrichtig in diesem Gruppenchat voranstellen möchtest. Unser Support-Team kann dir eine sinnvollere Hilfestellung geben, wenn es direkt weiß, welche Viewer-Version du benutzt.
+Um den Support zu vereinfachen wird empfohlen, die aktuelle Version Ihres Viewers der Gruppe mitzuteilen. Diese Information beinhaltet Viewer-Version, Viewer-Skin, Betriebssystem und RLVa-Status. Sie können daher entscheiden, ob Sie die Version Ihres Viewers jeder Nachricht in diesem Gruppenchat voranstellen möchten. Unser Support-Team kann Ihnen eine sinnvollere Hilfestellung geben, wenn es direkt weiß, welche Viewer-Version Sie benutzen.
Diese Funktion kann jederzeit über die Checkbox innerhalb des Gruppenchat-Fensters aktiviert bzw. deaktiviert werden.
Soll die automatische Anzeige der Viewer-Version aktiviert werden?
+
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index cf159efa29..ccebc4eb69 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -5463,9 +5463,9 @@ Configuración actual: [CURRENT_VALUE]
La cache del visor está vacía. Por favor, ten en cuenta que puedes sufrir de lentitud de movimiento y de inventario mientras se carga el nuevo contenido.
-
+
¡Bienvenido al Grupo de Soporte de Phoenix/Firestorm Viewer!
-Para facilitar el soporte, se recomienda que publiques la versión de tu visor en el grupo. Puedes mostrar la versión de tu visor delante de cada mensaje que envías al grupo. Nuestros miembros de soporte pueden darte respuestas más adecuadas si saben qué visor estás usando.
+Para facilitar el soporte, se recomienda que publiques la versión de tu visor en el grupo. Esta información incluye la versión actual del visor, el skin del visor, el sistema operativo y el estatus del RLVa. Puedes mostrar la versión de tu visor delante de cada mensaje que envías al grupo. Nuestros miembros de soporte pueden darte respuestas más adecuadas si saben qué visor estás usando.
Puedes activar y desactivar esta función en cualquier momento usando la casilla existente en la ventana del chat del grupo.
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 9807fe1ef0..40d17c9b60 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -5785,6 +5785,12 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
actualmente en tu barra de herramientas derecha
Activar/desactivar el modo de vuelo
+
+ Detener mis animaciones
+
+
+ Detener mis animaciones
+
% retención
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index cc8829756f..cced24a956 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -5487,6 +5487,12 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
actuellement dans la barre d'outils de droite
+
+ Arrêter mon animation
+
+
+ Arrêter mon animation
+
Garder%
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 73a816e8ad..fa5161dec2 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -3933,7 +3933,8 @@ Valore attuale: [CURRENT_VALUE]
La cache del viewer è vuota. Sono possibili rallentamenti nel framerate e nel caricamento dell'inventario per un breve tempo, mentre vengono caricati i nuovi contenuti.
-
+
Modificare gli script negli oggetti selezionati?
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 831e217f6a..9ab1d92ce8 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -5613,6 +5613,12 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette.
Attiva/disattiva il volo (Home)
+
+ Ferma animazioni
+
+
+ Ferma animazioni
+
Mantieni%
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 7309b54068..a685b5adce 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -4317,7 +4317,8 @@ AO セット "[AO_SET_NAME]" の名前を変更できません。
-
+
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 4d6b3e754c..ed26207b73 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -5719,6 +5719,12 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
飛行モードを開始、または停止する
+
+ 自分のアニメーションを停止する
+
+
+ 自分のアニメーションを停止する
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml b/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
index 4b2fa57d5e..432520fb5a 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
@@ -43,7 +43,10 @@
-
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
index fd22baacb3..afa174e67e 100644
--- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
@@ -10,6 +10,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
index 9782fc0bdf..cc275384fb 100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -31,6 +31,8 @@
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml
index d0f199fcae..e0bbb713d1 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml
@@ -108,6 +108,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index f536ee9d8f..5a2c8e8ed0 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -3900,6 +3900,8 @@ Powód: [SANITY_COMMENT]
Obecne ustawienie: [CURRENT_VALUE]
@@ -3915,10 +3917,10 @@ Obecne ustawienie: [CURRENT_VALUE]
Pamięć podręczna (bufor danych) Twojej Przeglądarki jest pusta. Miej na uwadze, że możesz przez jakiś czas odczuwać obniżoną wydajność i spowolnione doczytywanie obiektów z Szafy.
-
+
Witaj w grupie wsparcia Phoenix/Firestorm!
-Abyśmy mogli pomóc Ci lepiej zalecamy, aby Twoja Przeglądarka automatycznie prezentowała swoją wersję - będzie ona wyświetlana przed każdą Twoją wypowiedzią na tym czacie grupowym. Osoby z naszej załogi wsparcia będą mogły dać Ci bardziej sensowne porady, jeśli będą znać wersję Twojej Przeglądarki od razu.
+Abyśmy mogli pomóc Ci lepiej zalecamy, aby Twoja Przeglądarka automatycznie prezentowała swoją wersję - będzie ona wyświetlana przed każdą Twoją wypowiedzią na tym czacie grupowym. Informacja te obejmuje aktualną wersję, skórkę, system operacyjny i status RLVa. Osoby z naszej załogi wsparcia będą mogły dać Ci bardziej sensowne porady, jeśli będą znać wersję Twojej Przeglądarki od razu.
Możesz włączyć lub wyłączyć tą funkcję w każdej chwili w górnej części okna czatu.
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml b/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml
index d1a20b81af..b44dad6947 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml
@@ -96,7 +96,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 4fbe705504..1f2fde4867 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -5440,6 +5440,12 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
Włącz/wyłącz tryb latania (HOME)
+
+ Zatrzymaj animacje
+
+
+ Zatrzymaj animacje
+
%Zachowania
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index e26810b99a..66aa9c0bd1 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -5433,6 +5433,12 @@ Tente colocar o caminho do editor entre aspas.
atualmente na sua barra de ferramentas direita
+
+ Parar minha animação
+
+
+ Parar minha animação
+
Reter%
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index 0ea01a8716..1c1eaa648a 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -4034,7 +4034,8 @@ URL: [MEDIAURL]
Кэш вашего клиента очищен. Пожалуйста, помните, что вы можете испытать замедление работы клиента и высокую нагрузку в течение короткого времени, пока загружается контент.
-
+
Вы уверены, что хотите изменить скрипты в выбранных объектах?
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 21135d2b80..b5cd0642f2 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -5989,6 +5989,12 @@ support@secondlife.com.
Переключение режима полета Включено/Выключено (Дом)
+
+ Остановить анимации аватара
+
+
+ Остановить анимации аватара
+
Остаток%
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index 6739b31270..15159533a7 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -5601,6 +5601,12 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin.
şu anda sağ araç çubuğunuzda
+
+ Beni Anime Etmeyi Durdur
+
+
+ Beni Anime Etmeyi Durdur
+
Koru %
diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml
index 6c1b03c62e..159fd027eb 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -5557,6 +5557,12 @@ http://secondlife.com/support 求助解決問題。
目前位在你的右工具列
+
+ 停止我身上的動作
+
+
+ 停止我身上的動作
+
保留%
diff --git a/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml b/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
index 0a5a4175ef..599b6167d5 100644
--- a/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
+++ b/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
@@ -419,7 +419,7 @@
width="115"
follows="left|top">
@@ -249,6 +249,26 @@
+
+
-