Ansariel 2022-04-19 15:42:14 +02:00
commit b8b0c8ec3b
111 changed files with 3088 additions and 999 deletions

17
.pre-commit-config.yaml Normal file
View File

@ -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

View File

@ -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>

View File

@ -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)
{

View File

@ -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

View File

@ -46,7 +46,6 @@
#include "llstl.h" // for DeletePointer()
#include "llstring.h"
#include "lleventtimer.h"
#include "stringize.h"
#include "llcleanup.h"
#include "llevents.h"

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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)

View File

@ -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;

View File

@ -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));
}

View File

@ -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:

View File

@ -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)

View File

@ -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;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -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);

View File

@ -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

View File

@ -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());

View File

@ -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);

View File

@ -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.

View File

@ -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)

View File

@ -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>

View File

@ -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>

View File

@ -6951,11 +6951,11 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;sid=[SESSION_ID]</string>
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;sid=[SESSION_ID]</string>
<key>Backup</key>
<integer>0</integer>
<!-- LL, possibly privacy leaking search string
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;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>

View File

@ -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()

View File

@ -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 );

View File

@ -634,6 +634,7 @@ void FSFloaterPerformance::populateNearbyList()
auto overall_appearance = avatar->getOverallAppearance();
if (overall_appearance == LLVOAvatar::AOA_INVISIBLE)
{
char_iter++;
continue;
}

View File

@ -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;

View File

@ -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=";

View File

@ -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

View File

@ -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

View File

@ -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");

View File

@ -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();

View File

@ -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"

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -386,7 +386,7 @@ void LLFloaterIMSessionTab::draw()
void LLFloaterIMSessionTab::enableDisableCallBtn()
{
if (LLVoiceClient::instanceExists())
if (LLVoiceClient::instanceExists() && mVoiceButton)
{
mVoiceButton->setEnabled(
mSessionID.notNull()

View File

@ -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)

View File

@ -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())

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);
}
}
}

View File

@ -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>
}

View File

@ -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;
}

View File

@ -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.

View File

@ -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)
{

View File

@ -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();

View File

@ -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");

View File

@ -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();
}
}

View File

@ -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"

View File

@ -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();

View File

@ -134,8 +134,11 @@ void ll::statusbar::SearchableItem::setNotHighlighted( )
{
mCtrl->setHighlighted( false );
if( mWasHiddenBySearch )
mMenu->setVisible( TRUE );
if (mWasHiddenBySearch)
{
mMenu->setVisible(TRUE);
mWasHiddenBySearch = false;
}
}
}

View File

@ -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"];

View File

@ -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;
}

View File

@ -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 );

View File

@ -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;

View File

@ -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

View File

@ -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;
}

View File

@ -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++)

View File

@ -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];

View File

@ -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");

View File

@ -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

View File

@ -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");

View File

@ -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();

View File

@ -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 <<

View File

@ -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

View File

@ -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);
}
}
}

View File

@ -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
{

View File

@ -661,7 +661,7 @@ void LLVOSky::forceSkyUpdate()
{
mForceUpdate = TRUE;
memset(&m_lastAtmosphericsVars, 0x00, sizeof(AtmosphericsVars));
m_lastAtmosphericsVars = {};
mCubeMapUpdateStage = -1;
}

View File

@ -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");

View File

@ -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);

View File

@ -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"]);
}
};

View File

@ -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&apos;Clock Shadow">
<string name="5 O'Clock Shadow">
Skægstubbe
</string>
<string name="All White">

View File

@ -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>

View File

@ -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&apos;Clock Shadow">
<string name="5 O'Clock Shadow">
Bartschatten
</string>
<string name="All White">

View File

@ -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>

View File

@ -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"

View File

@ -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>

View File

@ -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 />

View File

@ -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/>

View File

@ -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>

View File

@ -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"

View File

@ -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>

View File

@ -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>

View File

@ -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"/>

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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">

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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="" 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