Merge branch 'master' of https://vcs.firestormviewer.org/phoenix-firestorm
commit
b8b0c8ec3b
|
|
@ -0,0 +1,17 @@
|
|||
repos:
|
||||
- repo: https://bitbucket.org/lindenlab/git-hooks.git
|
||||
rev: v1.0.0-beta2
|
||||
hooks:
|
||||
- id: opensource-license
|
||||
- id: jira-issue
|
||||
- id: llsd
|
||||
- id: no-trigraphs
|
||||
- id: copyright
|
||||
- id: end-of-file
|
||||
files: \.(cpp|c|h|py|glsl|cmake|txt)$
|
||||
exclude: language.txt
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v2.5.0
|
||||
hooks:
|
||||
- id: check-xml
|
||||
- id: mixed-line-ending
|
||||
|
|
@ -76,9 +76,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>9c93ba8b8af97fc8379f77de77e1540a</string>
|
||||
<string>88b6b9ebc2eda992b721529921c82066</string>
|
||||
<key>url</key>
|
||||
<string>http://3p.firestormviewer.org/glib-2.48.0.202301938-linux64-202301938.tar.bz2</string>
|
||||
<string>http://3p.firestormviewer.org/glib-2.56.0.220911433-linux64_bionic-220911433.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux</string>
|
||||
|
|
@ -1150,11 +1150,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>2db00aa4126d4ee8152fc49b03bb3fe1</string>
|
||||
<string>20c867a0327bb653c8fc377b97d68c55</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.05-darwin-220160006.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.06-darwin64-3.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
|
|
@ -1164,11 +1164,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>1a6c06c99d67296794b39183387f458d</string>
|
||||
<string>9aac95d85fd3f044da3fd9dd44ed5ca2</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.05-linux64-220101141.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.02.06-linux64_bionic-220911506.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -1178,11 +1178,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>126b2476f65ee4947fec1f754fc9dca9</string>
|
||||
<string>b81336e7824c6cf96a6cd6200333b3f7</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.05-windows-220101109.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.06-windows-220870903.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -1192,18 +1192,18 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>891c91e7868bf2e103691bae2ef493eb</string>
|
||||
<string>cbfb25df1e231a84b0beaf85600efb20</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.05-windows64-220101110.tar.bz2</string>
|
||||
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.02.06-windows64-220870905.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>2.02.05</string>
|
||||
<string>2.02.06</string>
|
||||
</map>
|
||||
<key>fontconfig</key>
|
||||
<map>
|
||||
|
|
@ -1940,9 +1940,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>94f8c766d77d68e0b8b1ac783b6a02dc</string>
|
||||
<string>c4dd59fbb0709fc4c7b5ab69b20246f8</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/kdu-8.2-linux64-212351600.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/kdu-8.2-linux64_bionic-220911445.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -2401,18 +2401,18 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>95cb09a712b7b61e992fe68ab7bf8c72</string>
|
||||
<string>d6e7ab8483c348f223fd24028e27a52f</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/92744/837149/llca-202201010217.567162-common-567162.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/93933/844890/llca-202202010217.567974-common-567974.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>common</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>202201010217.567162</string>
|
||||
<string>202202010217.567974</string>
|
||||
</map>
|
||||
<key>llphysicsextensions_source</key>
|
||||
<map>
|
||||
|
|
@ -3580,9 +3580,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>33ed1bb3e24fbd3462da04fb3e917e94</string>
|
||||
<string>1dda5fb3bb649b0ab5a93f22df7cb11e</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/94814/850320/viewer_manager-3.0.568552-darwin64-568552.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/96998/862110/viewer_manager-3.0.569958-darwin64-569958.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3616,9 +3616,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>2ad8e04965ac8bddb7d351abe09bee07</string>
|
||||
<string>30d1386d0a6883d898fc56757a789b8b</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/94813/850316/viewer_manager-3.0.568552-windows-568552.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/97002/862130/viewer_manager-3.0.569958-windows-569958.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -3629,7 +3629,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>source_type</key>
|
||||
<string>hg</string>
|
||||
<key>version</key>
|
||||
<string>3.0.568552</string>
|
||||
<string>3.0.569958</string>
|
||||
</map>
|
||||
<key>vlc-bin</key>
|
||||
<map>
|
||||
|
|
@ -3681,7 +3681,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>2.2.8.538966</string>
|
||||
<string>3.0.16.565299</string>
|
||||
</map>
|
||||
<key>xmlrpc-epi</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -1533,6 +1533,15 @@ bool LLAudioSource::setupChannel()
|
|||
return true;
|
||||
}
|
||||
|
||||
void LLAudioSource::stop()
|
||||
{
|
||||
play(LLUUID::null);
|
||||
if (mCurrentDatap)
|
||||
{
|
||||
// always reset data if something wants us to stop
|
||||
mCurrentDatap = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLAudioSource::play(const LLUUID &audio_uuid)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -351,7 +351,13 @@ public:
|
|||
LLAudioBuffer *getCurrentBuffer();
|
||||
|
||||
bool setupChannel();
|
||||
bool play(const LLUUID &audio_id); // Start the audio source playing
|
||||
|
||||
// Stop the audio source, reset audio id even if muted
|
||||
void stop();
|
||||
|
||||
// Start the audio source playing,
|
||||
// takes mute into account to preserve previous id if nessesary
|
||||
bool play(const LLUUID &audio_id);
|
||||
|
||||
bool hasPendingPreloads() const; // Has preloads that haven't been done yet
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@
|
|||
#include "llstl.h" // for DeletePointer()
|
||||
#include "llstring.h"
|
||||
#include "lleventtimer.h"
|
||||
|
||||
#include "stringize.h"
|
||||
#include "llcleanup.h"
|
||||
#include "llevents.h"
|
||||
|
|
|
|||
|
|
@ -248,14 +248,25 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
|
|||
// protected_fixedsize_stack sets a guard page past the end of the new
|
||||
// stack so that stack underflow will result in an access violation
|
||||
// instead of weird, subtle, possibly undiagnosed memory stomps.
|
||||
boost::fibers::fiber newCoro(boost::fibers::launch::dispatch,
|
||||
std::allocator_arg,
|
||||
boost::fibers::protected_fixedsize_stack(mStackSize),
|
||||
[this, &name, &callable](){ toplevel(name, callable); });
|
||||
// You have two choices with a fiber instance: you can join() it or you
|
||||
// can detach() it. If you try to destroy the instance before doing
|
||||
// either, the program silently terminates. We don't need this handle.
|
||||
newCoro.detach();
|
||||
|
||||
try
|
||||
{
|
||||
boost::fibers::fiber newCoro(boost::fibers::launch::dispatch,
|
||||
std::allocator_arg,
|
||||
boost::fibers::protected_fixedsize_stack(mStackSize),
|
||||
[this, &name, &callable]() { toplevel(name, callable); });
|
||||
|
||||
// You have two choices with a fiber instance: you can join() it or you
|
||||
// can detach() it. If you try to destroy the instance before doing
|
||||
// either, the program silently terminates. We don't need this handle.
|
||||
newCoro.detach();
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
// Out of memory on stack allocation?
|
||||
LL_ERRS("LLCoros") << "Bad memory allocation in LLCoros::launch(" << prefix << ")!" << LL_ENDL;
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ void storeToLLSDPath(LLSD& dest, const LLSD& path, const LLSD& value)
|
|||
}
|
||||
|
||||
// Drill down to where we should store 'value'.
|
||||
llsd::drill(dest, path) = value;
|
||||
llsd::drill_ref(dest, path) = value;
|
||||
}
|
||||
|
||||
} // anonymous
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "linden_common.h"
|
||||
|
||||
#include "llsdutil.h"
|
||||
#include <sstream>
|
||||
|
||||
#if LL_WINDOWS
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
|
|
@ -882,7 +883,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs, int bits)
|
|||
namespace llsd
|
||||
{
|
||||
|
||||
LLSD& drill(LLSD& blob, const LLSD& rawPath)
|
||||
LLSD& drill_ref(LLSD& blob, const LLSD& rawPath)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
|
||||
|
|
@ -943,9 +944,9 @@ LLSD drill(const LLSD& blob, const LLSD& path)
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED
|
||||
|
||||
// non-const drill() does exactly what we want. Temporarily cast away
|
||||
// drill_ref() does exactly what we want. Temporarily cast away
|
||||
// const-ness and use that.
|
||||
return drill(const_cast<LLSD&>(blob), path);
|
||||
return drill_ref(const_cast<LLSD&>(blob), path);
|
||||
}
|
||||
|
||||
} // namespace llsd
|
||||
|
|
|
|||
|
|
@ -184,10 +184,10 @@ namespace llsd
|
|||
* - Anything else is an error.
|
||||
*
|
||||
* By implication, if path.isUndefined() or otherwise equivalent to an empty
|
||||
* LLSD::Array, drill() returns 'blob' as is.
|
||||
* LLSD::Array, drill[_ref]() returns 'blob' as is.
|
||||
*/
|
||||
LLSD drill(const LLSD& blob, const LLSD& path);
|
||||
LLSD& drill( LLSD& blob, const LLSD& path);
|
||||
LLSD& drill_ref( LLSD& blob, const LLSD& path);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -202,18 +202,6 @@ LLOSInfo::LLOSInfo() :
|
|||
GetSystemInfo(&si); //if it fails get regular system info
|
||||
//(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load)
|
||||
|
||||
//msdn microsoft finds 32 bit and 64 bit flavors this way..
|
||||
//http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors
|
||||
//of windows than this code does (in case it is needed for the future)
|
||||
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit
|
||||
{
|
||||
mOSStringSimple += "64-bit ";
|
||||
}
|
||||
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
|
||||
{
|
||||
mOSStringSimple += "32-bit ";
|
||||
}
|
||||
|
||||
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
|
||||
OSVERSIONINFOEX osvi;
|
||||
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
|
||||
|
|
@ -261,12 +249,24 @@ LLOSInfo::LLOSInfo() :
|
|||
// and likely to return 'compatibility' string.
|
||||
// Check presence of dlls/libs or may be their version.
|
||||
// <FS:Ansariel> Windows 11 detection
|
||||
//mOSStringSimple = "Microsoft Windows 10/11";
|
||||
//mOSStringSimple = "Microsoft Windows 10/11 ";
|
||||
mMajorVer = 11;
|
||||
LLStringUtil::replaceString(mOSStringSimple, "10", "11");
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//msdn microsoft finds 32 bit and 64 bit flavors this way..
|
||||
//http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors
|
||||
//of windows than this code does (in case it is needed for the future)
|
||||
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit
|
||||
{
|
||||
mOSStringSimple += "64-bit ";
|
||||
}
|
||||
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
|
||||
{
|
||||
mOSStringSimple += "32-bit ";
|
||||
}
|
||||
|
||||
mOSString = mOSStringSimple;
|
||||
if (mBuild > 0)
|
||||
|
|
|
|||
|
|
@ -5857,7 +5857,16 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
|||
resizeIndices(grid_size*grid_size*6);
|
||||
if (!volume->isMeshAssetLoaded())
|
||||
{
|
||||
mEdge.resize(grid_size*grid_size * 6);
|
||||
S32 size = grid_size * grid_size * 6;
|
||||
try
|
||||
{
|
||||
mEdge.resize(size);
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_WARNS("LLVOLUME") << "Resize of mEdge to " << size << " failed" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
U16* out = mIndices;
|
||||
|
|
@ -6670,7 +6679,15 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
|
||||
if (!volume->isMeshAssetLoaded())
|
||||
{
|
||||
mEdge.resize(num_indices);
|
||||
try
|
||||
{
|
||||
mEdge.resize(num_indices);
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_WARNS("LLVOLUME") << "Resize of mEdge to " << num_indices << " failed" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6898,7 +6915,15 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
LLVector4a* norm = mNormals;
|
||||
|
||||
static LLAlignedArray<LLVector4a, 64> triangle_normals;
|
||||
triangle_normals.resize(count);
|
||||
try
|
||||
{
|
||||
triangle_normals.resize(count);
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_WARNS("LLVOLUME") << "Resize of triangle_normals to " << count << " failed" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
LLVector4a* output = triangle_normals.mArray;
|
||||
LLVector4a* end_output = output+count;
|
||||
|
||||
|
|
|
|||
|
|
@ -178,6 +178,14 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
|
|||
mTripleClickTimer.reset();
|
||||
setText(p.default_text());
|
||||
|
||||
if (p.initial_value.isProvided()
|
||||
&& !p.control_name.isProvided())
|
||||
{
|
||||
// Initial value often is descriptive, like "Type some ID here"
|
||||
// and can be longer than size limitation, ignore size
|
||||
setText(p.initial_value.getValue().asString(), false);
|
||||
}
|
||||
|
||||
// Initialize current history line iterator
|
||||
mCurrentHistoryLine = mLineHistory.begin();
|
||||
|
||||
|
|
@ -406,6 +414,11 @@ void LLLineEditor::updateTextPadding()
|
|||
|
||||
|
||||
void LLLineEditor::setText(const LLStringExplicit &new_text)
|
||||
{
|
||||
setText(new_text, true);
|
||||
}
|
||||
|
||||
void LLLineEditor::setText(const LLStringExplicit &new_text, bool use_size_limit)
|
||||
{
|
||||
// If new text is identical, don't copy and don't move insertion point
|
||||
if (mText.getString() == new_text)
|
||||
|
|
@ -424,13 +437,13 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
|
|||
all_selected = all_selected || (len == 0 && hasFocus() && mSelectAllonFocusReceived);
|
||||
|
||||
std::string truncated_utf8 = new_text;
|
||||
if (truncated_utf8.size() > (U32)mMaxLengthBytes)
|
||||
if (use_size_limit && truncated_utf8.size() > (U32)mMaxLengthBytes)
|
||||
{
|
||||
truncated_utf8 = utf8str_truncate(new_text, mMaxLengthBytes);
|
||||
}
|
||||
mText.assign(truncated_utf8);
|
||||
|
||||
if (mMaxLengthChars)
|
||||
if (use_size_limit && mMaxLengthChars)
|
||||
{
|
||||
mText.assign(utf8str_symbol_truncate(truncated_utf8, mMaxLengthChars));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -337,6 +337,8 @@ private:
|
|||
virtual S32 getPreeditFontSize() const;
|
||||
virtual LLWString getPreeditString() const { return getWText(); }
|
||||
|
||||
void setText(const LLStringExplicit &new_text, bool use_size_limit);
|
||||
|
||||
void setContextMenu(LLContextMenu* new_context_menu);
|
||||
|
||||
protected:
|
||||
|
|
|
|||
|
|
@ -2386,6 +2386,16 @@ void LLMenuGL::arrange( void )
|
|||
(*item_iter)->setRect( rect );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (getTornOff())
|
||||
{
|
||||
LLTearOffMenu * torn_off_menu = dynamic_cast<LLTearOffMenu*>(getParent());
|
||||
if (torn_off_menu)
|
||||
{
|
||||
torn_off_menu->updateSize();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mKeepFixedSize)
|
||||
{
|
||||
|
|
@ -3912,7 +3922,8 @@ void LLMenuHolderGL::setActivatedItem(LLMenuItemGL* item)
|
|||
/// Class LLTearOffMenu
|
||||
///============================================================================
|
||||
LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
|
||||
LLFloater(LLSD())
|
||||
LLFloater(LLSD()),
|
||||
mQuitRequested(false)
|
||||
{
|
||||
S32 floater_header_size = getHeaderHeight();
|
||||
|
||||
|
|
@ -3927,7 +3938,7 @@ LLTearOffMenu::LLTearOffMenu(LLMenuGL* menup) :
|
|||
LLRect rect;
|
||||
menup->localRectToOtherView(LLRect(-1, menup->getRect().getHeight(), menup->getRect().getWidth() + 3, 0), &rect, gFloaterView);
|
||||
// make sure this floater is big enough for menu
|
||||
mTargetHeight = (F32)(rect.getHeight() + floater_header_size);
|
||||
mTargetHeight = rect.getHeight() + floater_header_size;
|
||||
reshape(rect.getWidth(), rect.getHeight());
|
||||
setRect(rect);
|
||||
|
||||
|
|
@ -3959,19 +3970,24 @@ LLTearOffMenu::~LLTearOffMenu()
|
|||
void LLTearOffMenu::draw()
|
||||
{
|
||||
mMenu->setBackgroundVisible(isBackgroundOpaque());
|
||||
mMenu->needsArrange();
|
||||
|
||||
if (getRect().getHeight() != mTargetHeight)
|
||||
{
|
||||
// animate towards target height
|
||||
reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f))));
|
||||
reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), (F32)mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f))));
|
||||
mMenu->needsArrange();
|
||||
}
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
||||
void LLTearOffMenu::onFocusReceived()
|
||||
{
|
||||
// if nothing is highlighted, just highlight first item
|
||||
if (mQuitRequested)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// if nothing is highlighted, just highlight first item
|
||||
if (!mMenu->getHighlightedItem())
|
||||
{
|
||||
mMenu->highlightNextItem(NULL);
|
||||
|
|
@ -4047,6 +4063,31 @@ LLTearOffMenu* LLTearOffMenu::create(LLMenuGL* menup)
|
|||
return tearoffp;
|
||||
}
|
||||
|
||||
void LLTearOffMenu::updateSize()
|
||||
{
|
||||
if (mMenu)
|
||||
{
|
||||
S32 floater_header_size = getHeaderHeight();
|
||||
const LLRect &floater_rect = getRect();
|
||||
LLRect new_rect;
|
||||
mMenu->localRectToOtherView(LLRect(-1, mMenu->getRect().getHeight() + floater_header_size, mMenu->getRect().getWidth() + 3, 0), &new_rect, gFloaterView);
|
||||
|
||||
if (floater_rect.getWidth() != new_rect.getWidth()
|
||||
|| mTargetHeight != new_rect.getHeight())
|
||||
{
|
||||
// make sure this floater is big enough for menu
|
||||
mTargetHeight = new_rect.getHeight();
|
||||
reshape(new_rect.getWidth(), mTargetHeight);
|
||||
|
||||
// Restore menu position
|
||||
LLRect menu_rect = mMenu->getRect();
|
||||
menu_rect.setOriginAndSize(1, 1,
|
||||
menu_rect.getWidth(), menu_rect.getHeight());
|
||||
mMenu->setRect(menu_rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLTearOffMenu::closeTearOff()
|
||||
{
|
||||
removeChild(mMenu);
|
||||
|
|
@ -4057,6 +4098,7 @@ void LLTearOffMenu::closeTearOff()
|
|||
mMenu->setVisible(FALSE);
|
||||
mMenu->setTornOff(FALSE);
|
||||
mMenu->setDropShadowed(TRUE);
|
||||
mQuitRequested = true;
|
||||
}
|
||||
|
||||
LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p)
|
||||
|
|
|
|||
|
|
@ -885,6 +885,8 @@ public:
|
|||
virtual BOOL handleKeyHere(KEY key, MASK mask);
|
||||
virtual void translate(S32 x, S32 y);
|
||||
|
||||
void updateSize();
|
||||
|
||||
private:
|
||||
LLTearOffMenu(LLMenuGL* menup);
|
||||
|
||||
|
|
@ -892,7 +894,8 @@ private:
|
|||
|
||||
LLView* mOldParent;
|
||||
LLMenuGL* mMenu;
|
||||
F32 mTargetHeight;
|
||||
S32 mTargetHeight;
|
||||
bool mQuitRequested;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
|||
|
|
@ -1165,6 +1165,24 @@ std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const
|
|||
return LLUrlEntryBase::getLocation(url);
|
||||
}
|
||||
|
||||
//
|
||||
// LLUrlEntryChat Describes a Second Life chat Url, e.g.,
|
||||
// secondlife:///app/chat/42/This%20Is%20a%20test
|
||||
//
|
||||
|
||||
LLUrlEntryChat::LLUrlEntryChat()
|
||||
{
|
||||
mPattern = boost::regex("secondlife:///app/chat/\\d+/\\S+",
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_slapp.xml";
|
||||
mTooltip = LLTrans::getString("TooltipSLAPP");
|
||||
}
|
||||
|
||||
std::string LLUrlEntryChat::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
|
||||
{
|
||||
return unescapeUrl(url);
|
||||
}
|
||||
|
||||
// LLUrlEntryParcel statics.
|
||||
LLUUID LLUrlEntryParcel::sAgentID(LLUUID::null);
|
||||
LLUUID LLUrlEntryParcel::sSessionID(LLUUID::null);
|
||||
|
|
|
|||
|
|
@ -418,6 +418,17 @@ public:
|
|||
private:
|
||||
};
|
||||
|
||||
//
|
||||
// LLUrlEntryChat Describes a Second Life chat Url, e.g.,
|
||||
// secondlife:///app/chat/42/This%20Is%20a%20test
|
||||
//
|
||||
class LLUrlEntryChat : public LLUrlEntryBase
|
||||
{
|
||||
public:
|
||||
LLUrlEntryChat();
|
||||
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
|
||||
};
|
||||
|
||||
///
|
||||
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
|
||||
/// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ LLUrlRegistry::LLUrlRegistry()
|
|||
// LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since
|
||||
// LLUrlEntryAgent is a less specific (catchall for agent urls)
|
||||
registerUrl(new LLUrlEntryAgent());
|
||||
registerUrl(new LLUrlEntryChat());
|
||||
registerUrl(new LLUrlEntryGroup());
|
||||
registerUrl(new LLUrlEntryParcel());
|
||||
registerUrl(new LLUrlEntryTeleport());
|
||||
|
|
|
|||
|
|
@ -325,10 +325,9 @@ void LLWindowSDL::initialiseX11Clipboard()
|
|||
|
||||
XA_CLIPBOARD = XInternAtom(mSDL_Display, "CLIPBOARD", False);
|
||||
|
||||
gSupportedAtoms[0] = XA_STRING;
|
||||
|
||||
gSupportedAtoms[0] = XInternAtom(mSDL_Display, "UTF8_STRING", False);
|
||||
gSupportedAtoms[1] = XInternAtom(mSDL_Display, "COMPOUND_TEXT", False);
|
||||
gSupportedAtoms[2] = XInternAtom(mSDL_Display, "UTF8_STRING", False);
|
||||
gSupportedAtoms[2] = XA_STRING;
|
||||
|
||||
// TARGETS atom
|
||||
XA_TARGETS = XInternAtom(mSDL_Display, "TARGETS", False);
|
||||
|
|
@ -359,7 +358,7 @@ bool LLWindowSDL::getSelectionText( Atom aSelection, Atom aType, LLWString &text
|
|||
&remaining, &data);
|
||||
if (data && len)
|
||||
{
|
||||
text = LLWString(
|
||||
text = LLWString(
|
||||
utf8str_to_wstring(reinterpret_cast< char const *>( data ) )
|
||||
);
|
||||
XFree(data);
|
||||
|
|
|
|||
|
|
@ -4451,7 +4451,8 @@ BOOL LLWindowWin32::handleImeRequests(WPARAM request, LPARAM param, LRESULT *res
|
|||
S32 context_offset;
|
||||
LLWString context = find_context(wtext, preedit, preedit_length, &context_offset);
|
||||
preedit -= context_offset;
|
||||
if (preedit_length)
|
||||
preedit_length = llmin(preedit_length, (S32)context.length() - preedit);
|
||||
if (preedit_length && preedit >= 0)
|
||||
{
|
||||
// IMR_DOCUMENTFEED may be called when we have an active preedit.
|
||||
// We should pass the context string *excluding* the preedit string.
|
||||
|
|
|
|||
|
|
@ -2373,9 +2373,7 @@ if (WINDOWS)
|
|||
add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)
|
||||
endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
|
||||
|
||||
add_dependencies(${VIEWER_BINARY_NAME}
|
||||
SLPlugin
|
||||
)
|
||||
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin)
|
||||
|
||||
# sets the 'working directory' for debugging from visual studio.
|
||||
# Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865)
|
||||
|
|
|
|||
|
|
@ -238,14 +238,6 @@
|
|||
<map>
|
||||
<key>map-to</key>
|
||||
<string>NoAudio</string>
|
||||
</map>
|
||||
|
||||
<key>noinvlib</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
<string>Do not request the inventory library.</string>
|
||||
<key>map-to</key>
|
||||
<string>NoInventoryLibrary</string>
|
||||
</map>
|
||||
|
||||
<key>noninteractive</key>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<keys>
|
||||
<keys xml_version="1">
|
||||
<first_person>
|
||||
<binding key="A" mask="NONE" command="slide_left"/>
|
||||
<binding key="D" mask="NONE" command="slide_right"/>
|
||||
|
|
@ -17,22 +17,13 @@
|
|||
<binding key="PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="HOME" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="SPACE" mask="NONE" command="stop_moving"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
|
||||
</first_person>
|
||||
<third_person>
|
||||
<binding key="A" mask="NONE" command="turn_left"/>
|
||||
|
|
@ -60,19 +51,6 @@
|
|||
<binding key="PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="HOME" mask="NONE" command="toggle_fly"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="turn_left"/>
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="turn_right"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="push_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="push_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="jump"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="push_down"/>
|
||||
<binding key="PAD_HOME" mask="NONE" command="toggle_fly"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<!--Camera controls in third person on Alt-->
|
||||
<binding key="LEFT" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="RIGHT" mask="ALT" command="spin_around_ccw"/>
|
||||
|
|
@ -88,15 +66,6 @@
|
|||
<binding key="E" mask="ALT" command="spin_over"/>
|
||||
<binding key="C" mask="ALT" command="spin_under"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/>
|
||||
<binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/>
|
||||
<binding key="PAD_UP" mask="ALT" command="move_forward"/>
|
||||
<binding key="PAD_DOWN" mask="ALT" command="move_backward"/>
|
||||
<binding key="PAD_PGUP" mask="ALT" command="spin_over"/>
|
||||
<binding key="PAD_PGDN" mask="ALT" command="spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="ALT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/>
|
||||
|
||||
<!--mimic alt zoom behavior with keyboard only-->
|
||||
<binding key="W" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="S" mask="CTL_ALT" command="spin_under"/>
|
||||
|
|
@ -104,9 +73,6 @@
|
|||
<binding key="UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/>
|
||||
|
||||
<!--Therefore pan on Alt-Shift-->
|
||||
<binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
|
|
@ -118,14 +84,10 @@
|
|||
<binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
<binding key="" mask="NONE" mouse="LMB" command="walk_to"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
|
||||
</third_person>
|
||||
<sitting>
|
||||
<binding key="A" mask="ALT" command="spin_around_cw"/>
|
||||
|
|
@ -167,16 +129,6 @@
|
|||
<binding key="PGUP" mask="NONE" command="spin_over_sitting"/>
|
||||
<binding key="PGDN" mask="NONE" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/>
|
||||
<binding key="PAD_CENTER" mask="NONE" command="stop_moving"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<!--these are for passing controls when sitting on vehicles-->
|
||||
<binding key="A" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="D" mask="SHIFT" command="slide_right"/>
|
||||
|
|
@ -192,15 +144,6 @@
|
|||
<binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
|
||||
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
|
||||
<binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/>
|
||||
<binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
|
||||
<binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
|
||||
<binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
|
||||
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
|
||||
|
||||
<!--pan on Alt-Shift-->
|
||||
<binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
|
|
@ -212,17 +155,12 @@
|
|||
<binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
|
||||
<binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/>
|
||||
<binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/>
|
||||
<binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/>
|
||||
<binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/>
|
||||
<binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
|
||||
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
|
||||
</sitting>
|
||||
<edit_avatar>
|
||||
<!--Avatar editing camera controls-->
|
||||
|
|
@ -240,15 +178,9 @@
|
|||
<binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/>
|
||||
<binding key="ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
<binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/>
|
||||
<binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/>
|
||||
<binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/>
|
||||
<binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/>
|
||||
<binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/>
|
||||
<binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/>
|
||||
<binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
|
||||
<binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
|
||||
|
||||
<binding key="" mask="NONE" mouse="LMB" command="script_trigger_lbutton"/>
|
||||
</edit_avatar>
|
||||
</keys>
|
||||
|
|
@ -6951,11 +6951,11 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&sid=[SESSION_ID]</string>
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&r=[MATURITY]&lang=[LANGUAGE]&sid=[SESSION_ID]</string>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
<!-- LL, possibly privacy leaking search string
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
-->
|
||||
</map>
|
||||
<key>GuidebookURL</key>
|
||||
|
|
@ -8278,19 +8278,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LoginAsGod</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Attempt to login with god powers (Linden accounts only)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LoginLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -9722,6 +9709,17 @@
|
|||
<key>Value</key>
|
||||
<integer>1000</integer>
|
||||
</map>
|
||||
<key>FakeInitialOutfitName</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Pretend that this is first time login and specified name was chosen</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string />
|
||||
</map>
|
||||
<key>NearMeRange</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -9819,7 +9817,7 @@
|
|||
<key>NoInventoryLibrary</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Do not request inventory library.</string>
|
||||
<string>(Deprecated) Do not request inventory library.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
|
||||
// Bridge platform
|
||||
string BRIDGE_VERSION = "2.27"; // This should match fslslbridge.cpp
|
||||
string BRIDGE_VERSION = "2.28"; // This should match fslslbridge.cpp
|
||||
string gLatestURL;
|
||||
integer gViewerIsFirestorm;
|
||||
integer gTryHandshakeOnce = TRUE;
|
||||
|
|
@ -48,8 +48,8 @@
|
|||
{
|
||||
llReleaseURL(gLatestURL);
|
||||
gLatestURL = "";
|
||||
// llRequestSecureURL(); // Uncomment this line and comment next one for HTTPS instead of HTTP (experimental)
|
||||
llRequestURL();
|
||||
llRequestSecureURL();
|
||||
// llRequestURL(); -- Uncomment this line and comment the previous one for HTTP instead of HTTPS
|
||||
}
|
||||
|
||||
detachBridge()
|
||||
|
|
|
|||
|
|
@ -845,8 +845,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
|
|||
LL_DEBUGS("import") << "Setting clickaction on " << prim_uuid.asString() << " to " << prim["clickaction"].asInteger() << LL_ENDL;
|
||||
gMessageSystem->newMessageFast(_PREHASH_ObjectClickAction);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
|
||||
gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() );
|
||||
gMessageSystem->addU8("ClickAction", (U8)prim["clickaction"].asInteger());
|
||||
|
|
@ -860,8 +860,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
|
|||
LL_DEBUGS("import") << "Setting name on " << prim_uuid.asString() << " to " << prim_name << LL_ENDL;
|
||||
gMessageSystem->newMessageFast(_PREHASH_ObjectName);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
|
||||
gMessageSystem->addU32Fast(_PREHASH_LocalID, object_local_id);
|
||||
gMessageSystem->addStringFast(_PREHASH_Name, prim_name);
|
||||
|
|
@ -873,8 +873,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
|
|||
LL_DEBUGS("import") << "Setting description on " << prim_uuid.asString() << " to " << prim["description"].asString() << LL_ENDL;
|
||||
gMessageSystem->newMessageFast(_PREHASH_ObjectDescription);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
|
||||
gMessageSystem->addU32Fast(_PREHASH_LocalID, object_local_id);
|
||||
gMessageSystem->addStringFast(_PREHASH_Description, prim["description"].asString());
|
||||
|
|
@ -887,8 +887,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
|
|||
LL_DEBUGS("import") << "Setting permissions on " << prim_uuid.asString() << LL_ENDL;
|
||||
gMessageSystem->newMessageFast(_PREHASH_ObjectPermissions);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_HeaderData);
|
||||
gMessageSystem->addBOOLFast(_PREHASH_Override, (BOOL)FALSE);
|
||||
|
||||
|
|
@ -953,8 +953,8 @@ bool FSFloaterImport::processPrimCreated(LLViewerObject* object)
|
|||
LL_DEBUGS("import") << "Setting sale info on " << prim_uuid.asString() << LL_ENDL;
|
||||
gMessageSystem->newMessageFast(_PREHASH_ObjectSaleInfo);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
|
||||
gMessageSystem->addU32Fast(_PREHASH_LocalID, object->getLocalID());
|
||||
sale_info.packMessage(gMessageSystem);
|
||||
|
|
@ -1155,8 +1155,8 @@ void FSFloaterImport::setPrimPosition(U8 type, LLViewerObject* object, LLVector3
|
|||
{
|
||||
gMessageSystem->newMessage(_PREHASH_MultipleObjectUpdate);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
|
||||
gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID());
|
||||
gMessageSystem->addU8Fast(_PREHASH_Type, type);
|
||||
|
|
@ -1298,7 +1298,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
|
|||
ci_data->asset_type = asset_type;
|
||||
ci_data->post_asset_upload = false;
|
||||
LLPointer<LLInventoryCallback> cb = new FSCreateItemCallback(ci_data);
|
||||
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
|
||||
create_inventory_item(gAgentID, gAgentSessionID,
|
||||
folder_id, LLTransactionID::tnull, name, description, asset_type, inventory_type,
|
||||
NO_INV_SUBTYPE, PERM_ALL, cb);
|
||||
return;
|
||||
|
|
@ -1322,7 +1322,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
|
|||
ci_data->asset_type = asset_type;
|
||||
ci_data->post_asset_upload = false;
|
||||
LLPointer<LLInventoryCallback> cb = new FSCreateItemCallback(ci_data);
|
||||
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
|
||||
create_inventory_item(gAgentID, gAgentSessionID,
|
||||
folder_id, LLTransactionID::tnull, name, description, asset_type, inventory_type,
|
||||
NO_INV_SUBTYPE, PERM_MOVE | PERM_TRANSFER, cb);
|
||||
return;
|
||||
|
|
@ -1372,7 +1372,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
|
|||
ci_data->asset_type = asset_type;
|
||||
ci_data->post_asset_upload = false;
|
||||
LLPointer<LLInventoryCallback> cb = new FSCreateItemCallback(ci_data);
|
||||
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
|
||||
create_inventory_item(gAgentID, gAgentSessionID,
|
||||
folder_id, LLTransactionID::tnull, name, description, asset_type, inventory_type,
|
||||
NO_INV_SUBTYPE, PERM_ALL, cb);
|
||||
return;
|
||||
|
|
@ -1495,7 +1495,7 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
|
|||
data->mAssetInfo.setDescription(description);
|
||||
data->mPreferredLocation = folder_type;
|
||||
|
||||
if(!url.empty())
|
||||
if (!url.empty())
|
||||
{
|
||||
if (new_file_agent_inventory)
|
||||
{
|
||||
|
|
@ -1508,11 +1508,9 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
|
|||
body["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms(perms_prefix));
|
||||
body["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms(perms_prefix));
|
||||
}
|
||||
|
||||
|
||||
boost::shared_ptr< LLResourceData> pData( data, resourceDeleter );
|
||||
|
||||
LLCoprocedureManager::instance().enqueueCoprocedure( "FSImporter", "Upload asset", boost::bind( uploadCoroutine, _1, url, body, new_asset_id, asset_type, pData ) );
|
||||
boost::shared_ptr< LLResourceData> pData(data, resourceDeleter);
|
||||
LLCoprocedureManager::instance().enqueueCoprocedure("AssetStorage", "Upload asset", boost::bind( uploadCoroutine, _1, url, body, new_asset_id, asset_type, pData));
|
||||
|
||||
LL_DEBUGS("import") << "Asset upload via capability of " << new_asset_id.asString() << " to " << url << " of " << asset_id.asString() << LL_ENDL;
|
||||
}
|
||||
|
|
@ -1583,10 +1581,10 @@ void FSFloaterImport::onAssetUploadComplete(const LLUUID& uuid, void* userdata,
|
|||
LLMessageSystem* msg = gMessageSystem;
|
||||
msg->newMessageFast(_PREHASH_MoneyTransferRequest);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
msg->nextBlockFast(_PREHASH_MoneyData);
|
||||
msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SourceID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
|
||||
msg->addU8("Flags", 0);
|
||||
// we tell the sim how much we were expecting to pay so it
|
||||
|
|
@ -1613,7 +1611,7 @@ void FSFloaterImport::onAssetUploadComplete(const LLUUID& uuid, void* userdata,
|
|||
fs_data->post_asset_upload = true;
|
||||
fs_data->post_asset_upload_id = asset_id;
|
||||
LLPointer<LLInventoryCallback> cb = new FSCreateItemCallback(fs_data);
|
||||
create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
|
||||
create_inventory_item(gAgentID, gAgentSessionID,
|
||||
folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
|
||||
data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
|
||||
data->mInventoryType, fs_data->wearable_type, next_owner_perms,
|
||||
|
|
@ -2038,7 +2036,7 @@ void uploadCoroutine( LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &a_httpAdapter
|
|||
}
|
||||
|
||||
LLPermissions new_perms;
|
||||
new_perms.init( gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null );
|
||||
new_perms.init( gAgentID, gAgentID, LLUUID::null, LLUUID::null );
|
||||
|
||||
new_perms.initMasks( PERM_ALL, PERM_ALL, everyone_perms, group_perms, next_owner_perms );
|
||||
|
||||
|
|
|
|||
|
|
@ -634,6 +634,7 @@ void FSFloaterPerformance::populateNearbyList()
|
|||
auto overall_appearance = avatar->getOverallAppearance();
|
||||
if (overall_appearance == LLVOAvatar::AOA_INVISIBLE)
|
||||
{
|
||||
char_iter++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ public:
|
|||
|
||||
/*virtual*/ void setErrorStatus(S32 status, const std::string& reason)
|
||||
{
|
||||
LL_ERRS("Search") << "Can't complete remote parcel request. Http Status: " << status << ". Reason : " << reason << LL_ENDL;
|
||||
LL_WARNS("Search") << "Can't complete remote parcel request. Http Status: " << status << ". Reason : " << reason << LL_ENDL;
|
||||
}
|
||||
private:
|
||||
std::set<LLUUID> mParcelIDs;
|
||||
|
|
|
|||
|
|
@ -55,7 +55,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 = 27;
|
||||
static const U32 FS_BRIDGE_MINOR_VERSION = 28;
|
||||
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=";
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ namespace FSPerfStats
|
|||
FSPerfStats::tunables.userImpostorDistanceTuningEnabled = gSavedSettings.getBOOL("FSAutoTuneImpostorByDistEnabled");
|
||||
FSPerfStats::tunables.userFPSTuningStrategy = gSavedSettings.getU32("FSTuningFPSStrategy");
|
||||
FSPerfStats::tunables.userTargetFPS = gSavedSettings.getU32("FSTargetFPS");
|
||||
FSPerfStats::tunables.userTargetReflections = gSavedSettings.getU32("FSUserTargetReflections");
|
||||
FSPerfStats::tunables.userTargetReflections = gSavedSettings.getS32("FSUserTargetReflections");
|
||||
FSPerfStats::tunables.userAutoTuneEnabled = gSavedSettings.getBOOL("FSAutoTuneFPS");
|
||||
FSPerfStats::tunables.userAutoTuneLock = gSavedSettings.getBOOL("FSAutoTuneLock");
|
||||
// Note: The Max ART slider is logarithmic and thus we have an intermediate proxy value
|
||||
|
|
|
|||
|
|
@ -1,54 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
SCRIPT_PATH=`readlink -f $0`
|
||||
SCRIPT_PATH=`dirname $SCRIPT_PATH`
|
||||
|
||||
echo "Trying to build AppImage in directory $1 into file $3"
|
||||
|
||||
# All hope is lost if there is no lsb_release command
|
||||
command -v lsb_release >/dev/null 2>/dev/null || exit 0
|
||||
|
||||
if [ `lsb_release -is` != "Ubuntu" ]
|
||||
then
|
||||
echo "Distribution is not Ubuntu, skipping AppImage creation"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
cd $1
|
||||
pushd packaged
|
||||
|
||||
wget -q https://github.com/AppImage/AppImages/raw/master/functions.sh -O ./functions.sh
|
||||
. ./functions.sh
|
||||
rm functions.sh
|
||||
|
||||
cp firestorm AppRun
|
||||
cp ${SCRIPT_PATH}/firestorm.desktop firestorm.desktop
|
||||
|
||||
copy_deps
|
||||
copy_deps
|
||||
copy_deps
|
||||
delete_blacklisted
|
||||
|
||||
# Now copy everything to ./lib. The viewer binaries got build with a rpath pointing to ./lib so all so will be magically found there.
|
||||
#find ./usr/lib/ -type f -print0 | xargs -0 -Ifile cp file ./lib/
|
||||
#find ./lib/x86_64-linux-gnu/ -type f -print0 | xargs -0 -Ifile cp file ./lib/
|
||||
|
||||
#rm -rf ./usr/lib/
|
||||
#rm -rf ./lib/x86_64-linux-gnu/
|
||||
|
||||
find . -empty -type d -delete
|
||||
|
||||
popd
|
||||
|
||||
wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
chmod a+x appimagetool-x86_64.AppImage
|
||||
./appimagetool-x86_64.AppImage --appimage-extract
|
||||
rm appimagetool-x86_64.AppImage
|
||||
ARCH=x86_64 squashfs-root/AppRun packaged
|
||||
|
||||
if [ -f $2 ]
|
||||
then
|
||||
mv $2 $3
|
||||
fi
|
||||
|
|
@ -2422,7 +2422,8 @@ void LLAgent::propagate(const F32 dt)
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 mouse_x, const S32 mouse_y)
|
||||
{
|
||||
if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout"))
|
||||
static LLCachedControl<F32> hint_timeout(gSavedSettings, "NotMovingHintTimeout");
|
||||
if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > hint_timeout)
|
||||
{
|
||||
LLFirstUse::notMoving();
|
||||
}
|
||||
|
|
@ -2620,7 +2621,8 @@ void LLAgent::endAnimationUpdateUI()
|
|||
gStatusBar->setVisibleForMouselook(true);
|
||||
|
||||
// <FS:Zi> We don't use the mini location panel in Firestorm
|
||||
// if (gSavedSettings.getBOOL("ShowMiniLocationPanel"))
|
||||
// static LLCachedControl<bool> show_mini_location_panel(gSavedSettings, "ShowMiniLocationPanel");
|
||||
// if (show_mini_location_panel)
|
||||
// {
|
||||
// LLPanelTopInfoBar::getInstance()->setVisible(TRUE);
|
||||
// }
|
||||
|
|
@ -4667,10 +4669,9 @@ bool LLAgent::teleportCore(bool is_local)
|
|||
// yet if the teleport will succeed. Look in
|
||||
// process_teleport_location_reply
|
||||
|
||||
// close the map panel so we can see our destination.
|
||||
// we don't close search floater, see EXT-5840.
|
||||
if (!gSavedSettings.getBOOL("FSDoNotHideMapOnTeleport")) // <FS:Ansariel> FIRE-17779: Option to not close world map on teleport
|
||||
LLFloaterReg::hideInstance("world_map");
|
||||
// <FS:Ansariel> FIRE-17779: Option to not close world map on teleport
|
||||
if (!gSavedSettings.getBOOL("FSDoNotHideMapOnTeleport"))
|
||||
LLFloaterReg::hideInstance("world_map");
|
||||
|
||||
// hide land floater too - it'll be out of date
|
||||
LLFloaterReg::hideInstance("about_land");
|
||||
|
|
|
|||
|
|
@ -6304,14 +6304,18 @@ void LLAppViewer::disconnectViewer()
|
|||
}
|
||||
|
||||
// save inventory if appropriate
|
||||
gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
|
||||
if (gInventory.getLibraryRootFolderID().notNull()
|
||||
&& gInventory.getLibraryOwnerID().notNull())
|
||||
{
|
||||
gInventory.cache(
|
||||
gInventory.getLibraryRootFolderID(),
|
||||
gInventory.getLibraryOwnerID());
|
||||
}
|
||||
if (gInventory.isInventoryUsable()
|
||||
&& gAgent.getID().notNull()) // Shouldn't be null at this stage
|
||||
{
|
||||
gInventory.cache(gInventory.getRootFolderID(), gAgent.getID());
|
||||
if (gInventory.getLibraryRootFolderID().notNull()
|
||||
&& gInventory.getLibraryOwnerID().notNull())
|
||||
{
|
||||
gInventory.cache(
|
||||
gInventory.getLibraryRootFolderID(),
|
||||
gInventory.getLibraryOwnerID());
|
||||
}
|
||||
}
|
||||
|
||||
LLAvatarNameCache::instance().setCustomNameCheckCallback(LLAvatarNameCache::custom_name_check_callback_t()); // <FS:Ansariel> Contact sets
|
||||
saveNameCache();
|
||||
|
|
|
|||
|
|
@ -40,16 +40,42 @@
|
|||
|
||||
#include <exception>
|
||||
|
||||
#include "json/reader.h" // <FS:ND/> To parse manifest.json from pepperflash
|
||||
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <resolv.h>
|
||||
|
||||
#if (__GLIBC__*1000 + __GLIBC_MINOR__) >= 2034
|
||||
#pragma message "Compiling with libresolv stubs"
|
||||
extern "C"
|
||||
{
|
||||
int __res_nquery(res_state statep,
|
||||
const char *dname, int qclass, int type,
|
||||
unsigned char *answer, int anslen)
|
||||
{
|
||||
return res_nquery( statep, dname, qclass, type, answer, anslen );
|
||||
}
|
||||
|
||||
int __dn_expand(const unsigned char *msg,
|
||||
const unsigned char *eomorig,
|
||||
const unsigned char *comp_dn, char *exp_dn,
|
||||
int length)
|
||||
{
|
||||
return dn_expand( msg,eomorig,comp_dn,exp_dn,length);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if LL_SEND_CRASH_REPORTS
|
||||
#include "breakpad/client/linux/handler/exception_handler.h"
|
||||
#include "breakpad/common/linux/http_upload.h"
|
||||
#include "lldir.h"
|
||||
#include "../llcrashlogger/llcrashlogger.h"
|
||||
// <FS:LO> Fix linux compile
|
||||
#if LL_USESYSTEMLIBS
|
||||
#include "jsoncpp/reader.h" // JSON
|
||||
#else
|
||||
#include "json/reader.h" // JSON
|
||||
#endif
|
||||
// </FS:LO>
|
||||
#endif
|
||||
|
||||
#include "fsversionvalues.h"
|
||||
|
|
|
|||
|
|
@ -51,8 +51,8 @@ protected:
|
|||
bool initHardwareTest() override; // Win32 uses DX9 to test hardware.
|
||||
bool initParseCommandLine(LLCommandLineParser& clp) override;
|
||||
|
||||
virtual bool beingDebugged();
|
||||
virtual bool restoreErrorTrap();
|
||||
bool beingDebugged() override;
|
||||
bool restoreErrorTrap() override;
|
||||
|
||||
bool sendURLToOtherInstance(const std::string& url) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -345,6 +345,8 @@ void LLAvatarRenderInfoAccountant::idle()
|
|||
&& regionp->capabilitiesReceived())
|
||||
{
|
||||
// each of these is further governed by and resets its own timer
|
||||
// Note: We can have multiple regions, each launches up to two coroutines,
|
||||
// it likely is expensive
|
||||
sendRenderInfoToRegion(regionp);
|
||||
getRenderInfoFromRegion(regionp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -724,7 +724,8 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
|
|||
{
|
||||
if(mBuddyInfo.find(agent_id) != mBuddyInfo.end())
|
||||
{
|
||||
if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
|
||||
if (((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
|
||||
&& !gAgent.isDoNotDisturb())
|
||||
{
|
||||
LLSD args;
|
||||
// <FS:Ansariel> Always show complete name in rights dialogs
|
||||
|
|
|
|||
|
|
@ -98,10 +98,14 @@ LLConversationViewSession::~LLConversationViewSession()
|
|||
{
|
||||
mActiveVoiceChannelConnection.disconnect();
|
||||
|
||||
if(LLVoiceClient::instanceExists() && mVoiceClientObserver)
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
|
||||
}
|
||||
if (mVoiceClientObserver)
|
||||
{
|
||||
if (LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
|
||||
}
|
||||
delete mVoiceClientObserver;
|
||||
}
|
||||
|
||||
mFlashTimer->unset();
|
||||
}
|
||||
|
|
@ -257,7 +261,12 @@ BOOL LLConversationViewSession::postBuild()
|
|||
mIsInActiveVoiceChannel = true;
|
||||
if(LLVoiceClient::instanceExists())
|
||||
{
|
||||
LLNearbyVoiceClientStatusObserver* mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
|
||||
if (mVoiceClientObserver)
|
||||
{
|
||||
LLVoiceClient::getInstance()->removeObserver(mVoiceClientObserver);
|
||||
delete mVoiceClientObserver;
|
||||
}
|
||||
mVoiceClientObserver = new LLNearbyVoiceClientStatusObserver(this);
|
||||
LLVoiceClient::getInstance()->addObserver(mVoiceClientObserver);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -561,18 +561,18 @@ void LLFloaterCamera::setMode(ECameraControlMode mode)
|
|||
|
||||
void LLFloaterCamera::switchMode(ECameraControlMode mode)
|
||||
{
|
||||
setMode(mode);
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case CAMERA_CTRL_MODE_PRESETS:
|
||||
case CAMERA_CTRL_MODE_PAN:
|
||||
sFreeCamera = false;
|
||||
setMode(mode); // depends onto sFreeCamera
|
||||
clear_camera_tool();
|
||||
break;
|
||||
|
||||
case CAMERA_CTRL_MODE_FREE_CAMERA:
|
||||
sFreeCamera = true;
|
||||
setMode(mode);
|
||||
activate_camera_tool();
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -623,8 +623,7 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
|
|||
LLInventoryItem* item = gInventory.getItem(*it);
|
||||
if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
|
||||
{
|
||||
LLWString item_name = utf8str_to_wstring(item->getName());
|
||||
LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());
|
||||
LLClipboard::instance().addToClipboard(*it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ void LLFloaterIMSessionTab::draw()
|
|||
|
||||
void LLFloaterIMSessionTab::enableDisableCallBtn()
|
||||
{
|
||||
if (LLVoiceClient::instanceExists())
|
||||
if (LLVoiceClient::instanceExists() && mVoiceButton)
|
||||
{
|
||||
mVoiceButton->setEnabled(
|
||||
mSessionID.notNull()
|
||||
|
|
|
|||
|
|
@ -3574,7 +3574,16 @@ void LLPanelPreference::saveSettings()
|
|||
{
|
||||
view_stack.push_back(*iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (LLStartUp::getStartupState() == STATE_STARTED)
|
||||
{
|
||||
LLControlVariable* control = gSavedPerAccountSettings.getControl("VoiceCallsFriendsOnly");
|
||||
if (control)
|
||||
{
|
||||
mSavedValues[control] = control->getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelPreference::showMultipleViewersWarning(LLUICtrl* checkbox, const LLSD& value)
|
||||
|
|
|
|||
|
|
@ -185,15 +185,6 @@ void LLFloaterSearch::search(const SearchQuery &p)
|
|||
// add the search query string
|
||||
subs["QUERY"] = LLURI::escape(p.query);
|
||||
|
||||
// add the permissions token that login.cgi gave us
|
||||
// We use "search_token", and fallback to "auth_token" if not present.
|
||||
LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
|
||||
if (search_token.asString().empty())
|
||||
{
|
||||
search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
|
||||
}
|
||||
subs["AUTH_TOKEN"] = search_token.asString();
|
||||
|
||||
// add the user's preferred maturity (can be changed via prefs)
|
||||
std::string maturity;
|
||||
if (gAgent.prefersAdult())
|
||||
|
|
|
|||
|
|
@ -56,10 +56,12 @@
|
|||
#include "llscrolllistctrl.h"
|
||||
#include "llslurl.h"
|
||||
#include "lltextbox.h"
|
||||
#include "lltoolbarview.h"
|
||||
#include "lltracker.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewerinventory.h" // LLViewerInventoryItem
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerstats.h"
|
||||
#include "llviewertexture.h"
|
||||
|
|
@ -95,6 +97,9 @@ static const F32 MAP_ZOOM_TIME = 0.2f;
|
|||
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
|
||||
static const S32 MAX_VISIBLE_REGIONS = 512;
|
||||
|
||||
|
||||
const S32 HIDE_BEACON_PAD = 133;
|
||||
|
||||
// It would be more logical to have this inside the method where it is used but to compile under gcc this
|
||||
// struct has to be here.
|
||||
struct SortRegionNames
|
||||
|
|
@ -394,6 +399,8 @@ LLFloaterWorldMap::~LLFloaterWorldMap()
|
|||
mFriendObserver = NULL;
|
||||
|
||||
gFloaterWorldMap = NULL;
|
||||
|
||||
mTeleportFinishConnection.disconnect();
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
@ -407,12 +414,16 @@ void LLFloaterWorldMap::onClose(bool app_quitting)
|
|||
{
|
||||
// While we're not visible, discard the overlay images we're using
|
||||
LLWorldMap::getInstance()->clearImageRefs();
|
||||
mTeleportFinishConnection.disconnect();
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLFloaterWorldMap::onOpen(const LLSD& key)
|
||||
{
|
||||
bool center_on_target = (key.asString() == "center");
|
||||
mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
|
||||
setTeleportFinishedCallback(boost::bind(&LLFloaterWorldMap::onTeleportFinished, this));
|
||||
|
||||
bool center_on_target = (key.asString() == "center");
|
||||
|
||||
mIsClosing = FALSE;
|
||||
|
||||
|
|
@ -1936,6 +1947,13 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterWorldMap::onTeleportFinished()
|
||||
{
|
||||
if(isInVisibleChain())
|
||||
{
|
||||
LLWorldMapView::setPan(0, 0, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterWorldMap::onCommitSearchResult()
|
||||
{
|
||||
|
|
@ -2012,3 +2030,103 @@ void LLFloaterWorldMap::onFocusLost()
|
|||
LLWorldMapView* map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;
|
||||
map_panel->mPanning = FALSE;
|
||||
}
|
||||
|
||||
LLPanelHideBeacon::LLPanelHideBeacon() :
|
||||
mHideButton(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
// static
|
||||
LLPanelHideBeacon* LLPanelHideBeacon::getInstance()
|
||||
{
|
||||
static LLPanelHideBeacon* panel = getPanelHideBeacon();
|
||||
return panel;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLPanelHideBeacon::postBuild()
|
||||
{
|
||||
mHideButton = getChild<LLButton>("hide_beacon_btn");
|
||||
mHideButton->setCommitCallback(boost::bind(&LLPanelHideBeacon::onHideButtonClick, this));
|
||||
|
||||
gViewerWindow->setOnWorldViewRectUpdated(boost::bind(&LLPanelHideBeacon::updatePosition, this));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLPanelHideBeacon::draw()
|
||||
{
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
{
|
||||
mHideButton->setVisible(false);
|
||||
return;
|
||||
}
|
||||
mHideButton->setVisible(true);
|
||||
updatePosition();
|
||||
LLPanel::draw();
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLPanelHideBeacon::setVisible(BOOL visible)
|
||||
{
|
||||
if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false;
|
||||
|
||||
if (visible)
|
||||
{
|
||||
updatePosition();
|
||||
}
|
||||
|
||||
LLPanel::setVisible(visible);
|
||||
}
|
||||
|
||||
|
||||
//static
|
||||
LLPanelHideBeacon* LLPanelHideBeacon::getPanelHideBeacon()
|
||||
{
|
||||
LLPanelHideBeacon* panel = new LLPanelHideBeacon();
|
||||
panel->buildFromFile("panel_hide_beacon.xml");
|
||||
|
||||
LL_INFOS() << "Build LLPanelHideBeacon panel" << LL_ENDL;
|
||||
|
||||
panel->updatePosition();
|
||||
return panel;
|
||||
}
|
||||
|
||||
void LLPanelHideBeacon::onHideButtonClick()
|
||||
{
|
||||
LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();
|
||||
if (instance)
|
||||
{
|
||||
instance->onClearBtn();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates position of the panel (similar to Stand & Stop Flying panel).
|
||||
*/
|
||||
void LLPanelHideBeacon::updatePosition()
|
||||
{
|
||||
S32 bottom_tb_center = 0;
|
||||
if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM))
|
||||
{
|
||||
bottom_tb_center = toolbar_bottom->getRect().getCenterX();
|
||||
}
|
||||
|
||||
S32 left_tb_width = 0;
|
||||
if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT))
|
||||
{
|
||||
left_tb_width = toolbar_left->getRect().getWidth();
|
||||
}
|
||||
|
||||
if (gToolBarView != NULL && gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)->hasButtons())
|
||||
{
|
||||
S32 x_pos = bottom_tb_center - getRect().getWidth() / 2 - left_tb_width;
|
||||
setOrigin( x_pos + HIDE_BEACON_PAD, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
S32 x_pos = bottom_tb_center - getRect().getWidth() / 2;
|
||||
setOrigin( x_pos + HIDE_BEACON_PAD, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,7 +127,8 @@ public:
|
|||
// teleport to the tracked item, if there is one
|
||||
void teleport();
|
||||
void onChangeMaturity();
|
||||
|
||||
|
||||
void onClearBtn();
|
||||
|
||||
//Slapp instigated avatar tracking
|
||||
void avatarTrackFromSlapp( const LLUUID& id );
|
||||
|
|
@ -147,7 +148,6 @@ protected:
|
|||
void onComboTextEntry( );
|
||||
void onSearchTextEntry( );
|
||||
|
||||
void onClearBtn();
|
||||
void onClickTeleportBtn();
|
||||
void onShowTargetBtn();
|
||||
void onShowAgentBtn();
|
||||
|
|
@ -176,7 +176,7 @@ protected:
|
|||
void onCoordinatesCommit();
|
||||
void onCommitSearchResult();
|
||||
|
||||
void cacheLandmarkPosition();
|
||||
void onTeleportFinished();
|
||||
|
||||
// <FS:Ansariel> Parcel details on map
|
||||
void requestParcelInfo(const LLVector3d& pos_global, const LLVector3d& region_origin);
|
||||
|
|
@ -227,9 +227,31 @@ private:
|
|||
LLCtrlListInterface * mListFriendCombo;
|
||||
LLCtrlListInterface * mListLandmarkCombo;
|
||||
LLCtrlListInterface * mListSearchResults;
|
||||
|
||||
boost::signals2::connection mTeleportFinishConnection;
|
||||
};
|
||||
|
||||
extern LLFloaterWorldMap* gFloaterWorldMap;
|
||||
|
||||
|
||||
class LLPanelHideBeacon : public LLPanel
|
||||
{
|
||||
public:
|
||||
static LLPanelHideBeacon* getInstance();
|
||||
|
||||
LLPanelHideBeacon();
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void setVisible(BOOL visible);
|
||||
/*virtual*/ void draw();
|
||||
|
||||
private:
|
||||
static LLPanelHideBeacon* getPanelHideBeacon();
|
||||
void onHideButtonClick();
|
||||
void updatePosition();
|
||||
|
||||
LLButton* mHideButton;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -492,8 +492,13 @@ void LLGestureMgr::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_ges
|
|||
|
||||
mActive[base_item_id] = new_gesture;
|
||||
|
||||
delete old_gesture;
|
||||
old_gesture = NULL;
|
||||
// replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
|
||||
// replaces ids without repalcing gesture
|
||||
if (old_gesture != new_gesture)
|
||||
{
|
||||
delete old_gesture;
|
||||
old_gesture = NULL;
|
||||
}
|
||||
|
||||
if (asset_id.notNull())
|
||||
{
|
||||
|
|
@ -926,7 +931,7 @@ void LLGestureMgr::stepGesture(LLMultiGesture* gesture)
|
|||
else if (gesture->mWaitTimer.getElapsedTimeF32() > MAX_WAIT_ANIM_SECS)
|
||||
{
|
||||
// we've waited too long for an animation
|
||||
LL_INFOS() << "Waited too long for animations to stop, continuing gesture."
|
||||
LL_INFOS("GestureMgr") << "Waited too long for animations to stop, continuing gesture."
|
||||
<< LL_ENDL;
|
||||
gesture->mWaitingAnimations = FALSE;
|
||||
gesture->mCurrentStep++;
|
||||
|
|
@ -1124,6 +1129,34 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,
|
|||
self.setFetchID(item_id);
|
||||
self.startFetch();
|
||||
}
|
||||
|
||||
item_map_t::iterator it = self.mActive.find(item_id);
|
||||
if (it == self.mActive.end())
|
||||
{
|
||||
// Gesture is supposed to be present, active, but NULL
|
||||
LL_DEBUGS("GestureMgr") << "Gesture " << item_id << " not found in active list" << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMultiGesture* old_gesture = (*it).second;
|
||||
if (old_gesture && old_gesture != gesture)
|
||||
{
|
||||
LL_DEBUGS("GestureMgr") << "Received dupplicate " << item_id << " callback" << LL_ENDL;
|
||||
// In case somebody managest to activate, deactivate and
|
||||
// then activate gesture again, before asset finishes loading.
|
||||
// LLLoadInfo will have a different pointer, asset storage will
|
||||
// see it as a different request, resulting in two callbacks.
|
||||
|
||||
// deactivateSimilarGestures() did not turn this one off
|
||||
// because of matching item_id
|
||||
self.stopGesture(old_gesture);
|
||||
|
||||
self.mActive.erase(item_id);
|
||||
delete old_gesture;
|
||||
old_gesture = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
self.mActive[item_id] = gesture;
|
||||
|
||||
// Everything has been successful. Add to the active list.
|
||||
|
|
@ -1158,9 +1191,23 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,
|
|||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Unable to load gesture" << LL_ENDL;
|
||||
LL_WARNS("GestureMgr") << "Unable to load gesture" << LL_ENDL;
|
||||
|
||||
self.mActive.erase(item_id);
|
||||
item_map_t::iterator it = self.mActive.find(item_id);
|
||||
if (it != self.mActive.end())
|
||||
{
|
||||
LLMultiGesture* old_gesture = (*it).second;
|
||||
if (old_gesture)
|
||||
{
|
||||
// Shouldn't happen, just in case
|
||||
LL_WARNS("GestureMgr") << "Gesture " << item_id << " existed when it shouldn't" << LL_ENDL;
|
||||
|
||||
self.stopGesture(old_gesture);
|
||||
delete old_gesture;
|
||||
old_gesture = NULL;
|
||||
}
|
||||
self.mActive.erase(item_id);
|
||||
}
|
||||
|
||||
delete gesture;
|
||||
gesture = NULL;
|
||||
|
|
@ -1178,9 +1225,23 @@ void LLGestureMgr::onLoadComplete(const LLUUID& asset_uuid,
|
|||
LLDelayedGestureError::gestureFailedToLoad( item_id );
|
||||
}
|
||||
|
||||
LL_WARNS() << "Problem loading gesture: " << status << LL_ENDL;
|
||||
|
||||
LLGestureMgr::instance().mActive.erase(item_id);
|
||||
LL_WARNS("GestureMgr") << "Problem loading gesture: " << status << LL_ENDL;
|
||||
|
||||
item_map_t::iterator it = self.mActive.find(item_id);
|
||||
if (it != self.mActive.end())
|
||||
{
|
||||
LLMultiGesture* old_gesture = (*it).second;
|
||||
if (old_gesture)
|
||||
{
|
||||
// Shouldn't happen, just in case
|
||||
LL_WARNS("GestureMgr") << "Gesture " << item_id << " existed when it shouldn't" << LL_ENDL;
|
||||
|
||||
self.stopGesture(old_gesture);
|
||||
delete old_gesture;
|
||||
old_gesture = NULL;
|
||||
}
|
||||
self.mActive.erase(item_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;
|
|||
void LLGroupActions::search()
|
||||
{
|
||||
// <FS:Ansariel> Open groups search panel instead of invoking presumed failed websearch
|
||||
//LLFloaterReg::showInstance("search", LLSD().with("category", "groups"));
|
||||
//LLFloaterReg::showInstance("search");
|
||||
LLFloaterReg::showInstance("search", LLSD().with("tab", "groups"));
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
|
|||
LLInventoryValidationInfo::LLInventoryValidationInfo():
|
||||
mFatalErrorCount(0),
|
||||
mWarningCount(0),
|
||||
mLoopCount(0),
|
||||
mOrphanedCount(0),
|
||||
mInitialized(false),
|
||||
mFatalNoRootFolder(false),
|
||||
mFatalNoLibraryRootFolder(false),
|
||||
|
|
@ -163,7 +165,10 @@ LLInventoryValidationInfo::LLInventoryValidationInfo():
|
|||
|
||||
void LLInventoryValidationInfo::toOstream(std::ostream& os) const
|
||||
{
|
||||
os << "mFatalErrorCount " << mFatalErrorCount << " mWarningCount " << mWarningCount;
|
||||
os << "mFatalErrorCount " << mFatalErrorCount
|
||||
<< " mWarningCount " << mWarningCount
|
||||
<< " mLoopCount " << mLoopCount
|
||||
<< " mOrphanedCount " << mOrphanedCount;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -177,6 +182,8 @@ void LLInventoryValidationInfo::asLLSD(LLSD& sd) const
|
|||
{
|
||||
sd["fatal_error_count"] = mFatalErrorCount;
|
||||
sd["warning_count"] = mWarningCount;
|
||||
sd["loop_count"] = mLoopCount;
|
||||
sd["orphaned_count"] = mOrphanedCount;
|
||||
sd["initialized"] = mInitialized;
|
||||
sd["missing_system_folders_count"] = LLSD::Integer(mMissingRequiredSystemFolders.size());
|
||||
sd["fatal_no_root_folder"] = mFatalNoRootFolder;
|
||||
|
|
@ -361,21 +368,35 @@ const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LL
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bool LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
|
||||
LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
|
||||
{
|
||||
LLInventoryObject *object = getObject(object_id);
|
||||
while (object && object->getParentUUID().notNull())
|
||||
{
|
||||
LLInventoryObject *parent_object = getObject(object->getParentUUID());
|
||||
if (!object)
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Unable to trace topmost ancestor, initial object " << object_id << " does not exist" << LL_ENDL;
|
||||
return ANSCESTOR_MISSING;
|
||||
}
|
||||
|
||||
std::set<LLUUID> object_ids{ object_id }; // loop protection
|
||||
while (object->getParentUUID().notNull())
|
||||
{
|
||||
LLUUID parent_id = object->getParentUUID();
|
||||
if (object_ids.find(parent_id) != object_ids.end())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Detected a loop on an object " << parent_id << " when searching for ancestor of " << object_id << LL_ENDL;
|
||||
return ANSCESTOR_LOOP;
|
||||
}
|
||||
object_ids.insert(parent_id);
|
||||
LLInventoryObject *parent_object = getObject(parent_id);
|
||||
if (!parent_object)
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "unable to trace topmost ancestor, missing item for uuid " << object->getParentUUID() << LL_ENDL;
|
||||
return false;
|
||||
LL_WARNS(LOG_INV) << "unable to trace topmost ancestor of " << object_id << ", missing item for uuid " << parent_id << LL_ENDL;
|
||||
return ANSCESTOR_MISSING;
|
||||
}
|
||||
object = parent_object;
|
||||
}
|
||||
result = object->getUUID();
|
||||
return true;
|
||||
return ANSCESTOR_OK;
|
||||
}
|
||||
|
||||
// Get the object by id. Returns NULL if not found.
|
||||
|
|
@ -3147,42 +3168,69 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
|
|||
|
||||
LL_INFOS(LOG_INV) << "saving inventory to: (" << filename << ")" << LL_ENDL;
|
||||
|
||||
llofstream fileXML(filename.c_str());
|
||||
if (!fileXML.is_open())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "unable to save inventory to: " << filename << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
llofstream fileXML(filename.c_str());
|
||||
if (!fileXML.is_open())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Failed to open file. Unable to save inventory to: " << filename << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLSD cache_ver;
|
||||
cache_ver["inv_cache_version"] = sCurrentInvCacheVersion;
|
||||
LLSD cache_ver;
|
||||
cache_ver["inv_cache_version"] = sCurrentInvCacheVersion;
|
||||
|
||||
fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl;
|
||||
if (fileXML.fail())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Failed to write cache version to file. Unable to save inventory to: " << filename << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
S32 count = categories.size();
|
||||
S32 cat_count = 0;
|
||||
S32 i;
|
||||
for(i = 0; i < count; ++i)
|
||||
{
|
||||
LLViewerInventoryCategory* cat = categories[i];
|
||||
if(cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
|
||||
{
|
||||
fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl;
|
||||
cat_count++;
|
||||
}
|
||||
}
|
||||
fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl;
|
||||
|
||||
S32 it_count = items.size();
|
||||
for(i = 0; i < it_count; ++i)
|
||||
{
|
||||
fileXML << LLSDOStreamer<LLSDNotationFormatter>(items[i]->asLLSD()) << std::endl;
|
||||
}
|
||||
S32 count = categories.size();
|
||||
S32 cat_count = 0;
|
||||
S32 i;
|
||||
for (i = 0; i < count; ++i)
|
||||
{
|
||||
LLViewerInventoryCategory* cat = categories[i];
|
||||
if (cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
|
||||
{
|
||||
fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl;
|
||||
cat_count++;
|
||||
}
|
||||
|
||||
fileXML.close();
|
||||
if (fileXML.fail())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Failed to write a folder to file. Unable to save inventory to: " << filename << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL;
|
||||
S32 it_count = items.size();
|
||||
for (i = 0; i < it_count; ++i)
|
||||
{
|
||||
fileXML << LLSDOStreamer<LLSDNotationFormatter>(items[i]->asLLSD()) << std::endl;
|
||||
|
||||
return true;
|
||||
if (fileXML.fail())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Failed to write an item to file. Unable to save inventory to: " << filename << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
fileXML.close();
|
||||
|
||||
LL_INFOS(LOG_INV) << "Inventory saved: " << cat_count << " categories, " << it_count << " items." << LL_ENDL;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
LOG_UNHANDLED_EXCEPTION("");
|
||||
LL_INFOS(LOG_INV) << "Failed to save inventory to: (" << filename << ")" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// message handling functionality
|
||||
|
|
@ -4303,20 +4351,23 @@ void LLInventoryModel::dumpInventory() const
|
|||
LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
||||
{
|
||||
LLPointer<LLInventoryValidationInfo> validation_info = new LLInventoryValidationInfo;
|
||||
S32 fatalities = 0;
|
||||
S32 fatal_errs = 0;
|
||||
S32 warnings = 0;
|
||||
S32 loops = 0;
|
||||
S32 orphaned = 0;
|
||||
|
||||
if (getRootFolderID().isNull())
|
||||
{
|
||||
LL_WARNS("Inventory") << "Fatal inventory corruption: no root folder id" << LL_ENDL;
|
||||
validation_info->mFatalNoRootFolder = true;
|
||||
fatalities++;
|
||||
fatal_errs++;
|
||||
}
|
||||
if (getLibraryRootFolderID().isNull())
|
||||
{
|
||||
// Probably shouldn't be a fatality, inventory can function without a library
|
||||
LL_WARNS("Inventory") << "Fatal inventory corruption: no library root folder id" << LL_ENDL;
|
||||
validation_info->mFatalNoLibraryRootFolder = true;
|
||||
fatalities++;
|
||||
fatal_errs++;
|
||||
}
|
||||
|
||||
if (mCategoryMap.size() + 1 != mParentChildCategoryTree.size())
|
||||
|
|
@ -4348,7 +4399,23 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
}
|
||||
LLUUID topmost_ancestor_id;
|
||||
// Will leave as null uuid on failure
|
||||
getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
|
||||
EAnscestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
|
||||
switch (res)
|
||||
{
|
||||
case ANSCESTOR_MISSING:
|
||||
orphaned++;
|
||||
break;
|
||||
case ANSCESTOR_LOOP:
|
||||
loops++;
|
||||
break;
|
||||
case ANSCESTOR_OK:
|
||||
break;
|
||||
default:
|
||||
LL_WARNS("Inventory") << "Unknown ancestor error for " << cat_id << LL_ENDL;
|
||||
warnings++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cat_id != cat->getUUID())
|
||||
{
|
||||
LL_WARNS("Inventory") << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL;
|
||||
|
|
@ -4448,8 +4515,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
|
||||
// Topmost ancestor should be root or library.
|
||||
LLUUID topmost_ancestor_id;
|
||||
bool found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
|
||||
if (!found)
|
||||
EAnscestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
|
||||
if (found != ANSCESTOR_OK)
|
||||
{
|
||||
LL_WARNS("Inventory") << "unable to find topmost ancestor for " << item_id << LL_ENDL;
|
||||
warnings++;
|
||||
|
|
@ -4479,7 +4546,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
|
||||
<< "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL;
|
||||
warnings++;
|
||||
orphaned++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4497,6 +4564,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
|
||||
<< "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4505,7 +4573,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
LLFolderType::EType folder_type = cat->getPreferredType();
|
||||
bool cat_is_in_library = false;
|
||||
LLUUID topmost_id;
|
||||
if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) && topmost_id == getLibraryRootFolderID())
|
||||
if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANSCESTOR_OK && topmost_id == getLibraryRootFolderID())
|
||||
{
|
||||
cat_is_in_library = true;
|
||||
}
|
||||
|
|
@ -4545,6 +4613,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (parent_id.isNull())
|
||||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4555,6 +4624,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
|
||||
<< "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4571,6 +4641,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
|
||||
<< "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4589,15 +4660,18 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
LL_WARNS("Inventory") << "link " << item->getUUID() << " type " << item->getActualType()
|
||||
<< " missing backlink info at target_id " << target_id
|
||||
<< LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
// Links should have referents.
|
||||
if (item->getActualType() == LLAssetType::AT_LINK && !target_item)
|
||||
{
|
||||
LL_WARNS("Inventory") << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)
|
||||
{
|
||||
LL_WARNS("Inventory") << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
|
||||
orphaned++;
|
||||
}
|
||||
if (target_item && target_item->getIsLinkType())
|
||||
{
|
||||
|
|
@ -4669,8 +4743,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (is_automatic)
|
||||
{
|
||||
LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << ft << LL_ENDL;
|
||||
fatalities++;
|
||||
validation_info->mMissingRequiredSystemFolders.insert(LLFolderType::EType(ft));
|
||||
fatal_errs++;
|
||||
validation_info->mMissingRequiredSystemFolders.insert(folder_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4681,8 +4755,20 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
else if (count_under_root > 1)
|
||||
{
|
||||
LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL;
|
||||
validation_info->mDuplicateRequiredSystemFolders.insert(LLFolderType::EType(ft));
|
||||
fatalities++;
|
||||
validation_info->mDuplicateRequiredSystemFolders.insert(folder_type);
|
||||
if (!is_automatic && folder_type != LLFolderType::FT_SETTINGS)
|
||||
{
|
||||
// It is a fatal problem or can lead to fatal problems for COF,
|
||||
// outfits, trash and other non-automatic folders.
|
||||
fatal_errs++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// For automatic folders it's not a fatal issue and shouldn't
|
||||
// break inventory or other functionality further
|
||||
// Exception: FT_SETTINGS is not automatic, but only deserves a warning.
|
||||
warnings++;
|
||||
}
|
||||
}
|
||||
if (count_elsewhere > 0)
|
||||
{
|
||||
|
|
@ -4708,11 +4794,13 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
}
|
||||
|
||||
// FIXME need to fail login and tell user to retry, contact support if problem persists.
|
||||
bool valid = (fatalities == 0);
|
||||
LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatalities << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL;
|
||||
bool valid = (fatal_errs == 0);
|
||||
LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL;
|
||||
|
||||
validation_info->mFatalErrorCount = fatalities;
|
||||
validation_info->mFatalErrorCount = fatal_errs;
|
||||
validation_info->mWarningCount = warnings;
|
||||
validation_info->mLoopCount = loops;
|
||||
validation_info->mOrphanedCount = orphaned;
|
||||
|
||||
return validation_info;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,6 +72,8 @@ public:
|
|||
|
||||
S32 mFatalErrorCount;
|
||||
S32 mWarningCount;
|
||||
S32 mLoopCount; // Presence of folders whose ansestors loop onto themselves
|
||||
S32 mOrphanedCount; // Missing or orphaned items, links and folders
|
||||
bool mInitialized;
|
||||
bool mFatalNoRootFolder;
|
||||
bool mFatalNoLibraryRootFolder;
|
||||
|
|
@ -301,9 +303,14 @@ public:
|
|||
|
||||
// Check if one object has a parent chain up to the category specified by UUID.
|
||||
BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
|
||||
|
||||
|
||||
enum EAnscestorResult{
|
||||
ANSCESTOR_OK = 0,
|
||||
ANSCESTOR_MISSING = 1,
|
||||
ANSCESTOR_LOOP = 2,
|
||||
};
|
||||
// Follow parent chain to the top.
|
||||
bool getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
|
||||
EAnscestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
|
||||
|
||||
// <FS:Ansariel> Re-added because of start folder id
|
||||
// Collect all items in inventory that are linked to item_id.
|
||||
|
|
|
|||
|
|
@ -411,8 +411,16 @@ void LLKeyConflictHandler::loadFromSettings(ESourceMode load_mode)
|
|||
filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename_default);
|
||||
if (!gDirUtilp->fileExists(filename) || !loadFromSettings(load_mode, filename, &mControlsMap))
|
||||
{
|
||||
// mind placeholders
|
||||
mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end());
|
||||
// Mind placeholders
|
||||
// Do not use mControlsMap.insert(mDefaultsMap) since mControlsMap has
|
||||
// placeholders that won't be added over(to) by insert.
|
||||
// Or instead move generatePlaceholders call to be after copying
|
||||
control_map_t::iterator iter = mDefaultsMap.begin();
|
||||
while (iter != mDefaultsMap.end())
|
||||
{
|
||||
mControlsMap[iter->first].mKeyBind = iter->second.mKeyBind;
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
mLoadMode = load_mode;
|
||||
|
|
@ -575,6 +583,8 @@ void LLKeyConflictHandler::saveToSettings(bool temporary)
|
|||
break;
|
||||
}
|
||||
|
||||
keys.xml_version.set(keybindings_xml_version, true);
|
||||
|
||||
if (temporary)
|
||||
{
|
||||
// write to temporary xml and use it for gViewerInput
|
||||
|
|
@ -736,9 +746,9 @@ void LLKeyConflictHandler::resetToDefault(const std::string &control_name)
|
|||
resetToDefaultAndResolve(control_name, false);
|
||||
}
|
||||
|
||||
void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
|
||||
void LLKeyConflictHandler::resetToDefaultsAndResolve()
|
||||
{
|
||||
if (mode == MODE_SAVED_SETTINGS)
|
||||
if (mLoadMode == MODE_SAVED_SETTINGS)
|
||||
{
|
||||
control_map_t::iterator iter = mControlsMap.begin();
|
||||
control_map_t::iterator end = mControlsMap.end();
|
||||
|
|
@ -751,8 +761,16 @@ void LLKeyConflictHandler::resetToDefaults(ESourceMode mode)
|
|||
else
|
||||
{
|
||||
mControlsMap.clear();
|
||||
generatePlaceholders(mode);
|
||||
|
||||
// Set key combinations.
|
||||
// Copy from mDefaultsMap before doing generatePlaceholders, otherwise
|
||||
// insert() will fail to add some keys into pre-existing values from
|
||||
// generatePlaceholders()
|
||||
mControlsMap.insert(mDefaultsMap.begin(), mDefaultsMap.end());
|
||||
|
||||
// Set conflict masks and mark functions (un)assignable
|
||||
generatePlaceholders(mLoadMode);
|
||||
|
||||
}
|
||||
|
||||
mHasUnsavedChanges = true;
|
||||
|
|
@ -762,7 +780,7 @@ void LLKeyConflictHandler::resetToDefaults()
|
|||
{
|
||||
if (!empty())
|
||||
{
|
||||
resetToDefaults(mLoadMode);
|
||||
resetToDefaultsAndResolve();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -772,7 +790,7 @@ void LLKeyConflictHandler::resetToDefaults()
|
|||
// 3. We are loading 'current' only to replace it
|
||||
// but it is reliable and works Todo: consider optimizing.
|
||||
loadFromSettings(mLoadMode);
|
||||
resetToDefaults(mLoadMode);
|
||||
resetToDefaultsAndResolve();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -805,7 +823,7 @@ void LLKeyConflictHandler::resetKeyboardBindings()
|
|||
|
||||
void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
|
||||
{
|
||||
// These controls are meant to cause conflicts when user tries to assign same control somewhere else
|
||||
// These placeholders are meant to cause conflict resolution when user tries to assign same control somewhere else
|
||||
// also this can be used to pre-record controls that should not conflict or to assign conflict groups/masks
|
||||
|
||||
if (load_mode == MODE_FIRST_PERSON)
|
||||
|
|
@ -865,24 +883,60 @@ void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
|
|||
registerTemporaryControl("spin_around_ccw_sitting");
|
||||
registerTemporaryControl("spin_around_cw_sitting");
|
||||
}
|
||||
|
||||
|
||||
// Special case, mouse clicks passed to scripts have 'lowest' piority
|
||||
// thus do not conflict, everything else has a chance before them
|
||||
// also in ML they have highest priority, but only when script-grabbed,
|
||||
// thus do not conflict
|
||||
// (see AGENT_CONTROL_ML_LBUTTON_DOWN and CONTROL_LBUTTON_DOWN_INDEX)
|
||||
LLKeyConflict *type_data = &mControlsMap[script_mouse_handler_name];
|
||||
type_data->mAssignable = true;
|
||||
type_data->mConflictMask = U32_MAX - CONFLICT_LMOUSE;
|
||||
}
|
||||
|
||||
bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, const U32 &conlict_mask)
|
||||
bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, U32 conlict_mask)
|
||||
{
|
||||
if (conlict_mask == CONFLICT_NOTHING)
|
||||
{
|
||||
// Can't conflict
|
||||
return true;
|
||||
}
|
||||
|
||||
if (data.mMouse == CLICK_LEFT
|
||||
&& data.mMask == MASK_NONE
|
||||
&& data.mKey == KEY_NONE)
|
||||
{
|
||||
if ((conlict_mask & CONFLICT_LMOUSE) == 0)
|
||||
{
|
||||
// Can't conflict
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// simplify conflict mask
|
||||
conlict_mask = CONFLICT_LMOUSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// simplify conflict mask
|
||||
conlict_mask &= ~CONFLICT_LMOUSE;
|
||||
}
|
||||
|
||||
std::map<std::string, S32> conflict_list;
|
||||
control_map_t::iterator cntrl_iter = mControlsMap.begin();
|
||||
control_map_t::iterator cntrl_end = mControlsMap.end();
|
||||
for (; cntrl_iter != cntrl_end; ++cntrl_iter)
|
||||
{
|
||||
const U32 cmp_mask = cntrl_iter->second.mConflictMask;
|
||||
if ((cmp_mask & conlict_mask) == 0)
|
||||
{
|
||||
// can't conflict
|
||||
continue;
|
||||
}
|
||||
S32 index = cntrl_iter->second.mKeyBind.findKeyData(data);
|
||||
if (index >= 0
|
||||
&& cntrl_iter->second.mConflictMask != CONFLICT_NOTHING
|
||||
&& (cntrl_iter->second.mConflictMask & conlict_mask) != 0)
|
||||
if (index >= 0)
|
||||
{
|
||||
if (cntrl_iter->second.mAssignable)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ public:
|
|||
};
|
||||
|
||||
const U32 CONFLICT_NOTHING = 0;
|
||||
const U32 CONFLICT_LMOUSE = 0x1 << 1;
|
||||
// at the moment this just means that key will conflict with everything that is identical
|
||||
const U32 CONFLICT_ANY = U32_MAX;
|
||||
|
||||
|
|
@ -128,23 +129,24 @@ public:
|
|||
// resets current mode to defaults
|
||||
void resetToDefaults();
|
||||
|
||||
bool empty() { return mControlsMap.empty(); }
|
||||
bool empty() const { return mControlsMap.empty(); }
|
||||
void clear();
|
||||
|
||||
// reloads bindings from last valid user's xml or from default xml
|
||||
// to keyboard's handler
|
||||
static void resetKeyboardBindings();
|
||||
|
||||
bool hasUnsavedChanges() { return mHasUnsavedChanges; }
|
||||
bool hasUnsavedChanges() const { return mHasUnsavedChanges; }
|
||||
void setLoadMode(ESourceMode mode) { mLoadMode = mode; }
|
||||
ESourceMode getLoadMode() { return mLoadMode; }
|
||||
ESourceMode getLoadMode() const { return mLoadMode; }
|
||||
|
||||
private:
|
||||
void resetToDefaultAndResolve(const std::string &control_name, bool ignore_conflicts);
|
||||
void resetToDefaults(ESourceMode mode);
|
||||
void resetToDefaultsAndResolve();
|
||||
|
||||
// at the moment these kind of control is not savable, but takes part in conflict resolution
|
||||
void registerTemporaryControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask);
|
||||
// conflict mask 0 means that any conflicts will be ignored
|
||||
void registerTemporaryControl(const std::string &control_name, U32 conflict_mask = 0);
|
||||
|
||||
typedef std::map<std::string, LLKeyConflict> control_map_t;
|
||||
|
|
@ -152,7 +154,7 @@ private:
|
|||
bool loadFromSettings(const ESourceMode &load_mode, const std::string &filename, control_map_t *destination);
|
||||
void generatePlaceholders(ESourceMode load_mode); //E.x. non-assignable values
|
||||
// returns false in case user is trying to reuse control that can't be reassigned
|
||||
bool removeConflicts(const LLKeyData &data, const U32 &conlict_mask);
|
||||
bool removeConflicts(const LLKeyData &data, U32 conlict_mask);
|
||||
|
||||
// removes flags and removes temporary file, returns 'true' if file was removed
|
||||
bool clearUnsavedChanges();
|
||||
|
|
|
|||
|
|
@ -165,13 +165,12 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
|
|||
//requested_options.append("inventory-meat");
|
||||
//requested_options.append("inventory-skel-targets");
|
||||
#if (!defined LL_MINIMIAL_REQUESTED_OPTIONS)
|
||||
if(FALSE == gSavedSettings.getBOOL("NoInventoryLibrary"))
|
||||
{
|
||||
requested_options.append("inventory-lib-root");
|
||||
requested_options.append("inventory-lib-owner");
|
||||
requested_options.append("inventory-skel-lib");
|
||||
|
||||
// Not requesting library will trigger mFatalNoLibraryRootFolder
|
||||
requested_options.append("inventory-lib-root");
|
||||
requested_options.append("inventory-lib-owner");
|
||||
requested_options.append("inventory-skel-lib");
|
||||
// requested_options.append("inventory-meat-lib");
|
||||
}
|
||||
|
||||
requested_options.append("initial-outfit");
|
||||
requested_options.append("gestures");
|
||||
|
|
|
|||
|
|
@ -3123,6 +3123,7 @@ void LLModelPreview::lookupLODModelFiles(S32 lod)
|
|||
std::string lod_filename = mLODFile[LLModel::LOD_HIGH];
|
||||
// <FS:Beq> BUG-230890 fix case-sensitive filename handling
|
||||
// std::string ext = ".dae";
|
||||
// LLStringUtil::toLower(lod_filename_lower);
|
||||
// std::string::size_type i = lod_filename.rfind(ext);
|
||||
// if (i != std::string::npos)
|
||||
// {
|
||||
|
|
@ -4185,6 +4186,7 @@ void LLModelPreview::onLODMeshOptimizerParamCommit(S32 requested_lod, bool enfor
|
|||
if (!mLODFrozen)
|
||||
{
|
||||
genMeshOptimizerLODs(requested_lod, mode, 3, enforce_tri_limit);
|
||||
mFMP->refresh(); // <FS:Beq/> BUG-231970 Fix b0rken upload floater refresh
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@
|
|||
|
||||
#define CAP_SERVICE_NAVMESH_STATUS "NavMeshGenerationStatus"
|
||||
|
||||
#define CAP_SERVICE_OBJECT_LINKSETS "ObjectNavMeshProperties"
|
||||
#define CAP_SERVICE_OBJECT_LINKSETS "RegionObjects"
|
||||
#define CAP_SERVICE_TERRAIN_LINKSETS "TerrainNavMeshProperties"
|
||||
|
||||
#define CAP_SERVICE_CHARACTERS "CharacterProperties"
|
||||
|
|
|
|||
|
|
@ -1039,7 +1039,6 @@ void LLPreviewGesture::finishInventoryUpload(LLUUID itemId, LLUUID newAssetId)
|
|||
// active map with the new pointer.
|
||||
if (LLGestureMgr::instance().isGestureActive(itemId))
|
||||
{
|
||||
//*TODO: This is crashing for some reason. Fix it.
|
||||
// Active gesture edited from menu.
|
||||
LLGestureMgr::instance().replaceGesture(itemId, newAssetId);
|
||||
gInventory.notifyObservers();
|
||||
|
|
|
|||
|
|
@ -134,8 +134,11 @@ void ll::statusbar::SearchableItem::setNotHighlighted( )
|
|||
{
|
||||
mCtrl->setHighlighted( false );
|
||||
|
||||
if( mWasHiddenBySearch )
|
||||
mMenu->setVisible( TRUE );
|
||||
if (mWasHiddenBySearch)
|
||||
{
|
||||
mMenu->setVisible(TRUE);
|
||||
mWasHiddenBySearch = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3090,10 +3090,6 @@ bool idle_startup()
|
|||
|
||||
// Have the agent start watching the friends list so we can update proxies
|
||||
gAgent.observeFriends();
|
||||
if (gSavedSettings.getBOOL("LoginAsGod"))
|
||||
{
|
||||
gAgent.requestEnterGodMode();
|
||||
}
|
||||
|
||||
// Start automatic replay if the flag is set.
|
||||
if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
|
||||
|
|
@ -3642,19 +3638,34 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
|
|||
|
||||
gAgentAvatarp->setSex(gender);
|
||||
|
||||
// try to find the outfit - if not there, create some default
|
||||
// wearables.
|
||||
// try to find the requested outfit or folder
|
||||
|
||||
// -- check for existing outfit in My Outfits
|
||||
bool do_copy = false;
|
||||
LLUUID cat_id = findDescendentCategoryIDByName(
|
||||
gInventory.getLibraryRootFolderID(),
|
||||
gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS),
|
||||
outfit_folder_name);
|
||||
|
||||
// -- check for existing folder in Library
|
||||
if (cat_id.isNull())
|
||||
{
|
||||
cat_id = findDescendentCategoryIDByName(
|
||||
gInventory.getLibraryRootFolderID(),
|
||||
outfit_folder_name);
|
||||
if (!cat_id.isNull())
|
||||
{
|
||||
do_copy = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (cat_id.isNull())
|
||||
{
|
||||
// -- final fallback: create standard wearables
|
||||
LL_DEBUGS() << "standard wearables" << LL_ENDL;
|
||||
gAgentWearables.createStandardWearables();
|
||||
}
|
||||
else
|
||||
{
|
||||
bool do_copy = true;
|
||||
bool do_append = false;
|
||||
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
|
||||
// Need to fetch cof contents before we can wear.
|
||||
|
|
@ -4661,6 +4672,19 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
|
|||
}
|
||||
}
|
||||
|
||||
std::string fake_initial_outfit_name = gSavedSettings.getString("FakeInitialOutfitName");
|
||||
if (!fake_initial_outfit_name.empty())
|
||||
{
|
||||
gAgent.setFirstLogin(TRUE);
|
||||
sInitialOutfit = fake_initial_outfit_name;
|
||||
if (sInitialOutfitGender.empty())
|
||||
{
|
||||
sInitialOutfitGender = "female"; // just guess, will get overridden when outfit is worn anyway.
|
||||
}
|
||||
|
||||
LL_WARNS() << "Faking first-time login with initial outfit " << sInitialOutfit << LL_ENDL;
|
||||
}
|
||||
|
||||
// set the location of the Agent Appearance service, from which we can request
|
||||
// avatar baked textures if they are supported by the current region
|
||||
std::string agent_appearance_url = response["agent_appearance_service"];
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
#include "lltoolmgr.h"
|
||||
#include "lltoolselectrect.h"
|
||||
#include "lltoolplacer.h"
|
||||
#include "llviewerinput.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerwindow.h"
|
||||
|
|
@ -763,7 +764,7 @@ BOOL LLToolCompGun::handleHover(S32 x, S32 y, MASK mask)
|
|||
BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// if the left button is grabbed, don't put up the pie menu
|
||||
if (gAgent.leftButtonGrabbed())
|
||||
if (gAgent.leftButtonGrabbed() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
|
||||
return FALSE;
|
||||
|
|
@ -780,7 +781,7 @@ BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
BOOL LLToolCompGun::handleDoubleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// if the left button is grabbed, don't put up the pie menu
|
||||
if (gAgent.leftButtonGrabbed())
|
||||
if (gAgent.leftButtonGrabbed() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
|
||||
return FALSE;
|
||||
|
|
@ -848,7 +849,10 @@ BOOL LLToolCompGun::handleRightMouseUp(S32 x, S32 y, MASK mask)
|
|||
|
||||
BOOL LLToolCompGun::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
|
||||
if (gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
|
||||
}
|
||||
setCurrentTool( (LLTool*) mGun );
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@
|
|||
#include "lltoolmgr.h"
|
||||
#include "lltoolpie.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llviewerinput.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerregion.h"
|
||||
|
|
@ -143,7 +144,6 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
LL_INFOS() << "LLToolGrab handleMouseDown" << LL_ENDL;
|
||||
}
|
||||
|
||||
// call the base class to propogate info to sim
|
||||
LLTool::handleMouseDown(x, y, mask);
|
||||
|
||||
// leftButtonGrabbed() checks if controls are reserved by scripts, but does not take masks into account
|
||||
|
|
@ -153,6 +153,19 @@ BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE);
|
||||
}
|
||||
mClickedInMouselook = gAgentCamera.cameraMouselook();
|
||||
|
||||
if (mClickedInMouselook && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
|
||||
{
|
||||
// LLToolCompGun::handleMouseDown handles the event if ML controls are grabed,
|
||||
// but LLToolGrabBase is often the end point for mouselook clicks if ML controls
|
||||
// are not grabbed and LLToolGrabBase::handleMouseDown consumes the event,
|
||||
// so send clicks from here.
|
||||
// We are sending specifically CONTROL_LBUTTON_DOWN instead of _ML_ version.
|
||||
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
|
||||
|
||||
// Todo: LLToolGrabBase probably shouldn't consume the event if there is nothing
|
||||
// to grab in Mouselook, it intercepts handling in scanMouse
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -980,9 +993,18 @@ void LLToolGrabBase::handleHoverFailed(S32 x, S32 y, MASK mask)
|
|||
|
||||
BOOL LLToolGrabBase::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// call the base class to propogate info to sim
|
||||
LLTool::handleMouseUp(x, y, mask);
|
||||
|
||||
if (gAgentCamera.cameraMouselook() && gViewerInput.isLMouseHandlingDefault(MODE_FIRST_PERSON))
|
||||
{
|
||||
// LLToolCompGun::handleMouseUp handles the event if ML controls are grabed,
|
||||
// but LLToolGrabBase is often the end point for mouselook clicks if ML controls
|
||||
// are not grabbed and LToolGrabBase::handleMouseUp consumes the event,
|
||||
// so send clicks from here.
|
||||
// We are sending specifically CONTROL_LBUTTON_UP instead of _ML_ version.
|
||||
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
|
||||
}
|
||||
|
||||
if( hasMouseCapture() )
|
||||
{
|
||||
setMouseCapture( FALSE );
|
||||
|
|
|
|||
|
|
@ -445,8 +445,9 @@ BOOL LLToolPie::handleLeftClickPick()
|
|||
gFocusMgr.setKeyboardFocus(NULL);
|
||||
}
|
||||
|
||||
BOOL touchable = (object && object->flagHandleTouch())
|
||||
|| (parent && parent->flagHandleTouch());
|
||||
bool touchable = object
|
||||
&& (object->getClickAction() != CLICK_ACTION_DISABLED)
|
||||
&& (object->flagHandleTouch() || (parent && parent->flagHandleTouch()));
|
||||
|
||||
// Switch to grab tool if physical or triggerable
|
||||
if (object &&
|
||||
|
|
@ -754,6 +755,12 @@ bool LLToolPie::teleportToClickedLocation()
|
|||
LLViewerObject* objp = mHoverPick.getObject();
|
||||
LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL;
|
||||
|
||||
if (objp && (objp->getAvatar() == gAgentAvatarp || objp == gAgentAvatarp)) // ex: nametag
|
||||
{
|
||||
// Don't teleport to self, teleporting to other avatars is fine
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_in_world = mHoverPick.mObjectID.notNull() && objp && !objp->isHUDAttachment();
|
||||
bool is_land = mHoverPick.mPickType == LLPickInfo::PICK_LAND;
|
||||
bool pos_non_zero = !mHoverPick.mPosGlobal.isExactlyZero();
|
||||
|
|
@ -867,7 +874,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
|||
else if (!mMouseOutsideSlop
|
||||
&& mMouseButtonDown
|
||||
// disable camera steering if click on land is not used for moving
|
||||
&& gViewerInput.isMouseBindUsed(CLICK_LEFT))
|
||||
&& gViewerInput.isMouseBindUsed(CLICK_LEFT, MASK_NONE, MODE_THIRD_PERSON))
|
||||
{
|
||||
S32 delta_x = x - mMouseDownX;
|
||||
S32 delta_y = y - mMouseDownY;
|
||||
|
|
|
|||
|
|
@ -356,7 +356,7 @@ void LLViewerAssetStorage::checkForTimeouts()
|
|||
// Restore requests
|
||||
LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
|
||||
while (mCoroWaitList.size() > 0
|
||||
&& manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < LLCoprocedureManager::DEFAULT_QUEUE_SIZE)
|
||||
&& manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
|
||||
{
|
||||
CoroWaitList &request = mCoroWaitList.front();
|
||||
|
||||
|
|
@ -430,7 +430,8 @@ void LLViewerAssetStorage::queueRequestHttp(
|
|||
if (!duplicate)
|
||||
{
|
||||
// Coroutine buffer has fixed size (synchronization buffer, so we have no alternatives), so buffer any request above limit
|
||||
if (LLCoprocedureManager::instance().count(VIEWER_ASSET_STORAGE_CORO_POOL) < LLCoprocedureManager::DEFAULT_QUEUE_SIZE)
|
||||
LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
|
||||
if (manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
|
||||
{
|
||||
// <FS:Ansariel> [UDP Assets]
|
||||
//bool with_http = true;
|
||||
|
|
@ -438,7 +439,7 @@ void LLViewerAssetStorage::queueRequestHttp(
|
|||
//LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
|
||||
// </FS:Ansariel> [UDP Assets]
|
||||
|
||||
LLCoprocedureManager::instance().enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
|
||||
manager->enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
|
||||
boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, req, uuid, atype, callback, user_data));
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1120,7 +1120,7 @@ void handleUserTargetDrawDistanceChanged(const LLSD& newValue)
|
|||
|
||||
void handleUserTargetReflectionsChanged(const LLSD& newValue)
|
||||
{
|
||||
const auto newval = gSavedSettings.getF32("FSUserTargetReflections");
|
||||
const auto newval = gSavedSettings.getS32("FSUserTargetReflections");
|
||||
FSPerfStats::tunables.userTargetReflections = newval;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -908,13 +908,20 @@ bool toggle_enable_media(EKeystate s)
|
|||
|
||||
bool walk_to(EKeystate s)
|
||||
{
|
||||
if (KEYSTATE_DOWN != s) return true;
|
||||
if (KEYSTATE_DOWN != s)
|
||||
{
|
||||
// teleport/walk is usually on mouseclick, mouseclick needs
|
||||
// to let AGENT_CONTROL_LBUTTON_UP happen if teleport didn't,
|
||||
// so return false, but if it causes issues, do some kind of
|
||||
// "return !has_teleported"
|
||||
return false;
|
||||
}
|
||||
return LLToolPie::getInstance()->walkToClickedLocation();
|
||||
}
|
||||
|
||||
bool teleport_to(EKeystate s)
|
||||
{
|
||||
if (KEYSTATE_DOWN != s) return true;
|
||||
if (KEYSTATE_DOWN != s) return false;
|
||||
return LLToolPie::getInstance()->teleportToClickedLocation();
|
||||
}
|
||||
|
||||
|
|
@ -942,7 +949,47 @@ bool voice_follow_key(EKeystate s)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool agen_control_lbutton_handle(EKeystate s)
|
||||
bool script_trigger_lbutton(EKeystate s)
|
||||
{
|
||||
// Check for script overriding/expecting left mouse button.
|
||||
// Note that this does not pass event further and depends onto mouselook.
|
||||
// Checks CONTROL_ML_LBUTTON_DOWN_INDEX for mouselook,
|
||||
// CONTROL_LBUTTON_DOWN_INDEX for normal camera
|
||||
if (gAgent.leftButtonGrabbed())
|
||||
{
|
||||
bool mouselook = gAgentCamera.cameraMouselook();
|
||||
switch (s)
|
||||
{
|
||||
case KEYSTATE_DOWN:
|
||||
if (mouselook)
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN);
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);
|
||||
}
|
||||
return true;
|
||||
case KEYSTATE_UP:
|
||||
if (mouselook)
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP);
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Used by scripts, for overriding/handling left mouse button
|
||||
// see mControlsTakenCount
|
||||
bool agent_control_lbutton_handle(EKeystate s)
|
||||
{
|
||||
switch (s)
|
||||
{
|
||||
|
|
@ -1014,6 +1061,7 @@ REGISTER_KEYBOARD_ACTION("teleport_to", teleport_to);
|
|||
REGISTER_KEYBOARD_ACTION("walk_to", walk_to);
|
||||
REGISTER_KEYBOARD_GLOBAL_ACTION("toggle_voice", toggle_voice);
|
||||
REGISTER_KEYBOARD_GLOBAL_ACTION("voice_follow_key", voice_follow_key);
|
||||
REGISTER_KEYBOARD_ACTION(script_mouse_handler_name, script_trigger_lbutton);
|
||||
#undef REGISTER_KEYBOARD_ACTION
|
||||
|
||||
LLViewerInput::LLViewerInput()
|
||||
|
|
@ -1286,6 +1334,20 @@ BOOL LLViewerInput::bindMouse(const S32 mode, const EMouseClickType mouse, const
|
|||
typedef boost::function<bool(EKeystate)> function_t;
|
||||
function_t function = NULL;
|
||||
|
||||
if (mouse == CLICK_LEFT
|
||||
&& mask == MASK_NONE
|
||||
&& function_name == script_mouse_handler_name)
|
||||
{
|
||||
// Special case
|
||||
// Left click has script overrides and by default
|
||||
// is handled via agent_control_lbutton as last option
|
||||
// In case of mouselook and present overrides it has highest
|
||||
// priority even over UI and is handled in LLToolCompGun::handleMouseDown
|
||||
// so just mark it as having default handler
|
||||
mLMouseDefaultHandling[mode] = true;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LLKeybindFunctionData* result = LLKeyboardActionRegistry::getValue(function_name);
|
||||
if (result)
|
||||
{
|
||||
|
|
@ -1362,7 +1424,8 @@ LLViewerInput::Keys::Keys()
|
|||
: first_person("first_person"),
|
||||
third_person("third_person"),
|
||||
sitting("sitting"),
|
||||
edit_avatar("edit_avatar")
|
||||
edit_avatar("edit_avatar"),
|
||||
xml_version("xml_version", 0)
|
||||
{}
|
||||
|
||||
void LLViewerInput::resetBindings()
|
||||
|
|
@ -1373,6 +1436,7 @@ void LLViewerInput::resetBindings()
|
|||
mGlobalMouseBindings[i].clear();
|
||||
mKeyBindings[i].clear();
|
||||
mMouseBindings[i].clear();
|
||||
mLMouseDefaultHandling[i] = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1391,6 +1455,65 @@ S32 LLViewerInput::loadBindingsXML(const std::string& filename)
|
|||
binding_count += loadBindingMode(keys.third_person, MODE_THIRD_PERSON);
|
||||
binding_count += loadBindingMode(keys.sitting, MODE_SITTING);
|
||||
binding_count += loadBindingMode(keys.edit_avatar, MODE_EDIT_AVATAR);
|
||||
|
||||
// verify version
|
||||
if (keys.xml_version < 1)
|
||||
{
|
||||
// updating from a version that was not aware of LMouse bindings
|
||||
for (S32 i = 0; i < MODE_COUNT; i++)
|
||||
{
|
||||
mLMouseDefaultHandling[i] = true;
|
||||
}
|
||||
|
||||
// fix missing values
|
||||
KeyBinding mouse_binding;
|
||||
mouse_binding.key = "";
|
||||
mouse_binding.mask = "NONE";
|
||||
mouse_binding.mouse = "LMB";
|
||||
mouse_binding.command = script_mouse_handler_name;
|
||||
|
||||
if (keys.third_person.isProvided())
|
||||
{
|
||||
keys.third_person.bindings.add(mouse_binding);
|
||||
}
|
||||
|
||||
if (keys.first_person.isProvided())
|
||||
{
|
||||
keys.first_person.bindings.add(mouse_binding);
|
||||
}
|
||||
|
||||
if (keys.sitting.isProvided())
|
||||
{
|
||||
keys.sitting.bindings.add(mouse_binding);
|
||||
}
|
||||
|
||||
if (keys.edit_avatar.isProvided())
|
||||
{
|
||||
keys.edit_avatar.bindings.add(mouse_binding);
|
||||
}
|
||||
|
||||
// fix version
|
||||
keys.xml_version.set(keybindings_xml_version, true);
|
||||
|
||||
// Write the resulting XML to file
|
||||
LLXMLNodePtr output_node = new LLXMLNode("keys", false);
|
||||
LLXUIParser write_parser;
|
||||
write_parser.writeXUI(output_node, keys);
|
||||
|
||||
if (!output_node->isNull())
|
||||
{
|
||||
// file in app_settings is supposed to be up to date
|
||||
// this is only for the file from user_settings
|
||||
LL_INFOS("ViewerInput") << "Updating file " << filename << " to a newer version" << LL_ENDL;
|
||||
LLFILE *fp = LLFile::fopen(filename, "w");
|
||||
if (fp != NULL)
|
||||
{
|
||||
LLXMLNode::writeHeaderToFile(fp);
|
||||
output_node->writeToFile(fp);
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return binding_count;
|
||||
}
|
||||
|
|
@ -1562,17 +1685,6 @@ bool LLViewerInput::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
|
|||
|
||||
bool res = scanKey(mKeyBindings[mode], mKeyBindings[mode].size(), key, mask, key_down, key_up, key_level, repeat);
|
||||
|
||||
if (!res && agent_control_lbutton.canHandle(CLICK_NONE, key, mask))
|
||||
{
|
||||
if (key_down && !repeat)
|
||||
{
|
||||
res = agen_control_lbutton_handle(KEYSTATE_DOWN);
|
||||
}
|
||||
if (key_up)
|
||||
{
|
||||
res = agen_control_lbutton_handle(KEYSTATE_UP);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
@ -1696,29 +1808,36 @@ bool LLViewerInput::scanMouse(EMouseClickType click, EMouseState state) const
|
|||
bool res = false;
|
||||
S32 mode = getMode();
|
||||
MASK mask = gKeyboard->currentMask(TRUE);
|
||||
|
||||
// By default mouse clicks require exact mask
|
||||
// Todo: support for mIgnoreMasks because some functions like teleports
|
||||
// expect to be canceled, but for voice it's prefered to ignore mask.
|
||||
res = scanMouse(mMouseBindings[mode], mMouseBindings[mode].size(), click, mask, state, false);
|
||||
// no user defined actions found or those actions can't handle the key/button, handle control if nessesary
|
||||
if (!res && agent_control_lbutton.canHandle(click, KEY_NONE, mask))
|
||||
|
||||
// No user defined actions found or those actions can't handle the key/button,
|
||||
// so handle CONTROL_LBUTTON if nessesary.
|
||||
//
|
||||
// Default handling for MODE_FIRST_PERSON is in LLToolCompGun::handleMouseDown,
|
||||
// and sends AGENT_CONTROL_ML_LBUTTON_DOWN, but it only applies if ML controls
|
||||
// are leftButtonGrabbed(), send a normal click otherwise.
|
||||
|
||||
if (!res
|
||||
&& mLMouseDefaultHandling[mode]
|
||||
&& (mode != MODE_FIRST_PERSON || !gAgent.leftButtonGrabbed())
|
||||
&& (click == CLICK_LEFT || click == CLICK_DOUBLELEFT)
|
||||
)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case MOUSE_STATE_DOWN:
|
||||
agen_control_lbutton_handle(KEYSTATE_DOWN);
|
||||
agent_control_lbutton_handle(KEYSTATE_DOWN);
|
||||
res = true;
|
||||
break;
|
||||
case MOUSE_STATE_CLICK:
|
||||
// might not work best with some functions,
|
||||
// but some function need specific states too specifically
|
||||
agen_control_lbutton_handle(KEYSTATE_DOWN);
|
||||
agen_control_lbutton_handle(KEYSTATE_UP);
|
||||
agent_control_lbutton_handle(KEYSTATE_DOWN);
|
||||
agent_control_lbutton_handle(KEYSTATE_UP);
|
||||
res = true;
|
||||
break;
|
||||
case MOUSE_STATE_UP:
|
||||
agen_control_lbutton_handle(KEYSTATE_UP);
|
||||
agent_control_lbutton_handle(KEYSTATE_UP);
|
||||
res = true;
|
||||
break;
|
||||
default:
|
||||
|
|
@ -1748,7 +1867,7 @@ void LLViewerInput::scanMouse()
|
|||
}
|
||||
}
|
||||
|
||||
bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode)
|
||||
bool LLViewerInput::isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const
|
||||
{
|
||||
S32 size = mMouseBindings[mode].size();
|
||||
for (S32 index = 0; index < size; index++)
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@
|
|||
#include "llinitparam.h"
|
||||
|
||||
const S32 MAX_KEY_BINDINGS = 128; // was 60
|
||||
const S32 keybindings_xml_version = 1;
|
||||
const std::string script_mouse_handler_name = "script_trigger_lbutton";
|
||||
|
||||
class LLNamedFunction
|
||||
{
|
||||
|
|
@ -100,7 +102,7 @@ public:
|
|||
third_person,
|
||||
sitting,
|
||||
edit_avatar;
|
||||
|
||||
Optional<S32> xml_version; // 'xml', because 'version' appears to be reserved
|
||||
Keys();
|
||||
};
|
||||
|
||||
|
|
@ -131,7 +133,8 @@ public:
|
|||
BOOL handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
|
||||
void scanMouse();
|
||||
|
||||
bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask = MASK_NONE, const S32 mode = MODE_THIRD_PERSON);
|
||||
bool isMouseBindUsed(const EMouseClickType mouse, const MASK mask, const S32 mode) const;
|
||||
bool isLMouseHandlingDefault(const S32 mode) const { return mLMouseDefaultHandling[mode]; }
|
||||
|
||||
private:
|
||||
bool scanKey(const std::vector<LLKeyboardBinding> &binding,
|
||||
|
|
@ -171,6 +174,7 @@ private:
|
|||
// to send what we think function wants based on collection of bools (mKeyRepeated, mKeyLevel, mKeyDown)
|
||||
std::vector<LLKeyboardBinding> mKeyBindings[MODE_COUNT];
|
||||
std::vector<LLMouseBinding> mMouseBindings[MODE_COUNT];
|
||||
bool mLMouseDefaultHandling[MODE_COUNT]; // Due to having special priority
|
||||
|
||||
// keybindings that do not consume event and are handled earlier, before floaters
|
||||
std::vector<LLKeyboardBinding> mGlobalKeyBindings[MODE_COUNT];
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@
|
|||
#include "llcheckboxctrl.h"
|
||||
#include "llfloatergridstatus.h"
|
||||
#include "llfloaterpreference.h"
|
||||
#include "llkeyconflict.h"
|
||||
#include "lllogininstance.h"
|
||||
#include "llscenemonitor.h"
|
||||
#include "llsdserialize.h"
|
||||
|
|
@ -9643,26 +9644,88 @@ class LLToggleShaderControl : public view_listener_t
|
|||
};
|
||||
|
||||
//[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ]
|
||||
class LLAdvancedToggleDoubleClickTeleport: public view_listener_t
|
||||
// This stuff is based on LLPanelPreferenceControls::setKeyBind() and LLPanelPreferenceControls::canKeyBindHandle()
|
||||
void setDoubleClickAction(const std::string& control)
|
||||
{
|
||||
constexpr LLKeyConflictHandler::ESourceMode mode{ LLKeyConflictHandler::MODE_THIRD_PERSON };
|
||||
constexpr EMouseClickType click{ EMouseClickType::CLICK_DOUBLELEFT };
|
||||
constexpr KEY key{ KEY_NONE };
|
||||
constexpr MASK mask{ MASK_NONE };
|
||||
|
||||
LLKeyConflictHandler conflictHandler;
|
||||
conflictHandler.setLoadMode(mode);
|
||||
conflictHandler.loadFromSettings(mode);
|
||||
|
||||
if (!conflictHandler.canAssignControl(control))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool is_enabled = conflictHandler.canHandleControl(control, click, key, mask);
|
||||
if (!is_enabled)
|
||||
{
|
||||
// find free spot to add data, if no free spot, assign to first
|
||||
S32 index = 0;
|
||||
for (S32 i = 0; i < 3; i++)
|
||||
{
|
||||
if (conflictHandler.getControl(control, i).isEmpty())
|
||||
{
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool ignore_mask = true;
|
||||
conflictHandler.registerControl(control, index, click, key, mask, ignore_mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
// find specific control and reset it
|
||||
for (S32 i = 0; i < 3; i++)
|
||||
{
|
||||
LLKeyData data = conflictHandler.getControl(control, i);
|
||||
if (data.mMouse == click && data.mKey == key && data.mMask == mask)
|
||||
{
|
||||
conflictHandler.clearControl(control, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
conflictHandler.saveToSettings();
|
||||
}
|
||||
|
||||
bool isDoubleClickActionEnabled(const std::string control)
|
||||
{
|
||||
constexpr LLKeyConflictHandler::ESourceMode mode{ LLKeyConflictHandler::MODE_THIRD_PERSON };
|
||||
constexpr EMouseClickType click{ EMouseClickType::CLICK_DOUBLELEFT };
|
||||
constexpr KEY key{ KEY_NONE };
|
||||
constexpr MASK mask{ MASK_NONE };
|
||||
|
||||
LLKeyConflictHandler conflictHandler;
|
||||
conflictHandler.loadFromSettings(mode);
|
||||
|
||||
return conflictHandler.canHandleControl(control, click, key, mask);
|
||||
}
|
||||
|
||||
class FSAdvancedToggleDoubleClickAction: public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
BOOL checked = gSavedSettings.getBOOL("DoubleClickTeleport");
|
||||
if (checked)
|
||||
{
|
||||
gSavedSettings.setBOOL("DoubleClickTeleport", FALSE);
|
||||
report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportDisabled"));
|
||||
}
|
||||
else
|
||||
{
|
||||
gSavedSettings.setBOOL("DoubleClickTeleport", TRUE);
|
||||
gSavedSettings.setBOOL("DoubleClickAutoPilot", FALSE);
|
||||
report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportEnabled"));
|
||||
}
|
||||
const std::string& control = userdata.asStringRef();
|
||||
setDoubleClickAction(control);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class FSAdvancedCheckEnabledDoubleClickAction : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
const std::string& control = userdata.asStringRef();
|
||||
return isDoubleClickActionEnabled(control);
|
||||
}
|
||||
};
|
||||
|
||||
// <FS:Beq> Add telemetry controls to the viewer menus
|
||||
class LLProfilerToggleActive : public view_listener_t
|
||||
{
|
||||
|
|
@ -11918,7 +11981,8 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLAdvancedClickRenderProfile(), "Advanced.ClickRenderProfile");
|
||||
view_listener_t::addMenu(new LLAdvancedClickRenderBenchmark(), "Advanced.ClickRenderBenchmark");
|
||||
//[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ]
|
||||
view_listener_t::addMenu(new LLAdvancedToggleDoubleClickTeleport, "Advanced.ToggleDoubleClickTeleport");
|
||||
view_listener_t::addMenu(new FSAdvancedToggleDoubleClickAction, "Advanced.SetDoubleClickAction");
|
||||
view_listener_t::addMenu(new FSAdvancedCheckEnabledDoubleClickAction, "Advanced.CheckEnabledDoubleClickAction");
|
||||
|
||||
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
|
||||
view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode");
|
||||
|
|
|
|||
|
|
@ -1330,6 +1330,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
|
|||
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num, MAX_OBJECT_BINARY_DATA_SIZE);
|
||||
|
||||
mTotalCRC = crc;
|
||||
// Might need to update mSourceMuted here to properly pick up new radius
|
||||
mSoundCutOffRadius = cutoff;
|
||||
|
||||
// Owner ID used for sound muting or particle system muting
|
||||
|
|
@ -6053,7 +6054,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
|
|||
else if (flags & LL_SOUND_FLAG_STOP)
|
||||
{
|
||||
// Just shut off the sound
|
||||
mAudioSourcep->play(LLUUID::null);
|
||||
mAudioSourcep->stop();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -6100,7 +6101,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
|
|||
mAudioSourcep->setQueueSounds(queue);
|
||||
if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG
|
||||
{
|
||||
mAudioSourcep->play(LLUUID::null);
|
||||
mAudioSourcep->stop();
|
||||
}
|
||||
|
||||
// Play this sound if region maturity permits
|
||||
|
|
|
|||
|
|
@ -3042,6 +3042,21 @@ void LLViewerRegion::unpackRegionHandshake()
|
|||
}
|
||||
|
||||
mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking");
|
||||
// <FS:Beq> Earlier trigger for BOM support on region
|
||||
#ifdef OPENSIM
|
||||
constexpr U64 REGION_SUPPORTS_BOM {(U64)1<<63};
|
||||
if(region_protocols & REGION_SUPPORTS_BOM) // OS sets bit 63 when BOM supported
|
||||
{
|
||||
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES;
|
||||
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES;
|
||||
}
|
||||
else
|
||||
{
|
||||
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM;
|
||||
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO;
|
||||
}
|
||||
#endif
|
||||
// </FS:Beq>
|
||||
LLVLComposition *compp = getComposition();
|
||||
if (compp)
|
||||
{
|
||||
|
|
@ -3226,12 +3241,12 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
|
|||
capabilityNames.append("ObjectAnimation");
|
||||
capabilityNames.append("ObjectMedia");
|
||||
capabilityNames.append("ObjectMediaNavigate");
|
||||
capabilityNames.append("ObjectNavMeshProperties");
|
||||
capabilityNames.append("ParcelPropertiesUpdate");
|
||||
capabilityNames.append("ParcelVoiceInfoRequest");
|
||||
capabilityNames.append("ProductInfoRequest");
|
||||
capabilityNames.append("ProvisionVoiceAccountRequest");
|
||||
capabilityNames.append("ReadOfflineMsgs"); // Requires to respond reliably: AcceptFriendship, AcceptGroupInvite, DeclineFriendship, DeclineGroupInvite
|
||||
capabilityNames.append("RegionObjects");
|
||||
capabilityNames.append("RemoteParcelRequest");
|
||||
capabilityNames.append("RenderMaterials");
|
||||
capabilityNames.append("RequestTextureDownload");
|
||||
|
|
|
|||
|
|
@ -2497,6 +2497,10 @@ void LLViewerWindow::initWorldUI()
|
|||
LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
|
||||
panel_ssf_container->addChild(panel_stand_stop_flying);
|
||||
|
||||
// <FS:Ansariel> Leave this out for now until somebody wants to adjust the panel_toolbar_view.xml files...
|
||||
//LLPanelHideBeacon* panel_hide_beacon = LLPanelHideBeacon::getInstance();
|
||||
//panel_ssf_container->addChild(panel_hide_beacon);
|
||||
|
||||
panel_ssf_container->setVisible(TRUE);
|
||||
|
||||
LLMenuOptionPathfindingRebakeNavmesh::getInstance()->initialize();
|
||||
|
|
|
|||
|
|
@ -1458,11 +1458,8 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
|
||||
|
||||
//<FS:Beq> not called as often as it used to be but still no harm in optimising
|
||||
// S32 box_detail = gSavedSettings.getS32("AvatarBoundingBoxComplexity");
|
||||
static const LLCachedControl<S32> avatar_bounding_box_complexity(gSavedSettings, "AvatarBoundingBoxComplexity");
|
||||
S32 box_detail(avatar_bounding_box_complexity);
|
||||
//<FS:Beq>
|
||||
static LLCachedControl<S32> box_detail_cache(gSavedSettings, "AvatarBoundingBoxComplexity");
|
||||
S32 box_detail = box_detail_cache;
|
||||
if (getOverallAppearance() != AOA_NORMAL)
|
||||
{
|
||||
if (isControlAvatar())
|
||||
|
|
@ -2701,17 +2698,14 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
|
|||
{
|
||||
LL_INFOS() << "Warning! Idle on dead avatar" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// <FS:Beq> record time and refresh "tooSlow" status
|
||||
FSPerfStats::RecordAvatarTime T(getID(), FSPerfStats::StatType_t::RENDER_IDLE); // per avatar "idle" time.
|
||||
updateTooSlow();
|
||||
// </FS:Beq>;
|
||||
// <FS:CR> Use LLCachedControl
|
||||
static LLCachedControl<bool> disable_all_render_types(gSavedSettings, "DisableAllRenderTypes");
|
||||
if (!(gPipeline.hasRenderType(mIsControlAvatar ? LLPipeline::RENDER_TYPE_CONTROL_AV : LLPipeline::RENDER_TYPE_AVATAR))
|
||||
//&& !(gSavedSettings.getBOOL("DisableAllRenderTypes")) && !isSelf())
|
||||
&& !(disable_all_render_types) && !isSelf())
|
||||
// </FS:CR>
|
||||
&& !disable_all_render_types && !isSelf())
|
||||
{
|
||||
if (!mIsControlAvatar)
|
||||
{
|
||||
|
|
@ -2870,12 +2864,9 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
|
|||
// Don't render the user's own voice visualizer when in mouselook, or when opening the mic is disabled.
|
||||
if(isSelf())
|
||||
{
|
||||
// <FS:Ansariel> Faster debug settings
|
||||
//if(gAgentCamera.cameraMouselook() || gSavedSettings.getBOOL("VoiceDisableMic"))
|
||||
static LLCachedControl<bool> voiceDisableMic(gSavedSettings, "VoiceDisableMic");
|
||||
static LLCachedControl<bool> voiceDisableMic(gSavedSettings, "VoiceDisableMic");
|
||||
static LLCachedControl<bool> fsShowMyOwnVoiceVisualizer(gSavedSettings, "FSShowMyOwnVoiceVisualizer"); // <FS:PP> FIRE-21210: Don't show my voice visualizer
|
||||
if (gAgentCamera.cameraMouselook() || voiceDisableMic || !fsShowMyOwnVoiceVisualizer)
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
render_visualizer = false;
|
||||
}
|
||||
|
|
@ -3423,16 +3414,12 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
|
|||
mChats.clear();
|
||||
}
|
||||
|
||||
static LLCachedControl<F32> renderNameShowTime(gSavedSettings, "RenderNameShowTime");
|
||||
static LLCachedControl<F32> renderNameFadeDuration(gSavedSettings, "RenderNameFadeDuration");
|
||||
static LLCachedControl<bool> useChatBubbles(gSavedSettings, "UseChatBubbles");
|
||||
static LLCachedControl<bool> useTypingBubbles(gSavedSettings, "UseTypingBubbles");
|
||||
static LLCachedControl<bool> renderNameShowSelf(gSavedSettings, "RenderNameShowSelf");
|
||||
static LLCachedControl<S32> avatarNameTagMode(gSavedSettings, "AvatarNameTagMode");
|
||||
|
||||
const F32 time_visible = mTimeVisible.getElapsedTimeF32();
|
||||
const F32 NAME_SHOW_TIME = F32(renderNameShowTime); // seconds
|
||||
const F32 FADE_DURATION = F32(renderNameFadeDuration); // seconds
|
||||
static LLCachedControl<F32> NAME_SHOW_TIME(gSavedSettings, "RenderNameShowTime"); // seconds
|
||||
static LLCachedControl<F32> FADE_DURATION(gSavedSettings, "RenderNameFadeDuration"); // seconds
|
||||
static LLCachedControl<bool> use_chat_bubbles(gSavedSettings, "UseChatBubbles");
|
||||
static LLCachedControl<bool> use_typing_bubbles(gSavedSettings, "UseTypingBubbles");
|
||||
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.1
|
||||
bool fRlvShowAvTag = true, fRlvShowAvName = true;
|
||||
if (RlvActions::isRlvEnabled())
|
||||
|
|
@ -3441,9 +3428,9 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
|
|||
fRlvShowAvName = (fRlvShowAvTag) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, getID()));
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
BOOL visible_chat = useChatBubbles && (mChats.size() || mTyping);
|
||||
BOOL visible_typing = useTypingBubbles && mTyping;
|
||||
BOOL render_name = visible_chat ||
|
||||
bool visible_chat = use_chat_bubbles && (mChats.size() || mTyping);
|
||||
bool visible_typing = use_typing_bubbles && mTyping;
|
||||
bool render_name = visible_chat ||
|
||||
visible_typing ||
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.1
|
||||
((fRlvShowAvTag) &&
|
||||
|
|
@ -3454,10 +3441,11 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
|
|||
// draw if we're specifically hiding our own name.
|
||||
if (isSelf())
|
||||
{
|
||||
static LLCachedControl<bool> render_name_show_self(gSavedSettings, "RenderNameShowSelf");
|
||||
static LLCachedControl<S32> name_tag_mode(gSavedSettings, "AvatarNameTagMode");
|
||||
render_name = render_name
|
||||
&& !gAgentCamera.cameraMouselook()
|
||||
&& (visible_chat || (renderNameShowSelf
|
||||
&& S32(avatarNameTagMode) ));
|
||||
&& (visible_chat || (render_name_show_self && name_tag_mode));
|
||||
}
|
||||
|
||||
if ( !render_name )
|
||||
|
|
@ -3472,7 +3460,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
|
|||
return;
|
||||
}
|
||||
|
||||
BOOL new_name = FALSE;
|
||||
bool new_name = FALSE;
|
||||
if (visible_chat != mVisibleChat)
|
||||
{
|
||||
mVisibleChat = visible_chat;
|
||||
|
|
@ -3555,7 +3543,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
|
|||
// idleUpdateNameTagAlpha(new_name, alpha);
|
||||
}
|
||||
|
||||
void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
|
||||
void LLVOAvatar::idleUpdateNameTagText(bool new_name)
|
||||
{
|
||||
LLNameValue *title = getNVPair("Title");
|
||||
LLNameValue* firstname = getNVPair("FirstName");
|
||||
|
|
@ -4172,7 +4160,7 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
|
|||
mNameText->setPositionAgent(name_position);
|
||||
}
|
||||
|
||||
void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha)
|
||||
void LLVOAvatar::idleUpdateNameTagAlpha(bool new_name, F32 alpha)
|
||||
{
|
||||
llassert(mNameText);
|
||||
|
||||
|
|
@ -4371,11 +4359,8 @@ void LLVOAvatar::updateAppearanceMessageDebugText()
|
|||
{
|
||||
debug_line += llformat(" - cof: %d req: %d rcv:%d",
|
||||
curr_cof_version, last_request_cof_version, last_received_cof_version);
|
||||
// <FS:CR> Use LLCachedControl
|
||||
//if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure"))
|
||||
static LLCachedControl<bool> debug_force_appearance_request_failure(gSavedSettings, "DebugForceAppearanceRequestFailure");
|
||||
if (debug_force_appearance_request_failure)
|
||||
// </FS:CR>
|
||||
static LLCachedControl<bool> debug_force_failure(gSavedSettings, "DebugForceAppearanceRequestFailure");
|
||||
if (debug_force_failure)
|
||||
{
|
||||
debug_line += " FORCING ERRS";
|
||||
}
|
||||
|
|
@ -6697,8 +6682,8 @@ BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL
|
|||
if (PlayModeUISndTyping)
|
||||
// </FS:PP> FIRE-8190: Preview function for "UI Sounds" Panel
|
||||
{
|
||||
static LLCachedControl<std::string> uiSndTyping(gSavedSettings, "UISndTyping");
|
||||
LLUUID sound_id = LLUUID(uiSndTyping);
|
||||
static LLCachedControl<std::string> ui_snd_string(gSavedSettings, "UISndTyping");
|
||||
LLUUID sound_id = LLUUID(ui_snd_string);
|
||||
gAudiop->triggerSound(sound_id, getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_SFX, char_pos_global);
|
||||
}
|
||||
}
|
||||
|
|
@ -6766,7 +6751,7 @@ void LLVOAvatar::resetAnimations()
|
|||
// animations.
|
||||
LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
|
||||
{
|
||||
static LLCachedControl<bool> use_new_walk_run(gSavedSettings, "UseNewWalkRun");
|
||||
static LLCachedControl<bool> use_new_walk_run(gSavedSettings, "UseNewWalkRun");
|
||||
LLUUID result = id;
|
||||
|
||||
// start special case female walk for female avatars
|
||||
|
|
@ -9274,11 +9259,8 @@ void LLVOAvatar::updateTooSlow()
|
|||
bool LLVOAvatar::isTooComplex() const
|
||||
{
|
||||
bool too_complex;
|
||||
// <FS:Ansariel> Performance improvement
|
||||
//bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && gSavedSettings.getBOOL("AlwaysRenderFriends"));
|
||||
static LLCachedControl<bool> alwaysRenderFriends(gSavedSettings, "AlwaysRenderFriends");
|
||||
bool render_friend = ( alwaysRenderFriends && LLAvatarTracker::instance().isBuddy( getID() ) ); // Beq note: isBuddy can be slow only check if we have to
|
||||
// </FS:Ansariel>
|
||||
static LLCachedControl<bool> always_render_friends(gSavedSettings, "AlwaysRenderFriends");
|
||||
bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && always_render_friends);
|
||||
|
||||
if (isSelf() || render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
|
||||
{
|
||||
|
|
@ -10167,7 +10149,8 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe
|
|||
|
||||
// Parse visual params, if any.
|
||||
S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);
|
||||
bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing
|
||||
static LLCachedControl<bool> block_some_avatars(gSavedSettings, "BlockSomeAvatarAppearanceVisualParams");
|
||||
bool drop_visual_params_debug = block_some_avatars && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing
|
||||
if( num_blocks > 1 && !drop_visual_params_debug)
|
||||
{
|
||||
//LL_DEBUGS("Avatar") << avString() << " handle visual params, num_blocks " << num_blocks << LL_ENDL;
|
||||
|
|
@ -10285,11 +10268,11 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
|
||||
{
|
||||
// <FS:CR> Use LLCachedControl
|
||||
//bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage");
|
||||
static LLCachedControl<bool> enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage");
|
||||
// </FS:CR>
|
||||
if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages"))
|
||||
static LLCachedControl<bool> enable_verbose_dumps(gSavedSettings, "DebugAvatarAppearanceMessage");
|
||||
static LLCachedControl<bool> block_avatar_appearance_messages(gSavedSettings, "BlockAvatarAppearanceMessages");
|
||||
|
||||
std::string dump_prefix = getFullname() + "_" + (isSelf()?"s":"o") + "_";
|
||||
if (block_avatar_appearance_messages)
|
||||
{
|
||||
LL_WARNS() << "Blocking AvatarAppearance message" << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -10339,7 +10322,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
|
|||
}
|
||||
// </FS:Ansariel> [Legacy Bake]
|
||||
|
||||
if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
|
||||
// <FS:Beq> appearance fail fix from Rye
|
||||
// if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
|
||||
if (appearance_version > 0 && mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
|
||||
// </FS:Beq>
|
||||
{
|
||||
LL_WARNS("Avatar") << "Stale appearance received #" << thisAppearanceVersion <<
|
||||
" attempt to roll back from #" << mLastUpdateReceivedCOFVersion <<
|
||||
|
|
|
|||
|
|
@ -287,9 +287,9 @@ public:
|
|||
void idleUpdateLoadingEffect();
|
||||
void idleUpdateWindEffect();
|
||||
void idleUpdateNameTag(const LLVector3& root_pos_last);
|
||||
void idleUpdateNameTagText(BOOL new_name);
|
||||
void idleUpdateNameTagText(bool new_name);
|
||||
void idleUpdateNameTagPosition(const LLVector3& root_pos_last);
|
||||
void idleUpdateNameTagAlpha(BOOL new_name, F32 alpha);
|
||||
void idleUpdateNameTagAlpha(bool new_name, F32 alpha);
|
||||
// <FS:CR> Colorize tags
|
||||
//LLColor4 getNameTagColor(bool is_friend);
|
||||
LLColor4 getNameTagColor();
|
||||
|
|
@ -1010,8 +1010,8 @@ public:
|
|||
// <FS:Ansariel> Get typing status
|
||||
bool isTyping() const { return mTyping; }
|
||||
private:
|
||||
BOOL mVisibleChat;
|
||||
BOOL mVisibleTyping;
|
||||
bool mVisibleChat;
|
||||
bool mVisibleTyping;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Lip synch morphs
|
||||
|
|
|
|||
|
|
@ -1274,8 +1274,9 @@ void LLVOAvatarSelf::checkBOMRebakeRequired()
|
|||
{
|
||||
if(getRegion())
|
||||
{
|
||||
auto newBOMStatus = getRegion()->bakesOnMeshEnabled();
|
||||
if(!gSavedSettings.getBOOL("CurrentlyUsingBakesOnMesh") != newBOMStatus)
|
||||
auto bom_can_be_used_here = getRegion()->bakesOnMeshEnabled();
|
||||
static const LLCachedControl<bool> using_bom(gSavedSettings, "CurrentlyUsingBakesOnMesh", true);
|
||||
if( using_bom != bom_can_be_used_here)
|
||||
{
|
||||
// force a rebake when the last grid we were on (including previous login) had different BOM support
|
||||
// This replicates forceAppearanceUpdate rather than pulling in the whole of llavatarself.
|
||||
|
|
@ -1284,7 +1285,7 @@ void LLVOAvatarSelf::checkBOMRebakeRequired()
|
|||
doAfterInterval(boost::bind(&LLVOAvatarSelf::forceBakeAllTextures, gAgentAvatarp.get(), true), 5.0);
|
||||
}
|
||||
// update the setting even if we are in SL so that switch SL to OS and back
|
||||
gSavedSettings.setBOOL("CurrentlyUsingBakesOnMesh", newBOMStatus);
|
||||
gSavedSettings.setBOOL("CurrentlyUsingBakesOnMesh", bom_can_be_used_here);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2126,7 +2126,7 @@ bool LLVivoxVoiceClient::waitForChannel()
|
|||
{
|
||||
LL_INFOS("Voice") << "Session requesting reprovision and login." << LL_ENDL;
|
||||
requestRelog();
|
||||
break;
|
||||
// break;// <FS:Beq/> Fix broken state model
|
||||
}
|
||||
else if (mNextAudioSession)
|
||||
{
|
||||
|
|
@ -2135,7 +2135,7 @@ bool LLVivoxVoiceClient::waitForChannel()
|
|||
if (!runSession(joinSession)) //suspends
|
||||
{
|
||||
LL_DEBUGS("Voice") << "runSession returned false; leaving inner loop" << LL_ENDL;
|
||||
break;
|
||||
// break; <FS:Beq/> Fix broken state model
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -661,7 +661,7 @@ void LLVOSky::forceSkyUpdate()
|
|||
{
|
||||
mForceUpdate = TRUE;
|
||||
|
||||
memset(&m_lastAtmosphericsVars, 0x00, sizeof(AtmosphericsVars));
|
||||
m_lastAtmosphericsVars = {};
|
||||
|
||||
mCubeMapUpdateStage = -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7002,7 +7002,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
// can we safely treat this as an alpha mask?
|
||||
// <FS:Beq> Nothing actually sets facecolor use the TE alpha instead.
|
||||
// if (facep->getFaceColor().mV[3] <= 0.f)
|
||||
if (te->getAlpha() <=0.f || facep->getFaceColor().mV[3] <= 0.f)
|
||||
if ((te->getAlpha() <=0.f || facep->getFaceColor().mV[3] <= 0.f) && te->getGlow() == 0.0 )
|
||||
// </FS:Beq>
|
||||
{ //100% transparent, don't render unless we're highlighting transparent
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_VOLUME("facep->alpha -> invisible");
|
||||
|
|
|
|||
|
|
@ -203,19 +203,16 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
|
|||
// find the grid
|
||||
std::string current_grid = LLGridManager::getInstance()->getGridId();
|
||||
std::transform(current_grid.begin(), current_grid.end(), current_grid.begin(), ::tolower);
|
||||
if (current_grid == "agni")
|
||||
if (current_grid == "damballah")
|
||||
{
|
||||
substitution["GRID"] = "secondlife.com";
|
||||
}
|
||||
else if (current_grid == "damballah")
|
||||
{
|
||||
// Staging grid has its own naming scheme.
|
||||
substitution["GRID"] = "secondlife-staging.com";
|
||||
}
|
||||
else
|
||||
{
|
||||
substitution["GRID"] = llformat("%s.lindenlab.com", current_grid.c_str());
|
||||
}
|
||||
// Staging grid has its own naming scheme.
|
||||
substitution["GRID"] = "secondlife-staging.com";
|
||||
}
|
||||
else
|
||||
{
|
||||
substitution["GRID"] = "secondlife.com";
|
||||
}
|
||||
|
||||
// expand all of the substitution strings and escape the url
|
||||
std::string expanded_url = url;
|
||||
LLStringUtil::format(expanded_url, substitution);
|
||||
|
|
|
|||
|
|
@ -1689,6 +1689,16 @@ public:
|
|||
virtual void post(ResponsePtr response, const LLSD& context, const LLSD& input) const
|
||||
{
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (gDisconnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!LLWorld::instanceExists())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1701,8 +1711,13 @@ public:
|
|||
return;
|
||||
}
|
||||
|
||||
LLHost sim(input["body"]["sim-ip-and-port"].asString());
|
||||
|
||||
LLHost sim(input["body"]["sim-ip-and-port"].asString());
|
||||
if (sim.isInvalid())
|
||||
{
|
||||
LL_WARNS() << "Got EstablishAgentCommunication with invalid host" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
LLViewerRegion* regionp = LLWorld::getInstance()->getRegion(sim);
|
||||
if (!regionp)
|
||||
{
|
||||
|
|
@ -1711,7 +1726,7 @@ public:
|
|||
return;
|
||||
}
|
||||
LL_DEBUGS("CrossingCaps") << "Calling setSeedCapability from LLEstablishAgentCommunication::post. Seed cap == "
|
||||
<< input["body"]["seed-capability"] << LL_ENDL;
|
||||
<< input["body"]["seed-capability"] << " for region " << regionp->getRegionID() << LL_ENDL;
|
||||
regionp->setSeedCapability(input["body"]["seed-capability"]);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2198,7 +2198,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt [SUPPORT_SITE].
|
|||
|
||||
Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
|
||||
</string>
|
||||
<string name="5 O'Clock Shadow">
|
||||
<string name="5 O'Clock Shadow">
|
||||
Skægstubbe
|
||||
</string>
|
||||
<string name="All White">
|
||||
|
|
|
|||
|
|
@ -21,4 +21,7 @@
|
|||
<rows name="start_gesture">
|
||||
<columns name="lst_action" value="Geste beginnen" />
|
||||
</rows>
|
||||
<rows name="script_trigger_lbutton">
|
||||
<columns name="lst_action" value="Interagieren (LMB)" />
|
||||
</rows>
|
||||
</contents>
|
||||
|
|
@ -3265,7 +3265,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
|
|||
|
||||
Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_SITE].
|
||||
</string>
|
||||
<string name="5 O'Clock Shadow">
|
||||
<string name="5 O'Clock Shadow">
|
||||
Bartschatten
|
||||
</string>
|
||||
<string name="All White">
|
||||
|
|
|
|||
|
|
@ -73,4 +73,14 @@
|
|||
name="lst_action"
|
||||
value="Start Gesture" />
|
||||
</rows>
|
||||
<rows
|
||||
name="script_trigger_lbutton"
|
||||
value="script_trigger_lbutton">
|
||||
<columns
|
||||
column="lst_action"
|
||||
font="SansSerif"
|
||||
halign="left"
|
||||
name="lst_action"
|
||||
value="Interact (Script LMB)" />
|
||||
</rows>
|
||||
</contents>
|
||||
|
|
|
|||
|
|
@ -20,9 +20,10 @@
|
|||
name="message">
|
||||
Listing ID:
|
||||
</text>
|
||||
<!--listing_id is a positive S32-->
|
||||
<line_editor
|
||||
type="string"
|
||||
length="1"
|
||||
max_length_bytes="10"
|
||||
follows="top|right"
|
||||
font="SansSerif"
|
||||
height="20"
|
||||
|
|
|
|||
|
|
@ -102,10 +102,10 @@
|
|||
text_color="White"
|
||||
height="40"
|
||||
layout="topleft"
|
||||
left="425"
|
||||
left="420"
|
||||
top="5"
|
||||
name="fps_desc1_lbl"
|
||||
width="130"
|
||||
width="140"
|
||||
wrap="true">
|
||||
Stats pause when FPS is limited or in background.
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -3353,10 +3353,11 @@
|
|||
name="DoubleClick Teleport"
|
||||
shortcut="control|shift|D">
|
||||
<on_check
|
||||
function="CheckControl"
|
||||
parameter="DoubleClickTeleport" />
|
||||
function="Advanced.CheckEnabledDoubleClickAction"
|
||||
parameter="teleport_to"/>
|
||||
<on_click
|
||||
function="Advanced.ToggleDoubleClickTeleport"/>
|
||||
function="Advanced.SetDoubleClickAction"
|
||||
parameter="teleport_to"/>
|
||||
</menu_item_check>
|
||||
<!-- //[FIX FIRE-1927 - enable DoubleClickTeleport shortcut : SJ] -->
|
||||
|
||||
|
|
@ -4795,21 +4796,21 @@
|
|||
label="Double-Click Auto-Pilot"
|
||||
name="Double-ClickAuto-Pilot">
|
||||
<menu_item_check.on_check
|
||||
function="CheckControl"
|
||||
parameter="DoubleClickAutoPilot" />
|
||||
function="Advanced.CheckEnabledDoubleClickAction"
|
||||
parameter="walk_to" />
|
||||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="DoubleClickAutoPilot" />
|
||||
function="Advanced.SetDoubleClickAction"
|
||||
parameter="walk_to" />
|
||||
</menu_item_check>
|
||||
<menu_item_check
|
||||
label="Double-Click Teleport"
|
||||
name="DoubleClick Teleport">
|
||||
<menu_item_check.on_check
|
||||
function="CheckControl"
|
||||
parameter="DoubleClickTeleport" />
|
||||
function="Advanced.CheckEnabledDoubleClickAction"
|
||||
parameter="teleport_to" />
|
||||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="DoubleClickTeleport" />
|
||||
function="Advanced.SetDoubleClickAction"
|
||||
parameter="teleport_to" />
|
||||
</menu_item_check>
|
||||
<menu_item_separator />
|
||||
|
||||
|
|
|
|||
|
|
@ -2405,6 +2405,7 @@ Please try again later.
|
|||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="LandmarkCreated"
|
||||
log_to_chat="false"
|
||||
type="notifytip">
|
||||
You have added "[LANDMARK_NAME]" to your [FOLDER_NAME] folder.
|
||||
</notification>
|
||||
|
|
@ -13569,7 +13570,7 @@ This Region does not support environmental settings.
|
|||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
label="Save Outfit"
|
||||
label="Save Environmental Settings"
|
||||
name="SaveSettingAs"
|
||||
type="alertmodal">
|
||||
<unique/>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
height="25"
|
||||
layout="topleft"
|
||||
name="panel_hide_beacon"
|
||||
mouse_opaque="false"
|
||||
visible="true"
|
||||
width="133">
|
||||
<button
|
||||
follows="left|bottom"
|
||||
height="19"
|
||||
label="Hide beacon"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
name="hide_beacon_btn"
|
||||
tool_tip="Stop tracking and hide beacon"
|
||||
top="2"
|
||||
visible="false"
|
||||
width="113" />
|
||||
</panel>
|
||||
|
|
@ -142,7 +142,7 @@ top="0">
|
|||
follows="left|top|right"
|
||||
layout="topleft"
|
||||
sort_column="art_value"
|
||||
short_names="true"
|
||||
short_names="false"
|
||||
name="nearby_list"
|
||||
name_column="name"
|
||||
top_pad="10"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<floater name="360capture" title="Photo à 360°">
|
||||
<panel name="ui_panel_left">
|
||||
<text name="quality_level_label">
|
||||
Qualité
|
||||
</text>
|
||||
<radio_group name="360_quality_selection">
|
||||
<radio_item label="Aperçu (rapide)" name="preview_quality" tool_tip="Qualité la moins bonne" />
|
||||
<radio_item label="Moyenne" name="medium_quality" tool_tip="Qualité moyenne" />
|
||||
<radio_item label="Élevée" name="high_quality" tool_tip="Qualité élevée" />
|
||||
<radio_item label="Maximale" name="maximum_quality" tool_tip="Qualité maximale" />
|
||||
</radio_group>
|
||||
<check_box label="Masquer les avatars" name="360_hide_avatar" />
|
||||
<button label="Créer une image 360" name="capture_button" />
|
||||
<button label="Enregistrer sous..." name="save_local_button" />
|
||||
</panel>
|
||||
<panel name="ui_panel_right">
|
||||
<text name="statusbar">
|
||||
Cliquez et glissez pour vous déplacer dans la vue
|
||||
</text>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -44,4 +44,5 @@
|
|||
</view>
|
||||
<text name="image_res_text">[WIDTH]px (Largeur) x [HEIGHT]px (Hauteur)</text>
|
||||
<text name="file_size_label">[SIZE] Ko</text>
|
||||
<button label="Photo 360°" name="360_label"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@
|
|||
<floater name="inspect_group">
|
||||
<string name="PrivateGroup">Groupe privé</string>
|
||||
<string name="FreeToJoin">Inscription gratuite</string>
|
||||
<string name="CostToJoin">[AMOUNT] L$ pour rejoindre</string>
|
||||
<string name="CostToJoin">[AMOUNT] L$ pour adhérer</string>
|
||||
<string name="YouAreMember">Vous êtes membre</string>
|
||||
<text name="group_subtitle">123 membres</text>
|
||||
<text name="group_details">
|
||||
A group of folks charged with creating a room with a moose.
|
||||
Fear the moose! Fear it! And the mongoose too!
|
||||
Un groupe de personnes chargées de créer une chambre avec un élan.
|
||||
Craignez l'élan ! Craignez-le ! Et la mangouste aussi !
|
||||
</text>
|
||||
<text name="group_cost">L$123 to join</text>
|
||||
<text name="group_cost">123 L$ pour adhérer</text>
|
||||
<button label="Rejoindre" name="join_btn"/>
|
||||
<button label="Quitter" name="leave_btn"/>
|
||||
<button label="Voir le profil" name="view_profile_btn"/>
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
<menu_item_call label="Recréer le Bridge LSL" name="Recreate LSL Bridge"/>
|
||||
</menu>
|
||||
<menu_item_call label="Photo" name="Take Snapshot"/>
|
||||
<menu_item_call label="Photos 360°" name="Capture 360"/>
|
||||
<menu_item_call label="Suivi des transactions" name="money_tracker"/>
|
||||
<menu_item_call label="Stand de pose..." name="pose_stand"/>
|
||||
<menu_item_call label="Préférences..." name="Preferences"/>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<floater name="360capture" title="Foto panoramica a 360°">
|
||||
<panel name="ui_panel_left">
|
||||
<text name="quality_level_label">
|
||||
Livello qualità
|
||||
</text>
|
||||
<radio_group name="360_quality_selection">
|
||||
<radio_item label="Anteprima (veloce)" name="preview_quality" tool_tip="Qualità anteprima" />
|
||||
<radio_item label="Media" name="medium_quality" tool_tip="Qualità media" />
|
||||
<radio_item label="Alta" name="high_quality" tool_tip="Qualità alta" />
|
||||
<radio_item label="Massima" name="maximum_quality" tool_tip="Qualità massima" />
|
||||
</radio_group>
|
||||
<check_box label="Nascondi tutti gli avatar" name="360_hide_avatar" />
|
||||
<button label="Crea immagine 360°" name="capture_button" />
|
||||
<button label="Salva come..." name="save_local_button" />
|
||||
</panel>
|
||||
<panel name="ui_panel_right">
|
||||
<text name="statusbar">
|
||||
Clicca e trascina per ruotare la panoramica
|
||||
</text>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -1,13 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="performance" title="Migliora la velocita grafica (Sperimentale)">
|
||||
<floater name="performance" title="Migliora velocità grafica (sperimentale)">
|
||||
<floater.string name="frame_stats">
|
||||
Frame: [TOT_FRAME_TIME]ms - Scenario:[SCENERY_FRAME_PCT]% Avatar:[AV_FRAME_PCT]% UI:[UI_FRAME_PCT]% HUD:[HUDS_FRAME_PCT]% Swap:[SWAP_FRAME_PCT]% Tasks:[IDLE_FRAME_PCT]%
|
||||
</floater.string>
|
||||
<floater.string name="limit_fps">
|
||||
Limita FPS: [FPSCAP] fps
|
||||
</floater.string>
|
||||
<floater.string name="tuning_fps">
|
||||
Obbiett.: [FPSTARGET] fps
|
||||
</floater.string>
|
||||
<floater.string name="focus_fps">
|
||||
Sfondo
|
||||
In Background
|
||||
</floater.string>
|
||||
<floater.string name="info_waitforit">
|
||||
Attendi 5-10 sec per l'aggiornamento
|
||||
</floater.string>
|
||||
<floater.string name="info_frozen">
|
||||
Stats in pausa se FPS limitati / in background
|
||||
</floater.string>
|
||||
<floater.string name="tot_av_template">
|
||||
Totale: [TOT_AV] ([TOT_AV_TIME]μs)
|
||||
|
|
@ -18,28 +24,39 @@
|
|||
<panel name="panel_top">
|
||||
<panel name="fps_subpanel">
|
||||
<text name="fps_lbl">
|
||||
fotogr. al secondo
|
||||
frame per secondo
|
||||
</text>
|
||||
<text name="fps_warning">
|
||||
Limita FPS: [FPSCAP] fps
|
||||
</text>
|
||||
<text name="fps_desc1_lbl">
|
||||
Attendi 5-10 Sec per aggiornamento modifiche
|
||||
Stats in pausa se FPS limitati / in background
|
||||
</text>
|
||||
<text name="frame_breakdown">
|
||||
[------------ La suddivisione del frame apparirà qui ------------]
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="target_subpanel">
|
||||
<text name="settings_lbl">
|
||||
Autoregolazione Frame Rate
|
||||
<text name="settings_lbl" tool_tip="Regola automaticamente le impostazioni per mantenere gli FPS. Imposta il frame rate che deideri ed il viewer proverà a mantenerlo intervenendo in maniera dinamica sulle tue impostazioni.">
|
||||
Auto Tune:
|
||||
</text>
|
||||
<check_box label="Autoregolazione" name="AutoTuneFPS" tool_tip="Il programma tenterà di regolare le impostazioni per soddisfare l'FPS target." />
|
||||
<text name="targetfps_desc">
|
||||
Target Frame Rate (fps)
|
||||
</text>
|
||||
<spinner name="target_fps" tool_tip="Target FPS - Livello FPS desiderato. Il viewer proverà a raggiungerlo regolando le tue impostazioni grafiche." />
|
||||
<button label="Start" label_selected="Stop" name="AutoTuneFPS" tool_tip="Il viewer proverà a regolare le impostazioni in base al target FPS." />
|
||||
<check_box label="Continuo" name="AutoTuneContinuous" tool_tip="Il viewer continuerà ad adattare le impostazioni in base al target FPS anche quando chiudi la finestra. Senza questa spunta, la regolazione delle impostazioni viene eseguita solo una volta nel momento in cui premi il pulsante Start." />
|
||||
<button name="PrefSaveButton" tool_tip="Salva le impostazioni correnti." />
|
||||
<button name="PrefLoadButton" tool_tip="Carica un preset tra quelli salvati." />
|
||||
<button tool_tip="Ricarica le impostazioni predefinite per il tuo hardware." name="Defaults" />
|
||||
<text name="settings_desc">
|
||||
Autoregola impostazioni per mantenere FPS
|
||||
Modalità di Ottimizzazione
|
||||
</text>
|
||||
<combo_box name="FSTuningFPSStrategy">
|
||||
<combo_box.item label="Sintonizza solo avatar" name="av_only" />
|
||||
<combo_box.item label="Avatar e scena" name="av_and_scene" />
|
||||
<combo_box.item label="Solo Avatar" name="av_only" />
|
||||
<combo_box.item label="Avatar e Scenario" name="av_and_scene" />
|
||||
</combo_box>
|
||||
<spinner name="target_fps" tool_tip="Target FPS - Il livello FPS desiderato. Lo spettatore tenterà di raggiungere questo obiettivo regolando le impostazioni grafiche." />
|
||||
<button name="target_btn" tool_tip="Modifica i parametri di ottimizzazione." />
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="panel_performance_main">
|
||||
|
|
@ -48,7 +65,7 @@
|
|||
Impostazioni grafiche
|
||||
</text>
|
||||
<text name="settings_desc">
|
||||
Scegli impostazioni per distanza, acqua, illuminazione e altro.
|
||||
Scegli impostazioni per distanza, acqua, luci e altro.
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="nearby_subpanel">
|
||||
|
|
@ -56,33 +73,33 @@
|
|||
Avatar nelle vicinanze
|
||||
</text>
|
||||
<text name="avatars_nearby_desc">
|
||||
Gestisci quali avatar vicini vengono visti completamente.
|
||||
Gestisci visualizzazione degli avatar nelle vicinanze.
|
||||
</text>
|
||||
<text name="avatars_frme_pct_lbl">
|
||||
Tempo trasc.
|
||||
Tempo speso
|
||||
a disegnare
|
||||
avatar
|
||||
gli avatar
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="complexity_subpanel">
|
||||
<text name="complexity_lbl">
|
||||
La tua complessita
|
||||
La tua complessità
|
||||
</text>
|
||||
<text name="complexity_info">
|
||||
Sii un buon cittadino. Gestisci l'impatto del tuo avatar.
|
||||
Rispetta gli altri utenti. Gestisci l'impatto del tuo avatar.
|
||||
</text>
|
||||
</panel>
|
||||
<panel name="huds_subpanel">
|
||||
<text name="huds_lbl">
|
||||
I tuoi HUD attivi
|
||||
I tuoi HUD
|
||||
</text>
|
||||
<text name="huds_desc">
|
||||
Rimuovi HUD non necessari. Migliora la velocita.
|
||||
Migliora la velocità rimuovendo gli HUD non necessari.
|
||||
</text>
|
||||
<text name="huds_frme_pct_lbl">
|
||||
Tempo trasc.
|
||||
Tempo speso
|
||||
a disegnare
|
||||
HUD
|
||||
gli HUD
|
||||
</text>
|
||||
</panel>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,6 @@
|
|||
Sei iscritto
|
||||
</string>
|
||||
<button label="Iscriviti" name="join_btn"/>
|
||||
<button label="Chiudi" name="leave_btn"/>
|
||||
<button label="Abbandona" name="leave_btn"/>
|
||||
<button label="Vedi profilo" name="view_profile_btn"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@
|
|||
<menu_item_separator />
|
||||
<menu_item_check label="Mostra menu Avanzato" name="Show Advanced Menu"/>
|
||||
</menu>
|
||||
<menu_item_check label="Migliora velocità grafica..." name="Performance" />
|
||||
<menu_item_call label="Teleport a casa" name="Teleport Home"/>
|
||||
<menu_item_call label="Fissa casa qui" name="Set Home to Here"/>
|
||||
<menu label="Posizione del sole" name="Environment Settings">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel name="panel_performance_autotune">
|
||||
<text name="back_lbl">
|
||||
Indietro
|
||||
</text>
|
||||
<text name="settings_title">
|
||||
Preferenze Auto Tune
|
||||
</text>
|
||||
<text name="quality_lbl">
|
||||
Avatar distanti
|
||||
</text>
|
||||
<check_box label="Ottimizzazione basata sulla distanza" name="FSAutoTuneImpostorByDistEnabled" tool_tip="Quando abilitato, il viewer regolerà l'impostazione MaxNonImpostors per visualizzare completamente solo gli avatar entro il raggio definito." />
|
||||
<spinner label="AV completo più lontano" name="ffa_autotune" />
|
||||
<text name="distant_av_advice">
|
||||
Gli avatar distanti possono essere ottimizzati automaticamente indipenden-
|
||||
temente dal costo di rendering. Imposta la distanza dalla fotocamera oltre
|
||||
la quale il costo di rendering di un avatar verrà ottimizzato.
|
||||
</text>
|
||||
<text name="distance_lbl">
|
||||
Limiti di distanza per l'Auto Tune
|
||||
</text>
|
||||
<spinner label="Distanza minima" name="min_dd_autotune" />
|
||||
<spinner label="Distanza preferita" name="pref_dd_autotune" />
|
||||
<text name="distance_desc1">
|
||||
Quando si regolano i parametri dello scenario, l'Auto Tune sceglierà dei valori compresi tra la distanza di disegno minima e quella preferita.
|
||||
</text>
|
||||
<text name="sundry_lbl">
|
||||
Altre impostazioni
|
||||
</text>
|
||||
<check_box label="Consenti l'ottimizzazione del tuo avatar" name="alow_self_impostor" tool_tip="Se abilitato, il viewer potrà mostrarti il tuo avatar come impostor." />
|
||||
<check_box label="Mostra il tempo di rendering ottimizzato" name="show_tuned_art" tool_tip="Se abilitato, nella colonna Tempo verrà visualizzato il tempo di rendering corrente e non quello di pre-ottimizzazione." />
|
||||
<text name="sundry_desc1">
|
||||
Queste opzioni agiscono su impostazioni più specifiche. Per ulteriori informazioni, consulta la guida in linea.
|
||||
</text>
|
||||
</panel>
|
||||
|
|
@ -4,20 +4,23 @@
|
|||
Indietro
|
||||
</text>
|
||||
<text name="attachments_title">
|
||||
Complessita oggetti indossati avatar
|
||||
Complessità attachments
|
||||
</text>
|
||||
<text name="tot_att_count">
|
||||
Totale: 50 (120000.10μs)
|
||||
</text>
|
||||
<text name="attachments_desc1">
|
||||
Gli allegati rendono il tuo avatar piu complesso e lento da renderizzare.
|
||||
Gli attachments rendono il tuo avatar più complesso e lento da renderizzare.
|
||||
</text>
|
||||
<text name="attachments_desc2">
|
||||
Questa schermata ti consente di visualizzare gli allegati del tuo avatar.
|
||||
In questa schermata puoi visualizzare l'elenco dei tuoi attachments.
|
||||
</text>
|
||||
<text name="attachments_desc3">
|
||||
Puoi rimuovere i tuoi allegati rapidamente e facilmente premendo la 'X'.
|
||||
Puoi rimuovere rapidamente un attachment cliccando la 'X'.
|
||||
</text>
|
||||
<name_list name="obj_list">
|
||||
<name_list.columns label="Tempo (μs)" name="art_value" tool_tip="Tempo impiegato per il rendering di questo allegato (microsecondi)" />
|
||||
<name_list.columns name="complex_value" tool_tip="Complessità dell'oggetto (ARC)" />
|
||||
<name_list.columns label="Nome Allegato" tool_tip="Fare clic sulla 'X' per staccare" name="name" />
|
||||
<name_list.columns label="Tempo (μs)" name="art_value" tool_tip="Tempo impiegato per il rendering dell'attachment (microsecondi)." />
|
||||
<name_list.columns label="ARC" name="complex_value" tool_tip="Complessità dell'attachment (ARC)." />
|
||||
<name_list.columns label="Nome attachment" tool_tip="Fai click sulla 'X' per rimuovere l'attachment." name="name" />
|
||||
</name_list>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -4,19 +4,19 @@
|
|||
Indietro
|
||||
</text>
|
||||
<text name="huds_title">
|
||||
I tuoi HUDs attivi
|
||||
I tuoi HUD
|
||||
</text>
|
||||
<text name="huds_desc1">
|
||||
Staccare gli HUD inutilizzati. Usare meno memoria e rendere il viewer piu veloce.
|
||||
Rimuovendo gli HUD inutilizzati, si utilizza meno memoria ed il viewer sarà piu veloce.
|
||||
</text>
|
||||
<text name="huds_desc2">
|
||||
Gli HUD hanno spesso script pesanti e contribuiscono anche alla LAG lato server.
|
||||
Spesso gli HUD hanno molti scripts e possono contribuire anche al lag lato-server.
|
||||
</text>
|
||||
<text name="huds_desc3">
|
||||
Nota: l'utilizzo del pulsante di riduzione a icona di un HUD non lo stacca. Usa la X per rimuoverlo.
|
||||
Nota: Un HUD ridotto ad icona non utilizza meno risorse. Usa la 'X' per rimuoverlo.
|
||||
</text>
|
||||
<name_list name="hud_list">
|
||||
<name_list.columns label="Tempo (μs)" name="art_value" tool_tip="Tempo impiegato per il rendering di questo HUD (microsecondi)" />
|
||||
<name_list.columns label="Nome" tool_tip="Fare clic sulla 'X' per staccare" name="name" />
|
||||
<name_list.columns label="Tempo (μs)" name="art_value" tool_tip="Tempo impiegato per il rendering dell'HUD (microsecondi)." />
|
||||
<name_list.columns label="Nome HUD" tool_tip="Fai click sulla 'X' per rimuovere l'HUD." name="name" />
|
||||
</name_list>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -4,35 +4,41 @@
|
|||
Indietro
|
||||
</text>
|
||||
<text name="av_nearby_title">
|
||||
Avatars nelle vicinanze
|
||||
Avatar nelle vicinanze
|
||||
</text>
|
||||
<text name="tot_av_count">
|
||||
Totale: 50 (120000.10μs)
|
||||
</text>
|
||||
<text name="av_nearby_desc">
|
||||
Nascondi gli avatar piu complessi per aumentare la velocita.
|
||||
Nascondi gli avatar con una complessità elevata per aumentare la velocità.
|
||||
</text>
|
||||
<slider tool_tip="Controlla a che punto un avatar visivamente complesso viene disegnato come impostore" label="Massima complessità (K)" name="IndirectMaxComplexity" />
|
||||
<slider tool_tip="Controlla quando si ritiene che un avatar visivamente complesso richieda troppo tempo per il rendering (unità: microsecondi)" label="Tempo mass. di rendering (μs)" name="FSRenderAvatarMaxART" />
|
||||
<slider tool_tip="Stabilisci a che punto un avatar complesso viene disegnato come 'impostor'." label="Massima complessità (K)" name="IndirectMaxComplexity" />
|
||||
<slider tool_tip="Stabilisci a che punto la complessità di un avatar richiede troppo tempo per il rendering (unità: microsecondi)." label="Tempo massimo per il rendering (μs)" name="FSRenderAvatarMaxART" label_width="200" width="455" />
|
||||
<text name="FSRenderAvatarMaxARTText">
|
||||
senza limiti
|
||||
nessun limite
|
||||
</text>
|
||||
<name_list name="nearby_list">
|
||||
<name_list.columns tool_tip="Grafico a barre che mostra il tempo di rendering corrente (include l'autotuning) come % del più lento." name="art_visual" />
|
||||
<name_list.columns label="Tempo (μs)" tool_tip="Tempo di rendering avatar. Tempo effettivo impiegato per il rendering prima di qualsiasi ottimizzazione automatica (in microsec)." name="art_value" />
|
||||
<name_list.columns tool_tip="Complessita (ARC) basata su regole standard." name="complex_value" />
|
||||
<name_list.columns tool_tip="Mostra qualsiasi sintonizzazione. I=Impostore, S=nessuna ombra." name="state" />
|
||||
<name_list.columns tool_tip="Barra grafica che mostra il tempo di rendering corrente (include l'autotuning) in proporzione del più lento." name="art_visual" />
|
||||
<name_list.columns label="Tempo (μs)" tool_tip="Tempo di rendering dell'avatar. Tempo effettivo impiegato per il rendering dell'avatar prima di qualsiasi ottimizzazione automatica (in microsecondi)." name="art_value" />
|
||||
<name_list.columns label="ARC" tool_tip="Complessità dell'avatar basata sulle regole standard." name="complex_value" />
|
||||
<name_list.columns tool_tip="Mostra modalità di ottimizzazione. I=impostor, S=nessuna ombra." name="state" />
|
||||
<name_list.columns label="Nome" name="name"/>
|
||||
</name_list>
|
||||
<text name="av_nearby_desc2">
|
||||
Puoi anche fare clic destro del mouse su un avatar per contr. la visualizz.
|
||||
Puoi fare anche click destro su un avatar per impostare la modalità di resa.
|
||||
</text>
|
||||
<text name="av_nearby_desc3">
|
||||
Il tuo avatar include le risorse per il viewer. Usa la scheda Indossati per vedere il tuo impatto sugli altri.
|
||||
</text>
|
||||
<button label="Eccezioni..." name="exceptions_btn" />
|
||||
<check_box label="Mostra gli amici sempre con il massimo dettaglio" name="display_friends" />
|
||||
<check_box label="Nascondi completamente gli avatar" name="hide_avatars" />
|
||||
<button label="Eccezioni..." name="exceptions_btn" />
|
||||
<check_box label="Nascondi tutti gli avatar" name="hide_avatars" />
|
||||
<text name="name_tags_textbox">
|
||||
Nomi:
|
||||
Mostra nomi avatar:
|
||||
</text>
|
||||
<radio_group name="name_tag_mode">
|
||||
<radio_item label="Off" name="radio" />
|
||||
<radio_item label="On" name="radio2" />
|
||||
<radio_group name="name_tag_mode" left="150">
|
||||
<radio_item label="No" name="radio" />
|
||||
<radio_item label="Sì" name="radio2" />
|
||||
<radio_item label="Mostra brevemente" name="radio3" />
|
||||
</radio_group>
|
||||
</panel>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue