diff --git a/.hgtags b/.hgtags
index 43c50d422d..171502899b 100755
--- a/.hgtags
+++ b/.hgtags
@@ -590,3 +590,4 @@ a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release
82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release
706bdc7e25c6e6b8fb56f4a13fcce2936e70a79c 6.2.1-release
ec09daf1899c1c01c4ba0ba950fae572f2a612a8 6.2.2-release
+ab2ec5c5423b277d23fd0511ce50c15123ff2e03 6.2.3-release
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/autobuild.xml b/autobuild.xml
index af8af36969..ccf7a65cc3 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1006,39 +1006,25 @@
archive
name
darwin
- linux
-
linux64
archive
hash
- d1ef7f3d30bf2126620a37630b615ecf
+ 9111641e2b915c64529ed9624c1e9eb7
hash_algorithm
md5
url
- file:///opt/firestorm/fmodstudio-1.10.13-linux64-191311416.tar.bz2
+ file:///opt/firestorm/fmodstudio-2.00.01-linux64-191601723.tar.bz2
name
linux64
@@ -1048,11 +1034,11 @@
archive
hash
- 9aa1b6789b0f30943599f48c0fedefa1
+ f44299c9cf9c4224c6aee350284c3175
hash_algorithm
md5
url
- file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.13-windows-191311251.tar.bz2
+ file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.01-windows-191591202.tar.bz2
name
windows
@@ -1062,18 +1048,18 @@
archive
hash
- 7e6e5b4bc012e0f91c71c481aa4657fb
+ fd45c9663bbd413f779b3bd5ad6f3567
hash_algorithm
md5
url
- file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.13-windows64-191311303.tar.bz2
+ file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.01-windows64-191591204.tar.bz2
name
windows64
version
- 1.10.13
+ 2.00.01
fmodex
@@ -2000,9 +1986,9 @@
archive
hash
- 9a08c678a8c6c3c10bb913219b7931b6
+ 534ea1079513a56a78c99bc08179c87c
url
- file:///opt/firestorm/kdu-7.A.6-darwin-183562147.tar.bz2
+ file:///opt/firestorm/kdu-7.A.7-darwin-191472236.tar.bz2
name
darwin
@@ -2012,9 +1998,9 @@
archive
hash
- 9a08c678a8c6c3c10bb913219b7931b6
+ 534ea1079513a56a78c99bc08179c87c
url
- file:///opt/firestorm/kdu-7.A.6-darwin-183562147.tar.bz2
+ file:///opt/firestorm/kdu-7.A.7-darwin-191472236.tar.bz2
name
darwin64
@@ -2024,9 +2010,9 @@
archive
hash
- 544cc1f91d27be5fd3bffba3f686b3fa
+ e4e79a414a3b942d04473c1ee0f98bb7
url
- file:///opt/firestorm/kdu-7.A.6-linux-183540937.tar.bz2
+ file:///opt/firestorm/kdu-7.A.7-linux-191472043.tar.bz2
name
linux
@@ -2036,9 +2022,9 @@
archive
hash
- 544cc1f91d27be5fd3bffba3f686b3fa
+ e4e79a414a3b942d04473c1ee0f98bb7
url
- file:///opt/firestorm/kdu-7.A.6-linux-183540937.tar.bz2
+ file:///opt/firestorm/kdu-7.A.7-linux-191472043.tar.bz2
name
linux64
@@ -2048,9 +2034,9 @@
archive
hash
- a369edcd42d975b49328df1163c2eee7
+ a86b3a2fba5d62c42c26fd17ef7804d6
url
- file:///c:/cygwin/opt/firestorm/kdu-7.A.6-windows-183521837.tar.bz2
+ file:///c:/cygwin/opt/firestorm/kdu-7.A.7-windows-191472028.tar.bz2
name
windows
@@ -2060,9 +2046,9 @@
archive
hash
- a369edcd42d975b49328df1163c2eee7
+ a86b3a2fba5d62c42c26fd17ef7804d6
url
- file:///c:/cygwin/opt/firestorm/kdu-7.A.6-windows-183521837.tar.bz2
+ file:///c:/cygwin/opt/firestorm/kdu-7.A.7-windows-191472028.tar.bz2
name
windows64
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 3e2d8a4b11..9d615ea4e0 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1331,6 +1331,7 @@ Sovereign Engineer
STORM-2143
STORM-2148
MAINT-7343
+ SL-11079
SpacedOut Frye
VWR-34
VWR-45
diff --git a/indra/cmake/BuildPackagesInfo.cmake b/indra/cmake/BuildPackagesInfo.cmake
index 93461cea95..4314cca33d 100644
--- a/indra/cmake/BuildPackagesInfo.cmake
+++ b/indra/cmake/BuildPackagesInfo.cmake
@@ -8,7 +8,7 @@ include(Python)
# building in an IDE, it probably isn't. Set it explicitly using
# run_build_test.py.
add_custom_command(OUTPUT packages-info.txt
- COMMENT Generating packages-info.txt for the about box
+ COMMENT "Generating packages-info.txt for the about box"
MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/../autobuild.xml
DEPENDS ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py
${CMAKE_SOURCE_DIR}/../autobuild.xml
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index b03bfc104e..b59eb675ce 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -65,17 +65,11 @@ if(WINDOWS)
set(release_files ${release_files} growl++.dll growl.dll )
if (FMODSTUDIO)
- if(ADDRESS_SIZE EQUAL 32)
- set(debug_files ${debug_files} fmodL.dll)
- set(release_files ${release_files} fmod.dll)
- else(ADDRESS_SIZE EQUAL 32)
- set(debug_files ${debug_files} fmodL64.dll)
- set(release_files ${release_files} fmod64.dll)
- endif(ADDRESS_SIZE EQUAL 32)
+ set(debug_files ${debug_files} fmodL.dll)
+ set(release_files ${release_files} fmod.dll)
endif (FMODSTUDIO)
if (FMODEX)
-
if(ADDRESS_SIZE EQUAL 32)
set(release_files ${release_files} fmodex.dll)
else(ADDRESS_SIZE EQUAL 32)
diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake
index 7200a7da7b..ddef4046a3 100644
--- a/indra/cmake/FMODSTUDIO.cmake
+++ b/indra/cmake/FMODSTUDIO.cmake
@@ -27,15 +27,9 @@ if (FMODSTUDIO)
include(Prebuilt)
use_prebuilt_binary(fmodstudio)
if (WINDOWS)
- if (ADDRESS_SIZE EQUAL 32)
- set(FMODSTUDIO_LIBRARY
- debug fmodL_vc
- optimized fmod_vc)
- elseif (ADDRESS_SIZE EQUAL 64)
- set(FMODSTUDIO_LIBRARY
- debug fmodL64_vc
- optimized fmod64_vc)
- endif(ADDRESS_SIZE EQUAL 32)
+ set(FMODSTUDIO_LIBRARY
+ debug fmodL_vc
+ optimized fmod_vc)
elseif (DARWIN)
set(FMODSTUDIO_LIBRARY
debug fmodL
diff --git a/indra/cmake/OpenGL.cmake b/indra/cmake/OpenGL.cmake
index 2259c99293..3cb47a072c 100644
--- a/indra/cmake/OpenGL.cmake
+++ b/indra/cmake/OpenGL.cmake
@@ -3,6 +3,12 @@
include(Variables)
include(Prebuilt)
+# Shut cmake up about OpenGL library preference. This can
+# be either LEGACY or GLVND.
+if (LINUX)
+ SET(OpenGL_GL_PREFERENCE LEGACY)
+endif (LINUX)
+
if (BUILD_HEADLESS)
SET(OPENGL_glu_LIBRARY GLU)
SET(OPENGL_HEADLESS_LIBRARIES OSMesa16 dl GLU)
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.cpp b/indra/llaudio/llaudioengine.cpp
index 9eb6867a3f..2cb9f40a26 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -1294,6 +1294,18 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E
gAudiop->startNextTransfer();
}
+// Output device selection
+//virtual
+LLAudioEngine::output_device_map_t LLAudioEngine::getDevices()
+{
+ return output_device_map_t();
+}
+
+void LLAudioEngine::OnOutputDeviceListChanged(output_device_map_t output_device_map)
+{
+ mOutputDeviceListChangedCallback(output_device_map);
+}
+//
//
// LLAudioSource implementation
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 3bc8c81a04..3e2bf542fb 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -41,6 +41,8 @@
#include "lllistener.h"
+#include // Output device selection
+
const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
@@ -193,6 +195,20 @@ public:
void startNextTransfer();
static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status);
+ // Output device selection
+ typedef std::map output_device_map_t;
+ virtual output_device_map_t getDevices();
+ virtual void setDevice(const LLUUID& device_uuid) { };
+
+ typedef boost::signals2::signal output_device_list_changed_callback_t;
+ boost::signals2::connection setOutputDeviceListChangedCallback(const output_device_list_changed_callback_t::slot_type& cb)
+ {
+ return mOutputDeviceListChangedCallback.connect(cb);
+ }
+
+ void OnOutputDeviceListChanged(output_device_map_t output_device_map);
+ //
+
friend class LLPipeline; // For debugging
public:
F32 mMaxWindGain; // Hack. Public to set before fade in?
@@ -258,6 +274,9 @@ protected:
LLFrameTimer mWindUpdateTimer;
+ // Output device selection
+ output_device_list_changed_callback_t mOutputDeviceListChangedCallback;
+
private:
void setDefaults();
LLStreamingAudioInterface *mStreamingAudioImpl;
diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp
index 1eb3676e01..9000e1b99a 100644
--- a/indra/llaudio/llaudioengine_fmodex.cpp
+++ b/indra/llaudio/llaudioengine_fmodex.cpp
@@ -48,42 +48,79 @@
FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels);
-// FIRE-11266 / BUG-3549 / MAINT-2983: Changing audio device now requires relog to restore sounds
-#if LL_WINDOWS
+// Output device selection
+static inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string);
+
+LLUUID FMOD_GUID_to_LLUUID(FMOD_GUID guid)
+{
+ return LLUUID(llformat("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", guid.Data1, guid.Data2, guid.Data3,
+ guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]));
+}
+
+void set_device(FMOD::System* system, const LLUUID& device_uuid)
+{
+ LL_INFOS() << "LLAudioEngine_FMODEX::setDevice with device_uuid=" << device_uuid << LL_ENDL;
+
+ int drivercount;
+ if (!Check_FMOD_Error(system->getNumDrivers(&drivercount), "FMOD::System::getNumDrivers") && drivercount > 0)
+ {
+ if (device_uuid.isNull())
+ {
+ LL_INFOS() << "Setting driver \"Default\"" << LL_ENDL;
+ Check_FMOD_Error(system->setDriver(0), "FMOD::System::setDriver");
+ }
+ else
+ {
+ FMOD_GUID guid;
+
+ for (int i = 0; i < drivercount; ++i)
+ {
+ if (!Check_FMOD_Error(system->getDriverInfo(i, NULL, 0, &guid), "FMOD::System::getDriverInfo"))
+ {
+ 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;
+ }
+ }
+ }
+
+ LL_INFOS() << "Device not available (anymore) - falling back to default" << LL_ENDL;
+ Check_FMOD_Error(system->setDriver(0), "FMOD::System::setDriver");
+ }
+ }
+}
+
FMOD_RESULT F_CALLBACK systemCallback(FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACKTYPE type, void *commanddata1, void *commanddata2)
{
- FMOD::System *sys = (FMOD::System *)system;
- FMOD_RESULT result;
+ FMOD::System* sys = (FMOD::System*)system;
+ LLAudioEngine_FMODEX* audio_engine = NULL;
+ if (sys)
+ {
+ void* userdata = NULL;
+ Check_FMOD_Error(sys->getUserData(&userdata), "FMOD::System::getUserData");
+ audio_engine = (LLAudioEngine_FMODEX*)userdata;
+ }
+
switch (type)
{
case FMOD_SYSTEM_CALLBACKTYPE_DEVICELISTCHANGED:
- {
- int drivers;
- sys->getNumDrivers(&drivers);
-
- if (drivers <= 0)
+ LL_DEBUGS() << "FMOD system callback FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED" << LL_ENDL;
+ if (sys && audio_engine)
{
- break;
- }
-
- for (int i = 0; i < drivers; ++i)
- {
- result = sys->setDriver(i);
- if (result == FMOD_OK)
- {
- break;
- }
+ set_device(sys, audio_engine->getSelectedDeviceUUID());
+ audio_engine->OnOutputDeviceListChanged(audio_engine->getDevices());
}
break;
- }
-
default:
break;
}
return FMOD_OK;
}
-#endif
-//
+// >
FMOD::ChannelGroup *LLAudioEngine_FMODEX::mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT] = {0};
@@ -95,6 +132,7 @@ LLAudioEngine_FMODEX::LLAudioEngine_FMODEX(bool enable_profiler)
mSystem = NULL;
mEnableProfiler = enable_profiler;
mWindDSPDesc = new FMOD_DSP_DESCRIPTION();
+ mSelectedDeviceUUID == LLUUID::null; // Output device selection
}
@@ -182,12 +220,10 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
result = mSystem->setSoftwareChannels(num_channels + 2);
Check_FMOD_Error(result,"FMOD::System::setSoftwareChannels");
- // FIRE-11266 / BUG-3549 / MAINT-2983: Changing audio device now requires relog to restore sounds
- #if LL_WINDOWS
- result = mSystem->setCallback(systemCallback);
- Check_FMOD_Error(result, "FMOD::System::setCallback");
- #endif
- //
+ // Output device selection
+ Check_FMOD_Error(mSystem->setCallback(systemCallback), "FMOD::System::setCallback");
+ Check_FMOD_Error(mSystem->setUserData(this), "FMOD::System::setUserData");
+ //
U32 fmod_flags = FMOD_INIT_NORMAL;
if(mEnableProfiler)
@@ -369,9 +405,47 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init(): initialization complete." << LL_ENDL;
+ // Output device selection
+ getDevices(); // Purely to print out available devices for debugging reasons
+
return true;
}
+// Output device selection
+//virtual
+LLAudioEngine_FMODEX::output_device_map_t LLAudioEngine_FMODEX::getDevices()
+{
+ output_device_map_t driver_map;
+
+ int drivercount;
+ char r_name[512];
+ FMOD_GUID guid;
+
+ if (!Check_FMOD_Error(mSystem->getNumDrivers(&drivercount), "FMOD::System::getNumDrivers"))
+ {
+ for (int i = 0; i < drivercount; ++i)
+ {
+ 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;
+ }
+ }
+ }
+
+ return driver_map;
+}
+
+//virtual
+void LLAudioEngine_FMODEX::setDevice(const LLUUID& device_uuid)
+{
+ mSelectedDeviceUUID = device_uuid;
+ set_device(mSystem, device_uuid);
+}
+//
std::string LLAudioEngine_FMODEX::getDriverName(bool verbose)
{
diff --git a/indra/llaudio/llaudioengine_fmodex.h b/indra/llaudio/llaudioengine_fmodex.h
index ca389d489f..d0de2d602a 100644
--- a/indra/llaudio/llaudioengine_fmodex.h
+++ b/indra/llaudio/llaudioengine_fmodex.h
@@ -65,6 +65,14 @@ public:
typedef F32 MIXBUFFERFORMAT;
FMOD::System *getSystem() const {return mSystem;}
+
+ // Output device selection
+ /*virtual*/ std::map getDevices();
+ /*virtual*/ void setDevice(const LLUUID& device_uuid);
+
+ LLUUID getSelectedDeviceUUID() const { return mSelectedDeviceUUID; }
+ //
+
protected:
/*virtual*/ LLAudioBuffer *createBuffer(); // Get a free buffer, or flush an existing one if you have to.
/*virtual*/ LLAudioChannel *createChannel(); // Create a new audio channel.
@@ -80,6 +88,9 @@ protected:
FMOD::System *mSystem;
bool mEnableProfiler;
+ // Output device selection
+ LLUUID mSelectedDeviceUUID;
+
public:
static FMOD::ChannelGroup *mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT];
};
diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp
index e55485bb02..48203b0371 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.cpp
+++ b/indra/llaudio/llaudioengine_fmodstudio.cpp
@@ -51,25 +51,12 @@ FMOD_RESULT F_CALLBACK windDSPCallback(FMOD_DSP_STATE *dsp_state, float *inbuffe
FMOD::ChannelGroup *LLAudioEngine_FMODSTUDIO::mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT] = {0};
-LLAudioEngine_FMODSTUDIO::LLAudioEngine_FMODSTUDIO(bool enable_profiler, U32 resample_method)
- : mInited(false)
- , mWindGen(NULL)
- , mWindDSPDesc(NULL)
- , mWindDSP(NULL)
- , mSystem(NULL)
- , mEnableProfiler(enable_profiler)
- , mResampleMethod(resample_method)
-{
-}
-
-LLAudioEngine_FMODSTUDIO::~LLAudioEngine_FMODSTUDIO()
-{
-}
-
static inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string)
{
- if(result == FMOD_OK)
+ if (result == FMOD_OK)
+ {
return false;
+ }
if (result != FMOD_ERR_INVALID_HANDLE)
{
@@ -83,6 +70,87 @@ static inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string)
return true;
}
+LLUUID FMOD_GUID_to_LLUUID(FMOD_GUID guid)
+{
+ return LLUUID(llformat("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", guid.Data1, guid.Data2, guid.Data3,
+ guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]));
+}
+
+void set_device(FMOD::System* system, const LLUUID& device_uuid)
+{
+ LL_INFOS() << "LLAudioEngine_FMODSTUDIO::setDevice with device_uuid=" << device_uuid << LL_ENDL;
+
+ int drivercount;
+ if (!Check_FMOD_Error(system->getNumDrivers(&drivercount), "FMOD::System::getNumDrivers") && drivercount > 0)
+ {
+ if (device_uuid.isNull())
+ {
+ LL_INFOS() << "Setting driver \"Default\"" << LL_ENDL;
+ Check_FMOD_Error(system->setDriver(0), "FMOD::System::setDriver");
+ }
+ else
+ {
+ FMOD_GUID guid;
+ int r_samplerate, r_channels;
+
+ for (int i = 0; i < drivercount; ++i)
+ {
+ if (!Check_FMOD_Error(system->getDriverInfo(i, NULL, 0, &guid, &r_samplerate, NULL, &r_channels), "FMOD::System::getDriverInfo"))
+ {
+ 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;
+ }
+ }
+ }
+
+ LL_INFOS() << "Device not available (anymore) - falling back to default" << LL_ENDL;
+ Check_FMOD_Error(system->setDriver(0), "FMOD::System::setDriver");
+ }
+ }
+}
+
+FMOD_RESULT F_CALLBACK systemCallback(FMOD_SYSTEM *system, FMOD_SYSTEM_CALLBACK_TYPE type, void *commanddata1, void *commanddata2, void* userdata)
+{
+ FMOD::System* sys = (FMOD::System*)system;
+ LLAudioEngine_FMODSTUDIO* audio_engine = (LLAudioEngine_FMODSTUDIO*)userdata;
+
+ switch (type)
+ {
+ case FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED:
+ LL_DEBUGS() << "FMOD system callback FMOD_SYSTEM_CALLBACK_DEVICELISTCHANGED" << LL_ENDL;
+ if (sys && audio_engine)
+ {
+ set_device(sys, audio_engine->getSelectedDeviceUUID());
+ audio_engine->OnOutputDeviceListChanged(audio_engine->getDevices());
+ }
+ break;
+ default:
+ break;
+ }
+ return FMOD_OK;
+}
+
+LLAudioEngine_FMODSTUDIO::LLAudioEngine_FMODSTUDIO(bool enable_profiler, U32 resample_method)
+ : mInited(false)
+ , mWindGen(NULL)
+ , mWindDSPDesc(NULL)
+ , mWindDSP(NULL)
+ , mSystem(NULL)
+ , mEnableProfiler(enable_profiler)
+ , mResampleMethod(resample_method)
+ , mSelectedDeviceUUID()
+{
+}
+
+LLAudioEngine_FMODSTUDIO::~LLAudioEngine_FMODSTUDIO()
+{
+}
+
bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata)
{
U32 version;
@@ -110,6 +178,9 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata)
result = mSystem->setSoftwareChannels(num_channels + EXTRA_SOUND_CHANNELS);
Check_FMOD_Error(result,"FMOD::System::setSoftwareChannels");
+ Check_FMOD_Error(mSystem->setCallback(systemCallback), "FMOD::System::setCallback");
+ Check_FMOD_Error(mSystem->setUserData(this), "FMOD::System::setUserData");
+
FMOD_ADVANCEDSETTINGS adv_settings = { };
adv_settings.cbSize = sizeof(FMOD_ADVANCEDSETTINGS);
switch (mResampleMethod)
@@ -265,9 +336,45 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata)
LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::init(): initialization complete." << LL_ENDL;
+ getDevices(); // Purely to print out available devices for debugging reasons
+
return true;
}
+//virtual
+LLAudioEngine_FMODSTUDIO::output_device_map_t LLAudioEngine_FMODSTUDIO::getDevices()
+{
+ output_device_map_t driver_map;
+
+ int drivercount;
+ int r_samplerate, r_channels;
+ char r_name[512];
+ FMOD_GUID guid;
+
+ if (!Check_FMOD_Error(mSystem->getNumDrivers(&drivercount), "FMOD::System::getNumDrivers"))
+ {
+ for (int i = 0; i < drivercount; ++i)
+ {
+ 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;
+ }
+ }
+ }
+
+ return driver_map;
+}
+
+//virtual
+void LLAudioEngine_FMODSTUDIO::setDevice(const LLUUID& device_uuid)
+{
+ mSelectedDeviceUUID = device_uuid;
+ set_device(mSystem, device_uuid);
+}
std::string LLAudioEngine_FMODSTUDIO::getDriverName(bool verbose)
{
diff --git a/indra/llaudio/llaudioengine_fmodstudio.h b/indra/llaudio/llaudioengine_fmodstudio.h
index fb1b8ae2cd..3b80f45336 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.h
+++ b/indra/llaudio/llaudioengine_fmodstudio.h
@@ -71,6 +71,12 @@ public:
typedef F32 MIXBUFFERFORMAT;
FMOD::System *getSystem() const {return mSystem;}
+
+ /*virtual*/ std::map getDevices();
+ /*virtual*/ void setDevice(const LLUUID& device_uuid);
+
+ LLUUID getSelectedDeviceUUID() const { return mSelectedDeviceUUID; }
+
protected:
/*virtual*/ LLAudioBuffer *createBuffer(); // Get a free buffer, or flush an existing one if you have to.
/*virtual*/ LLAudioChannel *createChannel(); // Create a new audio channel.
@@ -87,6 +93,8 @@ protected:
bool mEnableProfiler;
U32 mResampleMethod;
+ LLUUID mSelectedDeviceUUID;
+
public:
static FMOD::ChannelGroup *mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT];
};
diff --git a/indra/llcommon/llcallstack.h b/indra/llcommon/llcallstack.h
index 5acf04a49f..77fa94b038 100644
--- a/indra/llcommon/llcallstack.h
+++ b/indra/llcommon/llcallstack.h
@@ -79,9 +79,23 @@ struct LLContextStatus
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLContextStatus& context_status);
+/* gcc gets unhappy at what it thinks are multiline comments
+// Store the check to avoid the nasty mutex monster that lies within
+//#define dumpStack(tag) \
+// if (debugLoggingEnabled(tag)) \
+// { \
+// LLCallStack cs; \
+// LL_DEBUGS(tag) << "STACK:\n" << "====================\n" << cs << "====================" << LL_ENDL; \
+// }
+*/
+#ifdef LL_RELEASE_FOR_DOWNLOAD
+#define dumpStack(tag)
+#else
#define dumpStack(tag) \
if (debugLoggingEnabled(tag)) \
{ \
LLCallStack cs; \
LL_DEBUGS(tag) << "STACK:\n" << "====================\n" << cs << "====================" << LL_ENDL; \
}
+#endif
+//
\ No newline at end of file
diff --git a/indra/llimagej2coj/CMakeLists.txt b/indra/llimagej2coj/CMakeLists.txt
index c9423d50dd..0e487b1d66 100644
--- a/indra/llimagej2coj/CMakeLists.txt
+++ b/indra/llimagej2coj/CMakeLists.txt
@@ -2,6 +2,9 @@
project(llimagej2coj)
+# when using KDU, why compile the OpenJPEG library?
+if (NOT USE_KDU)
+
include(00-Common)
include(LLCommon)
include(LLImage)
@@ -29,9 +32,9 @@ set_source_files_properties(${llimagej2coj_HEADER_FILES}
list(APPEND llimagej2coj_SOURCE_FILES ${llimagej2coj_HEADER_FILES})
add_library (llimagej2coj ${llimagej2coj_SOURCE_FILES})
-
target_link_libraries(
llimagej2coj
${OPENJPEG_LIBRARIES}
)
+endif()
diff --git a/indra/llkdu/llkdumem.h b/indra/llkdu/llkdumem.h
index 8d24bd2415..5ed5fe085b 100644
--- a/indra/llkdu/llkdumem.h
+++ b/indra/llkdu/llkdumem.h
@@ -47,6 +47,7 @@
#include "include_kdu_xxxx.h"
#include "kdu_sample_processing.h"
+#include "kdu_utils.h"
#include "image_local.h"
#include "stdtypes.h"
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index cd484b4fe9..c65b830b71 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -639,5 +639,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 6dc84d978d..184916e565 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/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 3bbb11a1ec..c06f408096 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -967,6 +967,7 @@ BOOL LLScrollListCtrl::selectItemRange( S32 first_index, S32 last_index )
// Fix for FS-specific people list (radar)
if (isFiltered(itemp))
{
+ iter++ ;
continue;
}
// Fix for FS-specific people list (radar)
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 10e2cd5172..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";
@@ -1574,7 +1574,7 @@ std::string LLUrlEntryJira::getUrl(const std::string &string) const
string.find("SLS") != std::string::npos ||
string.find("SUP") != std::string::npos )
{
- return llformat("https://jira.phoenixviewer.com/browse/%s", string.c_str());
+ return llformat("https://jira.firestormviewer.org/browse/%s", string.c_str());
}
else
{
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 8905cef552..e90de09a6e 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -961,12 +961,9 @@ std::string LLDir::getForbiddenFileChars()
{
return "\\/:*?\"<>|";
}
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
+//void LLDir::setLindenUserDir(const std::string &username)
void LLDir::setLindenUserDir(const std::string &username, const std::string &gridname)
-#else
-void LLDir::setLindenUserDir(const std::string &username)
-#endif // OPENSIM
//
{
// if the username isn't set, that's bad
@@ -977,21 +974,17 @@ void LLDir::setLindenUserDir(const std::string &username)
std::string userlower(username);
LLStringUtil::toLower(userlower);
LLStringUtil::replaceChar(userlower, ' ', '_');
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
std::string gridlower(gridname);
LLStringUtil::toLower(gridlower);
LLStringUtil::replaceChar(gridlower, ' ', '_');
-#endif // OPENSIM
//
mLindenUserDir = add(getOSUserAppDir(), userlower);
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
if (!gridname.empty() && gridlower != "second_life")
{
mLindenUserDir += "." + gridlower;
}
-#endif // OPENSIM
//
}
else
@@ -1019,12 +1012,9 @@ void LLDir::updatePerAccountChatLogsDir()
mPerAccountChatLogsDir = add(getChatLogsDir(), mUserName);
}
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
+//void LLDir::setPerAccountChatLogsDir(const std::string &username)
void LLDir::setPerAccountChatLogsDir(const std::string &username, const std::string &gridname)
-#else
-void LLDir::setPerAccountChatLogsDir(const std::string &username)
-#endif // OPENSIM
// /FS:CR>
{
// if both first and last aren't set, assume we're grabbing the cached dir
@@ -1035,24 +1025,19 @@ void LLDir::setPerAccountChatLogsDir(const std::string &username)
std::string userlower(username);
LLStringUtil::toLower(userlower);
LLStringUtil::replaceChar(userlower, ' ', '_');
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
std::string gridlower(gridname);
LLStringUtil::toLower(gridlower);
LLStringUtil::replaceChar(gridlower, ' ', '_');
-#endif // OPENSIM
//
mUserName = userlower;
updatePerAccountChatLogsDir();
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
if (!gridname.empty() && gridlower != "second_life")
{
mPerAccountChatLogsDir += "." + gridlower;
}
-#endif // OPENSIM
//
-
}
else
{
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index d4ff3c4cb3..37237f7f17 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -230,14 +230,11 @@ class LLDir
virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
+ //virtual void setPerAccountChatLogsDir(const std::string &username); // Set the per user chat log directory.
+ //virtual void setLindenUserDir(const std::string &username); // Set the linden user dir to this user's dir
virtual void setPerAccountChatLogsDir(const std::string &username, const std::string &gridname);
virtual void setLindenUserDir(const std::string &username, const std::string &gridname);
-#else
- virtual void setPerAccountChatLogsDir(const std::string &username); // Set the per user chat log directory.
- virtual void setLindenUserDir(const std::string &username); // Set the linden user dir to this user's dir
-#endif // OPENSIM
//
// [SL:KB] - Patch: Viewer-Skins | Checked: 2010-10-20 (Catznip-3.4)
virtual void setSkinFolder(const std::string& skin_folder, const std::string& theme_folder, const std::string& language);
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 1549cbc150..332b42d7c4 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -3035,6 +3035,7 @@ BOOL LLWindowWin32::restoreGamma()
{
if (mCustomGammaSet != FALSE)
{
+ LL_DEBUGS("Window") << "Restoring gamma" << LL_ENDL;
mCustomGammaSet = FALSE;
return SetDeviceGammaRamp(mhDC, mPrevGammaRamp);
}
@@ -3048,8 +3049,15 @@ BOOL LLWindowWin32::setGamma(const F32 gamma)
//Get the previous gamma ramp to restore later.
if (mCustomGammaSet == FALSE)
{
- if (GetDeviceGammaRamp(mhDC, mPrevGammaRamp) == FALSE)
- return FALSE;
+ if (!gGLManager.mIsIntel) // skip for Intel GPUs (see SL-11341)
+ {
+ LL_DEBUGS("Window") << "Getting the previous gamma ramp to restore later" << LL_ENDL;
+ if(GetDeviceGammaRamp(mhDC, mPrevGammaRamp) == FALSE)
+ {
+ LL_WARNS("Window") << "Failed to get the previous gamma ramp" << LL_ENDL;
+ return FALSE;
+ }
+ }
mCustomGammaSet = TRUE;
}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 2b441d0747..cd8e9a10e2 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1741,7 +1741,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
@@ -2101,7 +2105,10 @@ if (FMODEX)
set(FMODWRAPPER_LIBRARY ${FMODEX_LIBRARY})
endif (FMODEX)
-set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
+# Output device selection
+# set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
+set_source_files_properties(llstartup.cpp llfloaterpreference.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
+#
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index bee9433817..a6534bb333 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.2.3
+6.2.5
diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp
index 233eedb16e..8646b4f165 100644
--- a/indra/newview/aoengine.cpp
+++ b/indra/newview/aoengine.cpp
@@ -53,6 +53,7 @@ AOEngine::AOEngine() :
mCurrentSet(NULL),
mDefaultSet(NULL),
mEnabled(FALSE),
+ mEnabledStands(FALSE),
mInMouselook(FALSE),
mUnderWater(FALSE),
mImportSet(NULL),
@@ -62,6 +63,7 @@ AOEngine::AOEngine() :
mLastOverriddenMotion(ANIM_AGENT_STAND)
{
gSavedPerAccountSettings.getControl("UseAO")->getCommitSignal()->connect(boost::bind(&AOEngine::onToggleAOControl, this));
+ gSavedPerAccountSettings.getControl("UseAOStands")->getCommitSignal()->connect(boost::bind(&AOEngine::onToggleAOStandsControl, this));
mRegionChangeConnection = gAgent.addRegionChangedCallback(boost::bind(&AOEngine::onRegionChange, this));
}
@@ -78,7 +80,21 @@ AOEngine::~AOEngine()
void AOEngine::init()
{
- enable(mEnabled);
+ 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
+ // mEnabled variable properly
+ mEnabled = TRUE;
+ // Enabling the AO always enables stands to start with
+ enable_stands(TRUE);
+ }
+ else
+ {
+ enable_stands(do_enable_stands);
+ enable(FALSE);
+ }
}
// static
@@ -90,6 +106,16 @@ void AOEngine::onLoginComplete()
void AOEngine::onToggleAOControl()
{
enable(gSavedPerAccountSettings.getBOOL("UseAO"));
+ if (mEnabled)
+ {
+ // Enabling the AO always enables stands to start with
+ gSavedPerAccountSettings.setBOOL("UseAOStands", TRUE);
+ }
+}
+
+void AOEngine::onToggleAOStandsControl()
+{
+ enable_stands(gSavedPerAccountSettings.getBOOL("UseAOStands"));
}
void AOEngine::clear(bool aFromTimer)
@@ -165,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;
@@ -226,6 +274,14 @@ void AOEngine::checkBelowWater(BOOL yes)
gAgent.sendAnimationRequest(override(mLastOverriddenMotion, TRUE), ANIM_REQUEST_START);
}
+void AOEngine::enable_stands(BOOL yes)
+{
+ mEnabledStands = yes;
+ // let the main enable routine decide if we need to change animations
+ // but don't actually change the state of the enabled flag
+ enable(mEnabled);
+}
+
void AOEngine::enable(BOOL yes)
{
LL_DEBUGS("AOEngine") << "using " << mLastMotion << " enable " << yes << LL_ENDL;
@@ -258,6 +314,11 @@ void AOEngine::enable(BOOL yes)
if (mLastMotion == ANIM_AGENT_STAND)
{
+ if (!mEnabledStands)
+ {
+ LL_DEBUGS("AOEngine") << "Last motion was a STAND, but disabled for stands, ignoring." << LL_ENDL;
+ return;
+ }
stopAllStandVariants();
}
else if (mLastMotion == ANIM_AGENT_WALK)
@@ -424,6 +485,14 @@ const LLUUID AOEngine::override(const LLUUID& pMotion, BOOL start)
return animation;
}
+ // Don't override start and turning stands if stand override is disabled
+ if (!mEnabledStands &&
+ (motion == ANIM_AGENT_STAND || motion == ANIM_AGENT_TURNRIGHT || motion == ANIM_AGENT_TURNLEFT))
+ {
+ LL_DEBUGS("AOEngine") << "(enabled AO, stands disabled) setting last motion id to " << gAnimLibrary.animationName(mLastMotion) << LL_ENDL;
+ return animation;
+ }
+
// Do not start override sits if not selected
if (!mCurrentSet->getSitOverride() && motion == ANIM_AGENT_SIT)
{
@@ -553,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;
@@ -1581,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/aoengine.h b/indra/newview/aoengine.h
index 21f58862e2..b92490bd08 100644
--- a/indra/newview/aoengine.h
+++ b/indra/newview/aoengine.h
@@ -99,6 +99,7 @@ class AOEngine
};
void enable(BOOL yes);
+ void enable_stands(BOOL yes);
const LLUUID override(const LLUUID& motion, BOOL start);
void tick();
void update();
@@ -184,6 +185,7 @@ class AOEngine
void onRegionChange();
void onToggleAOControl();
+ void onToggleAOStandsControl();
static void onNotecardLoadComplete(LLVFS* vfs, const LLUUID& assetUUID, LLAssetType::EType type,
void* userdata, S32 status, LLExtStat extStatus);
void parseNotecard(const char* buffer);
@@ -195,6 +197,7 @@ class AOEngine
AOSitCancelTimer mSitCancelTimer;
BOOL mEnabled;
+ BOOL mEnabledStands;
BOOL mInMouselook;
BOOL mUnderWater;
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 4bbb424776..1c8a4fe389 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -625,4 +625,12 @@
is_running_function="Floater.IsOpen"
is_running_parameters="beacons"
/>
+
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7b1dd90586..0d5486beba 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1016,7 +1016,7 @@
Value
1
- FSSupportGroupChatPrefix2
+ FSSupportGroupChatPrefix3
Comment
Adds (FS 1.2.3) to support group chat
@@ -1027,6 +1027,17 @@
Value
0
+ FSSupportGroupChatPrefixTesting
+
+ Comment
+ Adds (W 56789f* os) to testing group chat
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
AutoCloseOOC
Comment
@@ -11464,7 +11475,7 @@ Change of this parameter will affect the layout of buttons in notification toast
Type
Boolean
Value
- 1
+ 0
RenderPerformanceTest
@@ -13529,7 +13540,7 @@ Change of this parameter will affect the layout of buttons in notification toast
Type
String
Value
- https://jira.phoenixviewer.com/secure/CreateIssueDetails!init.jspa?pid=10005&issuetype=1&priority=3&environment=[ENVIRONMENT]
+ https://jira.firestormviewer.org/secure/CreateIssueDetails!init.jspa?pid=10005&issuetype=1&priority=3&environment=[ENVIRONMENT]
RevokePermsOnStopAnimation
@@ -15275,7 +15286,7 @@ Change of this parameter will affect the layout of buttons in notification toast
0
SanityComment
- This might cause textures to look blurry and sculpties might fail to load properly.
+ This might cause textures to look blurry and sculpties might fail to load properly. Please see "Preferences -> Graphics -> Rendering -> Max Texture Quality Level" to change.
Backup
0
@@ -23798,17 +23809,6 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
1
- FSPurgeInventoryCacheOnStartup
-
- Comment
- Clear the inventory cache of the specific agent (ID) at next startup
- Persist
- 1
- Type
- String
- Value
-
-
FSSoundCacheLocation
Comment
@@ -25203,6 +25203,17 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
1
+ FSOutputDeviceUUID
+
+ Comment
+ UUID of the output device used for inworld sound playback
+ Persist
+ 1
+ Type
+ String
+ Value
+ 00000000-0000-0000-0000-000000000000
+
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 7c897bc670..ebc6d1d2ac 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -711,6 +711,17 @@
Value
0
+ UseAOStands
+
+ Comment
+ Use the viewer side Animation Overrider for standing and turning animations when enabled
+ Persist
+ 0
+ Type
+ Boolean
+ Value
+ 1
+
UseFullAOInterface
Comment
diff --git a/indra/newview/daeexport.cpp b/indra/newview/daeexport.cpp
index 7078c32daf..15984fcf1c 100644
--- a/indra/newview/daeexport.cpp
+++ b/indra/newview/daeexport.cpp
@@ -658,7 +658,9 @@ void DAESaver::addPolygons(daeElement* mesh, const char* geomID, const char* mat
{
for (S32 i = 0; i < face->mNumIndices; i++)
{
- U16 index = index_offset + face->mIndices[i];
+ // FIRE-24016 Allow >64k verts in exported mesh
+ // Contributed by Angus Boyd
+ U32 index = index_offset + face->mIndices[i];
(p->getValue()).append(index);
if (i % 3 == 0)
{
diff --git a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
index fc0cf86170..1c161565a8 100644
--- a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
+++ b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt
@@ -7,7 +7,7 @@
//
// Bridge platform
- string BRIDGE_VERSION = "2.24"; // This should match fslslbridge.cpp
+ string BRIDGE_VERSION = "2.25"; // This should match fslslbridge.cpp
string gLatestURL;
integer gViewerIsFirestorm;
integer gTryHandshakeOnce = TRUE;
@@ -610,19 +610,29 @@ default
else if ((zhaoPos = llSubStringIndex(msg, "ZHAO_")) >= 0)
{
zhaoPos += 5; // Skip past prefix
- if (llGetSubString(msg, zhaoPos, zhaoPos + 4) == "AOOFF" || llGetSubString(msg, zhaoPos, zhaoPos + 7) == "STANDOFF")
+ if (llGetSubString(msg, zhaoPos, zhaoPos + 4) == "AOOFF")
{
aoState("off");
}
- else if (llGetSubString(msg, zhaoPos, zhaoPos + 3) == "AOON" || llGetSubString(msg, zhaoPos, zhaoPos + 6) == "STANDON")
+ else if (llGetSubString(msg, zhaoPos, zhaoPos + 3) == "AOON")
{
aoState("on");
}
+ else if (llGetSubString(msg, zhaoPos, zhaoPos + 7) == "STANDOFF")
+ {
+ aoState("standoff");
+ }
+ else if (llGetSubString(msg, zhaoPos, zhaoPos + 6) == "STANDON")
+ {
+ aoState("standon");
+ }
}
}
// LockMeister AO interface listen handler
- else if (fromChan == AO_CHANNEL_LM && (key)llGetSubString(msg, 0, 35) == gOwner)
+ else if (fromChan == AO_CHANNEL_LM &&
+ (key)llGetSubString(msg, 0, 35) == gOwner &&
+ llList2Key(llGetObjectDetails(senderID, [OBJECT_ROOT]), 0) != gAO_CollarKey)
{
string command = llList2String(llParseStringKeepNulls(llGetSubString(msg, 36, -1), [ "|" ], []), 0);
if (command == "booton")
diff --git a/indra/newview/fsdata.cpp b/indra/newview/fsdata.cpp
index 0c25e81319..185abe23d7 100644
--- a/indra/newview/fsdata.cpp
+++ b/indra/newview/fsdata.cpp
@@ -263,7 +263,7 @@ void downloadCompleteScript(LLSD const &aData, std::string const &aURL, std::str
LL_WARNS("fsdata") << "Could not read the script library data from "<< aURL << LL_ENDL;
return;
}
-
+
LLAPRFile outfile ;
outfile.open(aFilename, LL_APR_WB);
if (!outfile.getFileHandle())
@@ -366,7 +366,7 @@ void FSData::downloadAgents()
// TODO: Let the opensim devs and opensim group figure out the best way
// to add "agents.xml" URL to the gridinfo protocol.
//getAgentsURL();
-
+
// there is no need for assets.xml URL for opensim grids as the grid owner can just delete
// the bad asset itself.
}
@@ -376,7 +376,7 @@ void FSData::downloadAgents()
mAgentsURL = mBaseURL + "/" + "agents.xml";
mAssetsURL = mBaseURL + "/" + "assets.xml";
}
-
+
if (!mAgentsURL.empty())
{
mAgentsFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename_prefix + "_agents.xml");
@@ -424,7 +424,7 @@ void FSData::processData(const LLSD& fs_data)
LLSD::array_const_iterator iter = mRandomMOTDs.beginArray();
gAgent.mMOTD.assign((iter + (ll_rand((S32)mRandomMOTDs.size())))->asString());
}
-
+
// If the event falls withen the current date, use that for MOTD instead.
if (fs_data.has("EventsMOTD"))
{
@@ -521,7 +521,7 @@ void FSData::processAgents(const LLSD& data)
if (data.has("Agents"))
{
const LLSD& agents = data["Agents"];
- for(LLSD::map_const_iterator iter = agents.beginMap(); iter != agents.endMap(); ++iter)
+ for (LLSD::map_const_iterator iter = agents.beginMap(); iter != agents.endMap(); ++iter)
{
LLUUID key = LLUUID(iter->first);
mSupportAgents[key] = iter->second.asInteger();
@@ -556,13 +556,23 @@ void FSData::processAgents(const LLSD& data)
if (data.has("SupportGroups"))
{
const LLSD& support_groups = data["SupportGroups"];
- for(LLSD::map_const_iterator itr = support_groups.beginMap(); itr != support_groups.endMap(); ++itr)
+ for (LLSD::map_const_iterator itr = support_groups.beginMap(); itr != support_groups.endMap(); ++itr)
{
mSupportGroup.insert(LLUUID(itr->first));
LL_DEBUGS("fsdata") << "Added " << itr->first << " to mSupportGroup" << LL_ENDL;
}
}
+ if (data.has("TestingGroups"))
+ {
+ const LLSD& testing_groups = data["TestingGroups"];
+ for (LLSD::map_const_iterator itr = testing_groups.beginMap(); itr != testing_groups.endMap(); ++itr)
+ {
+ mTestingGroup.insert(LLUUID(itr->first));
+ LL_DEBUGS("fsdata") << "Added " << itr->first << " to mTestingGroup" << LL_ENDL;
+ }
+ }
+
// The presence of just the key is enough to determine that legacy search needs to be disabled on this grid.
if (data.has("DisableLegacySearch"))
{
@@ -663,8 +673,7 @@ LLSD FSData::resolveClientTag(const LLUUID& id, bool new_system, const LLColor4&
if (curtag.has("name")) curtag["tpvd"] = true;
}
}
-
-
+
// Filtering starts here:
//WS: If we have a tag using the new system, check if we want to display it's name and/or color
if (new_system)
@@ -676,6 +685,7 @@ LLSD FSData::resolveClientTag(const LLUUID& id, bool new_system, const LLColor4&
LLStringFn::replace_ascii_controlchars(clienttagname, LL_UNKNOWN_CHAR);
curtag["name"] = clienttagname;
}
+
if (color_client_tags >= 3 || curtag["tpvd"].asBoolean())
{
if (curtag["tpvd"].asBoolean() && color_client_tags < 3)
@@ -821,9 +831,19 @@ LLSD FSData::allowedLogin()
}
}
+bool FSData::isFirestormGroup(const LLUUID& id)
+{
+ return isSupportGroup(id) || isTestingGroup(id);
+}
+
bool FSData::isSupportGroup(const LLUUID& id)
{
- return (mSupportGroup.count(id));
+ return mSupportGroup.count(id);
+}
+
+bool FSData::isTestingGroup(const LLUUID& id)
+{
+ return mTestingGroup.count(id);
}
bool FSData::isAgentFlag(const LLUUID& agent_id, flags_t flag)
diff --git a/indra/newview/fsdata.h b/indra/newview/fsdata.h
index 769aa4203e..fa17f34391 100644
--- a/indra/newview/fsdata.h
+++ b/indra/newview/fsdata.h
@@ -46,7 +46,7 @@ public:
void addAgents();
LLSD resolveClientTag(const LLUUID& id, bool new_system, const LLColor4& new_system_color);
-
+
enum flags_t
{
SUPPORT = (1 << 0), //0x01 1
@@ -60,23 +60,26 @@ public:
};
std::set mSupportGroup;
+ std::set mTestingGroup;
bool isDeveloper(const LLUUID& avatar_id);
bool isSupport(const LLUUID& avatar_id);
bool isQA(const LLUUID& avatar_id);
+ bool isFirestormGroup(const LLUUID& id);
bool isSupportGroup(const LLUUID& id);
+ bool isTestingGroup(const LLUUID& id);
// returns -1 if agent is not found.
S32 getAgentFlags(const LLUUID& avatar_id);
LLSD allowedLogin();
-
+
bool enableLegacySearch() {return mLegacySearch;}
std::string processRequestForInfo(const LLUUID& requester, const std::string& message, const std::string& name, const LLUUID& sessionid);
static LLSD getSystemInfo();
static void callbackReqInfo(const LLSD ¬ification, const LLSD &response);
-
+
std::string getOpenSimMOTD() { return mOpenSimMOTD; }
void selectNextMOTD();
diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp
index 1d3183a88e..eb8a9aaebb 100644
--- a/indra/newview/fsfloaterim.cpp
+++ b/indra/newview/fsfloaterim.cpp
@@ -386,8 +386,9 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
utf8_text = FSCommon::applyMuPose(utf8_text);
// Support group chat prefix
- static LLCachedControl chat_prefix(gSavedSettings, "FSSupportGroupChatPrefix2");
- if (chat_prefix && FSData::getInstance()->isSupportGroup(mSessionID))
+ 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))
{
// FIRE-7075: Skin indicator
static LLCachedControl FSInternalSkinCurrent(gSavedSettings, "FSInternalSkinCurrent");
@@ -402,18 +403,45 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
skin_indicator = skin_indicator.substr(0, 1); // "FS 4.4.1f os", "FS 4.4.1v", "FS 4.4.1a", "FS 4.4.1s os", "FS 4.4.1m os" etc.
}
//
-
+
+ //Address size check
#if ADDRESS_SIZE == 32
- std::string str_fs_tag = "FS ";
+ std::string str_address_size_tag = "32";
#else
- std::string str_fs_tag = "FS64 ";
+ std::string str_address_size_tag = "";
#endif
- std::string str_os_tag;
+
+ //OpenSim check
+ std::string str_opensim_tag;
#ifdef OPENSIM
- str_os_tag = " os";
+ str_opensim_tag = " os";
#endif
+
+ //Operating System check
+#if LL_WINDOWS
+ std::string str_operating_system_tag = "W";
+#elif LL_LINUX
+ std::string str_operating_system_tag = "L";
+#elif LL_DARWIN
+ std::string str_operating_system_tag = "M";
+#endif
+
+ //RLV check
+ std::string str_rlv_enabled = "";
+ if(RlvHandler::isEnabled())
+ str_rlv_enabled = "*";
+
+
+ //Build it up
size_t insert_pos = is_irc_me_prefix(utf8_text) ? 4 : 0;
- utf8_text.insert(insert_pos, ("(" + str_fs_tag + LLVersionInfo::getShortVersion() + skin_indicator + str_os_tag + ") "));
+
+ //For testing/beta groups, we display the build version since it doesn't speed by and this might change often
+ if(chat_prefix_testing && FSData::getInstance()->isTestingGroup(mSessionID))
+ utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getBuildVersion() + skin_indicator + str_rlv_enabled + str_opensim_tag + ") "));
+
+ //For release support groups, only display the short version(Major.Minor.Patch) since chat can speed by. This makes it easier on Support's eyes.
+ else if(chat_prefix_support && FSData::getInstance()->isSupportGroup(mSessionID))
+ utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getShortVersion() + skin_indicator + str_rlv_enabled + str_opensim_tag + ") "));
}
// Allow user to send system info.
@@ -887,19 +915,24 @@ BOOL FSFloaterIM::postBuild()
getChild("send_chat")->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL));
- bool isFSSupportGroup = FSData::getInstance()->isSupportGroup(mSessionID);
- childSetVisible("support_panel", isFSSupportGroup);
+ bool isFSSupportGroup = FSData::getInstance()->isFirestormGroup(mSessionID);
+ 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
@@ -2150,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/fslslbridge.cpp b/indra/newview/fslslbridge.cpp
index 8e44db095d..a233cd9321 100644
--- a/indra/newview/fslslbridge.cpp
+++ b/indra/newview/fslslbridge.cpp
@@ -54,7 +54,7 @@
static const std::string FS_BRIDGE_FOLDER = "#LSL Bridge";
static const std::string FS_BRIDGE_CONTAINER_FOLDER = "Landscaping";
static const U32 FS_BRIDGE_MAJOR_VERSION = 2;
-static const U32 FS_BRIDGE_MINOR_VERSION = 24;
+static const U32 FS_BRIDGE_MINOR_VERSION = 25;
static const U32 FS_MAX_MINOR_VERSION = 99;
static const std::string UPLOAD_SCRIPT_CURRENT = "EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt";
static const std::string FS_STATE_ATTRIBUTE = "state=";
@@ -320,11 +320,20 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 2) == "on")
{
gSavedPerAccountSettings.setBOOL("UseAO", TRUE);
+ gSavedPerAccountSettings.setBOOL("UseAOStands", TRUE);
}
else if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 3) == "off")
{
gSavedPerAccountSettings.setBOOL("UseAO", FALSE);
}
+ else if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 7) == "standon")
+ {
+ gSavedPerAccountSettings.setBOOL("UseAOStands", TRUE);
+ }
+ else if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 8) == "standoff")
+ {
+ gSavedPerAccountSettings.setBOOL("UseAOStands", FALSE);
+ }
else
{
LL_WARNS("FSLSLBridge") << "AO control - Received unknown state" << LL_ENDL;
diff --git a/indra/newview/fspanelprofile.cpp b/indra/newview/fspanelprofile.cpp
index 8b7f2febbb..f74e2f8e45 100644
--- a/indra/newview/fspanelprofile.cpp
+++ b/indra/newview/fspanelprofile.cpp
@@ -458,8 +458,9 @@ void FSPanelProfileSecondLife::onAvatarNameCache(const LLUUID& agent_id, const L
void FSPanelProfileSecondLife::fillCommonData(const LLAvatarData* avatar_data)
{
- //remove avatar id from cache to get fresh info
- LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
+ // Refresh avatar id in cache with new info to prevent re-requests
+ // and to make sure icons in text will be up to date
+ LLAvatarIconIDCache::getInstance()->add(avatar_data->avatar_id, avatar_data->image_id);
LLStringUtil::format_map_t args;
{
@@ -475,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/llappviewer.cpp b/indra/newview/llappviewer.cpp
index fc45aa0fe0..17b88b93e0 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4939,16 +4939,7 @@ bool LLAppViewer::initCache()
if(!read_only)
{
- // Clear inventory cache button
- std::string clear_inventory_agent_id = gSavedSettings.getString("FSPurgeInventoryCacheOnStartup");
- if (clear_inventory_agent_id != std::string())
- {
- gSavedSettings.setString("FSPurgeInventoryCacheOnStartup", std::string());
- std::string inv_cache_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, clear_inventory_agent_id + ".inv.gz");
- LL_INFOS("LLAppViewer") << "Purging inventory cache file: " << inv_cache_file << LL_ENDL;
- LLFile::remove(inv_cache_file);
- }
- //
+ // Purge inventory cache is done in LLInventoryModel::loadSkeleton()
// Purge cache if user requested it
if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index b8a98ece4d..b02b461aff 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -919,30 +919,45 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
//if (volume->getAvatar() && volume->getAvatar()->isControlAvatar())
if (volume->getAvatar())
{
- const LLVector3* av_box = volume->getAvatar()->getLastAnimExtents();
- LLVector3d cam_pos = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin());
- LLVector3 cam_region_pos = LLVector3(cam_pos - volume->getRegion()->getOriginGlobal());
+ // BUG-227041 Fix bad camera position calc forces LOD0 display on non-rigged attachments
+ // TODO: (maybe) Fixing this proved another bug, Rigged mesh attachments have the distance calcualted here then ignored.
+ // TODO: A further fix might be to remove this entirely in favour of calcLOD, waiting on Vir/Oz to reply.
+ // const LLVector3* av_box = volume->getAvatar()->getLastAnimExtents();
+ // LLVector3d cam_pos = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin());
+ // LLVector3 cam_region_pos = LLVector3(cam_pos - volume->getRegion()->getOriginGlobal());
- LLVector3 cam_to_box_offset = point_to_box_offset(cam_region_pos, av_box);
+ // LLVector3 cam_to_box_offset = point_to_box_offset(cam_region_pos, av_box);
+ // mDistanceWRTCamera = llmax(0.01f, ll_round(cam_to_box_offset.magVec(), 0.01f));
+ // LL_DEBUGS("DynamicBox") << volume->getAvatar()->getFullname()
+ // << " pos (ignored) " << pos
+ // << " cam pos " << cam_pos
+ // << " cam region pos " << cam_region_pos
+ // << " box " << av_box[0] << "," << av_box[1]
+ // << " -> dist " << mDistanceWRTCamera
+ // << LL_ENDL;
+ const LLVector3* av_box = volume->getAvatar()->getLastAnimExtents();
+ LLVector3 cam_pos_from_agent = LLViewerCamera::getInstance()->getOrigin();
+ LLVector3 cam_to_box_offset = point_to_box_offset(cam_pos_from_agent, av_box);
mDistanceWRTCamera = llmax(0.01f, ll_round(cam_to_box_offset.magVec(), 0.01f));
LL_DEBUGS("DynamicBox") << volume->getAvatar()->getFullname()
- << " pos (ignored) " << pos
- << " cam pos " << cam_pos
- << " cam region pos " << cam_region_pos
- << " box " << av_box[0] << "," << av_box[1]
- << " -> dist " << mDistanceWRTCamera
- << LL_ENDL;
+ << " pos (ignored) " << pos
+ << " cam pos " << cam_pos_from_agent
+ << " box " << av_box[0] << "," << av_box[1]
+ << " -> dist " << mDistanceWRTCamera
+ << LL_ENDL;
+ //
mVObjp->updateLOD();
return;
}
-
}
else
{
pos = LLVector3(getPositionGroup().getF32ptr());
}
- pos -= camera.getOrigin();
+
+ pos -= camera.getOrigin();
+
mDistanceWRTCamera = ll_round(pos.magVec(), 0.01f);
mVObjp->updateLOD();
}
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/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 489c1a02cd..db95618bd0 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -68,6 +68,7 @@ LLFilePicker LLFilePicker::sInstance;
//#define IMPORT_FILTER L"Import (*.oxp; *.hpa)\0*.oxp;*.hpa\0"
#define IMPORT_FILTER L"Import (*.oxp)\0*.oxp\0"
//
+#define EXE_FILTER L"Programs (*.exe)\0*.exe\0" // fix file picker EXE filtering
#endif
#ifdef LL_DARWIN
@@ -178,13 +179,22 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
switch (filter)
{
case FFLOAD_ALL:
- case FFLOAD_EXE:
+ // fix file picker EXE filtering
mOFN.lpstrFilter = L"All Files (*.*)\0*.*\0" \
SOUND_FILTER \
IMAGE_FILTER \
ANIM_FILTER \
L"\0";
break;
+ case FFLOAD_EXE:
+ // fix file picker EXE filtering
+ /*mOFN.lpstrFilter = L"All Files (*.*)\0*.*\0" \
+ SOUND_FILTER \
+ IMAGE_FILTER \
+ ANIM_FILTER \*/
+ mOFN.lpstrFilter = EXE_FILTER \
+ L"\0";
+ break;
case FFLOAD_WAV:
mOFN.lpstrFilter = SOUND_FILTER \
L"\0";
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 57b08242b0..b5d7a007bd 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -140,8 +140,10 @@
#include "fsfloaterimcontainer.h"
#include "growlmanager.h"
#include "lfsimfeaturehandler.h"
+#include "llaudioengine.h" // Output device selection
#include "llavatarname.h" // Deeper name cache stuffs
#include "lleventtimer.h"
+#include "llviewermenufile.h" // FIRE-23606 Reveal path to external script editor in prefernces
#include "lldiriterator.h" // for populating the fonts combo
#include "llline.h"
#include "llpanelblockedlist.h"
@@ -160,6 +162,13 @@
#include
#endif
+// FIRE-23606 Reveal path to external script editor in prefernces
+#if LL_DARWIN
+#include
+#include // [FS:CR]
+#endif
+//
+
// FIRE-6340, FIRE-6567 - Setting Bandwidth issues
//const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f;
char const* const VISIBILITY_DEFAULT = "default";
@@ -302,7 +311,12 @@ bool callback_clear_inventory_cache(const LLSD& notification, const LLSD& respon
if ( option == 0 ) // YES
{
// flag client texture cache for clearing next time the client runs
- gSavedSettings.setString("FSPurgeInventoryCacheOnStartup", gAgentID.asString());
+
+ // use a marker file instead of a settings variable to prevent logout crashes and
+ // dual log ins from messing with the flag. -Zi
+ std::string delete_cache_marker = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, gAgentID.asString() + "_DELETE_INV_GZ");
+ FILE* fd = LLFile::fopen(delete_cache_marker, "w");
+ LLFile::close(fd);
LLNotificationsUtil::add("CacheWillClear");
}
@@ -571,6 +585,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
//
mCommitCallbackRegistrar.add("NACL.AntiSpamUnblock", boost::bind(&LLFloaterPreference::onClickClearSpamList, this));
mCommitCallbackRegistrar.add("NACL.SetPreprocInclude", boost::bind(&LLFloaterPreference::setPreprocInclude, this));
+ // FIRE-23606 Reveal path to external script editor in prefernces
+ mCommitCallbackRegistrar.add("Pref.SetExternalEditor", boost::bind(&LLFloaterPreference::setExternalEditor, this));
//[ADD - Clear Settings : SJ]
mCommitCallbackRegistrar.add("Pref.ClearSettings", boost::bind(&LLFloaterPreference::onClickClearSettings, this));
mCommitCallbackRegistrar.add("Pref.Online_Notices", boost::bind(&LLFloaterPreference::onClickChatOnlineNotices, this));
@@ -1900,6 +1916,83 @@ void LLFloaterPreference::changePreprocIncludePath(const std::vector FIRE-23606 Reveal path to external script editor in prefernces
+void LLFloaterPreference::setExternalEditor()
+{
+ std::string cur_name(gSavedSettings.getString("ExternalEditor"));
+ std::string proposed_name(cur_name);
+
+ (new LLFilePickerReplyThread(boost::bind(&LLFloaterPreference::changeExternalEditorPath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile();
+}
+
+void LLFloaterPreference::changeExternalEditorPath(const std::vector& filenames)
+{
+ const std::string chosen_path = filenames[0];
+ std::string executable_path = chosen_path;
+#if LL_DARWIN
+ // on Mac, if it's an application bundle, figure out the actual path from the Info.plist file
+ CFStringRef path_cfstr = CFStringCreateWithCString(kCFAllocatorDefault, chosen_path.c_str(), kCFStringEncodingMacRoman); // get path as a CFStringRef
+ CFURLRef path_url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path_cfstr, kCFURLPOSIXPathStyle, TRUE); // turn it into a CFURLRef
+ CFBundleRef chosen_bundle = CFBundleCreate(kCFAllocatorDefault, path_url); // get a handle for the bundle
+ CFRelease(path_url); // [FS:CR] Don't leave a mess clean up our objects after we use them
+ LLSD args;
+ if (NULL != chosen_bundle)
+ {
+ CFDictionaryRef bundleInfoDict = CFBundleGetInfoDictionary(chosen_bundle); // get the bundle's dictionary
+ CFRelease(chosen_bundle); // [FS:CR] Don't leave a mess clean up our objects after we use them
+ if (NULL != bundleInfoDict)
+ {
+ CFStringRef executable_cfstr = (CFStringRef)CFDictionaryGetValue(bundleInfoDict, CFSTR("CFBundleExecutable")); // get the name of the actual executable (e.g. TextEdit or firefox-bin)
+ int max_file_length = 256; // (max file name length is 255 in OSX)
+ char executable_buf[max_file_length];
+ if (CFStringGetCString(executable_cfstr, executable_buf, max_file_length, kCFStringEncodingMacRoman)) // convert CFStringRef to char*
+ {
+ executable_path += std::string("/Contents/MacOS/") + std::string(executable_buf); // append path to executable directory and then executable name to exec path
+ }
+ else
+ {
+ std::string warning = "Unable to get CString from CFString for executable path";
+ LL_WARNS() << warning << LL_ENDL;
+ args["MESSAGE"] = warning;
+ LLNotificationsUtil::add("GenericAlert", args);
+ }
+ }
+ else
+ {
+ std::string warning = "Unable to get bundle info dictionary from application bundle";
+ LL_WARNS() << warning << LL_ENDL;
+ args["MESSAGE"] = warning;
+ LLNotificationsUtil::add("GenericAlert", args);
+ }
+ }
+ else
+ {
+ if (-1 != executable_path.find(".app")) // only warn if this path actually had ".app" in it, i.e. it probably just wasn'nt an app bundle and that's okay
+ {
+ std::string warning = std::string("Unable to get bundle from path \"") + chosen_path + std::string("\"");
+ LL_WARNS() << warning << LL_ENDL;
+ args["MESSAGE"] = warning;
+ LLNotificationsUtil::add("GenericAlert", args);
+ }
+ }
+
+#endif
+ {
+ std::string bin = executable_path;
+ if (!bin.empty())
+ {
+ // surround command with double quotes for the case if the path contains spaces
+ if (bin.find("\"") == std::string::npos)
+ {
+ bin = "\"" + bin + "\"";
+ }
+ executable_path = bin;
+ }
+ }
+ gSavedSettings.setString("ExternalEditor", executable_path);
+}
+//
+
//[FIX JIRA-1971 : SJ] Show an notify when Javascript setting change
void LLFloaterPreference::onClickJavascript()
{
@@ -2208,9 +2301,6 @@ void LLFloaterPreference::refreshEnabledState()
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
ctrl_shadow->setEnabled(enabled);
-
- LLComboBox* ctrl_avatar_shadow = getChild("AvatarShadowDetail");
- ctrl_avatar_shadow->setEnabled(enabled && ctrl_shadow->getValue().asInteger() > 0);
// now turn off any features that are unavailable
disableUnavailableSettings();
@@ -2422,7 +2512,6 @@ void LLFloaterPreference::disableUnavailableSettings()
LLComboBox* ctrl_shadows = getChild("ShadowDetail");
LLCheckBoxCtrl* ctrl_ssao = getChild("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild("UseDoF");
- LLComboBox* ctrl_avatar_shadow = getChild("AvatarShadowDetail");
LLSliderCtrl* sky = getChild("SkyMeshDetail");
// if vertex shaders off, disable all shader related products
@@ -2447,9 +2536,6 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
-
- ctrl_avatar_shadow->setEnabled(FALSE);
- ctrl_avatar_shadow->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -2473,9 +2559,6 @@ void LLFloaterPreference::disableUnavailableSettings()
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
- ctrl_avatar_shadow->setEnabled(FALSE);
- ctrl_avatar_shadow->setValue(0);
-
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -2492,9 +2575,6 @@ void LLFloaterPreference::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
-
- ctrl_avatar_shadow->setEnabled(FALSE);
- ctrl_avatar_shadow->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -2518,9 +2598,6 @@ void LLFloaterPreference::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
-
- ctrl_avatar_shadow->setEnabled(FALSE);
- ctrl_avatar_shadow->setValue(0);
}
// disabled reflections
@@ -2542,9 +2619,6 @@ void LLFloaterPreference::disableUnavailableSettings()
//deferred needs AvatarVP, disable deferred
ctrl_shadows->setEnabled(FALSE);
ctrl_shadows->setValue(0);
-
- ctrl_avatar_shadow->setEnabled(FALSE);
- ctrl_avatar_shadow->setValue(0);
ctrl_ssao->setEnabled(FALSE);
ctrl_ssao->setValue(FALSE);
@@ -5328,8 +5402,25 @@ void FSPanelPreferenceBackup::changeBackupSettingsPath(const std::vector
//
-#ifdef OPENSIM
static LLPanelInjector t_pref_opensim("panel_preference_opensim");
+#ifdef OPENSIM
LLPanelPreferenceOpensim::LLPanelPreferenceOpensim() : LLPanelPreference(),
mGridListControl(NULL)
{
@@ -6138,6 +6229,117 @@ void LLPanelPreferenceOpensim::onClickPickDebugSearchURL()
LLNotificationsUtil::add("ConfirmPickDebugSearchURL", LLSD(), LLSD(),callback_pick_debug_search );
}
+#else
+void no_cb()
+{ }
-#endif // OPENSIM
+LLPanelPreferenceOpensim::LLPanelPreferenceOpensim() : LLPanelPreference()
+{
+ mCommitCallbackRegistrar.add("Pref.ClearDebugSearchURL", boost::bind(&no_cb));
+ mCommitCallbackRegistrar.add("Pref.PickDebugSearchURL", boost::bind(&no_cb));
+ mCommitCallbackRegistrar.add("Pref.AddGrid", boost::bind(&no_cb));
+ mCommitCallbackRegistrar.add("Pref.ClearGrid", boost::bind(&no_cb));
+ mCommitCallbackRegistrar.add("Pref.RefreshGrid", boost::bind(&no_cb));
+ mCommitCallbackRegistrar.add("Pref.RemoveGrid", boost::bind(&no_cb));
+ mCommitCallbackRegistrar.add("Pref.SaveGrid", boost::bind(&no_cb));
+}
+#endif
//
+
+// Output device selection
+static LLPanelInjector t_pref_sounds("panel_preference_sounds");
+
+FSPanelPreferenceSounds::FSPanelPreferenceSounds() :
+ LLPanelPreference(),
+ mOutputDevicePanel(nullptr),
+ mOutputDeviceComboBox(nullptr),
+ mOutputDeviceListChangedConnection()
+{ }
+
+FSPanelPreferenceSounds::~FSPanelPreferenceSounds()
+{
+ if (mOutputDeviceListChangedConnection.connected())
+ {
+ mOutputDeviceListChangedConnection.disconnect();
+ }
+}
+
+BOOL FSPanelPreferenceSounds::postBuild()
+{
+ mOutputDevicePanel = findChild("output_device_settings_panel");
+ mOutputDeviceComboBox = findChild("sound_output_device");
+
+#if LL_FMODSTUDIO || LL_FMODEX
+ if (gAudiop && mOutputDevicePanel && mOutputDeviceComboBox)
+ {
+ gSavedSettings.getControl("FSOutputDeviceUUID")->getSignal()->connect(boost::bind(&FSPanelPreferenceSounds::onOutputDeviceChanged, this, _2));
+
+ mOutputDeviceListChangedConnection = gAudiop->setOutputDeviceListChangedCallback(boost::bind(&FSPanelPreferenceSounds::onOutputDeviceListChanged, this, _1));
+ onOutputDeviceListChanged(gAudiop->getDevices());
+
+ mOutputDeviceComboBox->setCommitCallback(boost::bind(&FSPanelPreferenceSounds::onOutputDeviceSelectionChanged, this, _2));
+ }
+#else
+ if (mOutputDevicePanel)
+ {
+ mOutputDevicePanel->setVisible(FALSE);
+ }
+#endif
+
+ return LLPanelPreference::postBuild();
+}
+
+void FSPanelPreferenceSounds::onOutputDeviceChanged(const LLSD& new_value)
+{
+ mOutputDeviceComboBox->setSelectedByValue(new_value.asUUID(), TRUE);
+}
+
+void FSPanelPreferenceSounds::onOutputDeviceSelectionChanged(const LLSD& new_value)
+{
+ gSavedSettings.setString("FSOutputDeviceUUID", mOutputDeviceComboBox->getSelectedValue().asString());
+}
+
+void FSPanelPreferenceSounds::onOutputDeviceListChanged(LLAudioEngine::output_device_map_t output_devices)
+{
+ LLUUID selected_device(gSavedSettings.getString("FSOutputDeviceUUID"));
+ mOutputDeviceComboBox->removeall();
+
+ if (output_devices.empty())
+ {
+ LL_INFOS() << "No output devices available" << LL_ENDL;
+ mOutputDeviceComboBox->add(mOutputDevicePanel->getString("output_no_device"), LLUUID::null);
+
+ if (selected_device != LLUUID::null)
+ {
+ LL_INFOS() << "Non-default device selected - adding unavailable for " << selected_device << LL_ENDL;
+ mOutputDeviceComboBox->add(mOutputDevicePanel->getString("output_device_unavailable"), selected_device);
+ }
+ }
+ else
+ {
+ bool selected_device_found = false;
+
+ mOutputDeviceComboBox->add(mOutputDevicePanel->getString("output_default_text"), LLUUID::null);
+ selected_device_found = selected_device == LLUUID::null;
+
+ for (auto device : output_devices)
+ {
+ mOutputDeviceComboBox->add(device.second.empty() ? mOutputDevicePanel->getString("output_name_no_device") : device.second, device.first);
+
+ if (!selected_device_found && device.first == selected_device)
+ {
+ LL_INFOS() << "Found selected device \"" << device.second << "\" (" << device.first << ")" << LL_ENDL;
+ selected_device_found = true;
+ }
+ }
+
+ if (!selected_device_found)
+ {
+ LL_INFOS() << "Selected device " << selected_device << " NOT found - adding unavailable" << LL_ENDL;
+ mOutputDeviceComboBox->add(mOutputDevicePanel->getString("output_device_unavailable"), selected_device);
+ }
+ }
+
+ mOutputDeviceComboBox->setSelectedByValue(selected_device, TRUE);
+}
+//
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 4ec490e6fa..d6eff687bd 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -38,6 +38,8 @@
#include "llconversationlog.h"
#include "llsearcheditor.h"
+#include "llaudioengine.h" // Output device selection
+
class LLConversationLogObserver;
class LLPanelPreference;
class LLPanelLCD;
@@ -199,6 +201,10 @@ public:
void onClickPreviewUISound(const LLSD& ui_sound_id); // FIRE-8190: Preview function for "UI Sounds" Panel
void setPreprocInclude();
void changePreprocIncludePath(const std::vector& filenames, std::string proposed_name);
+ // FIRE-23606 Reveal path to external script editor in prefernces
+ void setExternalEditor();
+ void changeExternalEditorPath(const std::vector& filenames);
+ //
void onClickEnablePopup();
void onClickDisablePopup();
void resetAllIgnored();
@@ -522,6 +528,7 @@ protected:
void doSelect(BOOL all); // calls applySelection for each list
void applySelection(LLScrollListCtrl* control, BOOL all); // selects or deselects all items in a scroll list
+ void doBackupSettings(const LLSD& notification, const LLSD& response); // callback for backup dialog
void doRestoreSettings(const LLSD& notification, const LLSD& response); // callback for restore dialog
void onQuitConfirmed(const LLSD& notification, const LLSD& response); // callback for finished restore dialog
//
@@ -530,12 +537,13 @@ private:
LOG_CLASS(FSPanelPreferenceBackup);
};
-#ifdef OPENSIM //
//
class LLPanelPreferenceOpensim : public LLPanelPreference
{
public:
LLPanelPreferenceOpensim();
+
+#ifdef OPENSIM
//
/*virtual*/ BOOL postBuild();
/*virtual*/ void apply();
@@ -570,11 +578,33 @@ private:
LLLineEditor* mEditorPassword;
LLLineEditor* mEditorSearch;
LLLineEditor* mEditorGridMessage;
+#endif
LOG_CLASS(LLPanelPreferenceOpensim);
};
//
-#endif // OPENSIM //
+
+// Output device selection
+class FSPanelPreferenceSounds : public LLPanelPreference
+{
+public:
+ FSPanelPreferenceSounds();
+ virtual ~FSPanelPreferenceSounds();
+
+ BOOL postBuild();
+
+private:
+ LLPanel* mOutputDevicePanel;
+ LLComboBox* mOutputDeviceComboBox;
+
+ void onOutputDeviceChanged(const LLSD& new_value);
+ void onOutputDeviceSelectionChanged(const LLSD& new_value);
+ void onOutputDeviceListChanged(LLAudioEngine::output_device_map_t output_devices);
+ boost::signals2::connection mOutputDeviceListChangedConnection;
+
+ LOG_CLASS(FSPanelPreferenceSounds);
+};
+//
class LLFloaterPreferenceProxy : public LLFloater
{
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/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index fcfcfcd12b..b3524e141f 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -1137,7 +1137,17 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
group_datap->mGroupPropertiesDataComplete = true;
group_datap->mChanged = TRUE;
-
+ // FIRE-19734/BUG-227094 stop persistent notification recovery spam
+ auto request = LLGroupMgr::getInstance()->mPropRequests.find(group_id);
+ if (request != LLGroupMgr::getInstance()->mPropRequests.end())
+ {
+ LLGroupMgr::getInstance()->mPropRequests.erase(request);
+ }
+ else
+ {
+ LL_DEBUGS() << "GroupPropertyResponse received with no pending request. Response was slow." << LL_ENDL;
+ }
+ //
LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
}
@@ -1507,6 +1517,30 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
return group_datap;
}
+// FIRE-19734/BUG-227094 stop persistent notification recovery spam
+bool LLGroupMgr::hasPendingPropertyRequest(const LLUUID & id)
+{
+ auto existing_req = LLGroupMgr::getInstance()->mPropRequests.find(id);
+ if (existing_req != LLGroupMgr::getInstance()->mPropRequests.end())
+ {
+ if (gFrameTime - existing_req->second < MIN_GROUP_PROPERTY_REQUEST_FREQ)
+ {
+ return true;
+ }
+ else
+ {
+ LLGroupMgr::getInstance()->mPropRequests.erase(existing_req);
+ }
+ }
+ return false;
+}
+
+void LLGroupMgr::addPendingPropertyRequest(const LLUUID& id)
+{
+ LLGroupMgr::getInstance()->mPropRequests[id] = gFrameTime;
+}
+//
+
void LLGroupMgr::notifyObservers(LLGroupChange gc)
{
for (group_map_t::iterator gi = mGroups.begin(); gi != mGroups.end(); ++gi)
@@ -1592,7 +1626,13 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest" << LL_ENDL;
// This will happen when we get the reply
//LLGroupMgrGroupData* group_datap = createGroupData(group_id);
-
+ // FIRE-19734/BUG-227094 stop persistent notification recovery spam
+ if (LLGroupMgr::getInstance()->hasPendingPropertyRequest(group_id))
+ {
+ LL_DEBUGS() << "LLGroupMgr::sendGroupPropertiesRequest suppressed repeat for " << group_id << LL_ENDL;
+ return;
+ }
+ //
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("GroupProfileRequest");
msg->nextBlock("AgentData");
@@ -1601,6 +1641,9 @@ void LLGroupMgr::sendGroupPropertiesRequest(const LLUUID& group_id)
msg->nextBlock("GroupData");
msg->addUUID("GroupID",group_id);
gAgent.sendReliableMessage();
+ // FIRE-19734/BUG-227094 stop persistent notification recovery spam
+ LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
+ //
}
void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 94c5df67eb..6bcd9de3f5 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -453,13 +453,20 @@ private:
void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
void addGroup(LLGroupMgrGroupData* group_datap);
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
-
+ // FIRE-19734/BUG-227094 stop persistent notification recovery spam
+ bool hasPendingPropertyRequest(const LLUUID& id);
+ void addPendingPropertyRequest(const LLUUID& id);
+ //
typedef std::multimap observer_multimap_t;
observer_multimap_t mObservers;
typedef std::map group_map_t;
group_map_t mGroups;
-
+ // FIRE-19734/BUG-227094 stop persistent notification recovery spam
+ const U64MicrosecondsImplicit MIN_GROUP_PROPERTY_REQUEST_FREQ = 100000;//100ms between requests should be enough to avoid spamming.
+ typedef std::map properties_request_map_t;
+ properties_request_map_t mPropRequests;
+ //
typedef std::set observer_set_t;
typedef std::map observer_map_t;
observer_map_t mParticularObservers;
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 2b85c62edb..8553f10f4f 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -6793,6 +6793,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)
{
@@ -6839,6 +6870,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);
@@ -7029,6 +7066,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/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index e79c0e8678..2008a0f23d 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2149,6 +2149,34 @@ bool LLInventoryModel::loadSkeleton(
const LLSD& options,
const LLUUID& owner_id)
{
+ // Purge inventory cache files marked by DELETE_INV_GZ marker files
+ std::string delete_cache_marker = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, owner_id.asString() + "_DELETE_INV_GZ");
+ LL_DEBUGS("LLInventoryModel") << "Checking for clear inventory cache marker: " << delete_cache_marker << LL_ENDL;
+
+ // if this marker exists, go ahead and delete the respective .inv and/or .inv.gz files
+ if (LLFile::isfile(delete_cache_marker))
+ {
+ LL_INFOS("LLInventoryModel") << "Clear inventory cache marker found: " << delete_cache_marker << LL_ENDL;
+
+ std::string inventory_filename = getInvCacheAddres(owner_id);
+ if (LLFile::isfile(inventory_filename))
+ {
+ LL_INFOS("LLInventoryModel") << "Purging inventory cache file: " << inventory_filename << LL_ENDL;
+ LLFile::remove(inventory_filename);
+ }
+
+ inventory_filename.append(".gz");
+ if (LLFile::isfile(inventory_filename))
+ {
+ LL_INFOS("LLInventoryModel") << "Purging inventory cache file: " << inventory_filename << LL_ENDL;
+ LLFile::remove(inventory_filename);
+ }
+
+ LL_INFOS("LLInventoryModel") << "Clear inventory cache marker removed: " << delete_cache_marker << LL_ENDL;
+ LLFile::remove(delete_cache_marker);
+ }
+ //
+
LL_DEBUGS(LOG_INV) << "importing inventory skeleton for " << owner_id << LL_ENDL;
typedef std::set, InventoryIDPtrLess> cat_set_t;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 7ebaa856f1..3af69d799f 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -846,7 +846,7 @@ bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group)
file_name = makeLogFileName(file_name);
return isTranscriptFileFound(makeLogFileName(file_name));
}
- return false;
+ //return false; // Unreachable code
}
bool LLLogChat::isNearbyTranscriptExist()
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index fddcc8d449..e60cdd062b 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -3996,6 +3996,14 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r
return TRUE;
}
+BOOL LLSelectMgr::isSelfAvatarSelected()
+{
+ if (mAllowSelectAvatar)
+ {
+ return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject() == gAgentAvatarp);
+ }
+ return FALSE;
+}
//--------------------------------------------------------------------
// Duplicate objects
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 57ac94954f..f8e0e59d6e 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -793,6 +793,8 @@ public:
LLPermissions* findObjectPermissions(const LLViewerObject* object);
+ BOOL isSelfAvatarSelected();
+
void selectDelete(); // Delete on simulator
void selectForceDelete(); // just delete, no into trash
void selectDuplicate(const LLVector3& offset, BOOL select_copy); // Duplicate on simulator
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index fa5d3ff64c..8fad732e58 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1022,6 +1022,9 @@ bool idle_startup()
bool init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle);
if(init)
{
+ // Output device selection
+ gAudiop->setDevice(LLUUID(gSavedSettings.getString("FSOutputDeviceUUID")));
+
gAudiop->setMuted(TRUE);
}
else
@@ -1399,13 +1402,10 @@ bool idle_startup()
// create necessary directories
// *FIX: these mkdir's should error check
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
+ //gDirUtilp->setLindenUserDir(userid, gridlabel);
std::string gridlabel = LLGridManager::getInstance()->getGridLabel();
- gDirUtilp->setLindenUserDir(userid, gridlabel);
-#else
- gDirUtilp->setLindenUserDir(userid);
-#endif // OPENSIM
+ gDirUtilp->setLindenUserDir(userid, LLGridManager::getInstance()->getGridLabel());
//
LLFile::mkdir(gDirUtilp->getLindenUserDir());
@@ -1473,13 +1473,10 @@ bool idle_startup()
gSavedPerAccountSettings.setString("SnapshotBaseName", gSavedPerAccountSettings.getControl("SnapshotBaseName")->getDefault().asString());
}
//
-// Seperate user directories per grid on OS build
-#ifdef OPENSIM
+// Seperate user directories per grid
+ //gDirUtilp->setPerAccountChatLogsDir(userid);
gDirUtilp->setPerAccountChatLogsDir(userid, gridlabel);
-#else
- gDirUtilp->setPerAccountChatLogsDir(userid);
-#endif // OPENSIM
-//
+//
LLFile::mkdir(gDirUtilp->getChatLogsDir());
LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 1ffc544900..e762f8ac81 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -153,16 +153,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)
@@ -420,6 +448,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);
@@ -736,6 +767,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)
{
@@ -796,16 +838,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");
@@ -821,6 +886,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/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index 3d000d4267..8d5168ba24 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -85,6 +85,22 @@ const std::string &LLVersionInfo::getVersion()
return version;
}
+//
+//static
+const std::string &LLVersionInfo::getBuildVersion()
+{
+ static std::string build_version("");
+ if (build_version.empty())
+ {
+ std::ostringstream stream;
+ stream << LLVersionInfo::getBuild();
+ // cache the version string
+ build_version = stream.str();
+ }
+ return build_version;
+}
+//
+
//static
const std::string &LLVersionInfo::getShortVersion()
{
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
index 5c3b7bf878..fed6b0efb5 100644
--- a/indra/newview/llversioninfo.h
+++ b/indra/newview/llversioninfo.h
@@ -56,6 +56,11 @@ public:
/// return the full viewer version as a string like "2.0.0.200030"
static const std::string &getVersion();
+//
+ /// return the full viewer version as a string like "200030"
+ static const std::string &getBuildVersion();
+//
+
/// return the viewer version as a string like "2.0.0"
static const std::string &getShortVersion();
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index b52b8a5733..8bd4d32ba7 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -954,6 +954,26 @@ void handleFSStatisticsNoFocusChanged(const LLSD& newvalue)
}
//
+// Output device selection
+void handleOutputDeviceChanged(const LLSD& newvalue)
+{
+ if (gAudiop)
+ {
+ gAudiop->setDevice(newvalue.asUUID());
+ }
+}
+//
+
+// FIRE-24081: Disable HiDPI by default and warn if set
+void handleRenderHiDPIChanged(const LLSD& newvalue)
+{
+ if (newvalue)
+ {
+ LLNotificationsUtil::add("EnableHiDPI");
+ }
+}
+// FIRE-24081
+
////////////////////////////////////////////////////////////////////////////
void settings_setup_listeners()
@@ -1011,6 +1031,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
+ gSavedSettings.getControl("RenderHiDPI")->getSignal()->connect(boost::bind(&handleRenderHiDPIChanged, _2));
gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));
gSavedSettings.getControl("ChatConsoleFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _2));
gSavedSettings.getControl("ChatPersistTime")->getSignal()->connect(boost::bind(&handleChatPersistTimeChanged, _2));
@@ -1192,6 +1213,9 @@ void settings_setup_listeners()
// Add ability for the statistics window to not be able to receive focus
gSavedSettings.getControl("FSStatisticsNoFocus")->getSignal()->connect(boost::bind(&handleFSStatisticsNoFocusChanged, _2));
//
+
+ // Output device selection
+ gSavedSettings.getControl("FSOutputDeviceUUID")->getSignal()->connect(boost::bind(&handleOutputDeviceChanged, _2));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index bb502ea7e1..db15723267 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3120,6 +3120,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)
@@ -3129,61 +3190,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/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index f864625c9e..367971b00a 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4929,7 +4929,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
BOOL draw_handles = TRUE;
- if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move)
+ if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isSelfAvatarSelected())
{
draw_handles = FALSE;
}
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 18c9f20701..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,5 +83,18 @@ 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);
+ LLNotificationsUtil::add(SANITY_CHECK, args, LLSD(), boost::bind(SanityCheck::onFixIt, _1, _2, controlp));
+}
+
+void SanityCheck::onFixIt(const LLSD& notification, const LLSD& response, LLControlVariable* controlp)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0) // Fix it
+ {
+ if (controlp)
+ {
+ controlp->resetToDefault(true);
+ return;
+ }
+ }
}
diff --git a/indra/newview/sanitycheck.h b/indra/newview/sanitycheck.h
index f9c5177e25..c5c66b6cb3 100644
--- a/indra/newview/sanitycheck.h
+++ b/indra/newview/sanitycheck.h
@@ -34,7 +34,8 @@ 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);
};
#endif // SANITYCHECK_H
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 69a5b10789..d16c3f7001 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -796,6 +796,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 a8418b44ea..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,7 +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 fa9ddbca2d..a3dba2c65d 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -110,6 +110,7 @@
+
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index d82e19fd98..f4b3e8f6c8 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -4850,6 +4850,14 @@ Grund: [SANITY_COMMENT]
Aktueller Wert: [CURRENT_VALUE]
@@ -4955,14 +4963,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?
+
+
+ Möchten Sie wirklich eine Sicherung in diesem Verzeichnis erstellen?
+[DIRECTORY]
+Bestehende Sicherungen in diesem Verzeichnis werden überschrieben!
+
+
+
Das Wiederherstellen von Einstellungen erfordert einen Neustart des Viewers. Sollen die Einstellungen jetzt wiederhergestellt und der Viewer beendet werden?
@@ -5270,4 +5286,7 @@ Weder Firestorm Viewer, Phoenix Firestorm Viewer Project Inc. noch dessen Team k
Falls Sie diesen Nutzungsbestimmungen nicht zustimmen, sollten keinerlei finanzielle Transaktionen im Rahmen der Nutzung dieses Viewers durchgeführt werden.
+
+ HiDPI kann negative Effekte aufweisen und die Leistung beeinträchtigen.
+
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 01f1b2d010..733eebfdab 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -178,8 +178,8 @@
-
-
+
+
IM-Text vor dem Hintergrund des Chatverlaufs ausblenden
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_firestorm.xml b/indra/newview/skins/default/xui/de/panel_preferences_firestorm.xml
index ded49b8f20..882321fdf5 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_firestorm.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_firestorm.xml
@@ -108,7 +108,7 @@
-
+
@@ -224,6 +224,10 @@
Include-Verzeichnis für Präprozessor:
+
+ Externer Editor:
+
+
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index d8326a0824..642c4a3f46 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -146,14 +146,14 @@
-
+
Maximales Qualitätslevel für Texturen:
-
-
-
-
+
+
+
+
Darstellung von Alpha-Masken:
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index 01be173b89..4c41fda995 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -84,6 +84,9 @@
+
+ Hinweis: Zum Aktivieren der automatischen Antworten setzen Sie Ihren Online-Status über das Hauptmenü unter Unterhalten > Online-Status
+
Automatische Antwort wenn im „Beschäftigt“-Modus:
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
index 9653acc7ac..14fffb3f3b 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
@@ -27,7 +27,25 @@
Schwellwert für L$-Änderung:
-
+
+
+ Standard
+
+
+ Kein Gerät vorhanden
+
+
+ Unbenanntes Gerät
+
+
+ Gerät nicht verfügbar
+
+
+ Ausgabegerät:
+
+
+
+
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 4d143b2e2a..3304bc31e2 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -5970,6 +5970,12 @@ Setzen Sie den Editorpfad in Anführungszeichen
Flugmodus ein-/ausschalten (Pos1)
+
+ Avatar-Animationen stoppen
+
+
+ Avatar-Animationen stoppen
+
Aktiviert/Deaktiviert erzwungenes Sitzen auf dem Boden (Strg+Alt+S)
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index ff31222a61..e4135ac0e5 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
-Albatroz Hird, Alexie Birman, Andromeda Rage, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
+Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
-
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 2ecb8fed7d..63c83bb947 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -3,7 +3,7 @@
legacy_header_height="18"
can_minimize="false"
can_resize="true"
- height="330"
+ height="360"
layout="topleft"
min_height="330"
min_width="410"
@@ -239,6 +239,26 @@
+
+
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index fd6853a102..fe026e75e3 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -855,6 +855,14 @@
function="Inventory.DoToSelected"
parameter="touch" />
+
+
+
+
+
@@ -10491,11 +10499,11 @@ Your viewer cache is currently empty. Please be aware that you may experience sl
Welcome to the Phoenix/Firestorm Viewer Support Group!
-To make support easier, it is recommended to announce your viewer's version to the group. You can choose to display your viewer's version in front of any chat you send to the group. Our support members can give you more meaningful advice right away if they know the viewer version you are on.
+To make support easier, it is recommended to announce your viewer's version to the group. This information includes current viewer version, viewer skin, operating system and RLVa status. You can choose to display your viewer's version in front of any chat you send to the group. Our support members can give you more meaningful advice right away if they know the viewer version you are on.
You can enable and disable this function at any time using the checkbox in the group chat floater.
@@ -12593,6 +12601,19 @@ The backup path could not be found or created.
The backup path could not be found.
+
+Are you sure you want to save a backup to this directory?
+[DIRECTORY]
+Any existing backups in that location will be overwritten!
+
+
+
+
+Enabling HiDPI support may have adverse effects and may impair performance.
+
+
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 5331da0ea5..3c3436f282 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -1134,7 +1134,7 @@
height="18"
name="FSShowIMInChatHistory"
control_name="FSShowIMInChatHistory"
- label="Show IMs in nearby chat window"/>
+ label="Show IMs and Group Chat in Nearby Chat Window"/>
+ label="Save IMs and Group Chat in Nearby Chat"/>
+
+ External Editor:
+
+
+
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 33bfe4c531..0a8d4c22ee 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -1130,21 +1130,22 @@
left_pad="5"
top_pad="-23"
name="TextureDetail"
- width="150">
+ width="150"
+ tool_tip="Quality to load textures to, affects the setting TextureDiscardLevel">
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 03e2e2e982..fe0dfa525b 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -479,7 +479,7 @@
initial_value="160"
layout="topleft"
max_val="32"
- min_val="1"
+ min_val="4"
name="LimitLookAtDistance"
width="150" />
-
+
+ Note: To activate the Autoresponse messages please set your online status via Comm Menu > Online Status
+
Automatic response when in UNAVAILABLE (ie, BUSY) mode:
@@ -524,7 +537,7 @@
use_ellipses="false"
commit_on_focus_lost = "true"
follows="left|top"
- height="55"
+ height="50"
layout="topleft"
left="35"
top_pad="5"
@@ -552,7 +565,7 @@
use_ellipses="false"
commit_on_focus_lost = "true"
follows="left|top"
- height="55"
+ height="50"
layout="topleft"
left="35"
top_pad="5"
@@ -580,7 +593,7 @@
use_ellipses="false"
commit_on_focus_lost = "true"
follows="left|top"
- height="55"
+ height="50"
layout="topleft"
left="35"
top_pad="5"
@@ -606,7 +619,7 @@
use_ellipses="false"
commit_on_focus_lost = "true"
follows="left|top"
- height="55"
+ height="50"
layout="topleft"
left="35"
top_pad="5"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 882939053e..df3e8b04ea 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -414,6 +414,61 @@
name="money_change_threshold"
width="75" />
+
+
+ Default
+
+
+ No device available
+
+
+ Unnamed device
+
+
+ Unavailable device
+
+
+
+ Output device:
+
+
+
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 87d601aa9a..693cded6a7 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2705,6 +2705,8 @@ Try enclosing path to the editor with double quotes.
currently in your right toolbar
Toggle flying mode on/off (HOME)
+ Stop Animations
+ Stop Animating my Avatar
Retain%
diff --git a/indra/newview/skins/default/xui/es/floater_fs_im_session.xml b/indra/newview/skins/default/xui/es/floater_fs_im_session.xml
index 3c4cc50824..05d4496402 100644
--- a/indra/newview/skins/default/xui/es/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/es/floater_fs_im_session.xml
@@ -42,7 +42,11 @@
-
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index f41dc3f431..124e7f8feb 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -5474,9 +5474,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 d439c0d416..6613d6da19 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -5761,6 +5761,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 76008fdfba..b29da50ce4 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -5464,6 +5464,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 abfacdc2dc..b05c03b544 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -3944,7 +3944,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/panel_region_general.xml b/indra/newview/skins/default/xui/it/panel_region_general.xml
index d1aa2d8ae2..3266a8e0b8 100644
--- a/indra/newview/skins/default/xui/it/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_general.xml
@@ -35,8 +35,8 @@
-
-
+
+
Categoria di accesso:
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index f4c6b8bc06..a99b7c67ac 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -5610,6 +5610,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 2234641ead..ee9c2c8f55 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -4329,7 +4329,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 d1bdc7cf36..9876018823 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -5716,6 +5716,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/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 291b17dd16..d29a484cfb 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -24,7 +24,7 @@
-
@@ -3926,10 +3928,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.
@@ -4710,6 +4712,12 @@ Poprzedni symulator: [OLDVERSION]
Ścieżka miejsca zapisu jest pusta. Proszę najpierw podać lokalizację, w jakiej będą zapisywanie i której będą przywracane kopie zapasowe.
+
+ Czy na pewno chcesz zapisać kopię zapasową w tym katalogu?
+[DIRECTORY]
+Wszelkie istniejące kopie zapasowe w tej lokalizacji zostaną nadpisane!
+
+
Przywrócenie ustawień wymaga ponownego uruchomienia przeglądarki. Czy chcesz teraz przywrócić ustawienia i wyłączyć ją?
@@ -4882,6 +4890,9 @@ Mnożnik LOD >8: Brak widocznych efektów. Może powodować błędy.
Należy pamiętać, że zakupy w walucie dokonywane za pośrednictwem Firestorm Viewer są transakcjami między Tobą (użytkownikiem) a dostawcą (-ami) lub sprzedawcą (-ami) waluty.
Ani Firestorm Viewer, ani Phoenix Firestorm Viewer Project Inc., ani jego zespół nie ponoszą odpowiedzialności za jakiekolwiek koszty lub szkody wynikające bezpośrednio lub pośrednio z takich transakcji.
Jeśli nie zgadzasz się z niniejszymi warunkami użytkowania, nie należy przeprowadzać transakcji finansowych za pomocą tej przeglądarki.
-
+
+
+
+ Włączenie obsługi HiDPI może mieć niekorzystne skutki i pogorszyć wydajność.
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 17fa77a462..1b46e3e986 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -170,10 +170,10 @@
-
-
-
- Wygaszaj tekst IM w tło okna logu czatu
+
+
+
+ Wyszarzanie tekstu wiadomości IM w tle okna logów 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 5b92e05a79..61fc491b62 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 @@
-
+
@@ -201,6 +201,10 @@
Ścieżka dołączania preprocesora:
+
+ Zewnętrzny edytor:
+
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
index a70dbf6558..557ca79412 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
@@ -132,11 +132,11 @@
Maksymalny poziom jakości tekstur:
-
-
-
-
-
+
+
+
+
+
Maski przezroczystości (alpha):
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index 552a28b7cf..da766db3ab 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -73,6 +73,9 @@
+
+ Notka: Aby aktywować Autoodpowiedzi ustaw swój status online w głównym menu: Komunikacja > Status online
+
Gdy jestem zajęty/a:
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
index f4c66a1e19..45005720af 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -25,6 +25,23 @@
Próg zmiany ilości L$:
+
+
+ Domyślne
+
+
+ Brak urządzenia
+
+
+ Nienazwane urządzenie
+
+
+ Niedostępne urządzenie
+
+
+ Urządzenie wyjściowe:
+
+
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index f6c62505aa..2f16b50a04 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -5437,6 +5437,12 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
Włącz/wyłącz tryb latania (HOME)
+
+ Zatrzymaj animacje
+
+
+ Zatrzymaj animacje
+
%Zachowania
@@ -5888,19 +5894,19 @@ do sekcji wsparcia witryny SecondLife.com i zgłoś problem.
Most LSL nie został utworzony. Skrypt Mostu nie może zostać utworzony.
- Most LSL nie został utworzony, bo jest nazwany niepoprawnie. Spróbuj stworzyć go na nowo ('Naprawa awatara' w menu 'Awatar' na górze).
+ Most LSL nie został utworzony, bo jest nazwany niepoprawnie. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze).
- Most LSL nie został utworzony, bo nie może zostać znaleziony w Szafie. Spróbuj stworzyć go na nowo ('Naprawa awatara' w menu 'Awatar' na górze).
+ Most LSL nie został utworzony, bo nie może zostać znaleziony w Szafie. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze).
- Most LSL nie mógł zostać założony na awatara, bo nie jest w aktualnej wersji. Spróbuj stworzyć go na nowo ('Naprawa awatara' w menu 'Awatar' na górze).
+ Most LSL nie mógł zostać założony na awatara, bo nie jest w aktualnej wersji. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze).
- Most LSL nie mógł zostać założony na awatara, bo nie został znaleziony w odpowiednim miejscu Szafy. Spróbuj stworzyć go na nowo ('Naprawa awatara' w menu 'Awatar' na górze).
+ Most LSL nie mógł zostać założony na awatara, bo nie został znaleziony w odpowiednim miejscu Szafy. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze).
- Most LSL nie mógł zostać założony na awatara, bo coś innego używa punktu zaczepu dodatku zarezerwowanego dla niego. Spróbuj stworzyć go na nowo ('Naprawa awatara' w menu 'Awatar' na górze).
+ Most LSL nie mógł zostać założony na awatara, bo coś innego używa punktu zaczepu dodatku zarezerwowanego dla niego. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze).
Obiekt Mostu LSL nie mógł zostać znaleziony. Nie można kontynuować procesu jego tworzenia, kończę operację.
@@ -5909,7 +5915,7 @@ do sekcji wsparcia witryny SecondLife.com i zgłoś problem.
Wewnątrz Mostu LSL znaleziono nieoczekiwane elementy.
- Proces tworzenia Mostu LSL nie dobiegł do końca. Być może będzie trzeba utworzyć go na nowo, aby zadział ('Naprawa awatara' w menu 'Awatar' na górze).
+ Proces tworzenia Mostu LSL nie dobiegł do końca. Być może będzie trzeba utworzyć go na nowo, aby zadział ('Kondycja awatara' w menu 'Awatar' na górze).
Most LSL został odłączony od awatara.
@@ -5952,10 +5958,10 @@ Twoja aktualna pozycja: [AVATAR_POS]
Info o skryptach: Otrzymano uszkodzoną odpowiedź od Mostu LSL. Spróbuj ponownie.
- UWAGA: Jeden lub więcej skryptów zostało dodanych do Twojego Mostu LSL Firestorma! Jeśli ta wiadomość jest niespodziewana, to stwórz teraz Most LSL na nowo ('Naprawa awatara' w menu 'Awatar' na górze).
+ UWAGA: Jeden lub więcej skryptów zostało dodanych do Twojego Mostu LSL Firestorma! Jeśli ta wiadomość jest niespodziewana, to stwórz teraz Most LSL na nowo ('Kondycja awatara' w menu 'Awatar' na górze).
- UWAGA: Skrypt Mostu LSL używa starej maszyny wirtualnej LSO (16 KB limitu pamięci) zamiast nowej Mono, co stwarza wysokie prawdopodobieństwo kolizji sterty i stosu oraz awarii Mostu poprzez wyczerpanie się pamięci. Spróbuj stworzyć go na nowo ('Naprawa awatara' w menu 'Awatar' na górze). Jeśli ten komunikat pojawi się ponownie spróbuj jeszcze raz w innym regionie.
+ UWAGA: Skrypt Mostu LSL używa starej maszyny wirtualnej LSO (16 KB limitu pamięci) zamiast nowej Mono, co stwarza wysokie prawdopodobieństwo kolizji sterty i stosu oraz awarii Mostu poprzez wyczerpanie się pamięci. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze). Jeśli ten komunikat pojawi się ponownie spróbuj jeszcze raz w innym regionie.
Pole widzenia
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index aee7409054..6e5ec362d9 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -5409,6 +5409,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 4609c147bc..d6bf9c2d42 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -4045,7 +4045,8 @@ URL: [MEDIAURL]
Кэш вашего клиента очищен. Пожалуйста, помните, что вы можете испытать замедление работы клиента и высокую нагрузку в течение короткого времени, пока загружается контент.
-
+
Вы уверены, что хотите изменить скрипты в выбранных объектах?
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 4fce24f076..0053030635 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -5962,6 +5962,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 e1c10b3d17..c23ce64421 100644
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -5577,6 +5577,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 2126fb7fa4..b724114416 100644
--- a/indra/newview/skins/default/xui/zh/strings.xml
+++ b/indra/newview/skins/default/xui/zh/strings.xml
@@ -5533,6 +5533,12 @@ http://secondlife.com/support 求助解決問題。
目前位在你的右工具列
+
+ 停止我身上的動作
+
+
+ 停止我身上的動作
+
保留%
diff --git a/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml b/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml
index b5ad5eb3bc..068240969f 100644
--- a/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/starlightcui/xui/en/floater_preferences.xml
@@ -133,7 +133,7 @@ https://accounts.secondlife.com/change_email/
help_topic="preferences_display_tab"
name="display" />
-
+
+
+
+
@@ -248,6 +248,26 @@
+
+
-
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index fff4eed71f..0e6042a5d3 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -605,15 +605,9 @@ class WindowsManifest(ViewerManifest):
# Get fmodstudio dll, continue if missing
try:
if self.args['configuration'].lower() == 'debug':
- if(self.address_size == 64):
- self.path("fmodL64.dll")
- else:
- self.path("fmodL.dll")
+ self.path("fmodL.dll")
else:
- if(self.address_size == 64):
- self.path("fmod64.dll")
- else:
- self.path("fmod.dll")
+ self.path("fmod.dll")
except:
print "Skipping fmodstudio audio library (assuming other audio engine)"