Merge Firestorm LGPL
commit
3d1a765c61
1
.hgtags
1
.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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1006,39 +1006,25 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>33d23a2167b58bd880f2cd3ce63501d7</string>
|
||||
<string>46c6881c26c05d9ab0c2b3bb7c4697f8</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-1.10.13-darwin-191311419.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.00.01-darwin-191591326.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
</map>
|
||||
<key>linux</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>7c0f5ff940be5b5a9c08446351d2c588</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-1.10.11-linux-190370440.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
</map>
|
||||
<key>linux64</key>
|
||||
<map>
|
||||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d1ef7f3d30bf2126620a37630b615ecf</string>
|
||||
<string>9111641e2b915c64529ed9624c1e9eb7</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-1.10.13-linux64-191311416.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.00.01-linux64-191601723.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -1048,11 +1034,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>9aa1b6789b0f30943599f48c0fedefa1</string>
|
||||
<string>f44299c9cf9c4224c6aee350284c3175</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.13-windows-191311251.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.01-windows-191591202.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -1062,18 +1048,18 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>7e6e5b4bc012e0f91c71c481aa4657fb</string>
|
||||
<string>fd45c9663bbd413f779b3bd5ad6f3567</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.13-windows64-191311303.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.01-windows64-191591204.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>1.10.13</string>
|
||||
<string>2.00.01</string>
|
||||
</map>
|
||||
<key>fmodex</key>
|
||||
<map>
|
||||
|
|
@ -2000,9 +1986,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>9a08c678a8c6c3c10bb913219b7931b6</string>
|
||||
<string>534ea1079513a56a78c99bc08179c87c</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/kdu-7.A.6-darwin-183562147.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/kdu-7.A.7-darwin-191472236.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
|
|
@ -2012,9 +1998,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>9a08c678a8c6c3c10bb913219b7931b6</string>
|
||||
<string>534ea1079513a56a78c99bc08179c87c</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/kdu-7.A.6-darwin-183562147.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/kdu-7.A.7-darwin-191472236.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -2024,9 +2010,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>544cc1f91d27be5fd3bffba3f686b3fa</string>
|
||||
<string>e4e79a414a3b942d04473c1ee0f98bb7</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/kdu-7.A.6-linux-183540937.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/kdu-7.A.7-linux-191472043.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
|
|
@ -2036,9 +2022,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>544cc1f91d27be5fd3bffba3f686b3fa</string>
|
||||
<string>e4e79a414a3b942d04473c1ee0f98bb7</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/kdu-7.A.6-linux-183540937.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/kdu-7.A.7-linux-191472043.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -2048,9 +2034,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>a369edcd42d975b49328df1163c2eee7</string>
|
||||
<string>a86b3a2fba5d62c42c26fd17ef7804d6</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-7.A.6-windows-183521837.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-7.A.7-windows-191472028.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -2060,9 +2046,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>a369edcd42d975b49328df1163c2eee7</string>
|
||||
<string>a86b3a2fba5d62c42c26fd17ef7804d6</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-7.A.6-windows-183521837.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/kdu-7.A.7-windows-191472028.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
|
|
|
|||
|
|
@ -1331,6 +1331,7 @@ Sovereign Engineer
|
|||
STORM-2143
|
||||
STORM-2148
|
||||
MAINT-7343
|
||||
SL-11079
|
||||
SpacedOut Frye
|
||||
VWR-34
|
||||
VWR-45
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -3,6 +3,12 @@
|
|||
include(Variables)
|
||||
include(Prebuilt)
|
||||
|
||||
# <FS:TS> 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)
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "llvertexbuffer.h"
|
||||
#include "llviewervisualparam.h"
|
||||
#include "llfasttimer.h"
|
||||
#include "llrendertarget.h" // <FS:ND/> 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)
|
||||
{
|
||||
// <FS:Ansariel> 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];
|
||||
|
|
|
|||
|
|
@ -1294,6 +1294,18 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E
|
|||
gAudiop->startNextTransfer();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> 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);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
//
|
||||
// LLAudioSource implementation
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@
|
|||
|
||||
#include "lllistener.h"
|
||||
|
||||
#include <boost/signals2.hpp> // <FS:Ansariel> 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);
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
typedef std::map<LLUUID, std::string> output_device_map_t;
|
||||
virtual output_device_map_t getDevices();
|
||||
virtual void setDevice(const LLUUID& device_uuid) { };
|
||||
|
||||
typedef boost::signals2::signal<void(output_device_map_t output_device_map)> 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);
|
||||
// </FS:Ansariel>
|
||||
|
||||
friend class LLPipeline; // For debugging
|
||||
public:
|
||||
F32 mMaxWindGain; // Hack. Public to set before fade in?
|
||||
|
|
@ -258,6 +274,9 @@ protected:
|
|||
|
||||
LLFrameTimer mWindUpdateTimer;
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
output_device_list_changed_callback_t mOutputDeviceListChangedCallback;
|
||||
|
||||
private:
|
||||
void setDefaults();
|
||||
LLStreamingAudioInterface *mStreamingAudioImpl;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
// <FS> FIRE-11266 / BUG-3549 / MAINT-2983: Changing audio device now requires relog to restore sounds
|
||||
#if LL_WINDOWS
|
||||
// <FS:Ansariel> 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
|
||||
// </FS>
|
||||
// </FS:Ansariel>>
|
||||
|
||||
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; // <FS:Ansariel> 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");
|
||||
|
||||
// <FS> 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
|
||||
// </FS>
|
||||
// <FS:Ansariel> Output device selection
|
||||
Check_FMOD_Error(mSystem->setCallback(systemCallback), "FMOD::System::setCallback");
|
||||
Check_FMOD_Error(mSystem->setUserData(this), "FMOD::System::setUserData");
|
||||
// </FS:Ansariel>
|
||||
|
||||
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;
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
getDevices(); // Purely to print out available devices for debugging reasons
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> 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);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
std::string LLAudioEngine_FMODEX::getDriverName(bool verbose)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -65,6 +65,14 @@ public:
|
|||
typedef F32 MIXBUFFERFORMAT;
|
||||
|
||||
FMOD::System *getSystem() const {return mSystem;}
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
/*virtual*/ std::map<LLUUID, std::string> getDevices();
|
||||
/*virtual*/ void setDevice(const LLUUID& device_uuid);
|
||||
|
||||
LLUUID getSelectedDeviceUUID() const { return mSelectedDeviceUUID; }
|
||||
// </FS:Ansariel>
|
||||
|
||||
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;
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
LLUUID mSelectedDeviceUUID;
|
||||
|
||||
public:
|
||||
static FMOD::ChannelGroup *mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -71,6 +71,12 @@ public:
|
|||
typedef F32 MIXBUFFERFORMAT;
|
||||
|
||||
FMOD::System *getSystem() const {return mSystem;}
|
||||
|
||||
/*virtual*/ std::map<LLUUID, std::string> 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];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -79,9 +79,23 @@ struct LLContextStatus
|
|||
|
||||
LL_COMMON_API std::ostream& operator<<(std::ostream& s, const LLContextStatus& context_status);
|
||||
|
||||
/* <FS:TS> gcc gets unhappy at what it thinks are multiline comments
|
||||
// <FS:Beq> 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
|
||||
// </FS:Beq>
|
||||
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
project(llimagej2coj)
|
||||
|
||||
# <FS:ND> 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()
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -639,5 +639,133 @@ void LLRenderTarget::getViewport(S32* viewport)
|
|||
viewport[3] = mResY;
|
||||
}
|
||||
|
||||
// <FS:ND> 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
|
||||
//</FD>ND>
|
||||
// <FS: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
|
||||
// <FS:ND> 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<U8 const*>(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
|
||||
// <FS:ND> Every other OS just gets glReadPixels
|
||||
glReadPixels(x, y, w, h, (GLenum)format, (GLenum)type, buffer);
|
||||
#endif
|
||||
}
|
||||
// </FS:ND>
|
||||
|
|
|
|||
|
|
@ -160,6 +160,10 @@ protected:
|
|||
LLTexUnit::eTextureType mUsage;
|
||||
|
||||
static LLRenderTarget* sBoundTarget;
|
||||
// <FS:ND> 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);
|
||||
// </FS:ND>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -967,6 +967,7 @@ BOOL LLScrollListCtrl::selectItemRange( S32 first_index, S32 last_index )
|
|||
// <FS:Ansariel> Fix for FS-specific people list (radar)
|
||||
if (isFiltered(itemp))
|
||||
{
|
||||
iter++ ;
|
||||
continue;
|
||||
}
|
||||
// </FS:Ansariel> Fix for FS-specific people list (radar)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -961,12 +961,9 @@ std::string LLDir::getForbiddenFileChars()
|
|||
{
|
||||
return "\\/:*?\"<>|";
|
||||
}
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> 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
|
||||
// </FS:CR>
|
||||
{
|
||||
// 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, ' ', '_');
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> Seperate user directories per grid
|
||||
std::string gridlower(gridname);
|
||||
LLStringUtil::toLower(gridlower);
|
||||
LLStringUtil::replaceChar(gridlower, ' ', '_');
|
||||
#endif // OPENSIM
|
||||
// </FS:CR>
|
||||
mLindenUserDir = add(getOSUserAppDir(), userlower);
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> Seperate user directories per grid
|
||||
if (!gridname.empty() && gridlower != "second_life")
|
||||
{
|
||||
mLindenUserDir += "." + gridlower;
|
||||
}
|
||||
#endif // OPENSIM
|
||||
// </FS:CR>
|
||||
}
|
||||
else
|
||||
|
|
@ -1019,12 +1012,9 @@ void LLDir::updatePerAccountChatLogsDir()
|
|||
mPerAccountChatLogsDir = add(getChatLogsDir(), mUserName);
|
||||
}
|
||||
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> 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, ' ', '_');
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> Seperate user directories per grid
|
||||
std::string gridlower(gridname);
|
||||
LLStringUtil::toLower(gridlower);
|
||||
LLStringUtil::replaceChar(gridlower, ' ', '_');
|
||||
#endif // OPENSIM
|
||||
// </FS:CR>
|
||||
mUserName = userlower;
|
||||
updatePerAccountChatLogsDir();
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> Seperate user directories per grid
|
||||
if (!gridname.empty() && gridlower != "second_life")
|
||||
{
|
||||
mPerAccountChatLogsDir += "." + gridlower;
|
||||
}
|
||||
#endif // OPENSIM
|
||||
// </FS:CR>
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -230,14 +230,11 @@ class LLDir
|
|||
|
||||
|
||||
virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> 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
|
||||
// </FS:CR>
|
||||
// [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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1741,7 +1741,11 @@ if (LINUX)
|
|||
set_source_files_properties(
|
||||
llappviewerlinux.cpp
|
||||
PROPERTIES
|
||||
COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}"
|
||||
# <FS:TS> 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}")
|
||||
# <FS:Ansariel> 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}")
|
||||
# </FS:Ansariel>
|
||||
|
||||
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.2.3
|
||||
6.2.5
|
||||
|
|
|
|||
|
|
@ -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<LLViewerObject*>(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<LLViewerObject*>(gAgentAvatarp->getRoot());
|
||||
if (agentRoot && agentRoot->getID() != gAgentID)
|
||||
{
|
||||
mSitCancelTimer.oneShot();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AOEngine::setDisableStands(AOSet* set, BOOL yes)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -625,4 +625,12 @@
|
|||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="beacons"
|
||||
/>
|
||||
<command name="stop_animations"
|
||||
available_in_toybox="true"
|
||||
icon="Stop_Animations_Icon"
|
||||
label_ref="Command_Stop_Animations_Label"
|
||||
tooltip_ref="Command_Stop_Animations_Tooltip"
|
||||
execute_function="Tools.StopAllAnimations"
|
||||
execute_parameters="stop"
|
||||
/>
|
||||
</commands>
|
||||
|
|
|
|||
|
|
@ -1016,7 +1016,7 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSSupportGroupChatPrefix2</key>
|
||||
<key>FSSupportGroupChatPrefix3</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Adds (FS 1.2.3) to support group chat</string>
|
||||
|
|
@ -1027,6 +1027,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSSupportGroupChatPrefixTesting</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Adds (W 56789f* os) to testing group chat</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AutoCloseOOC</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -11464,7 +11475,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderPerformanceTest</key>
|
||||
<map>
|
||||
|
|
@ -13529,7 +13540,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>https://jira.phoenixviewer.com/secure/CreateIssueDetails!init.jspa?pid=10005&issuetype=1&priority=3&environment=[ENVIRONMENT]</string>
|
||||
<string>https://jira.firestormviewer.org/secure/CreateIssueDetails!init.jspa?pid=10005&issuetype=1&priority=3&environment=[ENVIRONMENT]</string>
|
||||
</map>
|
||||
<key>RevokePermsOnStopAnimation</key>
|
||||
<map>
|
||||
|
|
@ -15275,7 +15286,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<integer>0</integer>
|
||||
</array>
|
||||
<key>SanityComment</key>
|
||||
<string>This might cause textures to look blurry and sculpties might fail to load properly.</string>
|
||||
<string>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.</string>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
|
@ -23798,17 +23809,6 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSPurgeInventoryCacheOnStartup</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Clear the inventory cache of the specific agent (ID) at next startup</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string/>
|
||||
</map>
|
||||
<key>FSSoundCacheLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -25203,6 +25203,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<real>1</real>
|
||||
</map>
|
||||
<key>FSOutputDeviceUUID</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>UUID of the output device used for inworld sound playback</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>00000000-0000-0000-0000-000000000000</string>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
||||
|
|
|
|||
|
|
@ -711,6 +711,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>UseAOStands</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use the viewer side Animation Overrider for standing and turning animations when enabled</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>UseFullAOInterface</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<LLUUID> mSupportGroup;
|
||||
std::set<LLUUID> 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();
|
||||
|
||||
|
|
|
|||
|
|
@ -386,8 +386,9 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
utf8_text = FSCommon::applyMuPose(utf8_text);
|
||||
|
||||
// <FS:Techwolf Lupindo> Support group chat prefix
|
||||
static LLCachedControl<bool> chat_prefix(gSavedSettings, "FSSupportGroupChatPrefix2");
|
||||
if (chat_prefix && FSData::getInstance()->isSupportGroup(mSessionID))
|
||||
static LLCachedControl<bool> chat_prefix_support(gSavedSettings, "FSSupportGroupChatPrefix3");
|
||||
static LLCachedControl<bool> chat_prefix_testing(gSavedSettings, "FSSupportGroupChatPrefixTesting");
|
||||
if ((chat_prefix_support || chat_prefix_testing) && FSData::getInstance()->isFirestormGroup(mSessionID))
|
||||
{
|
||||
// <FS:PP> FIRE-7075: Skin indicator
|
||||
static LLCachedControl<std::string> 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.
|
||||
}
|
||||
// </FS:PP>
|
||||
|
||||
|
||||
//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 + ") "));
|
||||
}
|
||||
|
||||
// <FS:Techwolf Lupindo> Allow user to send system info.
|
||||
|
|
@ -887,19 +915,24 @@ BOOL FSFloaterIM::postBuild()
|
|||
|
||||
getChild<LLButton>("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);
|
||||
|
||||
// <FS:Zi> 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));
|
||||
}
|
||||
}
|
||||
// </FS:Zi> 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;
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
// <FS:Ansariel> Remember the current object point pointed at - we might need it later
|
||||
mPointAtObject = object;
|
||||
|
||||
// <FS:Ansariel> Private point at
|
||||
static LLCachedControl<bool> private_pointat(gSavedSettings, "PrivatePointAtTarget", false);
|
||||
if (private_pointat)
|
||||
{
|
||||
if (mPointAt && !mPointAt->isDead())
|
||||
{
|
||||
mPointAt->clearPointAtTarget();
|
||||
mPointAt->markDead();
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// disallow pointing at attachments and avatars
|
||||
//this is the editing arm motion
|
||||
static LLCachedControl<bool> private_pointat(gSavedSettings, "PrivatePointAtTarget", false);
|
||||
if (object && (object->isAttachment() || object->isAvatar() || private_pointat))
|
||||
if (object && (object->isAttachment() || object->isAvatar()))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4939,16 +4939,7 @@ bool LLAppViewer::initCache()
|
|||
|
||||
if(!read_only)
|
||||
{
|
||||
// <FS:Ansariel> 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);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
// <FS:Zi> Purge inventory cache is done in LLInventoryModel::loadSkeleton()
|
||||
|
||||
// Purge cache if user requested it
|
||||
if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
// <FS:Beq> 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;
|
||||
// </FS:Beq>
|
||||
mVObjp->updateLOD();
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
pos = LLVector3(getPositionGroup().getF32ptr());
|
||||
}
|
||||
|
||||
pos -= camera.getOrigin();
|
||||
|
||||
pos -= camera.getOrigin();
|
||||
|
||||
mDistanceWRTCamera = ll_round(pos.magVec(), 0.01f);
|
||||
mVObjp->updateLOD();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,11 +125,16 @@ BOOL LLViewerDynamicTexture::render()
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLViewerDynamicTexture::preRender(BOOL clear_depth)
|
||||
{
|
||||
// <FS:Beq> 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<S32>(gPipeline.mPhysicsDisplay.getWidth()));
|
||||
llassert(mFullHeight <= static_cast<S32>(gPipeline.mPhysicsDisplay.getHeight()));
|
||||
|
||||
if (gGLManager.mHasFramebufferObject && gPipeline.mPhysicsDisplay.isComplete() && !gGLManager.mIsATI)
|
||||
// </FS:Beq>
|
||||
{ //using offscreen render target, just use the bottom left corner
|
||||
mOrigin.set(0, 0);
|
||||
}
|
||||
|
|
@ -216,9 +221,12 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
// <FS:Beq> 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();
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
|
@ -257,7 +265,10 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
|
|||
|
||||
if (use_fbo)
|
||||
{
|
||||
// <FS:Beq> changes to support higher resolution rendering in the preview
|
||||
// gPipeline.mWaterDis.flush();
|
||||
gPipeline.mPhysicsDisplay.flush();
|
||||
// </FS:Beq>
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
// </FS:CR>
|
||||
#define EXE_FILTER L"Programs (*.exe)\0*.exe\0" // <FS:LO> 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:
|
||||
// <FS:LO> fix file picker EXE filtering
|
||||
mOFN.lpstrFilter = L"All Files (*.*)\0*.*\0" \
|
||||
SOUND_FILTER \
|
||||
IMAGE_FILTER \
|
||||
ANIM_FILTER \
|
||||
L"\0";
|
||||
break;
|
||||
case FFLOAD_EXE:
|
||||
// <FS:LO> 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";
|
||||
|
|
|
|||
|
|
@ -140,8 +140,10 @@
|
|||
#include "fsfloaterimcontainer.h"
|
||||
#include "growlmanager.h"
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llaudioengine.h" // <FS:Ansariel> Output device selection
|
||||
#include "llavatarname.h" // <FS:CR> Deeper name cache stuffs
|
||||
#include "lleventtimer.h"
|
||||
#include "llviewermenufile.h" // <FS:LO> FIRE-23606 Reveal path to external script editor in prefernces
|
||||
#include "lldiriterator.h" // <Kadah> for populating the fonts combo
|
||||
#include "llline.h"
|
||||
#include "llpanelblockedlist.h"
|
||||
|
|
@ -160,6 +162,13 @@
|
|||
#include <VersionHelpers.h>
|
||||
#endif
|
||||
|
||||
// <FS:LO> FIRE-23606 Reveal path to external script editor in prefernces
|
||||
#if LL_DARWIN
|
||||
#include <CoreFoundation/CFURL.h>
|
||||
#include <CoreFoundation/CFBundle.h> // [FS:CR]
|
||||
#endif
|
||||
// </FS:LO>
|
||||
|
||||
//<FS:HG> 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)
|
|||
// <Firestorm Callbacks>
|
||||
mCommitCallbackRegistrar.add("NACL.AntiSpamUnblock", boost::bind(&LLFloaterPreference::onClickClearSpamList, this));
|
||||
mCommitCallbackRegistrar.add("NACL.SetPreprocInclude", boost::bind(&LLFloaterPreference::setPreprocInclude, this));
|
||||
// <FS:LO> 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<std::string
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:LO> 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<std::string>& 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);
|
||||
}
|
||||
// </FS:LO>
|
||||
|
||||
//[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<LLComboBox>("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<LLComboBox>("ShadowDetail");
|
||||
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
|
||||
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
|
||||
LLComboBox* ctrl_avatar_shadow = getChild<LLComboBox>("AvatarShadowDetail");
|
||||
LLSliderCtrl* sky = getChild<LLSliderCtrl>("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<std::st
|
|||
}
|
||||
|
||||
void FSPanelPreferenceBackup::onClickBackupSettings()
|
||||
{
|
||||
|
||||
LLSD args;
|
||||
args["DIRECTORY"] = gSavedSettings.getString("SettingsBackupPath");
|
||||
LLNotificationsUtil::add("SettingsConfirmBackup", args, LLSD(),
|
||||
boost::bind(&FSPanelPreferenceBackup::doBackupSettings, this, _1, _2));
|
||||
}
|
||||
|
||||
void FSPanelPreferenceBackup::doBackupSettings(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
LL_INFOS("SettingsBackup") << "entered" << LL_ENDL;
|
||||
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if ( option == 1 ) // CANCEL
|
||||
{
|
||||
LL_INFOS("SettingsBackup") << "backup cancelled" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// Get settings backup path
|
||||
std::string dir_name = gSavedSettings.getString("SettingsBackupPath");
|
||||
|
||||
|
|
@ -5925,9 +6016,9 @@ void LLFloaterPreference::populateFontSelectionCombo()
|
|||
// </FS:Kadah>
|
||||
|
||||
// <FS:AW optional opensim support>
|
||||
#ifdef OPENSIM
|
||||
static LLPanelInjector<LLPanelPreferenceOpensim> 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
|
||||
// <FS:AW optional opensim support>
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
static LLPanelInjector<FSPanelPreferenceSounds> 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<LLPanel>("output_device_settings_panel");
|
||||
mOutputDeviceComboBox = findChild<LLComboBox>("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);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
#include "llconversationlog.h"
|
||||
#include "llsearcheditor.h"
|
||||
|
||||
#include "llaudioengine.h" // <FS:Ansariel> Output device selection
|
||||
|
||||
class LLConversationLogObserver;
|
||||
class LLPanelPreference;
|
||||
class LLPanelLCD;
|
||||
|
|
@ -199,6 +201,10 @@ public:
|
|||
void onClickPreviewUISound(const LLSD& ui_sound_id); // <FS:PP> FIRE-8190: Preview function for "UI Sounds" Panel
|
||||
void setPreprocInclude();
|
||||
void changePreprocIncludePath(const std::vector<std::string>& filenames, std::string proposed_name);
|
||||
// <FS:LO> FIRE-23606 Reveal path to external script editor in prefernces
|
||||
void setExternalEditor();
|
||||
void changeExternalEditorPath(const std::vector<std::string>& filenames);
|
||||
// </FS:LO>
|
||||
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
|
||||
// </FS:Zi>
|
||||
|
|
@ -530,12 +537,13 @@ private:
|
|||
LOG_CLASS(FSPanelPreferenceBackup);
|
||||
};
|
||||
|
||||
#ifdef OPENSIM // <FS:AW optional opensim support>
|
||||
// <FS:AW opensim preferences>
|
||||
class LLPanelPreferenceOpensim : public LLPanelPreference
|
||||
{
|
||||
public:
|
||||
LLPanelPreferenceOpensim();
|
||||
|
||||
#ifdef OPENSIM
|
||||
// <FS:AW grid management>
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void apply();
|
||||
|
|
@ -570,11 +578,33 @@ private:
|
|||
LLLineEditor* mEditorPassword;
|
||||
LLLineEditor* mEditorSearch;
|
||||
LLLineEditor* mEditorGridMessage;
|
||||
#endif
|
||||
|
||||
LOG_CLASS(LLPanelPreferenceOpensim);
|
||||
};
|
||||
// </FS:AW opensim preferences>
|
||||
#endif // OPENSIM // <FS:AW optional opensim support>
|
||||
|
||||
// <FS:Ansariel> 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);
|
||||
};
|
||||
// </FS:Ansariel>
|
||||
|
||||
class LLFloaterPreferenceProxy : public LLFloater
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ public:
|
|||
void onClickDefault();
|
||||
void onCopyToClipboard();
|
||||
void onSanityCheck();
|
||||
void onClickSanityWarning();
|
||||
static void showControl(const std::string& control);
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -1137,7 +1137,17 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
|
|||
|
||||
group_datap->mGroupPropertiesDataComplete = true;
|
||||
group_datap->mChanged = TRUE;
|
||||
|
||||
// <FS:Beq> 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;
|
||||
}
|
||||
//</FS:Beq>
|
||||
LLGroupMgr::getInstance()->notifyObservers(GC_PROPERTIES);
|
||||
}
|
||||
|
||||
|
|
@ -1507,6 +1517,30 @@ LLGroupMgrGroupData* LLGroupMgr::createGroupData(const LLUUID& id)
|
|||
return group_datap;
|
||||
}
|
||||
|
||||
// <FS:Beq> 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;
|
||||
}
|
||||
//</FS:Beq>
|
||||
|
||||
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);
|
||||
|
||||
// <FS:Beq> 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;
|
||||
}
|
||||
// </FS:Beq>
|
||||
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();
|
||||
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
|
||||
LLGroupMgr::getInstance()->addPendingPropertyRequest(group_id);
|
||||
// </FS:Beq>
|
||||
}
|
||||
|
||||
void LLGroupMgr::sendGroupMembersRequest(const LLUUID& group_id)
|
||||
|
|
|
|||
|
|
@ -453,13 +453,20 @@ private:
|
|||
void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
|
||||
void addGroup(LLGroupMgrGroupData* group_datap);
|
||||
LLGroupMgrGroupData* createGroupData(const LLUUID &id);
|
||||
|
||||
// <FS:Beq> FIRE-19734/BUG-227094 stop persistent notification recovery spam
|
||||
bool hasPendingPropertyRequest(const LLUUID& id);
|
||||
void addPendingPropertyRequest(const LLUUID& id);
|
||||
// </FS:Beq>
|
||||
typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
|
||||
observer_multimap_t mObservers;
|
||||
|
||||
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
|
||||
group_map_t mGroups;
|
||||
|
||||
// <FS:Beq> 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<LLUUID, U64MicrosecondsImplicit> properties_request_map_t;
|
||||
properties_request_map_t mPropRequests;
|
||||
// </FS:Beq>
|
||||
typedef std::set<LLParticularGroupObserver*> observer_set_t;
|
||||
typedef std::map<LLUUID,observer_set_t> observer_map_t;
|
||||
observer_map_t mParticularObservers;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -6793,6 +6793,37 @@ void handle_attachment_touch(const LLUUID& idItem)
|
|||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Zi> 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);
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
// 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);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
// <FS:Zi> Texture Refresh on worn attachments
|
||||
else if ("texture_refresh_attachment" == action)
|
||||
{
|
||||
handle_attachment_texture_refresh(mUUID);
|
||||
}
|
||||
// </FS:Zi>
|
||||
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"));
|
||||
|
||||
// <FS:Zi> Texture Refresh on worn attachments
|
||||
if (item->getType() == LLAssetType::AT_OBJECT)
|
||||
{
|
||||
items.push_back(std::string("Texture Refresh Attachment"));
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
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)) )
|
||||
|
|
|
|||
|
|
@ -2149,6 +2149,34 @@ bool LLInventoryModel::loadSkeleton(
|
|||
const LLSD& options,
|
||||
const LLUUID& owner_id)
|
||||
{
|
||||
// <FS:Zi> 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);
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
LL_DEBUGS(LOG_INV) << "importing inventory skeleton for " << owner_id << LL_ENDL;
|
||||
|
||||
typedef std::set<LLPointer<LLViewerInventoryCategory>, InventoryIDPtrLess> cat_set_t;
|
||||
|
|
|
|||
|
|
@ -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; // <FS:Beq> Unreachable code
|
||||
}
|
||||
|
||||
bool LLLogChat::isNearbyTranscriptExist()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1022,6 +1022,9 @@ bool idle_startup()
|
|||
bool init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle);
|
||||
if(init)
|
||||
{
|
||||
// <FS:Ansariel> 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
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> 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());
|
||||
// </FS:CR>
|
||||
LLFile::mkdir(gDirUtilp->getLindenUserDir());
|
||||
|
||||
|
|
@ -1473,13 +1473,10 @@ bool idle_startup()
|
|||
gSavedPerAccountSettings.setString("SnapshotBaseName", gSavedPerAccountSettings.getControl("SnapshotBaseName")->getDefault().asString());
|
||||
}
|
||||
// </FS:LO>
|
||||
// <FS:CR> Seperate user directories per grid on OS build
|
||||
#ifdef OPENSIM
|
||||
// <FS:CR> Seperate user directories per grid
|
||||
//gDirUtilp->setPerAccountChatLogsDir(userid);
|
||||
gDirUtilp->setPerAccountChatLogsDir(userid, gridlabel);
|
||||
#else
|
||||
gDirUtilp->setPerAccountChatLogsDir(userid);
|
||||
#endif // OPENSIM
|
||||
// </FS:CR>
|
||||
// </FS:CR>
|
||||
LLFile::mkdir(gDirUtilp->getChatLogsDir());
|
||||
LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
|
||||
|
||||
|
|
|
|||
|
|
@ -153,16 +153,44 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
|
|||
if (item_id.isNull())
|
||||
{
|
||||
mInventoryPanel->getRootFolder()->clearSelection();
|
||||
//<FS:Chaser> Clear out the UUID instead of keeping the last value
|
||||
getChild<LLLineEditor>("TextureKey")->setText(LLUUID::null.asString());
|
||||
//</FS:Chaser>
|
||||
}
|
||||
else
|
||||
{
|
||||
LLInventoryItem* itemp = gInventory.getItem(image_id);
|
||||
if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
|
||||
//<FS:Chaser> Texture UUID picker
|
||||
//if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
|
||||
if (itemp)
|
||||
{
|
||||
// no copy texture
|
||||
getChild<LLUICtrl>("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<LLUICtrl>("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<LLLineEditor>("TextureKey")->setText(image_id.asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLLineEditor>("TextureKey")->setText(LLUUID::null.asString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLLineEditor>("TextureKey")->setText(LLUUID::null.asString());
|
||||
}
|
||||
// </FS:Chaser>
|
||||
}
|
||||
|
||||
if (set_selection)
|
||||
|
|
@ -420,6 +448,9 @@ BOOL LLFloaterTexturePicker::postBuild()
|
|||
}
|
||||
|
||||
getChild<LLUICtrl>("Pipette")->setCommitCallback( boost::bind(&LLFloaterTexturePicker::onBtnPipette, this));
|
||||
//<FS:Chaser> UUID picker
|
||||
childSetAction("TextureKeyApply", LLFloaterTexturePicker::onBtnApplyTexture,this);
|
||||
//</FS:Chaser>
|
||||
childSetAction("Cancel", LLFloaterTexturePicker::onBtnCancel,this);
|
||||
childSetAction("Select", LLFloaterTexturePicker::onBtnSelect,this);
|
||||
|
||||
|
|
@ -736,6 +767,17 @@ void LLFloaterTexturePicker::onBtnRevert(void* userdata)
|
|||
self->mViewModel->resetDirty();
|
||||
}*/
|
||||
|
||||
//<FS:Chaser> UUID texture picker
|
||||
// static
|
||||
void LLFloaterTexturePicker::onBtnApplyTexture(void* userdata)
|
||||
{
|
||||
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
|
||||
self->setCanApply(true, true);
|
||||
self->setImageID(LLUUID(self->getChild<LLLineEditor>("TextureKey")->getText()));
|
||||
self->commitIfImmediateSet();
|
||||
}
|
||||
//</FS:Chaser>
|
||||
|
||||
// static
|
||||
void LLFloaterTexturePicker::onBtnCancel(void* userdata)
|
||||
{
|
||||
|
|
@ -796,16 +838,39 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
|
|||
{
|
||||
mTextureSelectedCallback(itemp);
|
||||
}
|
||||
if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
|
||||
// <FS:Chaser> 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;
|
||||
}
|
||||
// </FS:Chaser>
|
||||
// <FS:Ansariel> FIRE-8298: Apply now checkbox has no effect
|
||||
setCanApply(true, true);
|
||||
// </FS:Ansariel>
|
||||
setImageID(itemp->getAssetUUID(),false);
|
||||
|
||||
// <FS:Chaser> 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<LLLineEditor>("TextureKey")->setText(itemp->getAssetUUID().asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLLineEditor>("TextureKey")->setText(LLUUID::null.asString());
|
||||
}
|
||||
// </FS:Chaser>
|
||||
|
||||
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<LLFolderViewItem
|
|||
commitIfImmediateSet();
|
||||
}
|
||||
}
|
||||
// <FS:Chaser> Clear texture key when item cant be found
|
||||
else
|
||||
{
|
||||
getChild<LLLineEditor>("TextureKey")->setText(LLUUID::null.asString());
|
||||
}
|
||||
// </FS:Chaser>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -319,6 +319,9 @@ public:
|
|||
const LLUUID& getBlankImageAssetID() { return mBlankImageAssetID; }
|
||||
|
||||
static void onBtnSetToDefault(void* userdata);
|
||||
//<FS:Chaser> UUID texture picker
|
||||
static void onBtnApplyTexture(void* userdata);
|
||||
//</FS:Chaser>
|
||||
static void onBtnSelect(void* userdata);
|
||||
static void onBtnCancel(void* userdata);
|
||||
void onBtnPipette();
|
||||
|
|
|
|||
|
|
@ -85,6 +85,22 @@ const std::string &LLVersionInfo::getVersion()
|
|||
return version;
|
||||
}
|
||||
|
||||
//<FS:CZ>
|
||||
//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;
|
||||
}
|
||||
//</FS:CZ>
|
||||
|
||||
//static
|
||||
const std::string &LLVersionInfo::getShortVersion()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -56,6 +56,11 @@ public:
|
|||
/// return the full viewer version as a string like "2.0.0.200030"
|
||||
static const std::string &getVersion();
|
||||
|
||||
//<FS:CZ>
|
||||
/// return the full viewer version as a string like "200030"
|
||||
static const std::string &getBuildVersion();
|
||||
//</FS:CZ>
|
||||
|
||||
/// return the viewer version as a string like "2.0.0"
|
||||
static const std::string &getShortVersion();
|
||||
|
||||
|
|
|
|||
|
|
@ -954,6 +954,26 @@ void handleFSStatisticsNoFocusChanged(const LLSD& newvalue)
|
|||
}
|
||||
// </FS:LO>
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
void handleOutputDeviceChanged(const LLSD& newvalue)
|
||||
{
|
||||
if (gAudiop)
|
||||
{
|
||||
gAudiop->setDevice(newvalue.asUUID());
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:TS> FIRE-24081: Disable HiDPI by default and warn if set
|
||||
void handleRenderHiDPIChanged(const LLSD& newvalue)
|
||||
{
|
||||
if (newvalue)
|
||||
{
|
||||
LLNotificationsUtil::add("EnableHiDPI");
|
||||
}
|
||||
}
|
||||
// </FS:TS> 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()
|
|||
// <FS:LO> Add ability for the statistics window to not be able to receive focus
|
||||
gSavedSettings.getControl("FSStatisticsNoFocus")->getSignal()->connect(boost::bind(&handleFSStatisticsNoFocusChanged, _2));
|
||||
// </FS:LO>
|
||||
|
||||
// <FS:Ansariel> Output device selection
|
||||
gSavedSettings.getControl("FSOutputDeviceUUID")->getSignal()->connect(boost::bind(&handleOutputDeviceChanged, _2));
|
||||
}
|
||||
|
||||
#if TEST_CACHED_CONTROL
|
||||
|
|
|
|||
|
|
@ -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<U8> > 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<U8> > 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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1325,8 +1325,14 @@ void LLVOAvatarSelf::idleUpdateTractorBeam()
|
|||
{
|
||||
LLColor4U rgb = gLggBeamMaps.getCurrentColor(LLColor4U(gAgent.getEffectColor()));
|
||||
|
||||
// <FS:Ansariel> Private point at
|
||||
static LLCachedControl<bool> private_pointat(gSavedSettings, "PrivatePointAtTarget", false);
|
||||
|
||||
// This is only done for yourself (maybe it should be in the agent?)
|
||||
if (!needsRenderBeam() || !isBuilt())
|
||||
// <FS:Ansariel> Private point at
|
||||
//if (!needsRenderBeam() || !isBuilt())
|
||||
if (!needsRenderBeam() || !isBuilt() || private_pointat)
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
mBeam = NULL;
|
||||
gLggBeamMaps.stopBeamChat();
|
||||
|
|
|
|||
|
|
@ -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<LLSD> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,8 @@ class SanityCheck : public LLSingleton<SanityCheck>
|
|||
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
|
||||
|
|
|
|||
|
|
@ -796,6 +796,7 @@ with the same filename but different name
|
|||
<texture name="Group_Titles_Icon" file_name="toolbar_icons/group_titles.png" preload="true" />
|
||||
<texture name="Wearable_Favorites_Icon" file_name="toolbar_icons/wearable_favorites.png" preload="true" />
|
||||
<texture name="beacons" file_name="toolbar_icons/beacons.png" preload="true" />
|
||||
<texture name="Stop_Animations_Icon" file_name="toolbar_icons/stop_animations.png" preload="true" />
|
||||
|
||||
<texture name="skin ansastorm blood" file_name="skinspreview/ansa_blood.jpg" preload="true" />
|
||||
<texture name="skin ansastorm bright blue" file_name="skinspreview/ansa_blue.jpg" preload="true" />
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 602 B |
|
|
@ -46,7 +46,10 @@
|
|||
<button name="chat_options_btn" tool_tip="Chat-Optionen"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="support_panel">
|
||||
<check_box label="Version senden" name="FSSupportGroupChatPrefix_toggle" tool_tip="Fügt die aktuelle Viewer-Version und Oberfläche am Anfang jeder Nachricht hinzu, die an diese Gruppe gesendet werden, um die Support-Mitarbeiter dabei zu unterstützen, ein mögliches Problem besser zu diagnostizieren und die Genauigkeit der Antworten auf deine Fragen zu verbessern."/>
|
||||
<check_box label="Version senden" name="FSSupportGroupChatPrefix_toggle" tool_tip="Fügt die aktuelle Viewer-Version, Viewer-Skin, das Betriebssystem und den RLVa-Status am Anfang jeder Nachricht hinzu, die an diese Gruppe gesendet werden, um die Support-Mitarbeiter dabei zu unterstützen, ein mögliches Problem besser zu diagnostizieren und die Genauigkeit der Antworten auf Ihre Fragen zu verbessern."/>
|
||||
</layout_panel>
|
||||
<layout_panel name="testing_panel">
|
||||
<check_box label="Build senden" name="FSSupportGroupChatPrefixTesting_toggle" tool_tip="Fügt die aktuelle Viewer-Version, Viewer-Skin, das Betriebssystem und den RLVa-Status am Anfang jeder Nachricht hinzu, die an diese Gruppe gesendet werden, um die Support-Mitarbeiter dabei zu unterstützen, ein mögliches Problem besser zu diagnostizieren und die Genauigkeit der Antworten auf Ihre Fragen zu verbessern. (Diese Einstellung ist unabhängig von den Support-Gruppen.)"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
<layout_stack name="chat_stack">
|
||||
|
|
|
|||
|
|
@ -15,7 +15,8 @@
|
|||
<spinner label="x" name="val_spinner_2"/>
|
||||
<spinner label="x" name="val_spinner_3"/>
|
||||
<spinner label="x" name="val_spinner_4"/>
|
||||
<button name="sanity_warning_btn" tool_tip="Diese Einstellung hat die Plausibilitätsprüfung nicht bestanden - der Wert liegt außerhalb des empfohlenen Bereichs."/>
|
||||
<button label="Kopieren" name="copy_btn" tool_tip="Kopiert den Namen der Einstellung in die Zwischenablage." width="60"/>
|
||||
<button label="Standardwert" name="default_btn" width="85"/>
|
||||
<button label="Standardwert" name="default_btn" tool_tip="Setzt den Wert dieser Einstellung auf den Standardwert zurück." width="85"/>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,8 @@
|
|||
<column name="unit_name" label="Name"/>
|
||||
<column name="unit_id_HIDDEN" label="ID"/>
|
||||
</scroll_list>
|
||||
<column label="ID" name="unit_id_HIDDEN"/>
|
||||
<line_editor name="TextureKey" tool_tip="Textur-UUID"/>
|
||||
<button name="TextureKeyApply" label="UUID anwenden" tool_tip="Textur mit dieser UUID anwenden"/>
|
||||
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
|
||||
<button label="OK" label_selected="OK" name="Select" left="135"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@
|
|||
<menu_item_call label="Berühren" name="Touch Attachment"/>
|
||||
<menu_item_call label="In Gesamtansicht anzeigen" name="Show in Main Panel"/>
|
||||
<menu_item_call label="Hinzufügen" name="Wearable Add"/>
|
||||
<menu_item_call label="Texturen aktualisieren" name="Texture Refresh Attachment"/>
|
||||
<menu_item_call label="Ausziehen" name="Take Off"/>
|
||||
<menu_item_call label="In Marktplatz-Auflistungen kopieren" name="Marketplace Copy"/>
|
||||
<menu_item_call label="In Marktplatz-Auflistungen verschieben" name="Marketplace Move"/>
|
||||
|
|
|
|||
|
|
@ -4850,6 +4850,14 @@ Grund: [SANITY_COMMENT]
|
|||
|
||||
Aktueller Wert: [CURRENT_VALUE]
|
||||
<form name="form">
|
||||
<button
|
||||
index="0"
|
||||
name="OK"
|
||||
text="Beheben"/>
|
||||
<button
|
||||
index="1"
|
||||
name="Cancel"
|
||||
text="Beibehalten"/>
|
||||
<ignore name="ignore"
|
||||
text="Eine Einstellung hat die Prüfung auf einen sinnvollen Wert nicht bestanden."/>
|
||||
</form>
|
||||
|
|
@ -4955,14 +4963,15 @@ URL: [AUDIOURL]
|
|||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="FirstJoinSupportGroup">
|
||||
<notification name="FirstJoinSupportGroup2">
|
||||
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?
|
||||
|
||||
<form name="form">
|
||||
<button name="OK_okcancelignore" text="Ja"/>
|
||||
<button name="Cancel_okcancelignore" text="Nein"/>
|
||||
|
|
@ -5074,6 +5083,13 @@ Der Sicherungspfad konnte nicht gefunden oder erstellt werden.
|
|||
Der Sicherungspfad konnte nicht gefunden werden.
|
||||
</notification>
|
||||
|
||||
<notification name="SettingsConfirmBackup">
|
||||
Möchten Sie wirklich eine Sicherung in diesem Verzeichnis erstellen?
|
||||
[DIRECTORY]
|
||||
Bestehende Sicherungen in diesem Verzeichnis werden überschrieben!
|
||||
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Sicherung erstellen"/>
|
||||
</notification>
|
||||
|
||||
<notification name="SettingsRestoreNeedsLogout">
|
||||
Das Wiederherstellen von Einstellungen erfordert einen Neustart des Viewers. Sollen die Einstellungen jetzt wiederhergestellt und der Viewer beendet werden?
|
||||
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Wiederherstellen und beenden"/>
|
||||
|
|
@ -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.
|
||||
<usetemplate ignoretext="Warnen, wenn eine Region die URL zum Währungsportal ändert" name="okignore" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="EnableHiDPI">
|
||||
HiDPI kann negative Effekte aufweisen und die Leistung beeinträchtigen.
|
||||
</notification>
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -178,8 +178,8 @@
|
|||
<spinner tool_tip="-1 für kompletten Gruppennamen, 0 für deaktiviert" name="FSShowGroupNameLength"/>
|
||||
<check_box name="FSOpenIMContainerOnOfflineMessage" label="Gespräche öffnen, wenn eine Offline-Nachricht empfangen wurde"/>
|
||||
<check_box label="IMs per E-Mail zuschicken, wenn ich offline bin ([EMAIL])" name="send_im_to_email"/>
|
||||
<check_box name="FSShowIMInChatHistory" label="Instant Messages im lokalem Chat anzeigen"/>
|
||||
<check_box name="FSLogIMInChatHistory" label="IMs im lokalem Chat speichern" width="190"/>
|
||||
<check_box name="FSShowIMInChatHistory" label="Instant Messages und Gruppenchats im lokalem Chat anzeigen"/>
|
||||
<check_box name="FSLogIMInChatHistory" label="IMs und Gruppenchats im lokalem Chat speichern" width="190"/>
|
||||
<text name="FSIMChatHistoryFade_label" width="320">
|
||||
IM-Text vor dem Hintergrund des Chatverlaufs ausblenden
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@
|
|||
<button name="BeamColor_new" label="Erstellen" tool_tip="Eine neue Farbeinstellung erstellen."/>
|
||||
<button name="BeamColor_refresh" label="Aktualisieren" tool_tip="Aktualisiert die Liste mit Farbeinstellungen."/>
|
||||
<slider name="FSMaxBeamsPerSecond" label="Updates/Sek:" tool_tip="Definiert wie viele Updates pro Sekunden gesendet werden sollen. [Standard: 40]"/>
|
||||
<check_box label="Auswahlstrahl aktivieren" name="SLPartBeam"/>
|
||||
<check_box label="Auswahlstrahl aktivieren" name="SLPartBeam" tool_tip="Das Deaktivieren dieser Einstellung verhindert die lokale Darstellung von Auswahlstrahlen. Das Senden der Auswahlinformationen an andere Avatare wird hierdurch nicht verhinden. Um keine Auswahlinformationen zu übertragen, können Sie diese unter Einstellungen -> Privatsphäre -> Kamerafokus -> Eigene Bearbeitungsauswahl nicht an andere senden deaktivieren"/>
|
||||
<check_box label="Auswahlinformationen an Chat senden" name="FSParticleChat" tool_tip="Sendet Informationen über die Auswahl (Start/Stop sowie globale Position) an Chat-Kanal 9000."/>
|
||||
|
||||
<combo_box name="FSBeamShape_combo" tool_tip="Erlaubt die Auswahl der Form für den Auswahlstrahl."/>
|
||||
|
|
@ -224,6 +224,10 @@
|
|||
Include-Verzeichnis für Präprozessor:
|
||||
</text>
|
||||
<button label="Durchsuchen" label_selected="Durchsuchen" name="SetPreprocInclude"/>
|
||||
<text name="externaleditor_textbox">
|
||||
Externer Editor:
|
||||
</text>
|
||||
<button label="Durchsuchen" label_selected="Durchsuchen" name="SetExternalEditor"/>
|
||||
</panel>
|
||||
|
||||
<!--Build 2-->
|
||||
|
|
|
|||
|
|
@ -146,14 +146,14 @@
|
|||
<check_box label="HTTP für Laden von Texturen verwenden" tool_tip="Aktiviert das Laden von Texturen über das HTTP-Protokoll - deaktivieren wenn es Probleme mit schlecht oder nicht korrekt ladenden Texturen gibt und das veraltete UDP-Protokoll verwendet werden soll." name="TexturesHTTP"/>
|
||||
<check_box label="Maximale Auflösung für Texturen auf 512px beschränken (nur 64bit; erfordert Neustart)" tool_tip="Beschränkt die maximale Auflösung für Inworld-Texturen auf 512px. Dies erlaubt die Darstellung von mehreren Texturen bevor der vorhandene Texturspeicher aufgebraucht ist und unscharfe Texturen dargestellt werden." name="FSRestrictMaxTextureSize"/>
|
||||
<slider label="Max. Anzahl gleichzeitiger HTTP-GET-Anfragen" name="HTTPFetchMaxRequests"/>
|
||||
<text name="TextureDetailLabel" width="215">
|
||||
<text name="TextureDetailLabel" width="215" tool_tip="Qualitätslevel, auf das Texturen geladen werden. Beeinflusst die Einstellung TextureDiscardLevel">
|
||||
Maximales Qualitätslevel für Texturen:
|
||||
</text>
|
||||
<combo_box name="TextureDetail">
|
||||
<combo_box.item label="Normale Qualität" name="0"/>
|
||||
<combo_box.item label="Mittlere Qualität" name="3"/>
|
||||
<combo_box.item label="Geringe Qualität" name="4"/>
|
||||
<combo_box.item label="Keine Texturen" name="5"/>
|
||||
<combo_box.item label="Normale (0) Qualität" name="0"/>
|
||||
<combo_box.item label="Mittlere (3) Qualität" name="3"/>
|
||||
<combo_box.item label="Geringe (4) Qualität" name="4"/>
|
||||
<combo_box.item label="Keine (5) Texturen" name="5"/>
|
||||
</combo_box>
|
||||
<text name="Alpha Mask Rendering">
|
||||
Darstellung von Alpha-Masken:
|
||||
|
|
|
|||
|
|
@ -84,6 +84,9 @@
|
|||
|
||||
<!--Autoresponse1-->
|
||||
<panel label="Autom. Antwort 1" name="tab-autoresponse-1">
|
||||
<text name="autorespond_toggle_location_tip">
|
||||
Hinweis: Zum Aktivieren der automatischen Antworten setzen Sie Ihren Online-Status über das Hauptmenü unter Unterhalten > Online-Status
|
||||
</text>
|
||||
<text name="text_box3">
|
||||
Automatische Antwort wenn im „Beschäftigt“-Modus:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,25 @@
|
|||
<text name="money_change_threshold_label" tool_tip="Spielt einen Soundbenachrichtung ab, wenn der angegebene Geldbetrag empfangen oder ausgegeben wird." width="160">
|
||||
Schwellwert für L$-Änderung:
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="output_device_settings_panel">
|
||||
<panel.string name="output_default_text">
|
||||
Standard
|
||||
</panel.string>
|
||||
<panel.string name="output_no_device">
|
||||
Kein Gerät vorhanden
|
||||
</panel.string>
|
||||
<panel.string name="output_name_no_device">
|
||||
Unbenanntes Gerät
|
||||
</panel.string>
|
||||
<panel.string name="output_device_unavailable">
|
||||
Gerät nicht verfügbar
|
||||
</panel.string>
|
||||
<text name="output_label">
|
||||
Ausgabegerät:
|
||||
</text>
|
||||
</panel>
|
||||
|
||||
</panel>
|
||||
|
||||
<!-- Media -->
|
||||
<panel label="Medien" name="Media Media Panel">
|
||||
|
|
|
|||
|
|
@ -5970,6 +5970,12 @@ Setzen Sie den Editorpfad in Anführungszeichen
|
|||
<string name="Command_Fly_Tooltip">
|
||||
Flugmodus ein-/ausschalten (Pos1)
|
||||
</string>
|
||||
<string name="Command_Stop_Animations_Label">
|
||||
Avatar-Animationen stoppen
|
||||
</string>
|
||||
<string name="Command_Stop_Animations_Tooltip">
|
||||
Avatar-Animationen stoppen
|
||||
</string>
|
||||
<string name="Command_Groundsit_Tooltip">
|
||||
Aktiviert/Deaktiviert erzwungenes Sitzen auf dem Boden (Strg+Alt+S)
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
</text>
|
||||
<text
|
||||
follows="top|left"
|
||||
|
|
|
|||
|
|
@ -442,7 +442,7 @@
|
|||
height="20"
|
||||
width="113"/>
|
||||
<check_box
|
||||
control_name="FSSupportGroupChatPrefix2"
|
||||
control_name="FSSupportGroupChatPrefix3"
|
||||
follows="left|top"
|
||||
height="19"
|
||||
label="Specify version"
|
||||
|
|
@ -450,10 +450,39 @@
|
|||
top="0"
|
||||
left_delta="5"
|
||||
name="FSSupportGroupChatPrefix_toggle"
|
||||
tool_tip="Adds your current viewer version and skin information to the front of messages sent by you to this group which will assist support staff in correctly diagnosing your issues and improve accuracy in answering your questions"
|
||||
tool_tip="Adds current viewer version, viewer skin, operating system and RLVa status to the front of messages sent by you to this group which will assist support staff in correctly diagnosing your issues and improve accuracy in answering your questions"
|
||||
width="110" />
|
||||
<!-- END: FS Prefix -->
|
||||
</layout_panel>
|
||||
<layout_panel
|
||||
name="testing_panel"
|
||||
auto_resize="false"
|
||||
user_resize="false"
|
||||
top="0"
|
||||
layout="topleft"
|
||||
height="20"
|
||||
width="105"
|
||||
follows="left|top">
|
||||
<icon
|
||||
follows="left|right"
|
||||
image_name="Toolbar_Middle_Off"
|
||||
left="2"
|
||||
name="dummy_icon_support_group_testing"
|
||||
top="0"
|
||||
height="20"
|
||||
width="103"/>
|
||||
<check_box
|
||||
control_name="FSSupportGroupChatPrefixTesting"
|
||||
follows="left|top"
|
||||
height="19"
|
||||
label="Specify build"
|
||||
layout="topleft"
|
||||
top="0"
|
||||
left_delta="5"
|
||||
name="FSSupportGroupChatPrefixTesting_toggle"
|
||||
tool_tip="Adds current viewer version, viewer skin, operating system and RLVa status to the front of messages sent by you to this group which will assist support staff in correctly diagnosing your issues and improve accuracy in answering your questions. (This is seperate from the support groups)"
|
||||
width="100" />
|
||||
</layout_panel>
|
||||
<!-- END: FS Prefix -->
|
||||
<layout_panel
|
||||
name="lp_bar"
|
||||
auto_resize="true"
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ https://accounts.secondlife.com/change_email/
|
|||
help_topic="preferences_display_tab"
|
||||
name="display" />
|
||||
<panel
|
||||
class="panel_preference"
|
||||
class="panel_preference_sounds"
|
||||
filename="panel_preferences_sound.xml"
|
||||
label="Sound & Media"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -204,6 +204,7 @@
|
|||
image_selected="PushButton_Selected_Press"
|
||||
name="sanity_warning_btn"
|
||||
right="-160"
|
||||
tool_tip="This debug setting failed the sanity check; its value lies outside the recommended range."
|
||||
top_pad="10"
|
||||
visible="true"
|
||||
width="22">
|
||||
|
|
|
|||
|
|
@ -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 @@
|
|||
</scroll_list>
|
||||
|
||||
<!-- bottom static -->
|
||||
<line_editor
|
||||
follows="bottom"
|
||||
height="20"
|
||||
left="7"
|
||||
top="-55"
|
||||
max_length_chars="256"
|
||||
name="TextureKey"
|
||||
layout="topleft"
|
||||
label="00000000-0000-0000-0000-000000000000"
|
||||
tool_tip="Texture Key"
|
||||
width="290"/>
|
||||
<button
|
||||
follows="bottom"
|
||||
name="TextureKeyApply"
|
||||
height="20"
|
||||
label="Apply UUID"
|
||||
layout="topleft"
|
||||
left_pad="5"
|
||||
width="100"
|
||||
tool_tip="Apply this UUID"/>
|
||||
<button
|
||||
follows="bottom"
|
||||
height="20"
|
||||
|
|
@ -265,7 +285,7 @@
|
|||
initial_value="true"
|
||||
label="Apply now"
|
||||
layout="topleft"
|
||||
left="4"
|
||||
left="5"
|
||||
name="apply_immediate_check"
|
||||
top_delta="0"
|
||||
width="120" />
|
||||
|
|
|
|||
|
|
@ -855,6 +855,14 @@
|
|||
function="Inventory.DoToSelected"
|
||||
parameter="touch" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Texture Refresh"
|
||||
layout="topleft"
|
||||
name="Texture Refresh Attachment">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.DoToSelected"
|
||||
parameter="texture_refresh_attachment" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Take Off"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -10451,6 +10451,14 @@ Reason: [SANITY_COMMENT]
|
|||
|
||||
Current setting: [CURRENT_VALUE]
|
||||
<form name="form">
|
||||
<button
|
||||
index="0"
|
||||
name="OK"
|
||||
text="Fix it"/>
|
||||
<button
|
||||
index="1"
|
||||
name="Cancel"
|
||||
text="Keep it"/>
|
||||
<ignore name="ignore"
|
||||
text="A settings control has failed the sanity check."/>
|
||||
</form>
|
||||
|
|
@ -10491,11 +10499,11 @@ Your viewer cache is currently empty. Please be aware that you may experience sl
|
|||
<!-- <FS:Zi> Viewer version popup -->
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="FirstJoinSupportGroup"
|
||||
name="FirstJoinSupportGroup2"
|
||||
type="alertmodal">
|
||||
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.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="SettingsConfirmBackup"
|
||||
type="alertmodal">
|
||||
Are you sure you want to save a backup to this directory?
|
||||
[DIRECTORY]
|
||||
Any existing backups in that location will be overwritten!
|
||||
<usetemplate
|
||||
name="okcancelbuttons"
|
||||
notext="Cancel"
|
||||
yestext="Save backup"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="SettingsRestoreNeedsLogout"
|
||||
|
|
@ -13057,4 +13078,11 @@ If you do not agree to these terms of use, then no financial transactions should
|
|||
name="okignore"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="EnableHiDPI"
|
||||
type="alertmodal">
|
||||
Enabling HiDPI support may have adverse effects and may impair performance.
|
||||
</notification>
|
||||
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
<check_box
|
||||
enabled_control="FSShowIMInChatHistory"
|
||||
layout="topleft"
|
||||
|
|
@ -1145,7 +1145,7 @@
|
|||
height="18"
|
||||
name="FSLogIMInChatHistory"
|
||||
control_name="FSLogIMInChatHistory"
|
||||
label="Save IMs in nearby chat"/>
|
||||
label="Save IMs and Group Chat in Nearby Chat"/>
|
||||
<text
|
||||
top_pad="0"
|
||||
follows="left|top"
|
||||
|
|
|
|||
|
|
@ -685,6 +685,7 @@
|
|||
left="15"
|
||||
name="SLPartBeam"
|
||||
width="250"
|
||||
tool_tip="Disabling this setting will prevent selection beams from being rendered locally. It does not prevent selection beams being sent to other avatars. If you do not wish to show your selection, you can disable that via Preferences -> Privacy -> LookAt -> Don't send my selection target hints."
|
||||
control_name="ShowSelectionBeam" />
|
||||
|
||||
<check_box
|
||||
|
|
@ -1375,7 +1376,7 @@
|
|||
</button>
|
||||
|
||||
<text
|
||||
top_pad="80"
|
||||
top_pad="10"
|
||||
left="8"
|
||||
follows="left|top"
|
||||
name="text_box_scripting_font"
|
||||
|
|
@ -1498,6 +1499,39 @@
|
|||
<button.commit_callback
|
||||
function="NACL.SetPreprocInclude" />
|
||||
</button>
|
||||
<text
|
||||
follows="left|top"
|
||||
height="16"
|
||||
type="string"
|
||||
length="1"
|
||||
layout="topleft"
|
||||
name="externaleditor_textbox"
|
||||
left="10"
|
||||
width="256">
|
||||
External Editor:
|
||||
</text>
|
||||
<line_editor
|
||||
control_name="ExternalEditor"
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
follows="left|top"
|
||||
font="SansSerif"
|
||||
height="23"
|
||||
max_length_chars="4096"
|
||||
name="externaleditor_location"
|
||||
width="310" />
|
||||
<button
|
||||
follows="left|top"
|
||||
height="23"
|
||||
label="Browse"
|
||||
label_selected="Browse"
|
||||
left_pad="5"
|
||||
name="SetExternalEditor"
|
||||
top_delta="0"
|
||||
width="100">
|
||||
<button.commit_callback
|
||||
function="Pref.SetExternalEditor" />
|
||||
</button>
|
||||
</panel>
|
||||
|
||||
<!--Build 2-->
|
||||
|
|
|
|||
|
|
@ -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"> <!-- To translators, do not try to translate the word TextureDiscardLevel -->
|
||||
<combo_box.item
|
||||
label="Normal quality"
|
||||
label="Normal (0) quality"
|
||||
name="0"
|
||||
value="0"/>
|
||||
<combo_box.item
|
||||
label="Mid quality"
|
||||
label="Mid (3) quality"
|
||||
name="3"
|
||||
value="3"/>
|
||||
<combo_box.item
|
||||
label="Low quality"
|
||||
label="Low (4) quality"
|
||||
name="4"
|
||||
value="4"/>
|
||||
<combo_box.item
|
||||
label="No textures"
|
||||
label="No (5) textures"
|
||||
name="5"
|
||||
value="5"/>
|
||||
</combo_box>
|
||||
|
|
|
|||
|
|
@ -479,7 +479,7 @@
|
|||
initial_value="160"
|
||||
layout="topleft"
|
||||
max_val="32"
|
||||
min_val="1"
|
||||
min_val="4"
|
||||
name="LimitLookAtDistance"
|
||||
width="150" />
|
||||
<text
|
||||
|
|
@ -505,7 +505,20 @@
|
|||
follows="all"
|
||||
label="Autoresponse 1"
|
||||
name="tab-autoresponse-1" >
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left="15"
|
||||
mouse_opaque="false"
|
||||
name="autorespond_toggle_location_tip"
|
||||
top_pad="5"
|
||||
width="450"
|
||||
wrap="true">
|
||||
Note: To activate the Autoresponse messages please set your online status via Comm Menu > Online Status
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
@ -515,7 +528,7 @@
|
|||
left="15"
|
||||
mouse_opaque="false"
|
||||
name="text_box3"
|
||||
top="10"
|
||||
top_pad="10"
|
||||
width="450">
|
||||
Automatic response when in UNAVAILABLE (ie, BUSY) mode:
|
||||
</text>
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -414,6 +414,61 @@
|
|||
name="money_change_threshold"
|
||||
width="75" />
|
||||
|
||||
<panel
|
||||
background_visible="false"
|
||||
border="false"
|
||||
follows="top|left|right"
|
||||
height="100"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
right="-5"
|
||||
name="output_device_settings_panel"
|
||||
top_pad="5">
|
||||
<panel.string
|
||||
name="output_default_text">
|
||||
Default
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="output_no_device">
|
||||
No device available
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="output_name_no_device">
|
||||
Unnamed device
|
||||
</panel.string>
|
||||
<panel.string
|
||||
name="output_device_unavailable">
|
||||
Unavailable device
|
||||
</panel.string>
|
||||
<icon
|
||||
height="18"
|
||||
image_name="Parcel_Voice_Light"
|
||||
left_delta="4"
|
||||
name="output_speaker_icon"
|
||||
mouse_opaque="false"
|
||||
top="7"
|
||||
visible="true"
|
||||
width="18" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left_pad="3"
|
||||
name="output_label"
|
||||
width="90">
|
||||
Output device:
|
||||
</text>
|
||||
<combo_box
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left_pad="0"
|
||||
max_chars="128"
|
||||
name="sound_output_device"
|
||||
top_delta="-5"
|
||||
right="-5" />
|
||||
</panel>
|
||||
</panel>
|
||||
|
||||
<!-- Media -->
|
||||
|
|
|
|||
|
|
@ -2705,6 +2705,8 @@ Try enclosing path to the editor with double quotes.
|
|||
<string name="Toolbar_Right_Tooltip" >currently in your right toolbar</string>
|
||||
|
||||
<string name="Command_Fly_Tooltip">Toggle flying mode on/off (HOME)</string>
|
||||
<string name="Command_Stop_Animations_Label">Stop Animations</string>
|
||||
<string name="Command_Stop_Animations_Tooltip">Stop Animating my Avatar</string>
|
||||
|
||||
<!-- Mesh UI terms -->
|
||||
<string name="Retain%">Retain%</string>
|
||||
|
|
|
|||
|
|
@ -42,7 +42,11 @@
|
|||
</layout_panel>
|
||||
<layout_panel name="support_panel" width="120">
|
||||
<icon name="dummy_icon_support_group" width="118"/>
|
||||
<check_box label="Especificar visor" name="FSSupportGroupChatPrefix_toggle" width="115" tool_tip="Añade tu versión actual de visor y la información de skin al principio de tus mensajes para ayudar al equipo de soporte a diagnosticar tus problemas correctamente y a mejorar la precisión en las respuestas a tus preguntas"/>
|
||||
<check_box label="Especificar versión" name="FSSupportGroupChatPrefix_toggle" width="115" tool_tip="Añade la versión actual del visor, el skin del visor, el sistema operativo y el estatus del RLVa al principio de los mensajes enviados por usted a este grupo, lo cual asistirá al personal de apoyo a correctamente diagnosticar su problema, y a mejorar la precisión de las respuestas a sus preguntas"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="testing_panel" width="120">
|
||||
<icon name="dummy_icon_support_group" width="118"/>
|
||||
<check_box label="Especificar compilación" name="FSSupportGroupChatPrefixTesting_toggle" width="115" tool_tip="Añade la compilación actual del visor, el skin del visor, el sistema operativo y el estatus del RLVa al principio de los mensajes enviados por usted a este grupo, lo cual asistirá al personal de apoyo a correctamente diagnosticar su problema, y a mejorar la precisión de las respuestas a sus preguntas"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -5474,9 +5474,9 @@ Configuración actual: [CURRENT_VALUE]
|
|||
<notification name="CacheEmpty">
|
||||
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.
|
||||
</notification>
|
||||
<notification name="FirstJoinSupportGroup">
|
||||
<notification name="FirstJoinSupportGroup2">
|
||||
¡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.
|
||||
|
||||
|
|
|
|||
|
|
@ -5761,6 +5761,12 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
|
|||
actualmente en tu barra de herramientas derecha
|
||||
</string>
|
||||
<string name="Command_Fly_Tooltip">Activar/desactivar el modo de vuelo</string>
|
||||
<string name="Command_Stop_Animations_Label">
|
||||
Detener mis animaciones
|
||||
</string>
|
||||
<string name="Command_Stop_Animations_Tooltip">
|
||||
Detener mis animaciones
|
||||
</string>
|
||||
<string name="Retain%">
|
||||
% retención
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -5464,6 +5464,12 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles
|
|||
<string name="Toolbar_Right_Tooltip">
|
||||
actuellement dans la barre d'outils de droite
|
||||
</string>
|
||||
<string name="Command_Stop_Animations_Label">
|
||||
Arrêter mon animation
|
||||
</string>
|
||||
<string name="Command_Stop_Animations_Tooltip">
|
||||
Arrêter mon animation
|
||||
</string>
|
||||
<string name="Retain%">
|
||||
Garder%
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -3944,7 +3944,8 @@ Valore attuale: [CURRENT_VALUE]
|
|||
<notification name="CacheEmpty">
|
||||
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.
|
||||
</notification>
|
||||
<notification name="FirstJoinSupportGroup">
|
||||
<!-- Commented out because without an update it would show false information!
|
||||
<notification name="FirstJoinSupportGroup2">
|
||||
Benvenuti al gruppo di supporto di Phoenix/Firestorm!
|
||||
|
||||
Per rendere il supporto più efficace, raccomandiamo di annunciare la versione del programma al gruppo. Il numero di versione può essere allegato ad ogni chat inviata al gruppo. I membri del gruppo di supporto possono dare suggerimenti più efficaci se conoscono la versione usata.
|
||||
|
|
@ -3958,6 +3959,7 @@ Abilitare l'invio automatico della versione?
|
|||
<ignore name="ignore" text="Iscrizione al gruppo di supporto Phoenix/Firestorm" save_option="true" />
|
||||
</form>
|
||||
</notification>
|
||||
-->
|
||||
<notification name="ConfirmScriptModify">
|
||||
Modificare gli script negli oggetti selezionati?
|
||||
<usetemplate ignoretext="Conferma prima di modificare script nella selezione" name="okcancelignore" notext="Annulla" />
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue