diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000000..0b19cae838
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,119 @@
+---
+Language: Cpp
+# BasedOnStyle: Microsoft
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveMacros: false
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlines: Right
+AlignOperands: true
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllConstructorInitializersOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: Always
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AllowShortLambdasOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: Never
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: MultiLine
+BinPackArguments: true
+BinPackParameters: true
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Allman
+BreakBeforeInheritanceComma: false
+BreakInheritanceList: BeforeColon
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeColon
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: true
+ColumnLimit: 120
+CommentPragmas: '^ IWYU pragma:'
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+DisableFormat: false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:
+ - foreach
+ - Q_FOREACH
+ - BOOST_FOREACH
+IncludeBlocks: Preserve
+IncludeCategories:
+ - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
+ Priority: 2
+ SortPriority: 0
+ - Regex: '^(<|"(gtest|gmock|isl|json)/)'
+ Priority: 3
+ SortPriority: 0
+ - Regex: '.*'
+ Priority: 1
+ SortPriority: 0
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentCaseLabels: false
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentWidth: 4
+IndentWrappedFunctionNames: false
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 2
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 1000
+PointerAlignment: Right
+ReflowComments: true
+SortIncludes: false
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: true
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceBeforeSquareBrackets: false
+Standard: Latest
+StatementMacros:
+ - Q_UNUSED
+ - QT_REQUIRE_VERSION
+TabWidth: 4
+UseCRLF: false
+UseTab: Never
+...
+
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..3a4c44aedc
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,35 @@
+* text eol=lf
+
+# VSTool (normalization disabled)
+indra/tools/vstool/* -text
+
+# Images
+*.bmp binary
+*.BMP binary
+*.gif binary
+*.icns binary
+*.ico binary
+*.j2c binary
+*.j2k binary
+*.jpg binary
+*.png binary
+*.tga binary
+*.tif binary
+
+# Viewer resources
+*.db2 binary
+*.llm binary
+*.nib binary
+*.rtf binary
+*.ttf binary
+
+# Executables
+*.dll binary
+*.exe binary
+
+# Files with Windows line endings
+VivoxAUP.txt text eol=crlf
+FILES_ARE_UNICODE_UTF-16LE.txt text eol=crlf
+
+# Windows Manifest files
+*.manifest text eol=crlf
diff --git a/.gitignore b/.gitignore
index ad23d001b9..639b982f18 100755
--- a/.gitignore
+++ b/.gitignore
@@ -34,31 +34,40 @@ indra/lib/mono/indra/*.dll
indra/lib/mono/indra/*.exe
indra/lib/mono/indra/*.pdb
indra/lib/python/eventlet/
+indra/lib/python/mulib.*
indra/llwindow/glh/glh_linear.h
indra/newview/app_settings/dictionaries
indra/newview/app_settings/mozilla
indra/newview/app_settings/mozilla-runtime-*
indra/newview/app_settings/mozilla_debug
indra/newview/app_settings/static_*.db2
+indra/newview/avatar_icons_cache.txt
+indra/newview/avatar_lad.log
indra/newview/browser_profile
indra/newview/character
+indra/newview/dbghelp.dll
+indra/newview/filters.xml
indra/newview/fmod.dll
indra/newview/fmod.log
indra/newview/mozilla-theme
indra/newview/mozilla-universal-darwin.tgz
-indra/newview/res/ll_icon.*
+indra/newview/pilot.txt
+indra/newview/pilot.xml
indra/newview/res-sdl/ll_icon.*
+indra/newview/res/ll_icon.*
+indra/newview/search_history.txt
+indra/newview/teleport_history.txt
+indra/newview/typed_locations.txt
indra/newview/vivox-runtime
-indra/newview/English.lproj/InfoPlist.strings
-indra/newview/Info-Firestorm.plist
indra/server-linux-*
-indra/newview/res/firestorm_icon.BMP
-indra/newview/res/firestorm_icon.ico
indra/temp
indra/test/linden_file.dat
indra/test_apps/llmediatest/dependencies/i686-win32
indra/test_apps/terrain_mule/*.dll
indra/viewer-linux-*
+indra/web/dataservice/lib/shared/vault.*
+indra/web/dataservice/locale.*
+indra/web/dataservice/vendor.*
indra/web/doc/asset-upload/plugins/lsl_compiler/lslc
indra/web/doc/asset-upload/plugins/verify-notecard
indra/web/doc/asset-upload/plugins/verify-texture
diff --git a/FIRESTORM-SOURCE_LICENSE_HEADER.txt b/FIRESTORM-SOURCE_LICENSE_HEADER.txt
index 7b1dd1d16e..733719b436 100644
--- a/FIRESTORM-SOURCE_LICENSE_HEADER.txt
+++ b/FIRESTORM-SOURCE_LICENSE_HEADER.txt
@@ -2,9 +2,9 @@
* @file
* @brief
*
- * $LicenseInfo:firstyear=2019&license=fsviewerlgpl$
+ * $LicenseInfo:firstyear=2020&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
- * Copyright (C) 2019, The Phoenix Firestorm Project, Inc.
+ * Copyright (C) 2020, The Phoenix Firestorm Project, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
diff --git a/README_BUILD_FIRESTORM_WINDOWS.txt b/README_BUILD_FIRESTORM_WINDOWS.txt
index ae44a9e200..5596119399 100755
--- a/README_BUILD_FIRESTORM_WINDOWS.txt
+++ b/README_BUILD_FIRESTORM_WINDOWS.txt
@@ -1,54 +1,54 @@
-Before you start configuring your Windows build system, be aware of our tested configurations:
- Memory: You will need at least 2GB RAM, 4GB strongly recommended.
- CPU: Multiple CPUs are strongly recommended.
- A build can take over an hour.
- Visual Studio 2013 Community Edition.
-
-Ensure you can build a stock viewer-development try as described in the SL wiki. Before asking for any help
-compiling Firestorm, make sure you can build viewer-development first. If you try and skip this step, you may
-receive much less help. http://wiki.secondlife.com/wiki/Visual_Studio_2013_Viewer_Builds
-
-If you want to use licensed FMOD or KDU build libraries (they are optional) you have to provision these yourself.
-If you're licensing these with Phoenix/Firestorm, ask for the libraries for fmod and kdu. Put them into:
-
- c:\cygwin\opt\firestorm
-
-If you're a community builder, you'll need to build these libraries yourself, then change your autobuild.xml file to
-point to your own versions, or create a different autobuild.xml with your customizations, and use this with autobuild
-instead of our default autobuild.xml There are some examples of how to build FMOD on the LL Wiki and opensource-dev
-mailing list. We've created a non-KDU build target to make this easier. Everywhere you see "ReleaseFS" below, use
-"ReleaseFS_open" instead. This will perform the same build, using OpenJpeg instead of KDU.
-
-
-To build Firestorm:
-
-Open a CMD shell and navigating to your firestorm code repo:
-
- autobuild build -c ReleaseFS
-
-Other build targets you may use are:
-
- ReleaseFS (includes KDU, FMOD)
- ReleaseFS_open (no KDU, no FMOD)
- RelWithDebInfoFS_open (no KDU, no FMOD)
-
-Other examples:
- autobuild configure -c ReleaseFS # basic configuration step, don't build, just configure
- autobuild configure -c ReleaseFS -- --clean # clean the output area first, then configure
- autobuild configure -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel
-
- autobuild build -c ReleaseFS --no-configure # default quick rebuild
-
-If you want to set custom configuration, do this in the configure step separately from build, then run "autobuild
-build -c ReleaseFS --no-configure" as a secondary step.
-
-If you want to build the 64bit version, add the parameter -A 64 to the autobuild commands, e.g.:
- autobuild configure -A 64 -c ReleaseFS
- autobuild build -A 64 -c ReleaseFS --no-configure
-
-
-Logs:
- Look for logs in build-vc120-32/logs for 32bit builds and build-vc120-64/logs for 64bit
-
-Output:
- Look for output in build-vc120-32/newview/Release for 32bit builds and build-vc120-64/newview/Release for 64bit
+Before you start configuring your Windows build system, be aware of our tested configurations:
+ Memory: You will need at least 2GB RAM, 4GB strongly recommended.
+ CPU: Multiple CPUs are strongly recommended.
+ A build can take over an hour.
+ Visual Studio 2013 Community Edition.
+
+Ensure you can build a stock viewer-development try as described in the SL wiki. Before asking for any help
+compiling Firestorm, make sure you can build viewer-development first. If you try and skip this step, you may
+receive much less help. http://wiki.secondlife.com/wiki/Visual_Studio_2013_Viewer_Builds
+
+If you want to use licensed FMOD or KDU build libraries (they are optional) you have to provision these yourself.
+If you're licensing these with Phoenix/Firestorm, ask for the libraries for fmod and kdu. Put them into:
+
+ c:\cygwin\opt\firestorm
+
+If you're a community builder, you'll need to build these libraries yourself, then change your autobuild.xml file to
+point to your own versions, or create a different autobuild.xml with your customizations, and use this with autobuild
+instead of our default autobuild.xml There are some examples of how to build FMOD on the LL Wiki and opensource-dev
+mailing list. We've created a non-KDU build target to make this easier. Everywhere you see "ReleaseFS" below, use
+"ReleaseFS_open" instead. This will perform the same build, using OpenJpeg instead of KDU.
+
+
+To build Firestorm:
+
+Open a CMD shell and navigating to your firestorm code repo:
+
+ autobuild build -c ReleaseFS
+
+Other build targets you may use are:
+
+ ReleaseFS (includes KDU, FMOD)
+ ReleaseFS_open (no KDU, no FMOD)
+ RelWithDebInfoFS_open (no KDU, no FMOD)
+
+Other examples:
+ autobuild configure -c ReleaseFS # basic configuration step, don't build, just configure
+ autobuild configure -c ReleaseFS -- --clean # clean the output area first, then configure
+ autobuild configure -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel
+
+ autobuild build -c ReleaseFS --no-configure # default quick rebuild
+
+If you want to set custom configuration, do this in the configure step separately from build, then run "autobuild
+build -c ReleaseFS --no-configure" as a secondary step.
+
+If you want to build the 64bit version, add the parameter -A 64 to the autobuild commands, e.g.:
+ autobuild configure -A 64 -c ReleaseFS
+ autobuild build -A 64 -c ReleaseFS --no-configure
+
+
+Logs:
+ Look for logs in build-vc120-32/logs for 32bit builds and build-vc120-64/logs for 64bit
+
+Output:
+ Look for output in build-vc120-32/newview/Release for 32bit builds and build-vc120-64/newview/Release for 64bit
diff --git a/autobuild.xml b/autobuild.xml
index 02b4057dfc..b59f0d67ed 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -197,46 +197,6 @@
- slvoice_os
-
discord-rpc
copyright
@@ -1070,11 +1030,11 @@
archive
hash
- d892f61440dd1888327d764b04158c88
+ b5b6897fb6f5413f3396b0666a6422ab
hash_algorithm
md5
url
- file:///opt/firestorm/fmodstudio-2.00.05-darwin-192862021.tar.bz2
+ file:///opt/firestorm/fmodstudio-2.00.08-darwin-201031332.tar.bz2
name
darwin
@@ -1084,11 +1044,11 @@
archive
hash
- 4bf66af7313c2a859bde553a563698e3
+ aed9fbd15995e71f9b600eb2ed2b73b1
hash_algorithm
md5
url
- file:///opt/firestorm/fmodstudio-2.00.05-linux64-192862026.tar.bz2
+ file:///opt/firestorm/fmodstudio-2.00.08-linux64-201031328.tar.bz2
name
linux64
@@ -1098,11 +1058,11 @@
archive
hash
- c668bd6961489c9bd6f07f1203a9d6eb
+ 670b2dc83403cc9024bc68728d851a4d
hash_algorithm
md5
url
- file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.05-windows-192861134.tar.bz2
+ file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.08-windows-200921513.tar.bz2
name
windows
@@ -1112,18 +1072,18 @@
archive
hash
- 2cf52c44f8943f69b91c950ae7ea356a
+ b97c88e262d37dd1514c0e580a8cc775
hash_algorithm
md5
url
- file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.05-windows64-192861136.tar.bz2
+ file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.08-windows64-200921514.tar.bz2
name
windows64
version
- 2.00.05
+ 2.00.08
fmodex
@@ -3626,9 +3586,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 175b1f90cd3679a2a64ad948dae3f2fa
+ e5a4261599f47045428b520b20405022
url
- http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/44332/391669/vlc_bin-2.2.8.531366-darwin64-531366.tar.bz2
+ http://downloads.phoenixviewer.com/vlc_bin-3.0.8.200601940-darwin64-200601940.tar.bz2
name
darwin64
@@ -3871,9 +3831,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
package_description
canonical_repo
- https://bitbucket.org/lindenlab/viewer-release
+ https://bitbucket.org/lindenlab/viewer
copyright
- Copyright (c) 2019, The Phoenix Firestorm Project, Inc.
+ Copyright (c) 2020, The Phoenix Firestorm Project, Inc.
description
Firestorm Viewer
license
diff --git a/build.sh b/build.sh
index 2fd9a09584..4dff58971f 100755
--- a/build.sh
+++ b/build.sh
@@ -259,6 +259,23 @@ then
export additional_packages=
fi
+begin_section "select viewer channel"
+# Look for a branch-specific viewer_channel setting
+# changeset_branch is set in the sling-buildscripts
+viewer_build_branch=$(echo -n "${changeset_branch:-$(repo_branch ${BUILDSCRIPTS_SRC:-$(pwd)})}" | tr -Cs 'A-Za-z0-9_' '_' | sed -E 's/^_+//; s/_+$//')
+if [ -n "$viewer_build_branch" ]
+then
+ branch_viewer_channel_var="${viewer_build_branch}_viewer_channel"
+ if [ -n "${!branch_viewer_channel_var}" ]
+ then
+ viewer_channel="${!branch_viewer_channel_var}"
+ record_event "Overriding viewer_channel for branch '$changeset_branch' to '$viewer_channel'"
+ else
+ record_event "No branch-specific viewer_channel for branch '$viewer_build_branch'; to set a branch build channel set '$branch_viewer_channel_var'"
+ fi
+fi
+end_section "select viewer channel"
+
python_cmd "$helpers/codeticket.py" addinput "Viewer Channel" "${viewer_channel}"
initialize_version # provided by buildscripts build.sh; sets version id
diff --git a/doc/contributions.txt b/doc/contributions.txt
index e11c61953f..eb3dbe1786 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -1437,6 +1437,8 @@ Thickbrick Sleaford
STORM-956
STORM-1147
STORM-1325
+Thoys Pan
+ SL-12396
Thraxis Epsilon
SVC-371
VWR-383
diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake
index 790153884a..86e42fa0ba 100644
--- a/indra/cmake/BuildVersion.cmake
+++ b/indra/cmake/BuildVersion.cmake
@@ -9,7 +9,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" VIEWER_VERSION_MAJOR ${VIEWER_SHORT_VERSION})
string(REGEX REPLACE "^[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" VIEWER_VERSION_MINOR ${VIEWER_SHORT_VERSION})
string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" VIEWER_VERSION_PATCH ${VIEWER_SHORT_VERSION})
-
+
if (DEFINED ENV{revision})
set(VIEWER_VERSION_REVISION $ENV{revision})
message("Revision (from environment): ${VIEWER_VERSION_REVISION}")
@@ -64,6 +64,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
"LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR}"
"LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}"
"LL_VIEWER_VERSION_BUILD=${VIEWER_VERSION_REVISION}"
+ "FS_VIEWER_VERSION_GITHASH=${VIEWER_VERSION_GITHASH}"
"LLBUILD_CONFIG=\"${CMAKE_BUILD_TYPE}\""
)
endif (NOT DEFINED VIEWER_SHORT_VERSION)
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index ee88c32c00..e7704a0db5 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -91,6 +91,10 @@ if(WINDOWS)
endif(ADDRESS_SIZE EQUAL 32)
endif (FMODEX)
+ if (OPENAL)
+ set(release_files ${release_files} OpenAL32.dll alut.dll)
+ endif (OPENAL)
+
#*******************************
# Copy MS C runtime dlls, required for packaging.
if (MSVC80)
diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake
index ddef4046a3..c39df56b7a 100644
--- a/indra/cmake/FMODSTUDIO.cmake
+++ b/indra/cmake/FMODSTUDIO.cmake
@@ -1,6 +1,6 @@
# -*- cmake -*-
-# FMOD can be set when launching the make using the argument -DFMODSTUDIO:BOOL=ON
+# FMOD Studio can be set when launching the make using the argument -DFMODSTUDIO:BOOL=ON
# When building using proprietary binaries though (i.e. having access to LL private servers),
# we always build with FMODSTUDIO.
# Open source devs should use the -DFMODSTUDIO:BOOL=ON then if they want to build with FMOD, whether
@@ -27,15 +27,16 @@ if (FMODSTUDIO)
include(Prebuilt)
use_prebuilt_binary(fmodstudio)
if (WINDOWS)
- set(FMODSTUDIO_LIBRARY
+ set(FMODSTUDIO_LIBRARY
debug fmodL_vc
optimized fmod_vc)
elseif (DARWIN)
- set(FMODSTUDIO_LIBRARY
+ #despite files being called libfmod.dylib, we are searching for fmod
+ set(FMODSTUDIO_LIBRARY
debug fmodL
optimized fmod)
elseif (LINUX)
- set(FMODSTUDIO_LIBRARY
+ set(FMODSTUDIO_LIBRARY
debug fmodL
optimized fmod)
endif (WINDOWS)
diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake
index 1e5c48f09e..980b2a0fdc 100644
--- a/indra/cmake/ViewerMiscLibs.cmake
+++ b/indra/cmake/ViewerMiscLibs.cmake
@@ -8,13 +8,6 @@ if (NOT USESYSTEMLIBS)
endif (LINUX)
use_prebuilt_binary(libhunspell)
use_prebuilt_binary(slvoice)
- # FIRE-22709: Local voice not working in OpenSim
- if (OPENSIM)
- if (WINDOWS OR DARWIN)
- use_prebuilt_binary(slvoice_os)
- endif (WINDOWS OR DARWIN)
- endif (OPENSIM)
- #
# use_prebuilt_binary(libidn)
endif(NOT USESYSTEMLIBS)
diff --git a/indra/cmake/bugsplat.cmake b/indra/cmake/bugsplat.cmake
index 59644b73ce..0c84bac88a 100644
--- a/indra/cmake/bugsplat.cmake
+++ b/indra/cmake/bugsplat.cmake
@@ -17,7 +17,9 @@ if (BUGSPLAT_DB)
elseif (DARWIN)
find_library(BUGSPLAT_LIBRARIES BugsplatMac
PATHS "${ARCH_PREBUILT_DIRS_RELEASE}")
+ message(FATAL_ERROR "Bugsplat for OSX not fully implemented, please adapt llappdelegate-objc.mm to honor options of sending user name and settings.xml.")
else (WINDOWS)
+ message(FATAL_ERROR "Bugsplat for Linux not implemented.")
endif (WINDOWS)
set(BUGSPLAT_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/bugsplat)
diff --git a/indra/cmake/jemalloc.cmake b/indra/cmake/jemalloc.cmake
index da77d0f160..8980134b0a 100644
--- a/indra/cmake/jemalloc.cmake
+++ b/indra/cmake/jemalloc.cmake
@@ -1,6 +1,10 @@
# -*- cmake -*-
include(Prebuilt)
+if (LINUX AND NOT SYSTEMLIBS )
+ set(USE_JEMALLOC ON)
+endif ()
+
if( USE_JEMALLOC )
if (USESYSTEMLIBS)
message( WARNING "Not implemented" )
diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt
index 8d1c8b69c3..fd40910d9e 100644
--- a/indra/edit-me-to-trigger-new-build.txt
+++ b/indra/edit-me-to-trigger-new-build.txt
@@ -1 +1,4 @@
-
+
+
+
+
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 201a2214ba..f8771b5936 100755
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -161,7 +161,7 @@ BASE_ARGUMENTS=[
dict(name='viewer_flavor',
description='Type of viewer build. Can be oss or hvk.', default="oss"),
dict(name='fmodversion',
- description='Version of FMOD used. Can be fmodstudio or fmodex.', default=None),
+ description='Version of FMOD used. Can be fmodstudio or fmodex.', default=None)
]
def usage(arguments, srctree=""):
diff --git a/indra/llappearance/llwearabledata.cpp b/indra/llappearance/llwearabledata.cpp
index d177d42a2e..764481cc7e 100644
--- a/indra/llappearance/llwearabledata.cpp
+++ b/indra/llappearance/llwearabledata.cpp
@@ -257,6 +257,7 @@ BOOL LLWearableData::canAddWearable(const LLWearableType::EType type) const
LLAssetType::EType a_type = LLWearableType::getAssetType(type);
if (a_type==LLAssetType::AT_CLOTHING)
{
+ if (type == LLWearableType::WT_PHYSICS) return (getWearableCount(type) < 1); // Don't add physics layer
return (getClothingLayerCount() < MAX_CLOTHING_LAYERS);
}
else if (a_type==LLAssetType::AT_BODYPART)
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 0df1be69b9..9da9e8f27c 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -78,6 +78,10 @@ if (FMODEX)
endif (FMODEX)
if (OPENAL)
+ include_directories(
+ ${OPENAL_LIBRARIES}
+ )
+
list(APPEND llaudio_SOURCE_FILES
llaudioengine_openal.cpp
lllistener_openal.cpp
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 2cb9f40a26..77935169bb 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -832,7 +832,9 @@ F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec)
void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain,
- const S32 type, const LLVector3d &pos_global, const LLUUID& source_object)
+ // / Optional parameter for setting the audio source UUID
+ // const S32 type, const LLVector3d &pos_global, const LLUUID& source_object)
+ const S32 type, const LLVector3d &pos_global, const LLUUID& source_object, const LLUUID& audio_source_id)
{
// Create a new source (since this can't be associated with an existing source.
//LL_INFOS() << "Localized: " << audio_uuid << LL_ENDL;
@@ -843,8 +845,14 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
return;
}
- LLUUID source_id;
- source_id.generate();
+ // Only generate the id if one wasn't passed to the method
+ //LLUUID source_id;
+ //source_id.generate();
+ LLUUID source_id = audio_source_id;
+ if (source_id.isNull())
+ {
+ source_id.generate();
+ }
LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type, source_object, true);
addAudioSource(asp);
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 3e2bf542fb..f685f3fc84 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -150,7 +150,11 @@ public:
void triggerSound(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain,
const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
const LLVector3d &pos_global = LLVector3d::zero,
- const LLUUID& source_object = LLUUID::null);
+ // Optional parameter for setting the audio source UUID
+ // const LLUUID& source_object = LLUUID::null);
+ const LLUUID& source_object = LLUUID::null,
+ const LLUUID& audio_source_id = LLUUID::null);
+
// NaCl End
void triggerSound(SoundData& soundData);
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 39a6a880f0..224396b3dc 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -392,10 +392,7 @@ void EnableCrashingOnCrashes()
}
#endif
-//void LLApp::setupErrorHandling(bool second_instance)
-// [SL:KB] - Patch: Viewer-CrashReporting | Checked: 2010-11-12 (Catznip-2.6.0a) | Added: Catznip-2.4.0a
-void LLApp::setupErrorHandling(bool second_instance, EMiniDumpType minidump_type)
-// [/SL:KB]
+void LLApp::setupErrorHandling(bool second_instance)
{
// Error handling is done by starting up an error handling thread, which just sleeps and
// occasionally checks to see if the app is in an error state, and sees if it needs to be run.
@@ -434,23 +431,7 @@ void LLApp::setupErrorHandling(bool second_instance, EMiniDumpType minidump_type
for (; retries > 0; --retries)
{
if (mExceptionHandler != 0) delete mExceptionHandler;
- // Reapply patch from Catznip to allow different types of minidumps
- U32 maskMiniDumpType = MiniDumpNormal | MiniDumpFilterModulePaths;
- switch (minidump_type)
- {
- case MINIDUMP_MINIMAL:
- maskMiniDumpType |= MiniDumpFilterMemory;
- break;
- case MINIDUMP_EXTENDED:
- maskMiniDumpType |= MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory;
- break;
- case MINIDUMP_NORMAL:
- default:
- break;
- }
- //
-
-
+ U32 maskMiniDumpType = MiniDumpNormal | MiniDumpFilterModulePaths;
mExceptionHandler = new google_breakpad::ExceptionHandler(
wdump_path,
NULL, //No filter
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index 3aa6934c44..245c73e3a2 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -226,16 +226,7 @@ public:
* DO NOT call this method if your application has specialized
* error handling code.
*/
-// void setupErrorHandling(bool mSecondInstance=false);
-// [SL:KB] - Patch: Viewer-CrashReporting | Checked: 2010-11-12 (Catznip-2.6.0a) | Added: Catznip-2.4.0a
- typedef enum minidump_type_t {
- MINIDUMP_MINIMAL = 0,
- MINIDUMP_NORMAL = 1,
- MINIDUMP_EXTENDED = 2
- } EMiniDumpType;
-
- void setupErrorHandling(bool second_instance, EMiniDumpType minidump_type = MINIDUMP_NORMAL);
-// [/SL:KB]
+ void setupErrorHandling(bool mSecondInstance=false);
void setErrorHandler(LLAppErrorHandler handler);
static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
diff --git a/indra/llcommon/llerrorthread.cpp b/indra/llcommon/llerrorthread.cpp
index f6bc68b5c1..221ccf9811 100644
--- a/indra/llcommon/llerrorthread.cpp
+++ b/indra/llcommon/llerrorthread.cpp
@@ -106,7 +106,9 @@ void LLErrorThread::run()
// This thread sits and waits for the sole purpose
// of waiting for the signal/exception handlers to flag the
// application state as APP_STATUS_ERROR.
- LL_INFOS() << "thread_error - Waiting for an error" << LL_ENDL;
+
+ // Do not log as this can lead to deadlocks during startup.
+ // LL_INFOS() << "thread_error - Waiting for an error" << LL_ENDL;
S32 counter = 0;
while (! (LLApp::isError() || LLApp::isStopped()))
diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt
index c4f2a40333..30ccf57bfb 100644
--- a/indra/llinventory/CMakeLists.txt
+++ b/indra/llinventory/CMakeLists.txt
@@ -23,7 +23,7 @@ include_directories(SYSTEM
set(llinventory_SOURCE_FILES
llcategory.cpp
- lleconomy.cpp
+ lleconomy.cpp # OpenSim legacy economy
llfoldertype.cpp
llinventory.cpp
llinventorydefines.cpp
@@ -41,7 +41,7 @@ set(llinventory_HEADER_FILES
CMakeLists.txt
llcategory.h
- lleconomy.h
+ lleconomy.h # OpenSim legacy economy
llfoldertype.h
llinventory.h
llinventorydefines.h
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index c9b3f1d1b5..77f142659b 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -5295,21 +5295,14 @@ bool LLVolumeFace::cacheOptimize()
llassert(!mOptimized);
mOptimized = TRUE;
- // FIRE-23370/BUG-8801/MAIN-5060
+ // FIRE-23370/BUG-8801/MAIN-5060/FIRE-29492
// cacheOptimize will destroy triangles. This is due to LLVCacheVertexData pointing to vertices in the vector vertex_data.
// Once vertex_data is sorted (std::sort(triangle_data.begin(), triangle_data.end()) ) this will invalidate those pointers and
// LLVCacheVertexData suddenly does point to unrelated vertices. It is an interesting fact that this is no problem for the
// windows version.
//
- // To solve the issue with the pointer invalidation it use a std::vector< U16 > for triangle indices, sort this using
- // std::sort( v.begin(), v.end(), [&triangle_data](U16 rhs, U16 lhs ){ return triangle_data[rhs].mScore > triangle_data[lhs].mScore; }
- // Then access all LLVCacheTriangleData> via triangle_data[ v[ idx ] ].
- //
- // Unfortunately this is a bit of a messy interwoven change all of this method, alternative is to copy a Linux specific version. Which
- // won't be that great either
- // NB The change really should be safe for Winows too, in fact it is surprising Windows does not suffer fro the sae bug. Just cannot test
- // the windows versions right now.
+#ifndef LL_LINUX
LLVCacheLRU cache;
if (mNumVertices < 3 || mNumIndices < 3)
@@ -5344,13 +5337,6 @@ bool LLVolumeFace::cacheOptimize()
triangle_data[tri_idx].mVertex[i%3] = &(vertex_data[idx]);
}
-// FIRE-23370/BUG-8801/MAIN-5060
-#ifdef LL_LINUX
- std::vector< U32 > v;
- for (U32 j = 0; j < triangle_data.size(); ++j)
- v.push_back( j );
-#endif
-
/*F32 pre_acmr = 1.f;
//measure cache misses from before rebuild
{
@@ -5382,27 +5368,14 @@ bool LLVolumeFace::cacheOptimize()
}
//sort triangle data by score
-// FIRE-23370/BUG-8801/MAIN-5060
-#ifndef LL_LINUX
std::sort(triangle_data.begin(), triangle_data.end());
-#else
- std::sort( v.begin(), v.end(),
- [&triangle_data](U16 rhs, U16 lhs )
- { return triangle_data[rhs].mScore > triangle_data[lhs].mScore; }
- );
-#endif
std::vector new_indices;
LLVCacheTriangleData* tri;
//prime pump by adding first triangle to cache;
-// FIRE-23370/BUG-8801/MAIN-5060
-#ifndef LL_LINUX
tri = &(triangle_data[0]);
-#else
- tri = &(triangle_data[v[0]]);
-#endif
cache.addTriangle(tri);
new_indices.push_back(tri->mVertex[0]->mIdx);
@@ -5420,21 +5393,11 @@ bool LLVolumeFace::cacheOptimize()
breaks++;
for (U32 j = 0; j < triangle_data.size(); ++j)
{
-// FIRE-23370/BUG-8801/MAIN-5060
-#ifndef LL_LINUX
if (triangle_data[j].mActive)
{
tri = &(triangle_data[j]);
break;
}
-#else
- if (triangle_data[v[j]].mActive)
- {
- tri = &(triangle_data[v[j]]);
- break;
- }
-#endif
-
}
}
@@ -5565,7 +5528,8 @@ bool LLVolumeFace::cacheOptimize()
//std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks);
//LL_INFOS() << result << LL_ENDL;
-
+#endif
+
return true;
}
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index 0aa1d9da6e..1421edf9f0 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -47,10 +47,18 @@ static LLDefaultChildRegistry::Register r("check_box");
template class LLCheckBoxCtrl* LLView::getChild(
const std::string& name, BOOL recurse) const;
+void LLCheckBoxCtrl::WordWrap::declareValues()
+{
+ declare("none", EWordWrap::WRAP_NONE);
+ declare("down", EWordWrap::WRAP_DOWN);
+ declare("up", EWordWrap::WRAP_UP);
+}
+
LLCheckBoxCtrl::Params::Params()
: initial_value("initial_value", false),
label_text("label_text"),
check_button("check_button"),
+ word_wrap("word_wrap", EWordWrap::WRAP_NONE),
// on_check callback parameter
on_check("on_check"),
//
@@ -62,14 +70,14 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
: LLUICtrl(p),
mTextEnabledColor(p.label_text.text_color()),
mTextDisabledColor(p.label_text.text_readonly_color()),
- mFont(p.font())
+ mFont(p.font()),
+ mWordWrap(p.word_wrap)
{
mViewModel->setValue(LLSD(p.initial_value));
mViewModel->resetDirty();
static LLUICachedControl llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
static LLUICachedControl llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
static LLUICachedControl llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
- static LLUICachedControl llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
// must be big enough to hold all children
setUseBoundingRect(TRUE);
@@ -88,20 +96,47 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
{
tbparams.font(p.font);
}
- mLabel = LLUICtrlFactory::create (tbparams);
+
+ mLabel = LLUICtrlFactory::create(tbparams);
+ if (mWordWrap != WRAP_NONE)
+ {
+ // Not setWordWrap(mWordWrap != WRAP_NONE) because there might be some old lurking code that sets it manually
+ mLabel->setWordWrap(true);
+ S32 new_width = getRect().getWidth() - p.check_button.rect().getWidth() - llcheckboxctrl_hpad;
+ LLRect label_rect = mLabel->getRect();
+ label_rect.mRight = label_rect.mLeft + new_width;
+ mLabel->setRect(label_rect);
+ }
mLabel->reshapeToFitText();
- addChild(mLabel);
LLRect label_rect = mLabel->getRect();
+ if (mLabel->getLineCount() > 1)
+ {
+ if (mWordWrap == WRAP_DOWN)
+ {
+ // reshapeToFitText uses LLView::reshape() which always reshapes
+ // from bottom to top, but we want to extend the bottom
+ // Note: might be better idea to use getRect().mTop of LLCheckBoxCtrl (+pad) as top point of new rect
+ S32 delta = ll_round((F32)mLabel->getFont()->getLineHeight() * mLabel->getLineSpacingMult()) - label_rect.getHeight();
+ label_rect.translate(0, delta);
+ mLabel->setRect(label_rect);
+ }
+ // else
+ // WRAP_UP is essentially done by reshapeToFitText() (extends from bottom to top)
+ // howhever it doesn't respect rect of checkbox
+ // todo: this should be fixed, but there are at least couple checkboxes that use this feature as is.
+ }
+
+ addChild(mLabel);
// Button
- // Note: button cover the label by extending all the way to the right.
+ // Note: button cover the label by extending all the way to the right and down.
LLRect btn_rect = p.check_button.rect();
btn_rect.setOriginAndSize(
btn_rect.mLeft,
- btn_rect.mBottom,
+ llmin(btn_rect.mBottom, label_rect.mBottom),
llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft),
- llmax( label_rect.getHeight(), btn_rect.mTop));
+ llmax(label_rect.getHeight(), btn_rect.mTop));
std::string active_true_id, active_false_id;
std::string inactive_true_id, inactive_false_id;
@@ -162,17 +197,26 @@ void LLCheckBoxCtrl::clear()
void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
{
-
+ S32 label_top = mLabel->getRect().mTop;
mLabel->reshapeToFitText();
LLRect label_rect = mLabel->getRect();
+ if (label_top != label_rect.mTop && mWordWrap == WRAP_DOWN)
+ {
+ // reshapeToFitText uses LLView::reshape() which always reshapes
+ // from bottom to top, but we want to extend the bottom so
+ // reposition control
+ S32 delta = label_top - label_rect.mTop;
+ label_rect.translate(0, delta);
+ mLabel->setRect(label_rect);
+ }
// Button
- // Note: button cover the label by extending all the way to the right.
+ // Note: button cover the label by extending all the way to the right and down.
LLRect btn_rect = mButton->getRect();
btn_rect.setOriginAndSize(
btn_rect.mLeft,
- btn_rect.mBottom,
+ llmin(btn_rect.mBottom, label_rect.mBottom),
llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft),
llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight()));
mButton->setShape(btn_rect);
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 41110b9ae0..031a69a772 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -50,6 +50,19 @@ class LLCheckBoxCtrl
, public ll::ui::SearchableControl
{
public:
+
+ enum EWordWrap
+ {
+ WRAP_NONE,
+ WRAP_UP,
+ WRAP_DOWN
+ };
+
+ struct WordWrap : public LLInitParam::TypeValuesHelper
+ {
+ static void declareValues();
+ };
+
struct Params
: public LLInitParam::Block
{
@@ -58,6 +71,8 @@ public:
Optional label_text;
Optional check_button;
+ Optional word_wrap;
+
// on_check callback parameter
Optional on_check;
//
@@ -145,6 +160,8 @@ protected:
LLUIColor mTextEnabledColor;
LLUIColor mTextDisabledColor;
+
+ EWordWrap mWordWrap; // off, shifts text up, shifts text down
};
// Build time optimization, generate once in .cpp file
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index b8f2afbe74..2c16ef7380 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -580,23 +580,40 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, L
while( paragraph_offset < (S32)mParagraphText.length() &&
mParagraphText[paragraph_offset] != 0)
{
- S32 skip_chars; // skip '\n'
+ // FIRE-8257: Sometimes text is cut off on left side of console
+ //S32 skip_chars; // skip '\n'
// Figure out if a word-wrapped line fits here.
LLWString::size_type line_end = mParagraphText.find_first_of(llwchar('\n'), paragraph_offset);
- if (line_end != LLWString::npos)
- {
- skip_chars = 1; // skip '\n'
- }
- else
+ // FIRE-8257: Sometimes text is cut off on left side of console
+ //if (line_end != LLWString::npos)
+ //{
+ // skip_chars = 1; // skip '\n'
+ //}
+ //else
+ //{
+ // line_end = mParagraphText.size();
+ // skip_chars = 0;
+ //}
+
+ //U32 drawable = font->maxDrawableChars(mParagraphText.c_str()+paragraph_offset, screen_width, line_end - paragraph_offset, LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
+ if (line_end == LLWString::npos)
{
line_end = mParagraphText.size();
- skip_chars = 0;
}
- U32 drawable = font->maxDrawableChars(mParagraphText.c_str()+paragraph_offset, screen_width, line_end - paragraph_offset, LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
+ S32 skip_chars = 0; // skip '\n'
+ U32 line_length = line_end - paragraph_offset;
+ U32 drawable = font->maxDrawableChars(mParagraphText.c_str()+paragraph_offset, screen_width, line_length, LLFontGL::WORD_BOUNDARY_IF_POSSIBLE);
+ //
if (drawable != 0)
{
+ // FIRE-8257: Sometimes text is cut off on left side of console
+ if (drawable >= line_length)
+ {
+ skip_chars = 1;
+ }
+ //
F32 x_position = 0; //Screen X position of text.
mMaxWidth = llmax( mMaxWidth, (F32)font->getWidth( mParagraphText.substr( paragraph_offset, drawable ).c_str() ) );
@@ -639,6 +656,12 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, L
}
mLines.push_back(line); //Append line to paragraph line list.
}
+ // FIRE-8257: Sometimes text is cut off on left side of console
+ else
+ {
+ break;
+ }
+ //
paragraph_offset += (drawable + skip_chars);
}
}
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index d7d4249d93..4fa0ba0117 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -1338,7 +1338,47 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
handled = TRUE;
}
break;
+
+ // FIRE-19933: Open context menu on context menu key press
+ case KEY_CONTEXT_MENU:
+ S32 count = mSelectedItems.size();
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (( count > 0 && (hasVisibleChildren()) ) // show menu only if selected items are visible
+ && menu )
+ {
+ if (mCallbackRegistrar)
+ {
+ mCallbackRegistrar->pushScope();
+ }
+
+ updateMenuOptions(menu);
+ menu->updateParent(LLMenuGL::sMenuContainer);
+
+ LLView* spawning_view = getParentByType();
+ if (!spawning_view)
+ {
+ spawning_view = this;
+ }
+
+ LLMenuGL::showPopup(spawning_view, menu, spawning_view->getRect().getCenterX(), spawning_view->getRect().getCenterY());
+
+ if (mCallbackRegistrar)
+ {
+ mCallbackRegistrar->popScope();
+ }
+ }
+ else
+ {
+ if (menu && menu->getVisible())
+ {
+ menu->setVisible(FALSE);
+ }
+ setSelection(NULL, FALSE, TRUE);
+ }
+ handled = TRUE;
+ break;
}
+ //
return handled;
}
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 924c3d6d98..ad921e6c31 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -971,7 +971,17 @@ void LLFolderViewItem::draw()
}
drawLabel(font, text_left, y, color, right_x);
- // Special for protected items
+ // Special for locked items
+ if (mViewModelItem->isLocked())
+ {
+ static const std::string locked_string = " (" + LLTrans::getString("LockedFolder") + ") ";
+ font->renderUTF8(locked_string, 0, right_x, y, sProtectedColor,
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ S32_MAX, S32_MAX, &right_x, FALSE);
+ }
+ //
+
+ // FIRE-29342: Protect folder option
if (mViewModelItem->isProtected())
{
static const std::string protected_string = " (" + LLTrans::getString("ProtectedFolder") + ") ";
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 4a41c3a53d..cbd0cd8d46 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -224,7 +224,10 @@ public:
//
virtual LLFolderViewModelItem* getParent() const = 0;
- // Special for protected items
+ // Special for locked items
+ virtual bool isLocked() const { return false; }
+
+ // FIRE-29342: Protect folder option
virtual bool isProtected() const { return false; }
protected:
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index d79fcd2aea..3d7afdb1a7 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -141,6 +141,7 @@ LLScrollListCtrl::Params::Params()
background_visible("background_visible"),
draw_stripes("draw_stripes"),
column_padding("column_padding"),
+ row_padding("row_padding", 2),
fg_unselected_color("fg_unselected_color"),
fg_selected_color("fg_selected_color"),
bg_selected_color("bg_selected_color"),
@@ -203,6 +204,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mHoveredColor(p.hovered_color()),
mSearchColumn(p.search_column),
mColumnPadding(p.column_padding),
+ mRowPadding(p.row_padding),
mContextMenuType(MENU_NONE),
mIsFriendSignal(NULL),
// Fix for FS-specific people list (radar)
@@ -773,8 +775,6 @@ bool LLScrollListCtrl::updateColumnWidths()
return width_changed;
}
-const S32 SCROLL_LIST_ROW_PAD = 2;
-
// Line height is the max height of all the cells in all the items.
void LLScrollListCtrl::updateLineHeight()
{
@@ -787,7 +787,7 @@ void LLScrollListCtrl::updateLineHeight()
S32 i = 0;
for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i))
{
- mLineHeight = llmax( mLineHeight, cell->getHeight() + SCROLL_LIST_ROW_PAD );
+ mLineHeight = llmax( mLineHeight, cell->getHeight() + mRowPadding );
}
}
}
@@ -799,7 +799,7 @@ void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp)
S32 i = 0;
for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i))
{
- mLineHeight = llmax( mLineHeight, cell->getHeight() + SCROLL_LIST_ROW_PAD );
+ mLineHeight = llmax( mLineHeight, cell->getHeight() + mRowPadding );
}
}
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index a295bf0754..40eaa4e9d4 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -108,7 +108,8 @@ public:
// layout
Optional column_padding,
- page_lines,
+ row_padding,
+ page_lines,
heading_height;
// sort and search behavior
@@ -296,8 +297,10 @@ public:
void setBackgroundVisible(BOOL b) { mBackgroundVisible = b; }
void setDrawStripes(BOOL b) { mDrawStripes = b; }
- void setColumnPadding(const S32 c) { mColumnPadding = c; }
- S32 getColumnPadding() { return mColumnPadding; }
+ void setColumnPadding(const S32 c) { mColumnPadding = c; }
+ S32 getColumnPadding() const { return mColumnPadding; }
+ void setRowPadding(const S32 c) { mColumnPadding = c; }
+ S32 getRowPadding() const { return mColumnPadding; }
void setCommitOnKeyboardMovement(BOOL b) { mCommitOnKeyboardMovement = b; }
void setCommitOnSelectionChange(BOOL b) { mCommitOnSelectionChange = b; }
void setAllowKeyboardMovement(BOOL b) { mAllowKeyboardMovement = b; }
@@ -499,6 +502,7 @@ private:
LLRect mItemListRect;
S32 mColumnPadding;
+ S32 mRowPadding;
BOOL mBackgroundVisible;
BOOL mDrawStripes;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 8792940a4b..a17170b3a0 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -171,6 +171,7 @@ LLTextBase::Params::Params()
plain_text("plain_text",false),
track_end("track_end", false),
read_only("read_only", false),
+ skip_link_underline("skip_link_underline", false),
spellcheck("spellcheck", false),
v_pad("v_pad", 0),
h_pad("h_pad", 0),
@@ -205,6 +206,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mFontShadow(p.font_shadow),
mPopupMenuHandle(),
mReadOnly(p.read_only),
+ mSkipLinkUnderline(p.skip_link_underline),
mSpellCheck(p.spellcheck),
mSpellCheckStart(-1),
mSpellCheckEnd(-1),
@@ -1090,7 +1092,37 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
// handle triple click
if (!mTripleClickTimer.hasExpired())
{
- selectAll();
+ S32 real_line = getLineNumFromDocIndex(mCursorPos, false);
+ S32 line_start = -1;
+ S32 line_end = -1;
+ for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
+ it != end_it;
+ ++it)
+ {
+ if (it->mLineNum < real_line)
+ {
+ continue;
+ }
+ if (it->mLineNum > real_line)
+ {
+ break;
+ }
+ if (line_start == -1)
+ {
+ line_start = it->mDocIndexStart;
+ }
+ line_end = it->mDocIndexEnd;
+ }
+
+ if (line_start == -1)
+ {
+ return TRUE;
+ }
+
+ mSelectionEnd = line_start;
+ mSelectionStart = line_end;
+ setCursorPos(line_start);
+
return TRUE;
}
@@ -2457,7 +2489,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
S32 cur_length = getLength();
LLStyleConstSP sp(new LLStyle(highlight_params));
LLTextSegmentPtr segmentp;
- if(underline_on_hover_only)
+ if (underline_on_hover_only || mSkipLinkUnderline)
{
highlight_params.font.style("NORMAL");
LLStyleConstSP normal_sp(new LLStyle(highlight_params));
@@ -2481,7 +2513,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig
S32 segment_start = old_length;
S32 segment_end = old_length + wide_text.size();
LLStyleConstSP sp(new LLStyle(style_params));
- if (underline_on_hover_only)
+ if (underline_on_hover_only || mSkipLinkUnderline)
{
LLStyle::Params normal_style_params(style_params);
normal_style_params.font.style("NORMAL");
@@ -3727,7 +3759,7 @@ F32 LLOnHoverChangeableTextSegment::draw(S32 start, S32 end, S32 selection_start
/*virtual*/
BOOL LLOnHoverChangeableTextSegment::handleHover(S32 x, S32 y, MASK mask)
{
- mStyle = mHoveredStyle;
+ mStyle = mEditor.getSkipLinkUnderline() ? mNormalStyle : mHoveredStyle;
return LLNormalTextSegment::handleHover(x, y, mask);
}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index ab921f008a..6ffbe0baad 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -334,6 +334,7 @@ public:
border_visible,
track_end,
read_only,
+ skip_link_underline,
spellcheck,
allow_scroll,
plain_text,
@@ -474,6 +475,8 @@ public:
S32 getVPad() { return mVPad; }
S32 getHPad() { return mHPad; }
+ F32 getLineSpacingMult() { return mLineSpacingMult; }
+ S32 getLineSpacingPixels() { return mLineSpacingPixels; } // only for multiline
S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const;
LLRect getLocalRectFromDocIndex(S32 pos) const;
@@ -482,6 +485,9 @@ public:
void setReadOnly(bool read_only) { mReadOnly = read_only; }
bool getReadOnly() { return mReadOnly; }
+ void setSkipLinkUnderline(bool skip_link_underline) { mSkipLinkUnderline = skip_link_underline; }
+ bool getSkipLinkUnderline() { return mSkipLinkUnderline; }
+
void setPlainText(bool value) { mPlainText = value;}
bool getPlainText() const { return mPlainText; }
@@ -756,6 +762,8 @@ protected:
bool mAutoIndent;
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
+ bool mSkipLinkUnderline;
+
// support widgets
LLHandle mPopupMenuHandle;
LLView* mDocumentView;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 2465e090cd..a0aace52f1 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -173,6 +173,7 @@ set(viewer_SOURCE_FILES
fsfloaterplacedetails.cpp
fsfloaterposestand.cpp
fsfloaterprofile.cpp
+ fsfloaterprotectedfolders.cpp
fsfloaterradar.cpp
fsfloatersearch.cpp
fsfloaterstatistics.cpp
@@ -208,6 +209,7 @@ set(viewer_SOURCE_FILES
fsradarentry.cpp
fsradarlistctrl.cpp
fsradarmenu.cpp
+ fsregioncross.cpp
fsscriptlibrary.cpp
fsscrolllistctrl.cpp
fsslurlcommand.cpp
@@ -229,6 +231,7 @@ set(viewer_SOURCE_FILES
llaisapi.cpp
llagent.cpp
llagentaccess.cpp
+ llagentbenefits.cpp
llagentcamera.cpp
llagentdata.cpp
llagentlanguage.cpp
@@ -555,6 +558,7 @@ set(viewer_SOURCE_FILES
llpanelface.cpp
llpanelgenerictip.cpp
llpanelgroup.cpp
+ llpanelgroupcreate.cpp
llpanelgroupbulk.cpp
llpanelgroupbulkban.cpp
llpanelgroupexperiences.cpp
@@ -928,6 +932,7 @@ set(viewer_HEADER_FILES
fsfloaterplacedetails.h
fsfloaterposestand.h
fsfloaterprofile.h
+ fsfloaterprotectedfolders.h
fsfloaterradar.h
fsfloatersearch.h
fsfloaterstatistics.h
@@ -964,6 +969,7 @@ set(viewer_HEADER_FILES
fsradarentry.h
fsradarlistctrl.h
fsradarmenu.h
+ fsregioncross.h
fsscriptlibrary.h
fsscrolllistctrl.h
fsslurl.h
@@ -986,6 +992,7 @@ set(viewer_HEADER_FILES
llaisapi.h
llagent.h
llagentaccess.h
+ llagentbenefits.h
llagentcamera.h
llagentdata.h
llagentlanguage.h
@@ -1306,6 +1313,7 @@ set(viewer_HEADER_FILES
llpanelface.h
llpanelgenerictip.h
llpanelgroup.h
+ llpanelgroupcreate.h
llpanelgroupbulk.h
llpanelgroupbulkimpl.h
llpanelgroupbulkban.h
@@ -1780,6 +1788,9 @@ if (LINUX)
endif( ND_CTAGS )
#
+ # Get rid of memory limit exceeded for -fvar-tracking-assignments.
+ SET_SOURCE_FILES_PROPERTIES(llviewermenu.cpp PROPERTIES COMPILE_FLAGS -fno-var-tracking-assignments)
+ #
endif (LINUX)
if (WINDOWS)
@@ -1971,6 +1982,10 @@ if (WINDOWS)
LIST(APPEND viewer_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../tools/manifests/legacy.manifest)
endif (ADDRESS_SIZE EQUAL 64)
#
+
+ if (OPENAL)
+ LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES})
+ endif (OPENAL)
endif (WINDOWS)
# Add the xui files. This is handy for searching for xui elements
@@ -2115,7 +2130,7 @@ endif (FMODEX)
# Output device selection
# set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
-set_source_files_properties(llstartup.cpp llfloaterpreference.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
+set_source_files_properties(llstartup.cpp llfloaterpreference.cpp llfloaterabout.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
#
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
@@ -2242,19 +2257,11 @@ if (WINDOWS)
endif (ADDRESS_SIZE EQUAL 64)
if (FMODSTUDIO)
- if (ADDRESS_SIZE EQUAL 64)
- list(APPEND COPY_INPUT_DEPENDENCIES
- ${SHARED_LIB_STAGING_DIR}/Release/fmod64.dll
- ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod64.dll
- ${SHARED_LIB_STAGING_DIR}/Debug/fmodL64.dll
- )
- else (ADDRESS_SIZE EQUAL 64)
- list(APPEND COPY_INPUT_DEPENDENCIES
- ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll
- ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll
- ${SHARED_LIB_STAGING_DIR}/Debug/fmodL.dll
- )
- endif (ADDRESS_SIZE EQUAL 64)
+ list(APPEND COPY_INPUT_DEPENDENCIES
+ ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/fmodL.dll
+ )
endif (FMODSTUDIO)
if (FMODEX)
@@ -2265,6 +2272,13 @@ if (WINDOWS)
)
endif (FMODEX)
+ if (OPENAL)
+ list(APPEND COPY_INPUT_DEPENDENCIES
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
+ )
+ endif (OPENAL)
+
add_custom_command(
OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
COMMAND ${PYTHON_EXECUTABLE}
@@ -2285,6 +2299,7 @@ if (WINDOWS)
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--fmodversion=${FMODVERSION}
+ --openal=${OPENAL}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
stage_third_party_libs
@@ -2348,6 +2363,7 @@ if (WINDOWS)
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--fmodversion=${FMODVERSION}
+ --openal=${OPENAL}
DEPENDS
${VIEWER_BINARY_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -2440,6 +2456,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${DBUSGLIB_LIBRARIES}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY} # must come after LLAudio
+ ${OPENAL_LIBRARIES}
${GLOD_LIBRARIES}
${OPENGL_LIBRARIES}
${JSONCPP_LIBRARIES}
@@ -2523,6 +2540,7 @@ endif (NOT ENABLE_MEDIA_PLUGINS)
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--fmodversion=${FMODVERSION}
+ --openal=${OPENAL}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
@@ -2548,6 +2566,7 @@ endif (NOT ENABLE_MEDIA_PLUGINS)
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--fmodversion=${FMODVERSION}
+ --openal=${OPENAL}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
${COPY_INPUT_DEPENDENCIES}
@@ -2578,7 +2597,7 @@ if (DARWIN)
set(MACOSX_BUNDLE_BUNDLE_NAME "Firestorm")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")
- set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2019 The Phoenix Firestorm Project, Inc.")
+ set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2020 The Phoenix Firestorm Project, Inc.")
set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "Firestorm.nib")
set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "LLApplication")
@@ -2632,6 +2651,7 @@ if (DARWIN)
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--fmodversion=${FMODVERSION}
+ --openal=${OPENAL}
DEPENDS
${VIEWER_BINARY_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -2668,6 +2688,7 @@ if (DARWIN)
--versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
--viewer_flavor=${ND_VIEWER_FLAVOR}
--fmodversion=${FMODVERSION}
+ --openal=${OPENAL}
${SIGNING_SETTING}
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -2759,8 +2780,8 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE
"${VIEWER_SYMBOL_FILE_CYGWIN}"
"-C"
"${PARENT_DIRECTORY_CYGWIN}"
- "secondlife-bin.pdb"
- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-bin.pdb"
+ "firestorm-bin.pdb"
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/firestorm-bin.pdb"
COMMENT "Packing viewer PDB into ${VIEWER_SYMBOL_FILE_CYGWIN}"
)
add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME})
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index d2b4ade076..4e0275a728 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -3,4 +3,4 @@
CFBundleName = "Firestorm";
CFBundleShortVersionString = "Firestorm version %%VERSION%%";
-CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2019 The Phoenix Firestorm Project, Inc.";
+CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2020 The Phoenix Firestorm Project, Inc.";
diff --git a/indra/newview/NACLfloaterexploresounds.cpp b/indra/newview/NACLfloaterexploresounds.cpp
index c9e27c5fd4..c4473f0fbf 100644
--- a/indra/newview/NACLfloaterexploresounds.cpp
+++ b/indra/newview/NACLfloaterexploresounds.cpp
@@ -63,6 +63,8 @@ NACLFloaterExploreSounds::~NACLFloaterExploreSounds()
}
}
mBlacklistAvatarNameCacheConnections.clear();
+
+ mLocalPlayingAudioSourceIDs.clear();
}
BOOL NACLFloaterExploreSounds::postBuild()
@@ -71,6 +73,7 @@ BOOL NACLFloaterExploreSounds::postBuild()
getChild("look_at_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleLookAt, this));
getChild("stop_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStop, this));
getChild("bl_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistSound, this));
+ getChild("stop_locally_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStopLocally, this));
mHistoryScroller = getChild("sound_list");
mHistoryScroller->setCommitCallback(boost::bind(&NACLFloaterExploreSounds::handleSelection, this));
@@ -296,6 +299,32 @@ BOOL NACLFloaterExploreSounds::tick()
mHistoryScroller->selectMultiple(selected_ids);
mHistoryScroller->setScrollPos(scroll_pos);
+ // Clean up stopped local audio source IDs
+ uuid_vec_t stopped_audio_src_ids;
+ uuid_vec_t::iterator audio_src_id_iter = mLocalPlayingAudioSourceIDs.begin();
+ uuid_vec_t::iterator audio_src_id_end = mLocalPlayingAudioSourceIDs.end();
+ for (; audio_src_id_iter != audio_src_id_end; ++audio_src_id_iter)
+ {
+ LLUUID audio_src_id = *audio_src_id_iter;
+ LLAudioSource* audio_source = gAudiop->findAudioSource(audio_src_id);
+ if (!audio_source || audio_source->isDone())
+ {
+ stopped_audio_src_ids.push_back(audio_src_id);
+ }
+ }
+
+ for (uuid_vec_t::iterator stopped_audio_src_ids_iter = stopped_audio_src_ids.begin();
+ stopped_audio_src_ids_iter != stopped_audio_src_ids.end(); ++stopped_audio_src_ids_iter)
+ {
+ uuid_vec_t::iterator find_iter = std::find(mLocalPlayingAudioSourceIDs.begin(), mLocalPlayingAudioSourceIDs.end(), *stopped_audio_src_ids_iter);
+ if (find_iter != mLocalPlayingAudioSourceIDs.end())
+ {
+ mLocalPlayingAudioSourceIDs.erase(find_iter);
+ }
+ }
+
+ childSetEnabled("stop_locally_btn", mLocalPlayingAudioSourceIDs.size() > 0);
+
return FALSE;
}
@@ -313,9 +342,13 @@ void NACLFloaterExploreSounds::handlePlayLocally()
if(std::find(asset_list.begin(), asset_list.end(), item.mAssetID) == asset_list.end())
{
asset_list.push_back(item.mAssetID);
- gAudiop->triggerSound(item.mAssetID, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
+ LLUUID audio_source_id = LLUUID::generateNewID();
+ gAudiop->triggerSound(item.mAssetID, gAgent.getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_UI, LLVector3d::zero, LLUUID::null, audio_source_id);
+ mLocalPlayingAudioSourceIDs.push_back(audio_source_id);
}
}
+
+ childSetEnabled("stop_locally_btn", mLocalPlayingAudioSourceIDs.size() > 0);
}
void NACLFloaterExploreSounds::handleLookAt()
@@ -384,6 +417,23 @@ void NACLFloaterExploreSounds::handleStop()
}
}
+void NACLFloaterExploreSounds::handleStopLocally()
+{
+ uuid_vec_t::iterator audio_source_id_iter = mLocalPlayingAudioSourceIDs.begin();
+ uuid_vec_t::iterator audio_source_id_end = mLocalPlayingAudioSourceIDs.end();
+ for (; audio_source_id_iter != audio_source_id_end; ++audio_source_id_iter)
+ {
+ LLUUID audio_source_id = *audio_source_id_iter;
+ LLAudioSource* audio_source = gAudiop->findAudioSource(audio_source_id);
+ if (audio_source && !audio_source->isDone())
+ {
+ audio_source->play(LLUUID::null);
+ }
+ }
+
+ mLocalPlayingAudioSourceIDs.clear();
+}
+
//add sound to blacklist
void NACLFloaterExploreSounds::blacklistSound()
{
diff --git a/indra/newview/NACLfloaterexploresounds.h b/indra/newview/NACLfloaterexploresounds.h
index 33c1da97ce..0f2df60c99 100644
--- a/indra/newview/NACLfloaterexploresounds.h
+++ b/indra/newview/NACLfloaterexploresounds.h
@@ -29,6 +29,7 @@ private:
void handlePlayLocally();
void handleLookAt();
void handleStop();
+ void handleStopLocally();
void handleSelection();
void blacklistSound();
@@ -41,6 +42,8 @@ private:
std::list mLastHistory;
+ uuid_vec_t mLocalPlayingAudioSourceIDs;
+
typedef std::map blacklist_avatar_name_cache_connection_map_t;
blacklist_avatar_name_cache_connection_map_t mBlacklistAvatarNameCacheConnections;
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index c8320dd521..9776e7290d 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.3.6
+6.3.10
diff --git a/indra/newview/VivoxAUP.txt b/indra/newview/VivoxAUP.txt
index d76ec3e567..6413f8b16a 100644
--- a/indra/newview/VivoxAUP.txt
+++ b/indra/newview/VivoxAUP.txt
@@ -1,23 +1,23 @@
-Acceptable Use Policy (AUP)
-
- 1. BACKGROUND: Users of the online voice services provided by Vivox, Inc. ("Vivox") (the "Service"), through the act of utilizing the Service, agree to adhere to this Acceptable Use Policy (the "Policy"). Vivox reserves the right to immediately terminate a user's access to the Service if the user engages in any of the activities prohibited by this Policy or uses the Service contrary to this Policy. Each user is responsible for all activities conducted under its account. The user is also responsible for adhering to any policy set forth by any other service provider accessed through the Service; Vivox, and its suppliers and providers, assume no responsibility or liability for a user's failure to comply with the Policy. The user acknowledges that Vivox may have access to information about or provided by the user, including diagnostic information sent automatically after a problem or error, and agrees to such access and use.
-
- 2. PROHIBITED USES AND ACTIVITIES: Users shall not provide inaccurate or misleading information to Vivox or use the Service to: (i) access any other person's computer or computer system, software, or data without their knowledge and consent; or breach the security of another user; or attempt to circumvent the user authentication or security of any host, network, system, or account, which includes, but is not limited to, accessing data not intended for the user, logging into or making use of a server or account the user is not expressly authorized to access, or probing the security of other hosts, networks, or accounts; or use automated means (such as robots and spiders) to obtain information from Vivox's website or, though it, from other websites; (ii) interfere with computer networking or telecommunications service to any user, host or network, including, without limitation, denial of service attacks, flooding of a network, overloading a service, improper seizing and abuse of operator privileges and attempts to "crash" a host; (iii) violate the rules, regulations, or policies applicable to any network, server, computer database, or service that accessed by the user; (iv) transmit, re-transmit, or store any content or to engage in any activity that infringes the intellectual property rights or privacy rights of Vivox or any individual, group or entity, including but not limited to any rights protected by any copyright, patent, trademark, trade secret, trade dress, right of privacy, right of publicity, moral rights or other intellectual property right now known or later recognized by statute, judicial decision or regulation; (v) host, post, transmit, or re-transmit any content or material that is threatening, harassing, obscene, indecent, pornographic, hateful, malicious, racist, defamatory, libelous, treasonous, excessively violent or promotes the use of violence, or provides instruction, information or assistance in causing or carrying out violence against any government, organization, group or individual, or provides guidance, information or assistance with respect to causing damage or security breaches to or Vivox's network or to the network of any other service provider; (vi) commit an act that constitutes a criminal offense, gives rise to civil liability, or otherwise violates any applicable local, state, federal or international law, or (vii) encourage conduct that would constitute a criminal offense, give rise to civil liability, or otherwise violate any applicable local, state, federal or international law.
-
- 3. SECURITY: In all cases, the user is solely responsible for the security of any device or application it chooses to connect to the Service, including any data stored on or communications passed.
-
- 4. TRADEMARKS AND COPYRIGHTS. "Vivox," "Powered by Vivox" and similar marks are the property of Vivox. All other names, graphics, logos, marks and trade names used in connection with this Service, are the property of their owners and suppliers and may not be used without permission for any purpose. The copyright in the Vivox website and Service and all related materials are owned by Vivox or its suppliers unless otherwise stated.
-
- 5. DISCLAIMER OF WARRANTIES. THE SERVICE IS PROVIDED "AS IS" AND "WITH ALL FAULTS," AND PROVIDER AND VIVOX HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION (I) WARRANTIES OF MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT, AND (II) ANY WARRANTIES CONCERNING THE SECURITY, RELIABILITY OR PERFORMANCE OF THE SERVICE. Certain states prohibit the disclaimer of warranties in certain cases, so the above may not apply to all users in all instances.
-
- THE DOWNLOADING OR SUBMISSION OF ANY MATERIALS IS DONE AT THE USER'S OWN RISK, AND THE USER IS SOLELY RESPONSIBLE FOR ANY LOSS OR DAMAGE TO ANY CONTENT, IMAGE, COMPUTER SYSTEM OR DATA THAT MAY RESULT FROM USING THE SERVICE.
-
- 6. EXCLUSION OF DAMAGES. TO THE FULLEST EXTENT ALLOWED BY LAW, VIVOX SHALL NOT BE LIABLE FOR ANY INDIRECT OR CONSEQUENTIAL DAMAGES, INCLUDING INCIDENTAL, SPECIAL, EXEMPLARY AND PUNITIVE DAMAGES, RESULTING FROM THE USE OR PROVISION OF THE SERVICE, EVEN IF THE POSSIBILITY OF SUCH DAMAGES IS KNOWN. Certain states prohibit the limitation of liability in certain cases, so the above may not apply to the user in all instances.
-
- 7. ENFORCEMENT OF THIS POLICY: Vivox does not routinely monitors the activity of Service accounts for violation of this Policy. Vivox reserves the right at any time to monitor usage, transmissions, and content from time to time to operate the Service; to identify violations of this Policy; and/or to protect the network, the Service and/or other users. If the Service is used in a way that Vivox, in their sole discretion, believe violate this Policy, it may take any responsive actions they deem appropriate, including, but are not limited to, the immediate suspension or termination of all or any portion of the Service. Vivox will have no liability for any of these responsive actions. These actions are not exclusive remedies and Vivox may take any other legal or technical action deemed appropriate. The user expressly authorizes Vivox to cooperate with (i) law enforcement authorities in the investigation of suspected legal violations, and (ii) any system administrators at other Internet service providers or other network or computing facilities in order to enforce this Policy. This cooperation may include making available personally identifiable information about users to law enforcement or system administrators. The failure to enforce this Policy, for whatever reason or for no reason, shall not be construed as a waiver of any right to do so at any time. The user agrees that if any portion of this Policy is held invalid or unenforceable, such portion will be construed consistent with applicable law as nearly as possible, and the remaining portions will remain in full force and effect. The user agrees to indemnify, defend and hold harmless Vivox and its affiliates, suppliers, providers, and agents against all claims and expenses (including reasonable attorney fees) resulting from users engaging in any of the prohibited activities listed in this Policy or resulting from users violating the Policy or any other posted policy related to the Service. The foregoing user indemnification will survive any termination of the user's agreements with Vivox .
-
- 8. ARBITRATION. Except for the right of a party to seek equitable relief, any disputes arising under or related to this Agreement ("Dispute"), excluding any Dispute relating to the validity or infringement of any intellectual property right, will be resolved by negotiation, mediation and, if necessary, arbitration, as follows. The party raising such Dispute will promptly advise the other party in writing describing in reasonable detail the nature of such Dispute ("Notice of Dispute"). The parties will negotiate in good faith to resolve the Dispute, but if they have not done so within thirty (30) days, the parties will submit the Dispute to a mutually agreed mediation organization. If the parties are unable to resolve the Dispute within sixty (60) days after delivery of the Notice of Dispute, then the Dispute will be resolved by a single arbitrator in a final and binding arbitration under the then current procedural rules of the American Arbitration Association. All proceedings will be conducted in the English language in Boston, Massachusetts. The arbitrator will have no power to modify the terms or conditions of this Agreement, or to award punitive damages. Any award rendered in such arbitration may be enforced by either party in any Court of competent jurisdiction.
-
- 9. GENERAL TERMS. This Agreement is governed by the laws of the Commonwealth of Massachusetts. No agency, partnership, joint venture, employment or franchise relationship is intended or created by this Agreement. This AUP constitute the entire agreement between the parties concerning the use of the Service. If any provision of this Agreement is found to be unenforceable, it shall be deemed modified to the least extent needed to make the provision enforceable; the remaining terms of this Agreement shall remain in full force and effect. Vivox reserves the right to disclose any information about any user as required by a court order or as recommended by counsel in the context of any action by any government entity or other third party.
-
+Acceptable Use Policy (AUP)
+
+ 1. BACKGROUND: Users of the online voice services provided by Vivox, Inc. ("Vivox") (the "Service"), through the act of utilizing the Service, agree to adhere to this Acceptable Use Policy (the "Policy"). Vivox reserves the right to immediately terminate a user's access to the Service if the user engages in any of the activities prohibited by this Policy or uses the Service contrary to this Policy. Each user is responsible for all activities conducted under its account. The user is also responsible for adhering to any policy set forth by any other service provider accessed through the Service; Vivox, and its suppliers and providers, assume no responsibility or liability for a user's failure to comply with the Policy. The user acknowledges that Vivox may have access to information about or provided by the user, including diagnostic information sent automatically after a problem or error, and agrees to such access and use.
+
+ 2. PROHIBITED USES AND ACTIVITIES: Users shall not provide inaccurate or misleading information to Vivox or use the Service to: (i) access any other person's computer or computer system, software, or data without their knowledge and consent; or breach the security of another user; or attempt to circumvent the user authentication or security of any host, network, system, or account, which includes, but is not limited to, accessing data not intended for the user, logging into or making use of a server or account the user is not expressly authorized to access, or probing the security of other hosts, networks, or accounts; or use automated means (such as robots and spiders) to obtain information from Vivox's website or, though it, from other websites; (ii) interfere with computer networking or telecommunications service to any user, host or network, including, without limitation, denial of service attacks, flooding of a network, overloading a service, improper seizing and abuse of operator privileges and attempts to "crash" a host; (iii) violate the rules, regulations, or policies applicable to any network, server, computer database, or service that accessed by the user; (iv) transmit, re-transmit, or store any content or to engage in any activity that infringes the intellectual property rights or privacy rights of Vivox or any individual, group or entity, including but not limited to any rights protected by any copyright, patent, trademark, trade secret, trade dress, right of privacy, right of publicity, moral rights or other intellectual property right now known or later recognized by statute, judicial decision or regulation; (v) host, post, transmit, or re-transmit any content or material that is threatening, harassing, obscene, indecent, pornographic, hateful, malicious, racist, defamatory, libelous, treasonous, excessively violent or promotes the use of violence, or provides instruction, information or assistance in causing or carrying out violence against any government, organization, group or individual, or provides guidance, information or assistance with respect to causing damage or security breaches to or Vivox's network or to the network of any other service provider; (vi) commit an act that constitutes a criminal offense, gives rise to civil liability, or otherwise violates any applicable local, state, federal or international law, or (vii) encourage conduct that would constitute a criminal offense, give rise to civil liability, or otherwise violate any applicable local, state, federal or international law.
+
+ 3. SECURITY: In all cases, the user is solely responsible for the security of any device or application it chooses to connect to the Service, including any data stored on or communications passed.
+
+ 4. TRADEMARKS AND COPYRIGHTS. "Vivox," "Powered by Vivox" and similar marks are the property of Vivox. All other names, graphics, logos, marks and trade names used in connection with this Service, are the property of their owners and suppliers and may not be used without permission for any purpose. The copyright in the Vivox website and Service and all related materials are owned by Vivox or its suppliers unless otherwise stated.
+
+ 5. DISCLAIMER OF WARRANTIES. THE SERVICE IS PROVIDED "AS IS" AND "WITH ALL FAULTS," AND PROVIDER AND VIVOX HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION (I) WARRANTIES OF MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT, AND (II) ANY WARRANTIES CONCERNING THE SECURITY, RELIABILITY OR PERFORMANCE OF THE SERVICE. Certain states prohibit the disclaimer of warranties in certain cases, so the above may not apply to all users in all instances.
+
+ THE DOWNLOADING OR SUBMISSION OF ANY MATERIALS IS DONE AT THE USER'S OWN RISK, AND THE USER IS SOLELY RESPONSIBLE FOR ANY LOSS OR DAMAGE TO ANY CONTENT, IMAGE, COMPUTER SYSTEM OR DATA THAT MAY RESULT FROM USING THE SERVICE.
+
+ 6. EXCLUSION OF DAMAGES. TO THE FULLEST EXTENT ALLOWED BY LAW, VIVOX SHALL NOT BE LIABLE FOR ANY INDIRECT OR CONSEQUENTIAL DAMAGES, INCLUDING INCIDENTAL, SPECIAL, EXEMPLARY AND PUNITIVE DAMAGES, RESULTING FROM THE USE OR PROVISION OF THE SERVICE, EVEN IF THE POSSIBILITY OF SUCH DAMAGES IS KNOWN. Certain states prohibit the limitation of liability in certain cases, so the above may not apply to the user in all instances.
+
+ 7. ENFORCEMENT OF THIS POLICY: Vivox does not routinely monitors the activity of Service accounts for violation of this Policy. Vivox reserves the right at any time to monitor usage, transmissions, and content from time to time to operate the Service; to identify violations of this Policy; and/or to protect the network, the Service and/or other users. If the Service is used in a way that Vivox, in their sole discretion, believe violate this Policy, it may take any responsive actions they deem appropriate, including, but are not limited to, the immediate suspension or termination of all or any portion of the Service. Vivox will have no liability for any of these responsive actions. These actions are not exclusive remedies and Vivox may take any other legal or technical action deemed appropriate. The user expressly authorizes Vivox to cooperate with (i) law enforcement authorities in the investigation of suspected legal violations, and (ii) any system administrators at other Internet service providers or other network or computing facilities in order to enforce this Policy. This cooperation may include making available personally identifiable information about users to law enforcement or system administrators. The failure to enforce this Policy, for whatever reason or for no reason, shall not be construed as a waiver of any right to do so at any time. The user agrees that if any portion of this Policy is held invalid or unenforceable, such portion will be construed consistent with applicable law as nearly as possible, and the remaining portions will remain in full force and effect. The user agrees to indemnify, defend and hold harmless Vivox and its affiliates, suppliers, providers, and agents against all claims and expenses (including reasonable attorney fees) resulting from users engaging in any of the prohibited activities listed in this Policy or resulting from users violating the Policy or any other posted policy related to the Service. The foregoing user indemnification will survive any termination of the user's agreements with Vivox .
+
+ 8. ARBITRATION. Except for the right of a party to seek equitable relief, any disputes arising under or related to this Agreement ("Dispute"), excluding any Dispute relating to the validity or infringement of any intellectual property right, will be resolved by negotiation, mediation and, if necessary, arbitration, as follows. The party raising such Dispute will promptly advise the other party in writing describing in reasonable detail the nature of such Dispute ("Notice of Dispute"). The parties will negotiate in good faith to resolve the Dispute, but if they have not done so within thirty (30) days, the parties will submit the Dispute to a mutually agreed mediation organization. If the parties are unable to resolve the Dispute within sixty (60) days after delivery of the Notice of Dispute, then the Dispute will be resolved by a single arbitrator in a final and binding arbitration under the then current procedural rules of the American Arbitration Association. All proceedings will be conducted in the English language in Boston, Massachusetts. The arbitrator will have no power to modify the terms or conditions of this Agreement, or to award punitive damages. Any award rendered in such arbitration may be enforced by either party in any Court of competent jurisdiction.
+
+ 9. GENERAL TERMS. This Agreement is governed by the laws of the Commonwealth of Massachusetts. No agency, partnership, joint venture, employment or franchise relationship is intended or created by this Agreement. This AUP constitute the entire agreement between the parties concerning the use of the Service. If any provision of this Agreement is found to be unenforceable, it shall be deemed modified to the least extent needed to make the provision enforceable; the remaining terms of this Agreement shall remain in full force and effect. Vivox reserves the right to disclose any information about any user as required by a court order or as recommended by counsel in the context of any action by any government entity or other third party.
+
10. CHANGES TO THIS POLICY. Vivox may revise its Acceptable Use Policy from time to time without prior notice. Any changes will be presented in the latest version at the Vivox web site. All revised copies of the Policy are effective immediately upon a user's first use of the Service after the change has been posted.
\ No newline at end of file
diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp
index 8184e254fe..37123fc828 100644
--- a/indra/newview/aoengine.cpp
+++ b/indra/newview/aoengine.cpp
@@ -963,11 +963,11 @@ LLUUID AOEngine::addSet(const std::string& name, BOOL reload)
return LLUUID::null;
}
- BOOL wasProtected = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL wasProtected = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
LL_DEBUGS("AOEngine") << "adding set folder " << name << LL_ENDL;
LLUUID newUUID = gInventory.createNewCategory(mAOFolder, LLFolderType::FT_NONE, name);
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", wasProtected);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", wasProtected);
if (reload)
{
@@ -1030,10 +1030,10 @@ BOOL AOEngine::addAnimation(const AOSet* set, AOSet::AOState* state, const LLInv
anim.mSortOrder = state->mAnimations.size() + 1;
state->mAnimations.push_back(anim);
- BOOL wasProtected = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL wasProtected = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
createAnimationLink(set, state, item);
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", wasProtected);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", wasProtected);
if (reload)
{
@@ -1060,8 +1060,8 @@ BOOL AOEngine::findForeignItems(const LLUUID& uuid) const
}
// count backwards in case we have to remove items
- BOOL wasProtected = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL wasProtected = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
for (S32 index = items->size() - 1; index >= 0; --index)
{
BOOL move = FALSE;
@@ -1093,7 +1093,7 @@ BOOL AOEngine::findForeignItems(const LLUUID& uuid) const
LL_DEBUGS("AOEngine") << item->getName() << " moved to lost and found!" << LL_ENDL;
}
}
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", wasProtected);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", wasProtected);
return moved;
}
@@ -1102,8 +1102,8 @@ BOOL AOEngine::findForeignItems(const LLUUID& uuid) const
void AOEngine::purgeFolder(const LLUUID& uuid) const
{
// unprotect it
- BOOL wasProtected = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL wasProtected = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
// move everything that's not an animation link to "lost and found"
if (findForeignItems(uuid))
@@ -1123,7 +1123,7 @@ void AOEngine::purgeFolder(const LLUUID& uuid) const
gInventory.notifyObservers();
// protect it
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", wasProtected);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", wasProtected);
}
BOOL AOEngine::removeSet(AOSet* set)
@@ -1601,10 +1601,10 @@ void AOEngine::saveSet(const AOSet* set)
gInventory.addChangedMask(LLInventoryObserver::LABEL, cat->getUUID());
gInventory.notifyObservers();
*/
- BOOL wasProtected = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL wasProtected = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
rename_category(&gInventory, set->getInventoryUUID(), setParams);
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", wasProtected);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", wasProtected);
LL_INFOS("AOEngine") << "sending update signal" << LL_ENDL;
mUpdatedSignal();
@@ -1641,10 +1641,10 @@ void AOEngine::saveState(const AOSet::AOState* state)
stateParams += ":RN";
}
- BOOL wasProtected = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL wasProtected = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
rename_category(&gInventory, state->mInventoryUUID, stateParams);
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", wasProtected);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", wasProtected);
}
void AOEngine::saveSettings()
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 29f134eb67..25dbb1a99c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3777,6 +3777,19 @@
Value
1
+ CurrentlyUsingBakesOnMesh
+
+ Comment
+ Are we currently on a grid that uses bakes on mesh? Persisted to force rebakes on login to named grids.
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+ Backup
+ 0
+
CurrentGrid
Comment
@@ -21391,17 +21404,6 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
Grey
- FSReleaseCandidateChannelId
-
- Comment
- Defines the string that identifies a simulator release candidate channel in the simulator version string.
- Persist
- 1
- Type
- String
- Value
- RC
-
FSStatusbarShowSimulatorVersion
Comment
@@ -23420,6 +23422,17 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
1
+ DAEExportSingleUVMap
+
+ Comment
+ set all objects to have the same UV map name
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
DAEExportTextureParams
Comment
@@ -25073,7 +25086,7 @@ Change of this parameter will affect the layout of buttons in notification toast
FSExperimentalRegionCrossingMovementFix
Comment
- Enables the experimental fix for region crossing movements being bogus due to false predictions by the viewer (0 = Disabled, 1 = Enabled)
+ Enables the experimental fix for region crossing movements being bogus due to false predictions by the viewer (0 = Disabled (Unlimited prediction), 1 = Enabled (Predict until error gets too large))
Persist
1
Type
@@ -25081,6 +25094,39 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
0
+ FSRegionCrossingPositionErrorLimit
+
+ Comment
+ Region crossing position error limit in meters
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 0.25
+
+ FSRegionCrossingAngleErrorLimit
+
+ Comment
+ Region crossing angle error limit in degrees
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 20.0
+
+ FSRegionCrossingSmoothingTime
+
+ Comment
+ Region crossing smoothing filter time in seconds
+ Persist
+ 1
+ Type
+ F32
+ Value
+ 10.0
+
FSStatisticsNoFocus
Comment
@@ -25178,7 +25224,7 @@ Change of this parameter will affect the layout of buttons in notification toast
Type
Boolean
Value
- 0
+ 1
FSRestrictMaxTextureSize
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 2f9e2505de..e7e7fa96a0 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -744,7 +744,7 @@
Value
0
- ProtectAOFolders
+ LockAOFolders
Comment
Keep the AO folders in Inventory safe from manual changes.
@@ -769,7 +769,7 @@
0
- ProtectBridgeFolder
+ LockBridgeFolder
Comment
Keep the Bridge folder in Inventory safe from manual changes.
@@ -778,7 +778,7 @@
Value
1
- ProtectWearableFavoritesFolders
+ LockWearableFavoritesFolders
Comment
Keep the Wearable Favorites folder in Inventory safe from manual changes.
@@ -1279,5 +1279,16 @@
Value
0
+ FSProtectedFolders
+
+ Comment
+ A list of folder UUIDs that are protected from moving and deleting.
+ Persist
+ 1
+ Type
+ LLSD
+ Value
+
+
diff --git a/indra/newview/daeexport.cpp b/indra/newview/daeexport.cpp
index e8a06f77e5..ef178cba9d 100644
--- a/indra/newview/daeexport.cpp
+++ b/indra/newview/daeexport.cpp
@@ -640,7 +640,14 @@ void DAESaver::addPolygons(daeElement* mesh, const char* geomID, const char* mat
domInputLocalOffset* input = daeSafeCast(polylist->add("input"));
input->setSemantic("TEXCOORD");
input->setOffset(0);
- input->setSource(llformat("#%s-%s", geomID, "map0").c_str());
+ if(gSavedSettings.getBOOL("DAEExportSingleUVMap"))
+ {
+ input->setSource(llformat("#%s-%s", "unified", "map0").c_str());
+ }
+ else
+ {
+ input->setSource(llformat("#%s-%s", geomID, "map0").c_str());
+ }
}
// Save indices
@@ -778,7 +785,7 @@ bool DAESaver::saveDAE(std::string filename)
}
S32 prim_nr = 0;
-
+
for (obj_info_t::iterator obj_iter = mObjects.begin(); obj_iter != mObjects.end(); ++obj_iter)
{
LLViewerObject* obj = obj_iter->first;
@@ -797,6 +804,7 @@ bool DAESaver::saveDAE(std::string filename)
std::vector normal_data;
std::vector uv_data;
bool applyTexCoord = gSavedSettings.getBOOL("DAEExportTextureParams");
+ bool consolidateUVMap = gSavedSettings.getBOOL("DAEExportSingleUVMap");
S32 num_faces = obj->getVolume()->getNumVolumeFaces();
for (S32 face_num = 0; face_num < num_faces; face_num++)
@@ -853,7 +861,15 @@ bool DAESaver::saveDAE(std::string filename)
addSource(mesh, llformat("%s-%s", geomID, "positions").c_str(), "XYZ", position_data);
addSource(mesh, llformat("%s-%s", geomID, "normals").c_str(), "XYZ", normal_data);
- addSource(mesh, llformat("%s-%s", geomID, "map0").c_str(), "ST", uv_data);
+ if(consolidateUVMap)
+ {
+ addSource(mesh, llformat("%s-%s", "unified", "map0").c_str(), "ST", uv_data);
+ }
+ else
+ {
+ addSource(mesh, llformat("%s-%s", geomID, "map0").c_str(), "ST", uv_data);
+ }
+
// Add the element
{
diff --git a/indra/newview/fonts/SourceCodePro-license.txt b/indra/newview/fonts/SourceCodePro-license.txt
index d154618a7d..1177330426 100755
--- a/indra/newview/fonts/SourceCodePro-license.txt
+++ b/indra/newview/fonts/SourceCodePro-license.txt
@@ -1,93 +1,93 @@
-Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-
-This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
+Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/indra/newview/fs_viewer_manifest.py b/indra/newview/fs_viewer_manifest.py
index 523e43b046..39a8bb739a 100644
--- a/indra/newview/fs_viewer_manifest.py
+++ b/indra/newview/fs_viewer_manifest.py
@@ -134,6 +134,7 @@ class FSViewerManifest:
self.address_size),
'w')
symbolTar.add( "%s/Firestorm-bin.exe" % self.args['configuration'].lower(), "firestorm-bin.exe" )
+ symbolTar.add( "%s/build_data.json" % self.args['configuration'].lower(), "build_data.json" )
symbolTar.add( "%s/%s" % (self.args['configuration'].lower(),pdbName), pdbName )
symbolTar.close()
diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp
index 3f2a41db23..1a7e65633f 100644
--- a/indra/newview/fsareasearch.cpp
+++ b/indra/newview/fsareasearch.cpp
@@ -1323,6 +1323,11 @@ void FSAreaSearch::onCommitCheckboxRegex()
}
}
+void FSAreaSearch::setFindOwnerText(std::string value)
+{
+ mPanelFind->mOwnerLineEditor->setText(value);
+}
+
//---------------------------------------------------------------------------
// List panel
@@ -1632,6 +1637,25 @@ bool FSPanelAreaSearchList::onContextMenuItemClick(const LLSD& userdata)
std::string action = userdata.asString();
LL_DEBUGS("FSAreaSearch") << "Right click menu " << action << " was selected." << LL_ENDL;
+ if (action == "select_all")
+ {
+ std::vector result_items = mResultList->getAllData();
+ std::for_each(result_items.begin(), result_items.end(), [](LLScrollListItem* item) { item->setSelected(TRUE); });
+ return true;
+ }
+ if (action == "clear_selection")
+ {
+ std::vector selected_items = mResultList->getAllSelected();
+ std::for_each(selected_items.begin(), selected_items.end(), [](LLScrollListItem* item) { item->setSelected(FALSE); });
+ return true;
+ }
+ if (action == "filter_my_objects")
+ {
+ mFSAreaSearch->setFindOwnerText(gAgentUsername);
+ mFSAreaSearch->onButtonClickedSearch();
+ return true;
+ }
+
// NOTE that each action command MUST begin with a different letter.
char c = action.at(0);
switch(c)
diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h
index 5b8f3a8d74..9ad465aac4 100644
--- a/indra/newview/fsareasearch.h
+++ b/indra/newview/fsareasearch.h
@@ -126,6 +126,7 @@ public:
void onButtonClickedSearch();
void onCommitCheckboxRegex();
bool isSearchableObject (LLViewerObject* objectp, LLViewerRegion* our_region);
+ void setFindOwnerText(std::string value);
std::map mObjectDetails;
diff --git a/indra/newview/fscommon.cpp b/indra/newview/fscommon.cpp
index 54ac09b229..d064dcdac6 100644
--- a/indra/newview/fscommon.cpp
+++ b/indra/newview/fscommon.cpp
@@ -30,6 +30,7 @@
#include "fscommon.h"
#include "fsradar.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llavataractions.h"
#include "llavatarnamecache.h"
#include "llfloaterperms.h"
@@ -369,9 +370,10 @@ LLSD FSCommon::populateGroupCount()
{
LLStringUtil::format_map_t args;
S32 groupcount = gAgent.mGroups.size();
+ S32 maxgroup = LLAgentBenefitsMgr::current().getGroupMembershipLimit();
args["[COUNT]"] = llformat("%d", groupcount);
- args["[REMAINING]"] = llformat("%d", gMaxAgentGroups > groupcount ? gMaxAgentGroups - groupcount : 0);
- LLUIString groupcountstring = LLTrans::getString((gMaxAgentGroups ? "groupcountstring" : "groupcountunlimitedstring"), args);
+ args["[REMAINING]"] = llformat("%d", maxgroup > groupcount ? maxgroup - groupcount : 0);
+ LLUIString groupcountstring = LLTrans::getString((maxgroup ? "groupcountstring" : "groupcountunlimitedstring"), args);
return LLSD(groupcountstring);
}
diff --git a/indra/newview/fsdiscordkey.h.in b/indra/newview/fsdiscordkey.h.in
index 269745e453..c0454f1e3d 100644
--- a/indra/newview/fsdiscordkey.h.in
+++ b/indra/newview/fsdiscordkey.h.in
@@ -1,4 +1,4 @@
-// THIS FILE IS AUTOGENERATED BY THE BUILD PROCESS
-// You can either set the keys in Variables.cmake or at the autobuild command
-
+// THIS FILE IS AUTOGENERATED BY THE BUILD PROCESS
+// You can either set the keys in Variables.cmake or at the autobuild command
+
#define DISCORD_API_KEY "@DDISCORD_API_KEY@"
\ No newline at end of file
diff --git a/indra/newview/fsfloatergroup.cpp b/indra/newview/fsfloatergroup.cpp
index 612711bdd5..64e20bc1c0 100644
--- a/indra/newview/fsfloatergroup.cpp
+++ b/indra/newview/fsfloatergroup.cpp
@@ -31,10 +31,12 @@
#include "llfloaterreg.h"
#include "llpanelgroup.h"
+#include "llpanelgroupcreate.h"
FSFloaterGroup::FSFloaterGroup(const LLSD& seed)
: LLFloater(seed),
- mGroupPanel(NULL),
+ mGroupPanel(nullptr),
+ mGroupCreatePanel(nullptr),
mIsCreateGroup(false)
{
}
@@ -46,7 +48,8 @@ FSFloaterGroup::~FSFloaterGroup()
BOOL FSFloaterGroup::postBuild()
{
mGroupPanel = findChild("panel_group_info_sidetray");
- if (!mGroupPanel)
+ mGroupCreatePanel = findChild("panel_group_creation_sidetray");
+ if (!mGroupPanel || !mGroupCreatePanel)
{
return FALSE;
}
@@ -59,15 +62,19 @@ void FSFloaterGroup::onOpen(const LLSD& key)
// openFloater() sets the key again - we only want the group id as key, so set it again!
setKey(LLSD().with("group_id", key.get("group_id").asUUID()));
mIsCreateGroup = (key.has("action") && key.get("action").asString() == "create");
- mGroupPanel->onOpen(key);
if (mIsCreateGroup)
{
- mGroupPanel->getChildView("header_container")->setVisible(TRUE);
- mGroupPanel->getChildView("back")->setVisible(FALSE);
+ mGroupCreatePanel->onOpen(key);
+ mGroupCreatePanel->setVisible(TRUE);
+ mGroupPanel->setVisible(FALSE);
+ setTitle(getString("title_create_group"));
}
else
{
+ mGroupPanel->onOpen(key);
+ mGroupPanel->setVisible(TRUE);
+ mGroupCreatePanel->setVisible(FALSE);
mGroupPanel->getChildView("header_container")->setVisible(FALSE);
}
}
diff --git a/indra/newview/fsfloatergroup.h b/indra/newview/fsfloatergroup.h
index bb0799f605..6452a54511 100644
--- a/indra/newview/fsfloatergroup.h
+++ b/indra/newview/fsfloatergroup.h
@@ -31,6 +31,7 @@
#include "llfloater.h"
class LLPanelGroup;
+class LLPanelGroupCreate;
class FSFloaterGroup : public LLFloater
{
@@ -54,8 +55,9 @@ public:
static FSFloaterGroup* findInstance(const LLUUID& group_id);
private:
- LLPanelGroup* mGroupPanel;
- bool mIsCreateGroup;
+ LLPanelGroup* mGroupPanel;
+ LLPanelGroupCreate* mGroupCreatePanel;
+ bool mIsCreateGroup;
};
#endif // FS_FLOATERGROUP_H
diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp
index 16d4a3c9ac..403233d51c 100644
--- a/indra/newview/fsfloaterim.cpp
+++ b/indra/newview/fsfloaterim.cpp
@@ -53,6 +53,7 @@
#include "llfloaterabout.h" // for sysinfo button -Zi
#include "llfloateravatarpicker.h"
#include "llfloaterreg.h"
+#include "llfloatersearchreplace.h"
#include "llgroupactions.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -432,18 +433,29 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
str_rlv_enabled = "*";
+ // Text mode check
+ std::string str_viewer_mode = "";
+
+ // Unfortunately, we have to cheat a little here. Ideally we'd have
+ // a method defined to check if the viewer is running in Text Mode.
+ // For now, we will use the same method as used in llappviewer.cpp(LLAppViewer::getViewerInfo())
+ static LLCachedControl FSViewerMode(gSavedSettings, "SessionSettingsFile");
+ std::string viewer_mode(FSViewerMode);
+ LLStringUtil::toLower(viewer_mode);
+ if(viewer_mode == "settings_text.xml")
+ str_viewer_mode = "T";
+
+
//Build it up
size_t insert_pos = is_irc_me_prefix(utf8_text) ? 4 : 0;
//For testing/beta groups, we display the build version since it doesn't speed by and this might change often
if(chat_prefix_testing && FSData::getInstance()->isTestingGroup(mSessionID))
- utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getBuildVersion() +
- skin_indicator + str_rlv_enabled + str_opensim_tag + ") "));
+ utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getBuildVersion() + skin_indicator + str_viewer_mode + str_rlv_enabled + str_opensim_tag + ") "));
//For release support groups, only display the short version(Major.Minor.Patch) since chat can speed by. This makes it easier on Support's eyes.
else if(chat_prefix_support && FSData::getInstance()->isSupportGroup(mSessionID))
- utf8_text.insert( insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getShortVersion() + skin_indicator +
- str_rlv_enabled + str_opensim_tag + ") "));
+ utf8_text.insert(insert_pos, ("(" + str_address_size_tag + str_operating_system_tag + " " + LLVersionInfo::getInstance()->getShortVersion() + skin_indicator + str_viewer_mode + str_rlv_enabled + str_opensim_tag + ") "));
}
// Allow user to send system info.
@@ -468,6 +480,11 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
setTyping(false);
}
+void FSFloaterIM::onChatSearchButtonClicked()
+{
+ LLFloaterSearchReplace::show(mChatHistory);
+}
+
void FSFloaterIM::sendMsg(const std::string& msg)
{
// const std::string utf8_text = utf8str_truncate(msg, MAX_MSG_BUF_SIZE - 1);
@@ -917,6 +934,8 @@ BOOL FSFloaterIM::postBuild()
getChild("send_chat")->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL));
+ getChild("chat_search_btn")->setCommitCallback(boost::bind(&FSFloaterIM::onChatSearchButtonClicked, this));
+
bool isFSSupportGroup = FSData::getInstance()->isFirestormGroup(mSessionID);
bool isFSTestingGroup = FSData::getInstance()->isTestingGroup(mSessionID);
diff --git a/indra/newview/fsfloaterim.h b/indra/newview/fsfloaterim.h
index 8681513120..d70bac8155 100644
--- a/indra/newview/fsfloaterim.h
+++ b/indra/newview/fsfloaterim.h
@@ -120,6 +120,8 @@ public:
static void clearAllOpenHistories(); // FIRE-11734
+ void onChatSearchButtonClicked();
+
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type,
void *cargo_data, EAcceptance *accept,
diff --git a/indra/newview/fsfloaterimport.cpp b/indra/newview/fsfloaterimport.cpp
index e97e92f7bd..c8c86dfd66 100644
--- a/indra/newview/fsfloaterimport.cpp
+++ b/indra/newview/fsfloaterimport.cpp
@@ -30,13 +30,13 @@
#include "fscommon.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llappviewer.h"
#include "llbuycurrencyhtml.h"
#include "llcallbacklist.h"
#include "llcheckboxctrl.h"
#include "lldatapacker.h"
#include "lldir.h"
-#include "lleconomy.h"
#include "llfloaterperms.h"
#include "llinventorydefines.h"
#include "llinventoryfunctions.h"
@@ -126,7 +126,7 @@ FSFloaterImport::~FSFloaterImport()
BOOL FSFloaterImport::postBuild()
{
- if (LLGlobalEconomy::getInstance()->getPriceUpload() == 0
+ if (LLAgentBenefitsMgr::current().getTextureUploadCost() == 0
|| gAgent.getRegion()->getCentralBakeVersion() > 0)
{
getChild("temp_asset")->setVisible(FALSE);
@@ -520,7 +520,7 @@ void FSFloaterImport::onClickBtnImport()
if (!getChild("temp_asset")->get())
{
- U32 expected_upload_cost = mTexturesTotal * (U32)LLGlobalEconomy::getInstance()->getPriceUpload();
+ U32 expected_upload_cost = mTexturesTotal * (U32)LLAgentBenefitsMgr::current().getTextureUploadCost();
if(!(can_afford_transaction(expected_upload_cost)))
{
LLStringUtil::format_map_t args;
@@ -590,7 +590,7 @@ void FSFloaterImport::onClickCheckBoxUploadAsset()
{
getChild("temp_asset")->setEnabled(TRUE);
LLUIString stats = getString("upload_cost");
- stats.setArg("[COST]", llformat("%u", (mTexturesTotal + mSoundsTotal + mAnimsTotal) * (U32)LLGlobalEconomy::getInstance()->getPriceUpload()));
+ stats.setArg("[COST]", llformat("%u", (mTexturesTotal * LLAgentBenefitsMgr::current().getTextureUploadCost() + mSoundsTotal * LLAgentBenefitsMgr::current().getSoundUploadCost() + mAnimsTotal * LLAgentBenefitsMgr::current().getAnimationUploadCost())));
getChild("file_status_text")->setText(stats.getString());
}
else
@@ -613,7 +613,7 @@ void FSFloaterImport::onClickCheckBoxTempAsset()
else
{
LLUIString stats = getString("upload_cost");
- stats.setArg("[COST]", llformat("%u", (mTexturesTotal + mSoundsTotal + mAnimsTotal) * (U32)LLGlobalEconomy::getInstance()->getPriceUpload()));
+ stats.setArg("[COST]", llformat("%u", (mTexturesTotal * LLAgentBenefitsMgr::current().getTextureUploadCost() + mSoundsTotal * LLAgentBenefitsMgr::current().getSoundUploadCost() + mAnimsTotal * LLAgentBenefitsMgr::current().getAnimationUploadCost())));
getChild("file_status_text")->setText(stats.getString());
}
}
@@ -1468,7 +1468,21 @@ void FSFloaterImport::uploadAsset(LLUUID asset_id, LLUUID inventory_item)
data->mAssetInfo.mCreatorID = gAgentID;
data->mInventoryType = inventory_type;
data->mNextOwnerPerm = LLFloaterPerms::getNextOwnerPerms(perms_prefix);
- data->mExpectedUploadCost = LLGlobalEconomy::getInstance()->getPriceUpload();
+ switch (asset_type)
+ {
+ case LLAssetType::AT_TEXTURE:
+ data->mExpectedUploadCost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ break;
+ case LLAssetType::AT_ANIMATION:
+ data->mExpectedUploadCost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ break;
+ case LLAssetType::AT_SOUND:
+ data->mExpectedUploadCost = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ break;
+ default:
+ data->mExpectedUploadCost = 0;
+ break;
+ }
FSResourceData* fs_data = new FSResourceData;
fs_data->uuid = asset_id;
fs_data->mFloater = this;
@@ -1960,7 +1974,23 @@ void uploadCoroutine( LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &a_httpAdapter
{
LLAssetType::EType asset_type = LLAssetType::lookup( aBody[ "asset_type" ].asString() );
LLInventoryType::EType inventory_type = LLInventoryType::lookup( aBody[ "inventory_type" ].asString() );
- S32 upload_price = LLGlobalEconomy::getInstance()->getPriceUpload();
+
+ S32 upload_price;
+ switch (asset_type)
+ {
+ case LLAssetType::AT_TEXTURE:
+ upload_price = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ break;
+ case LLAssetType::AT_ANIMATION:
+ upload_price = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ break;
+ case LLAssetType::AT_SOUND:
+ upload_price = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ break;
+ default:
+ upload_price = 0;
+ break;
+ }
const std::string inventory_type_string = aBody[ "asset_type" ].asString();
const LLUUID& item_folder_id = aBody[ "folder_id" ].asUUID();
diff --git a/indra/newview/fsfloaternearbychat.cpp b/indra/newview/fsfloaternearbychat.cpp
index 58e473a285..70557c4c8b 100644
--- a/indra/newview/fsfloaternearbychat.cpp
+++ b/indra/newview/fsfloaternearbychat.cpp
@@ -51,6 +51,7 @@
#include "llconsole.h"
#include "lldraghandle.h"
#include "llfloaterreg.h"
+#include "llfloatersearchreplace.h"
#include "llfocusmgr.h"
#include "llgesturemgr.h"
#include "lliconctrl.h"
@@ -145,6 +146,8 @@ BOOL FSFloaterNearbyChat::postBuild()
getChild("chat_history_btn")->setCommitCallback(boost::bind(&FSFloaterNearbyChat::onHistoryButtonClicked, this));
+ getChild("chat_search_btn")->setCommitCallback(boost::bind(&FSFloaterNearbyChat::onSearchButtonClicked, this));
+
// chat type selector and send chat button
mChatTypeCombo = getChild("chat_type");
mChatTypeCombo->selectByValue("say");
@@ -314,6 +317,18 @@ void FSFloaterNearbyChat::onHistoryButtonClicked()
}
}
+void FSFloaterNearbyChat::onSearchButtonClicked()
+{
+ if (mChatHistory->getVisible())
+ {
+ LLFloaterSearchReplace::show(mChatHistory);
+ }
+ else if (mChatHistoryMuted->getVisible())
+ {
+ LLFloaterSearchReplace::show(mChatHistoryMuted);
+ }
+}
+
void FSFloaterNearbyChat::onChatOptionsContextMenuItemClicked(const LLSD& userdata)
{
FSChatOptionsMenu::onMenuItemClick(userdata, this);
diff --git a/indra/newview/fsfloaternearbychat.h b/indra/newview/fsfloaternearbychat.h
index bde7ba8780..58276d8be4 100644
--- a/indra/newview/fsfloaternearbychat.h
+++ b/indra/newview/fsfloaternearbychat.h
@@ -79,6 +79,8 @@ public:
void onHistoryButtonClicked();
+ void onSearchButtonClicked();
+
// overridden to fix the multitab focus bug -Zi
BOOL focusFirstItem(BOOL prefer_text_fields = FALSE, BOOL focus_flash = TRUE );
diff --git a/indra/newview/fsfloaterprotectedfolders.cpp b/indra/newview/fsfloaterprotectedfolders.cpp
new file mode 100644
index 0000000000..e83e7037bc
--- /dev/null
+++ b/indra/newview/fsfloaterprotectedfolders.cpp
@@ -0,0 +1,190 @@
+/**
+ * @file fsfloaterprotectedfolders.cpp
+ * @brief Class for the protected folders floater
+ *
+ * $LicenseInfo:firstyear=2020&license=viewerlgpl$
+ * Phoenix Firestorm Viewer Source Code
+ * Copyright (c) 2020 Ansariel Hiller @ Second Life
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
+ * http://www.firestormviewer.org
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "fsfloaterprotectedfolders.h"
+#include "fscommon.h"
+#include "llbutton.h"
+#include "llfiltereditor.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llscrolllistctrl.h"
+#include "llviewercontrol.h" // for gSavedSettings
+#include "rlvactions.h"
+
+
+FSFloaterProtectedFolders::FSFloaterProtectedFolders(const LLSD& key)
+ : LLFloater(key),
+ mFolderList(NULL),
+ mFilterSubString(LLStringUtil::null),
+ mFilterSubStringOrig(LLStringUtil::null),
+ mProtectedCategoriesChangedCallbackConnection(),
+ mInitialized(false)
+{
+}
+
+FSFloaterProtectedFolders::~FSFloaterProtectedFolders()
+{
+ if (mProtectedCategoriesChangedCallbackConnection.connected())
+ {
+ mProtectedCategoriesChangedCallbackConnection.disconnect();
+ }
+}
+
+//virtual
+BOOL FSFloaterProtectedFolders::postBuild()
+{
+ mFolderList = getChild("folder_list");
+ mFolderList->setFilterColumn(0);
+ mFolderList->setDoubleClickCallback(boost::bind(&FSFloaterProtectedFolders::onDoubleClick, this));
+
+ mRemoveFolderBtn = getChild("remove_btn");
+ mRemoveFolderBtn->setCommitCallback(boost::bind(&FSFloaterProtectedFolders::handleRemove, this));
+
+ mFilterEditor = getChild("filter_input");
+ mFilterEditor->setCommitCallback(boost::bind(&FSFloaterProtectedFolders::onFilterEdit, this, _2));
+
+ return TRUE;
+}
+
+//virtual
+void FSFloaterProtectedFolders::onOpen(const LLSD& /*info*/)
+{
+ if (!mInitialized)
+ {
+ if (!gInventory.isInventoryUsable())
+ {
+ return;
+ }
+
+ mProtectedCategoriesChangedCallbackConnection = gSavedPerAccountSettings.getControl("FSProtectedFolders")->getCommitSignal()->connect(boost::bind(&FSFloaterProtectedFolders::updateList, this));
+
+ updateList();
+
+ mInitialized = true;
+ }
+}
+
+//virtual
+void FSFloaterProtectedFolders::draw()
+{
+ LLFloater::draw();
+
+ mRemoveFolderBtn->setEnabled(mFolderList->getNumSelected() > 0);
+}
+
+//virtual
+BOOL FSFloaterProtectedFolders::handleKeyHere(KEY key, MASK mask)
+{
+ if (FSCommon::isFilterEditorKeyCombo(key, mask))
+ {
+ mFilterEditor->setFocus(TRUE);
+ return TRUE;
+ }
+
+ return LLFloater::handleKeyHere(key, mask);
+}
+
+void FSFloaterProtectedFolders::updateList()
+{
+ bool needs_sort = mFolderList->isSorted();
+ mFolderList->setNeedsSort(false);
+ mFolderList->clearRows();
+
+ LLSD protected_folders = gSavedPerAccountSettings.getLLSD("FSProtectedFolders");
+ for (LLSD::array_const_iterator it = protected_folders.beginArray(); it != protected_folders.endArray(); ++it)
+ {
+ LLUUID id = (*it).asUUID();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+
+ LLSD row_data;
+ row_data["value"] = id;
+ row_data["columns"][0]["column"] = "name";
+ row_data["columns"][0]["value"] = cat ? cat->getName() : getString("UnknownFolder");
+
+ LLScrollListItem* row = mFolderList->addElement(row_data);
+ if (!cat)
+ {
+ LLScrollListText* name_column = (LLScrollListText*)row->getColumn(0);
+ name_column->setFontStyle(LLFontGL::NORMAL | LLFontGL::ITALIC);
+ }
+ }
+
+ mFolderList->setNeedsSort(needs_sort);
+ mFolderList->updateSort();
+}
+
+void FSFloaterProtectedFolders::handleRemove()
+{
+ uuid_set_t selected_ids;
+ std::vector selected_items = mFolderList->getAllSelected();
+
+ for (std::vector::iterator it = selected_items.begin(); it != selected_items.end(); ++it)
+ {
+ selected_ids.insert((*it)->getUUID());
+ }
+
+ LLSD protected_folders = gSavedPerAccountSettings.getLLSD("FSProtectedFolders");
+ LLSD new_protected_folders;
+ for (LLSD::array_const_iterator it = protected_folders.beginArray(); it != protected_folders.endArray(); ++it)
+ {
+ if (selected_ids.find((*it).asUUID()) == selected_ids.end())
+ {
+ new_protected_folders.append(*it);
+ }
+ }
+ gSavedPerAccountSettings.setLLSD("FSProtectedFolders", new_protected_folders);
+}
+
+void FSFloaterProtectedFolders::onFilterEdit(const std::string& search_string)
+{
+ mFilterSubStringOrig = search_string;
+ LLStringUtil::trimHead(mFilterSubStringOrig);
+ // Searches are case-insensitive
+ std::string search_upper = mFilterSubStringOrig;
+ LLStringUtil::toUpper(search_upper);
+
+ if (mFilterSubString == search_upper)
+ {
+ return;
+ }
+
+ mFilterSubString = search_upper;
+
+ // Apply new filter.
+ mFolderList->setFilterString(mFilterSubStringOrig);
+}
+
+void FSFloaterProtectedFolders::onDoubleClick()
+{
+ LLUUID selected_item_id = mFolderList->getStringUUIDSelectedItem();
+ if (selected_item_id.notNull() && (!RlvActions::isRlvEnabled() || !RlvActions::hasBehaviour(RLV_BHVR_SHOWINV)))
+ {
+ show_item_original(selected_item_id);
+ }
+}
diff --git a/indra/newview/fsfloaterprotectedfolders.h b/indra/newview/fsfloaterprotectedfolders.h
new file mode 100644
index 0000000000..65d17f2bc6
--- /dev/null
+++ b/indra/newview/fsfloaterprotectedfolders.h
@@ -0,0 +1,68 @@
+/**
+ * @file fsfloaterprotectedfolders.h
+ * @brief Class for the protected folders floater
+ *
+ * $LicenseInfo:firstyear=2020&license=viewerlgpl$
+ * Phoenix Firestorm Viewer Source Code
+ * Copyright (c) 2020 Ansariel Hiller @ Second Life
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
+ * http://www.firestormviewer.org
+ * $/LicenseInfo$
+ */
+
+#ifndef FS_FLOATERPROTECTEDFOLDERS_H
+#define FS_FLOATERPROTECTEDFOLDERS_H
+
+#include "llfloater.h"
+
+class LLButton;
+class LLFilterEditor;
+class LLScrollListCtrl;
+
+class FSFloaterProtectedFolders : public LLFloater
+{
+public:
+ FSFloaterProtectedFolders(const LLSD& key);
+ virtual ~FSFloaterProtectedFolders();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& info);
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
+ /*virtual*/ bool hasAccelerators() const { return true; }
+
+private:
+ void updateList();
+
+ void handleRemove();
+ void onFilterEdit(const std::string& search_string);
+ void onDoubleClick();
+
+ bool mInitialized;
+
+ std::string mFilterSubString;
+ std::string mFilterSubStringOrig;
+
+ boost::signals2::connection mProtectedCategoriesChangedCallbackConnection;
+
+ LLScrollListCtrl* mFolderList;
+ LLButton* mRemoveFolderBtn;
+ LLFilterEditor* mFilterEditor;
+};
+
+#endif // FS_FLOATERPROTECTEDFOLDERS_H
diff --git a/indra/newview/fskeywords.cpp b/indra/newview/fskeywords.cpp
index 361ddfbd16..88269625cf 100644
--- a/indra/newview/fskeywords.cpp
+++ b/indra/newview/fskeywords.cpp
@@ -63,13 +63,16 @@ void FSKeywords::updateKeywords()
mWordList.clear();
while (begin != end)
{
+ std::string token(*begin++);
+ LLStringUtil::trim(token);
+
if (match_whole_words)
{
- mWordList.push_back(boost::regex_replace(std::string(*begin++), boost::regex("[.^$|()\\[\\]{}*+?\\\\]"), "\\\\&", boost::match_default|boost::format_sed));
+ mWordList.push_back(boost::regex_replace(token, boost::regex("[.^$|()\\[\\]{}*+?\\\\]"), "\\\\&", boost::match_default|boost::format_sed));
}
else
{
- mWordList.push_back(*begin++);
+ mWordList.push_back(token);
}
}
}
diff --git a/indra/newview/fspanelclassified.cpp b/indra/newview/fspanelclassified.cpp
index 5999ab1f3c..034fef0903 100644
--- a/indra/newview/fspanelclassified.cpp
+++ b/indra/newview/fspanelclassified.cpp
@@ -591,8 +591,6 @@ BOOL FSPanelClassifiedEdit::postBuild()
FSPanelClassifiedInfo::postBuild();
LLTextureCtrl* snapshot = getChild("classified_snapshot");
- snapshot->setOnSelectCallback(boost::bind(&FSPanelClassifiedEdit::onChange, this));
-
LLUICtrl* edit_icon = getChild("edit_icon");
snapshot->setMouseEnterCallback(boost::bind(&FSPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon));
snapshot->setMouseLeaveCallback(boost::bind(&FSPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon));
@@ -1110,6 +1108,7 @@ void FSPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
void FSPanelClassifiedEdit::onTextureSelected()
{
setSnapshotId(mSnapshotCtrl->getValue().asUUID());
+ onChange();
}
//////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/fspanellogin.cpp b/indra/newview/fspanellogin.cpp
index 8d05b9a1e4..070f681987 100644
--- a/indra/newview/fspanellogin.cpp
+++ b/indra/newview/fspanellogin.cpp
@@ -84,6 +84,7 @@ FSPanelLogin *FSPanelLogin::sInstance = NULL;
BOOL FSPanelLogin::sCapslockDidNotification = FALSE;
BOOL FSPanelLogin::sCredentialSet = FALSE;
std::string FSPanelLogin::sPassword = "";
+std::string FSPanelLogin::sPendingNewGridURI{};
// Helper for converting a user name into the canonical "Firstname Lastname" form.
// For new accounts without a last name "Resident" is added as a last name.
@@ -1091,7 +1092,18 @@ void FSPanelLogin::onSelectServer()
LLComboBox* server_combo = getChild("server_combo");
LLSD server_combo_val = server_combo->getSelectedValue();
- LL_INFOS("AppInit") << "grid "<getValue().asString())<< LL_ENDL;
+ if (server_combo_val.isUndefined() && sPendingNewGridURI.empty())
+ {
+ sPendingNewGridURI = server_combo->getValue().asString();
+ LLStringUtil::trim(sPendingNewGridURI);
+ LL_INFOS("AppInit") << "requesting unknown grid "<< sPendingNewGridURI << LL_ENDL;
+ // Previously unknown gridname was entered
+ LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&FSPanelLogin::gridListChanged, this, _1));
+ LLGridManager::getInstance()->addGrid(sPendingNewGridURI);
+
+ }
+
LLGridManager::getInstance()->setGridChoice(server_combo_val.asString());
/*
@@ -1361,6 +1373,14 @@ void FSPanelLogin::updateServerCombo()
LLComboBox* server_choice_combo = sInstance->getChild("server_combo");
server_choice_combo->removeall();
+ if(!sPendingNewGridURI.empty())
+ {
+ LLSD grid_name = LLGridManager::getInstance()->getGridByAttribute(GRID_LOGIN_URI_VALUE, sPendingNewGridURI, false);
+ LL_INFOS("AppInit") << "new grid for ["<setSelectedByValue(grid_name, true);
+ LLGridManager::getInstance()->setGridChoice(grid_name.asString());
+ }
+
std::string current_grid = LLGridManager::getInstance()->getGrid();
std::map known_grids = LLGridManager::getInstance()->getKnownGrids();
@@ -1401,10 +1421,11 @@ std::string FSPanelLogin::credentialName()
return username + "@" + LLGridManager::getInstance()->getGrid();
}
-// static
+
void FSPanelLogin::gridListChanged(bool success)
{
updateServer();
+ sPendingNewGridURI.clear(); // success or fail we clear the pending URI as we will not get another callback.
}
// static
diff --git a/indra/newview/fspanellogin.h b/indra/newview/fspanellogin.h
index 2c3a2ac56f..9ce2509404 100644
--- a/indra/newview/fspanellogin.h
+++ b/indra/newview/fspanellogin.h
@@ -89,6 +89,7 @@ public:
static void clearPassword() { sPassword.clear(); }
+ void gridListChanged(bool success);
private:
void addFavoritesToStartLocation();
void addUsersToCombo(BOOL show_server);
@@ -109,7 +110,6 @@ private:
static void onClickRemove(void*);
static void onRemoveCallback(const LLSD& notification, const LLSD& response);
static void onClickGridMgrHelp(void*);
- static void gridListChanged(bool success);
static std::string credentialName();
private:
@@ -132,6 +132,7 @@ private:
std::string mPreviousUsername;
static std::string sPassword;
+ static std::string sPendingNewGridURI;
bool mInitialized;
};
diff --git a/indra/newview/fspanelprofile.cpp b/indra/newview/fspanelprofile.cpp
index 4a301baa5f..086a4f375c 100644
--- a/indra/newview/fspanelprofile.cpp
+++ b/indra/newview/fspanelprofile.cpp
@@ -52,6 +52,7 @@
#include "fsdroptarget.h"
#include "fspanelprofileclassifieds.h"
#include "llagent.h" //gAgent
+#include "llagentbenefits.h"
#include "llagentpicksinfo.h"
#include "llavataractions.h"
#include "llavatarpropertiesprocessor.h"
@@ -1788,7 +1789,7 @@ void FSPanelProfilePicks::updateRlvRestrictions(ERlvBehaviour behavior, ERlvPara
bool FSPanelProfilePicks::canAddNewPick()
{
return (!LLAgentPicksInfo::getInstance()->isPickLimitReached() &&
- mTabContainer->getTabCount() < LLAgentPicksInfo::getInstance()->getMaxNumberOfPicks() &&
+ mTabContainer->getTabCount() < LLAgentBenefitsMgr::current().getPicksLimit() &&
!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC));
}
diff --git a/indra/newview/fsregioncross.cpp b/indra/newview/fsregioncross.cpp
new file mode 100644
index 0000000000..f7644d8bfe
--- /dev/null
+++ b/indra/newview/fsregioncross.cpp
@@ -0,0 +1,196 @@
+/**
+ * @file fsregioncross.cpp
+ * @brief Improvements to region crossing display
+ * @author nagle@animats.com
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Phoenix Firestorm Viewer Source Code
+ * Copyright (C) 2020 Animats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
+ * http://www.firestormviewer.org
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "fsregioncross.h"
+#include "llframetimer.h"
+#include "llmath.h"
+#include "llviewercontrol.h"
+#include "llviewerobject.h"
+
+// Improved region crossing time limit prediction.
+//
+// Applied when
+// 1) object has an avatar sitting on it
+// 2) object has been seen to move since sat on
+// 3) object is outside the 0..256m region boundaries.
+//
+// In other words, a vehicle with an avatar doing a region crossing.
+//
+// This computes a safe time limit for extrapolating vehicle position and
+// rotation during a region crossing, when the simulator to simulator handoff
+// is in progress and no object updates are being received. Goal is to keep
+// the position and rotation errors within set bounds.
+//
+// The smoother the movement of the vehicle approaching the sim crossing,
+// the longer the allowed extrapolation will be.
+//
+//
+// Constructor -- called when something sits on the object.
+//
+// Potential vehicle, but might be just a chair.
+// We don't start the movement averaging until there's movement at least once.
+//
+RegionCrossExtrapolateImpl::RegionCrossExtrapolateImpl(const LLViewerObject& vo) :
+ mOwner(vo),
+ mPreviousUpdateTime(0),
+ mMoved(false)
+ {
+ LL_INFOS() << "Object " << vo.getID().asString() << " has sitter." << LL_ENDL;
+ }
+
+// update -- called for each object update message to "vehicle" objects.
+//
+// This is called for any object with an avatar sitting on it.
+// If the object never moves, it's not a vehicle and we can skip this.
+// If it has moved, we treat it as a vehicle.
+//
+void RegionCrossExtrapolateImpl::update()
+{
+ if (!mMoved)
+ {
+ LLVector3 rawvel = mOwner.getVelocity(); // velocity in world coords
+ if (rawvel.mV[VX] != 0.f || rawvel.mV[VY] != 0.f || rawvel.mV[VZ] != 0.f) // check for nonzero velocity
+ {
+ mMoved = true; // moved, has seated avatar, thus is vehicle
+ }
+ else
+ {
+ return; // sitting on stationary object, skip this
+ }
+ }
+
+ // Moving seat - do the extrapolation calculations
+ F64 dt = 1.0 / 45.0; // dt used on first value - one physics frame on server
+ F64 now = LLFrameTimer::getElapsedSeconds();
+ if (mPreviousUpdateTime != 0.0)
+ {
+ dt = now - mPreviousUpdateTime; // change since last update
+ // Could adjust here for ping time and time dilation, but the filter isn't that
+ // sensitive to minor variations dt and it would just complicate things.
+ }
+
+ mPreviousUpdateTime = now;
+ LLQuaternion rot = mOwner.getRotationRegion(); // transform in global coords
+ const LLQuaternion& inverserot = rot.conjugate(); // transform global to local
+ LLVector3 vel = mOwner.getVelocity() * inverserot; // velocity in object coords
+ LLVector3 angvel = mOwner.getAngularVelocity() * inverserot; // angular velocity in object coords
+ mFilteredVel.update(vel, dt); // accum into filter in object coords
+ mFilteredAngVel.update(angvel, dt); // accum into filter in object coords
+}
+
+// dividesafe -- floating divide with divide by zero check
+//
+// Returns infinity for a divide by near zero.
+//
+static inline F32 dividesafe(F32 num, F32 denom)
+{
+ return ((denom > FP_MAG_THRESHOLD || denom < -FP_MAG_THRESHOLD) // avoid divide by zero
+ ? (num / denom) : std::numeric_limits::infinity()); // return infinity if zero divide
+}
+
+// getextraptimelimit -- don't extrapolate further ahead than this during a region crossing.
+//
+// Returns seconds of extrapolation that will probably stay within set limits of error.
+//
+F32 RegionCrossExtrapolateImpl::getextraptimelimit() const
+{
+ // Debug tuning parameters. This code will try to limit the maximum position and angle error to the specified limits.
+ // The limits can be adjusted as debug symbols or in settings.xml, but that should not be necessary.
+ static LLCachedControl fsRegionCrossingPositionErrorLimit(gSavedSettings, "FSRegionCrossingPositionErrorLimit");
+ static LLCachedControl fsRegionCrossingAngleErrorLimit(gSavedSettings, "FSRegionCrossingAngleErrorLimit");
+
+ // Time limit is max allowed error / error. Returns worst case (smallest) of vel and angular vel limits.
+ LLQuaternion rot = mOwner.getRotationRegion(); // transform in global coords
+ const LLQuaternion& inverserot = rot.conjugate(); // transform global to local
+
+ // Calculate safe extrapolation time limit.
+ F32 extrapTimeLimit = llmin(dividesafe(fsRegionCrossingPositionErrorLimit, ((mOwner.getVelocity() * inverserot - mFilteredVel.get()).length())),
+ dividesafe(fsRegionCrossingAngleErrorLimit, ((mOwner.getAngularVelocity() * inverserot - mFilteredAngVel.get()).length())));
+
+ LL_INFOS() << "Region cross extrapolation safe limit " << extrapTimeLimit << " secs." << LL_ENDL;
+ return extrapTimeLimit; // do not extrapolate more than this
+}
+
+// ifsaton -- True if object is being sat upon.
+//
+// Potential vehicle.
+//
+bool RegionCrossExtrapolate::ifsaton(const LLViewerObject& vo) // true if root object and being sat on
+{
+ if (!vo.isRoot())
+ {
+ return false; // not root, cannot be sat upon
+ }
+
+ for (auto iter = vo.getChildren().begin(); // check for avatar as child of root
+ iter != vo.getChildren().end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ if (child->isAvatar())
+ {
+ return true;
+ }
+ }
+
+ return false; // no avatar children, not sat on
+}
+
+// LowPassFilter -- the low pass filter for smoothing velocities.
+//
+// Works on vectors.
+//
+// Filter function is scaled by 1- 1/((1+(1/filterval))^secs)
+// This is so samples which represent more time are weighted more.
+//
+// The filterval function is a curve which goes through (0,0) and gradually
+// approaches 1 for larger values of secs. Secs is the time since the last update.
+// We assume that the time covered by an update had reasonably uniform velocity
+// and angular velocity, since if those were changing rapidly, the server would send
+// more object updates.
+//
+// Setting filter smoothing time to zero turns off the filter and results in the predictor
+// always returning a very large value and not affecting region crossing times.
+// So that's how to turn this off, if desired.
+//
+void LowPassFilter::update(const LLVector3& val, F32 secs) // add new value into filter
+{
+ static LLCachedControl fsRegionCrossingSmoothingTime(gSavedSettings, "FSRegionCrossingSmoothingTime");
+ if (!mInitialized)
+ {
+ mFiltered = val; // just use new value
+ mInitialized = true;
+ return;
+ }
+
+ F32 filtermult = 1.0f; // no filtering if zero filter time
+ if (fsRegionCrossingSmoothingTime > F_ALMOST_ZERO) // avoid divide by zero
+ {
+ filtermult = 1.0f - 1.0f / pow(1.0f + 1.0f / fsRegionCrossingSmoothingTime, secs); // filter scale factor
+ }
+ mFiltered = val * filtermult + mFiltered * (1.0f - filtermult); // low pass filter
+}
diff --git a/indra/newview/fsregioncross.h b/indra/newview/fsregioncross.h
new file mode 100644
index 0000000000..626036ed7a
--- /dev/null
+++ b/indra/newview/fsregioncross.h
@@ -0,0 +1,152 @@
+/**
+ * @file fsregioncross.h
+ * @brief Improvements to region crossing display
+ * @author nagle@animats.com
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Phoenix Firestorm Viewer Source Code
+ * Copyright (C) 2020 Animats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
+ * http://www.firestormviewer.org
+ */
+
+#ifndef FS_FSREGIONCROSS_H
+#define FS_FSREGIONCROSS_H
+
+//
+// Improved region crossing support.
+//
+
+class LLViewerObject;
+
+// LowPassFilter -- a simple Kalman low-pass filter.
+//
+// Supports nonuniform time deltas between samples, since object update times are not consistent.
+//
+class LowPassFilter
+{
+private:
+ LLVector3 mFiltered; // filtered value
+ bool mInitialized;
+
+public:
+ LowPassFilter() :
+ mInitialized(false),
+ mFiltered()
+ { }
+
+ void update(const LLVector3& val, F32 dt); // add new value into filter
+
+ const LLVector3& get() const // get filtered output
+ {
+ return mFiltered; // already stored
+ }
+
+ void clear()
+ {
+ mInitialized = false;
+ }
+};
+
+// RegionCrossExtrapolateImpl -- the extrapolation limit calculator.
+//
+// One of these is created when an object is sat upon. If the
+// seat moves, it's effectively a vehicle, so we start calculating
+// region crossing safe extrapolation times. If the seat never moves,
+// we still allocate one of these, but it doesn't do anything.
+// When the avatar stands, this object is released.
+// If the LLViewerObject is deleted, so is this object.
+//
+class RegionCrossExtrapolateImpl // Implementation of region cross extrapolation control
+{
+private:
+ const LLViewerObject& mOwner; // ref to owning object
+ F64 mPreviousUpdateTime; // previous update time
+ LowPassFilter mFilteredVel; // filtered velocity
+ LowPassFilter mFilteredAngVel; // filtered angular velocity
+ bool mMoved; // seen to move at least once
+
+public:
+ RegionCrossExtrapolateImpl(const LLViewerObject& vo);
+ void update(); // update on object update message
+ F32 getextraptimelimit() const; // don't extrapolate more than this
+ bool hasmoved() const { return (mMoved); } // true if has been seen to move with sitter
+};
+
+// RegionCrossExtrapolate -- calculate safe limit on how long to extrapolate after a region crossing
+//
+// Member object of llViewerObject. For vehicles, a RegionCrossExtrapolateImpl is allocated to do the real work.
+// Call "update" for each new object update.
+// Call "changedlink" for any object update which changes parenting.
+// Get the extrapolation limit time with getextraptimelimit.
+//
+class RegionCrossExtrapolate
+{
+private:
+ std::unique_ptr mImpl;
+
+protected:
+ bool ifsaton(const LLViewerObject& vo); // true if root object and being sat on
+
+public:
+ void update(const LLViewerObject& vo) // new object update message received
+ {
+ if (mImpl.get())
+ {
+ mImpl->update(); // update extrapolator if present
+ }
+ }
+
+ void changedlink(const LLViewerObject& vo) // parent or child changed, check if extrapolation object needed
+ {
+ if (ifsaton(vo)) // if this object is now the root of a linkset with an avatar
+ {
+ if (!mImpl.get()) // if no extrapolation implementor
+ {
+ mImpl.reset(new RegionCrossExtrapolateImpl(vo)); // add an extrapolator
+ }
+ }
+ else // not a vehicle
+ {
+ if (mImpl.get())
+ {
+ mImpl.reset(); // no longer needed
+ }
+ }
+ }
+
+ bool ismovingssaton(const LLViewerObject &vo)
+ {
+ if (!mImpl.get())
+ {
+ return (false); // not sat on
+ }
+ return mImpl->hasmoved(); // sat on, check for moving
+ }
+
+ F32 getextraptimelimit() const // get extrapolation time limit
+ {
+ if (mImpl.get())
+ {
+ return mImpl->getextraptimelimit(); // get extrapolation time limit if vehicle
+ }
+ return std::numeric_limits::infinity(); // no limit if not a vehicle
+ }
+};
+
+#endif // FS_REGIONCROSS_H
diff --git a/indra/newview/fsversionvalues.h.in b/indra/newview/fsversionvalues.h.in
index 5e4c932b10..359c349103 100755
--- a/indra/newview/fsversionvalues.h.in
+++ b/indra/newview/fsversionvalues.h.in
@@ -42,7 +42,9 @@
#define LL_VIEWER_VERSION_MINOR @VIEWER_VERSION_MINOR@
#define LL_VIEWER_VERSION_PATCH @VIEWER_VERSION_PATCH@
#define LL_VIEWER_VERSION_BUILD @VIEWER_VERSION_REVISION@
+const std::string LL_VIEWER_VERSION_GITHASH {@VIEWER_VERSION_GITHASH@};
#define LLBUILD_CONFIG "@CMAKE_BUILD_TYPE@"
+
//
#endif
diff --git a/indra/newview/icons/nightly-os/firestorm_128.png b/indra/newview/icons/nightly-os/firestorm_128.png
new file mode 100644
index 0000000000..5e367659f3
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_128.png differ
diff --git a/indra/newview/icons/nightly-os/firestorm_16.png b/indra/newview/icons/nightly-os/firestorm_16.png
new file mode 100644
index 0000000000..239e3f6b6f
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_16.png differ
diff --git a/indra/newview/icons/nightly-os/firestorm_256.bmp b/indra/newview/icons/nightly-os/firestorm_256.bmp
new file mode 100644
index 0000000000..9621d199bd
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_256.bmp differ
diff --git a/indra/newview/icons/nightly-os/firestorm_256.png b/indra/newview/icons/nightly-os/firestorm_256.png
new file mode 100644
index 0000000000..210d846e46
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_256.png differ
diff --git a/indra/newview/icons/nightly-os/firestorm_32.png b/indra/newview/icons/nightly-os/firestorm_32.png
new file mode 100644
index 0000000000..09f757a549
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_32.png differ
diff --git a/indra/newview/icons/nightly-os/firestorm_48.png b/indra/newview/icons/nightly-os/firestorm_48.png
new file mode 100644
index 0000000000..ec02fa841d
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_48.png differ
diff --git a/indra/newview/icons/nightly-os/firestorm_512.png b/indra/newview/icons/nightly-os/firestorm_512.png
new file mode 100644
index 0000000000..bc93fe25f0
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_512.png differ
diff --git a/indra/newview/icons/nightly-os/firestorm_icon.icns b/indra/newview/icons/nightly-os/firestorm_icon.icns
new file mode 100644
index 0000000000..6f746bc3d0
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_icon.icns differ
diff --git a/indra/newview/icons/nightly-os/firestorm_icon.ico b/indra/newview/icons/nightly-os/firestorm_icon.ico
new file mode 100644
index 0000000000..52ddcf378d
Binary files /dev/null and b/indra/newview/icons/nightly-os/firestorm_icon.ico differ
diff --git a/indra/newview/icons/nightly/firestorm_128.png b/indra/newview/icons/nightly/firestorm_128.png
new file mode 100644
index 0000000000..9b9c34821e
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_128.png differ
diff --git a/indra/newview/icons/nightly/firestorm_16.png b/indra/newview/icons/nightly/firestorm_16.png
new file mode 100644
index 0000000000..e22c5fb6c4
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_16.png differ
diff --git a/indra/newview/icons/nightly/firestorm_256.BMP b/indra/newview/icons/nightly/firestorm_256.BMP
new file mode 100644
index 0000000000..066b6244b0
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_256.BMP differ
diff --git a/indra/newview/icons/nightly/firestorm_256.png b/indra/newview/icons/nightly/firestorm_256.png
new file mode 100644
index 0000000000..c440137b72
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_256.png differ
diff --git a/indra/newview/icons/nightly/firestorm_32.png b/indra/newview/icons/nightly/firestorm_32.png
new file mode 100644
index 0000000000..fc9e6f0e2c
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_32.png differ
diff --git a/indra/newview/icons/nightly/firestorm_48.png b/indra/newview/icons/nightly/firestorm_48.png
new file mode 100644
index 0000000000..d2f31b77c9
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_48.png differ
diff --git a/indra/newview/icons/nightly/firestorm_512.png b/indra/newview/icons/nightly/firestorm_512.png
new file mode 100644
index 0000000000..ce0742d66a
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_512.png differ
diff --git a/indra/newview/icons/nightly/firestorm_icon.icns b/indra/newview/icons/nightly/firestorm_icon.icns
new file mode 100644
index 0000000000..a39d58ea70
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_icon.icns differ
diff --git a/indra/newview/icons/nightly/firestorm_icon.ico b/indra/newview/icons/nightly/firestorm_icon.ico
new file mode 100644
index 0000000000..8f59ecd435
Binary files /dev/null and b/indra/newview/icons/nightly/firestorm_icon.ico differ
diff --git a/indra/newview/installers/darwin/firestorm-beta-dmg/background.png b/indra/newview/installers/darwin/firestorm-beta-dmg/background.png
old mode 100644
new mode 100755
index a2750cdde5..deafaac687
Binary files a/indra/newview/installers/darwin/firestorm-beta-dmg/background.png and b/indra/newview/installers/darwin/firestorm-beta-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestorm-nightly-dmg/background.png b/indra/newview/installers/darwin/firestorm-nightly-dmg/background.png
old mode 100644
new mode 100755
index 698e148585..28012bbbc5
Binary files a/indra/newview/installers/darwin/firestorm-nightly-dmg/background.png and b/indra/newview/installers/darwin/firestorm-nightly-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestorm-private-dmg/background.png b/indra/newview/installers/darwin/firestorm-private-dmg/background.png
old mode 100644
new mode 100755
index 06b1962584..b41190d81b
Binary files a/indra/newview/installers/darwin/firestorm-private-dmg/background.png and b/indra/newview/installers/darwin/firestorm-private-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestorm-release-dmg/background.png b/indra/newview/installers/darwin/firestorm-release-dmg/background.png
old mode 100644
new mode 100755
index 510d3a0e97..e0f43cf6a9
Binary files a/indra/newview/installers/darwin/firestorm-release-dmg/background.png and b/indra/newview/installers/darwin/firestorm-release-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestormos-beta-dmg/background.png b/indra/newview/installers/darwin/firestormos-beta-dmg/background.png
old mode 100644
new mode 100755
index c62db12109..d71a63016d
Binary files a/indra/newview/installers/darwin/firestormos-beta-dmg/background.png and b/indra/newview/installers/darwin/firestormos-beta-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestormos-nightly-dmg/background.png b/indra/newview/installers/darwin/firestormos-nightly-dmg/background.png
old mode 100644
new mode 100755
index c30527d412..0e134a3c5b
Binary files a/indra/newview/installers/darwin/firestormos-nightly-dmg/background.png and b/indra/newview/installers/darwin/firestormos-nightly-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestormos-private-dmg/background.png b/indra/newview/installers/darwin/firestormos-private-dmg/background.png
old mode 100644
new mode 100755
index b3066bf518..060c54c18a
Binary files a/indra/newview/installers/darwin/firestormos-private-dmg/background.png and b/indra/newview/installers/darwin/firestormos-private-dmg/background.png differ
diff --git a/indra/newview/installers/darwin/firestormos-release-dmg/background.png b/indra/newview/installers/darwin/firestormos-release-dmg/background.png
old mode 100644
new mode 100755
index d772f97a5f..cbc32141dd
Binary files a/indra/newview/installers/darwin/firestormos-release-dmg/background.png and b/indra/newview/installers/darwin/firestormos-release-dmg/background.png differ
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 76a582f936..bb4da6b0d7 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -32,12 +32,14 @@
#include "pipeline.h"
#include "llagentaccess.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llagentlistener.h"
#include "llagentwearables.h"
#include "llagentui.h"
#include "llappearancemgr.h"
#include "llanimationstates.h"
+#include "llavatarappearancedefines.h"
#include "llcallingcard.h"
#include "llchannelmanager.h"
#include "llchicletbar.h"
@@ -3564,10 +3566,17 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO
BOOL LLAgent::canJoinGroups() const
{
- // [CR] FIRE-12229
- //return (S32)mGroups.size() < gMaxAgentGroups;
- return ((!gMaxAgentGroups) || ((S32)mGroups.size() < gMaxAgentGroups));
- // [/CR]
+ // FIRE-12229
+ //return (S32)mGroups.size() < LLAgentBenefitsMgr::current().getGroupMembershipLimit();
+ if (LLGridManager::instance().isInSecondLife())
+ {
+ return (S32)mGroups.size() < LLAgentBenefitsMgr::current().getGroupMembershipLimit();
+ }
+ else
+ {
+ return ((!gMaxAgentGroups) || ((S32)mGroups.size() < gMaxAgentGroups));
+ }
+ //
}
LLQuaternion LLAgent::getHeadRotation()
@@ -5540,10 +5549,7 @@ LLAgentQueryManager::LLAgentQueryManager() :
mNumPendingQueries(0),
mUpdateSerialNum(0)
{
- // BOM fallback legacy opensim
- // for (U32 i = 0; i < BAKED_NUM_INDICES; i++)
- for (U32 i = 0; i < LLVOAvatar::sMaxBakes; i++)
- //
+ for (U32 i = 0; i < BAKED_NUM_INDICES; i++)
{
mActiveCacheQueries[i] = 0;
}
@@ -5952,7 +5958,7 @@ void LLAgent::sendAgentSetAppearance()
BOOL textures_current = gAgentAvatarp->areTexturesCurrent();
// BOM fallback legacy opensim
// for(U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++ )
- for(U8 baked_index = 0; baked_index < LLVOAvatar::sMaxBakes; baked_index++ )
+ for(U8 baked_index = 0; baked_index < gAgentAvatarp->getNumBakes(); baked_index++ )
//
{
const ETextureIndex texture_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);
@@ -5988,7 +5994,7 @@ void LLAgent::sendAgentSetAppearance()
LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "TAT: Sending cached texture data" << LL_ENDL;
// BOM fallback for legacy opensim
// for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
- for (U8 baked_index = 0; baked_index < LLVOAvatar::sMaxBakes; baked_index++)
+ for (U8 baked_index = 0; baked_index < gAgentAvatarp->getNumBakes(); baked_index++)
//
{
BOOL generate_valid_hash = TRUE;
@@ -5997,6 +6003,13 @@ void LLAgent::sendAgentSetAppearance()
generate_valid_hash = FALSE;
LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "Not caching baked texture upload for " << (U32)baked_index << " due to being uploaded at low resolution." << LL_ENDL;
}
+ // Exclude BAKED_SKIRT from being sent if no skirt is worn (should only reach here if it were already baked)
+ if (baked_index == BAKED_SKIRT && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT))
+ {
+ LL_DEBUGS("Avatar") << "Not caching baked texture for unworn skirt." << LL_ENDL;
+ generate_valid_hash = FALSE;
+ }
+ //
const LLUUID hash = gAgentWearables.computeBakedTextureHash((EBakedTextureIndex) baked_index, generate_valid_hash);
if (hash.notNull())
@@ -6008,6 +6021,7 @@ void LLAgent::sendAgentSetAppearance()
}
}
msg->nextBlockFast(_PREHASH_ObjectData);
+ // gAgentAvatarp->dumpAvatarTEs("sendAppearance"); // useful when debugging appeanrce updates
gAgentAvatarp->sendAppearanceMessage( gMessageSystem );
}
else
diff --git a/indra/newview/llagentbenefits.cpp b/indra/newview/llagentbenefits.cpp
new file mode 100644
index 0000000000..d7213daeb1
--- /dev/null
+++ b/indra/newview/llagentbenefits.cpp
@@ -0,0 +1,315 @@
+/**
+* @file llagentbenefits.cpp
+*
+* $LicenseInfo:firstyear=2019&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2019, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+#include "llagentbenefits.h"
+
+// OpenSim legacy economy
+#include "llagent.h"
+#include "llagentpicksinfo.h"
+#include "lleconomy.h"
+#include "llstartup.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
+#include "llviewerregion.h"
+//
+
+LLAgentBenefits::LLAgentBenefits():
+ m_initalized(false),
+ m_animated_object_limit(-1),
+ m_animation_upload_cost(-1),
+ m_attachment_limit(-1),
+ m_group_membership_limit(-1),
+ m_picks_limit(-1),
+ m_sound_upload_cost(-1),
+ m_texture_upload_cost(-1),
+ m_create_group_cost(-1)
+{
+}
+
+LLAgentBenefits::~LLAgentBenefits()
+{
+}
+
+// This could be extended to a template scheme or otherwise modified
+// to support other types, if and when needed. Currently all fields
+// the viewer cares about are integer.
+bool get_required_S32(const LLSD& sd, const LLSD::String& key, S32& value)
+{
+ value = -1;
+ if (sd.has(key))
+ {
+ value = sd[key].asInteger();
+ return true;
+ }
+
+ LL_WARNS("Benefits") << "Missing required benefit field " << key << LL_ENDL;
+ return false;
+}
+
+bool LLAgentBenefits::init(const LLSD& benefits_sd)
+{
+ LL_DEBUGS("Benefits") << "initializing benefits from " << benefits_sd << LL_ENDL;
+
+ if (!get_required_S32(benefits_sd, "animated_object_limit", m_animated_object_limit))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "animation_upload_cost", m_animation_upload_cost))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "attachment_limit", m_attachment_limit))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "create_group_cost", m_create_group_cost))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "group_membership_limit", m_group_membership_limit))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "picks_limit", m_picks_limit))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "sound_upload_cost", m_sound_upload_cost))
+ {
+ return false;
+ }
+ if (!get_required_S32(benefits_sd, "texture_upload_cost", m_texture_upload_cost))
+ {
+ return false;
+ }
+
+ // FIXME PREMIUM - either use this field or get rid of it
+ m_initalized = true;
+ return true;
+}
+
+S32 LLAgentBenefits::getAnimatedObjectLimit() const
+{
+ // OpenSim legacy economy
+ //return m_animated_object_limit;
+ if (LLGridManager::instance().isInSecondLife())
+ {
+ return m_animated_object_limit;
+ }
+ else
+ {
+ S32 max_attach = 0;
+ if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits"))
+ {
+ max_attach = getAttachmentLimit();
+ }
+ else
+ {
+ if (gAgent.getRegion())
+ {
+ LLSD features;
+ gAgent.getRegion()->getSimulatorFeatures(features);
+ if (features.has("AnimatedObjects"))
+ {
+ max_attach = features["AnimatedObjects"]["MaxAgentAnimatedObjectAttachments"].asInteger();
+ }
+ }
+ }
+ return max_attach;
+ }
+ //
+}
+
+S32 LLAgentBenefits::getAnimationUploadCost() const
+{
+ // OpenSim legacy economy
+ //return m_animation_upload_cost;
+ return LLGridManager::instance().isInSecondLife() ? m_animation_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
+ //
+}
+
+S32 LLAgentBenefits::getAttachmentLimit() const
+{
+ // OpenSim legacy economy
+ //return m_attachment_limit;
+ if (LLGridManager::instance().isInSecondLife())
+ {
+ return m_attachment_limit;
+ }
+ else
+ {
+ const S32 MAX_AGENT_ATTACHMENTS = 38;
+
+ S32 max_attach = MAX_AGENT_ATTACHMENTS;
+
+ if (gAgent.getRegion())
+ {
+ LLSD features;
+ gAgent.getRegion()->getSimulatorFeatures(features);
+ if (features.has("MaxAgentAttachments"))
+ {
+ max_attach = features["MaxAgentAttachments"].asInteger();
+ }
+ }
+ return max_attach;
+ }
+ //
+}
+
+S32 LLAgentBenefits::getCreateGroupCost() const
+{
+ // OpenSim legacy economy
+ //return m_create_group_cost;
+ return LLGridManager::instance().isInSecondLife() ? m_create_group_cost : 0;
+ //
+}
+
+S32 LLAgentBenefits::getGroupMembershipLimit() const
+{
+ // OpenSim legacy economy
+ //return m_group_membership_limit;
+ return LLGridManager::instance().isInSecondLife() ? m_group_membership_limit : gMaxAgentGroups;
+ //
+}
+
+S32 LLAgentBenefits::getPicksLimit() const
+{
+ // OpenSim legacy economy
+ //return m_picks_limit;
+ return LLGridManager::instance().isInSecondLife() ? m_picks_limit : LLAgentPicksInfo::instance().getMaxNumberOfPicks();
+ //
+}
+
+S32 LLAgentBenefits::getSoundUploadCost() const
+{
+ // OpenSim legacy economy
+ //return m_sound_upload_cost;
+ return LLGridManager::instance().isInSecondLife() ? m_sound_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
+ //
+}
+
+S32 LLAgentBenefits::getTextureUploadCost() const
+{
+ // OpenSim legacy economy
+ //return m_texture_upload_cost;
+ return LLGridManager::instance().isInSecondLife() ? m_texture_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
+ //
+}
+
+bool LLAgentBenefits::findUploadCost(LLAssetType::EType& asset_type, S32& cost) const
+{
+ bool succ = false;
+ if (asset_type == LLAssetType::AT_TEXTURE)
+ {
+ cost = getTextureUploadCost();
+ succ = true;
+ }
+ else if (asset_type == LLAssetType::AT_SOUND)
+ {
+ cost = getSoundUploadCost();
+ succ = true;
+ }
+ else if (asset_type == LLAssetType::AT_ANIMATION)
+ {
+ cost = getAnimationUploadCost();
+ succ = true;
+ }
+ return succ;
+}
+
+LLAgentBenefitsMgr::LLAgentBenefitsMgr()
+{
+}
+
+LLAgentBenefitsMgr::~LLAgentBenefitsMgr()
+{
+}
+
+// static
+const LLAgentBenefits& LLAgentBenefitsMgr::current()
+{
+ return instance().mCurrent;
+}
+
+// static
+const LLAgentBenefits& LLAgentBenefitsMgr::get(const std::string& package)
+{
+ if (instance().mPackageMap.find(package) != instance().mPackageMap.end())
+ {
+ return instance().mPackageMap[package];
+ }
+ else
+ {
+ return instance().mDefault;
+ }
+}
+
+// static
+bool LLAgentBenefitsMgr::init(const std::string& package, const LLSD& benefits_sd)
+{
+ LLAgentBenefits benefits;
+ if (!benefits.init(benefits_sd))
+ {
+ LL_WARNS("Benefits") << "Unable to initialize package " << package << " from sd " << benefits_sd << LL_ENDL;
+ return false;
+ }
+ else
+ {
+ instance().mPackageMap[package] = benefits;
+ }
+ return true;
+
+}
+
+// static
+bool LLAgentBenefitsMgr::initCurrent(const std::string& package, const LLSD& benefits_sd)
+{
+ LLAgentBenefits benefits;
+ if (!benefits.init(benefits_sd))
+ {
+ LL_WARNS("Benefits") << "Unable to initialize package " << package << " from sd " << benefits_sd << LL_ENDL;
+ return false;
+ }
+ else
+ {
+ instance().mCurrent = benefits;
+ instance().mCurrentName = package;
+ }
+ return true;
+
+}
+
+// static
+bool LLAgentBenefitsMgr::has(const std::string& package)
+{
+ return instance().mPackageMap.find(package) != instance().mPackageMap.end();
+}
+
+//static
+bool LLAgentBenefitsMgr::isCurrent(const std::string& package)
+{
+ return instance().mCurrentName == package;
+}
diff --git a/indra/newview/llagentbenefits.h b/indra/newview/llagentbenefits.h
new file mode 100644
index 0000000000..48aa6bd869
--- /dev/null
+++ b/indra/newview/llagentbenefits.h
@@ -0,0 +1,88 @@
+/**
+* @file llagentbenefits.h
+*
+* $LicenseInfo:firstyear=2019&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2019, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_AGENTBENEFITS_H
+#define LL_AGENTBENEFITS_H
+
+#include "llsingleton.h"
+#include "llsd.h"
+#include "llassettype.h"
+
+class LLAgentBenefits
+{
+public:
+ LLAgentBenefits();
+ ~LLAgentBenefits();
+ LOG_CLASS(LLAgentBenefits);
+
+ bool init(const LLSD& benefits_sd);
+
+ S32 getAnimatedObjectLimit() const;
+ S32 getAnimationUploadCost() const;
+ S32 getAttachmentLimit() const;
+ S32 getCreateGroupCost() const;
+ S32 getGroupMembershipLimit() const;
+ S32 getPicksLimit() const;
+ S32 getSoundUploadCost() const;
+ S32 getTextureUploadCost() const;
+
+ bool findUploadCost(LLAssetType::EType& asset_type, S32& cost) const;
+
+private:
+ S32 m_animated_object_limit;
+ S32 m_animation_upload_cost;
+ S32 m_attachment_limit;
+ S32 m_create_group_cost;
+ S32 m_group_membership_limit;
+ S32 m_picks_limit;
+ S32 m_sound_upload_cost;
+ S32 m_texture_upload_cost;
+
+ bool m_initalized;
+};
+
+class LLAgentBenefitsMgr: public LLSingleton
+{
+ LLSINGLETON(LLAgentBenefitsMgr);
+ ~LLAgentBenefitsMgr();
+ LOG_CLASS(LLAgentBenefitsMgr);
+
+public:
+ static const LLAgentBenefits& current();
+ static const LLAgentBenefits& get(const std::string& package);
+ static bool init(const std::string& package, const LLSD& benefits_sd);
+ static bool initCurrent(const std::string& package, const LLSD& benefits_sd);
+ static bool has(const std::string& package);
+ static bool isCurrent(const std::string& package);
+
+private:
+ std::string mCurrentName;
+ LLAgentBenefits mCurrent;
+ LLAgentBenefits mDefault;
+ std::map mPackageMap;
+};
+
+
+#endif
diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp
index 799060eeab..2d23c937cc 100644
--- a/indra/newview/llagentpicksinfo.cpp
+++ b/indra/newview/llagentpicksinfo.cpp
@@ -28,6 +28,7 @@
#include "llagentpicksinfo.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llavatarpropertiesprocessor.h"
const S32 MAX_AVATAR_PICKS = 10;
@@ -112,7 +113,9 @@ void LLAgentPicksInfo::requestNumberOfPicks()
bool LLAgentPicksInfo::isPickLimitReached()
{
- return getNumberOfPicks() >= getMaxNumberOfPicks();
+ // Picks premium perks integration
+ //return getNumberOfPicks() >= getMaxNumberOfPicks();
+ return getNumberOfPicks() >= LLAgentBenefitsMgr::current().getPicksLimit();
}
void LLAgentPicksInfo::onServerRespond(LLAvatarPicks* picks)
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index df3cce5cb6..d6d7f71b88 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -105,26 +105,29 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
pos_y -= pos_y % 2;
}
- // FIRE-1874: Show server channel in statusbar
+ // FIRE-1874: Show server version in statusbar
static LLCachedControl fsStatusbarShowSimulatorVersion(gSavedSettings, "FSStatusbarShowSimulatorVersion");
- static LLCachedControl fsReleaseCandidateChannelId(gSavedSettings, "FSReleaseCandidateChannelId");
- std::string simulator_channel;
+ std::string simulator_version;
if (fsStatusbarShowSimulatorVersion)
{
std::istringstream simulator_name(gLastVersionChannel);
- std::string rc_part;
+ std::string version_part;
- // RC identifier should be at 3rd position, RC name is at 4th
- if ((simulator_name >> rc_part) &&
- (simulator_name >> rc_part) &&
- ((simulator_name >> rc_part) && rc_part == std::string(fsReleaseCandidateChannelId)) &&
- (simulator_name >> rc_part))
+ // Format is "Second Life Server 2020-03-20T18:40:52.538914"
+ if ((simulator_name >> version_part) &&
+ (simulator_name >> version_part) &&
+ (simulator_name >> version_part) &&
+ (simulator_name >> version_part))
{
- simulator_channel = rc_part;
+ size_t version_start = version_part.rfind('.');
+ if (version_start != std::string::npos && version_start != version_part.length() - 1)
+ {
+ simulator_version = version_part.substr(version_start + 1);
+ }
}
}
- // FIRE-1874: Show server channel in statusbar
+ // FIRE-1874: Show server version in statusbar
// create a default name and description for the landmark
std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
@@ -179,11 +182,11 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
break;
// V1 format statusbar
case LOCATION_FORMAT_V1:
- if (fsStatusbarShowSimulatorVersion && !simulator_channel.empty())
+ if (fsStatusbarShowSimulatorVersion && !simulator_version.empty())
{
buffer = llformat("%s - %s - (%d, %d, %d)%s%s",
region_name.c_str(),
- simulator_channel.c_str(),
+ simulator_version.c_str(),
pos_x, pos_y, pos_z,
sim_access_string.empty() ? "" : " - ",
sim_access_string.c_str());
@@ -198,11 +201,11 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
}
break;
case LOCATION_FORMAT_V1_NO_COORDS:
- if (fsStatusbarShowSimulatorVersion && !simulator_channel.empty())
+ if (fsStatusbarShowSimulatorVersion && !simulator_version.empty())
{
buffer = llformat("%s - %s%s%s",
region_name.c_str(),
- simulator_channel.c_str(),
+ simulator_version.c_str(),
sim_access_string.empty() ? "" : " - ",
sim_access_string.c_str());
}
@@ -256,11 +259,11 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
break;
// V1 format statusbar
case LOCATION_FORMAT_V1:
- if (fsStatusbarShowSimulatorVersion && !simulator_channel.empty())
+ if (fsStatusbarShowSimulatorVersion && !simulator_version.empty())
{
buffer = llformat("%s - %s - (%d, %d, %d)%s%s - %s",
region_name.c_str(),
- simulator_channel.c_str(),
+ simulator_version.c_str(),
pos_x, pos_y, pos_z,
sim_access_string.empty() ? "" : " - ",
sim_access_string.c_str(),
@@ -277,11 +280,11 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
}
break;
case LOCATION_FORMAT_V1_NO_COORDS:
- if (fsStatusbarShowSimulatorVersion && !simulator_channel.empty())
+ if (fsStatusbarShowSimulatorVersion && !simulator_version.empty())
{
buffer = llformat("%s - %s%s%s - %s",
region_name.c_str(),
- simulator_channel.c_str(),
+ simulator_version.c_str(),
sim_access_string.empty() ? "" : " - ",
sim_access_string.c_str(),
parcel_name.c_str());
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index f174642f20..07934ba528 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -2142,7 +2142,7 @@ void LLAgentWearables::queryWearableCache()
S32 num_queries = 0;
// BOM fallback for legacy opensim
// for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
- for (U8 baked_index = 0; baked_index < LLVOAvatar::sMaxBakes; baked_index++)
+ for (U8 baked_index = 0; baked_index < gAgentAvatarp->getNumBakes(); baked_index++)
//
{
LLUUID hash_id = computeBakedTextureHash((EBakedTextureIndex) baked_index);
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index a5a8891aad..bb21cb7026 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -388,20 +388,6 @@ void LLAppCoreHttp::refreshSettings(bool initial)
// Global pipelining setting
bool pipeline_changed(false);
static const std::string http_pipelining("HttpPipelining");
-// FIRE-17287: Force HttpPipelining off on OpenSim
-#ifdef OPENSIM
- if (LLGridManager::instance().isInOpenSim())
- {
- if (mPipelined)
- {
- mPipelined = false;
- pipeline_changed = true;
- }
- LL_INFOS() << "HTTP Pipelining is not supported on OpenSim - setting to disabled." << LL_ENDL;
- }
- else
-#endif
-//
if (gSavedSettings.controlExists(http_pipelining))
{
// Default to true (in ctor) if absent.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3acbf3ea5f..b6ce8e5478 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -485,6 +485,7 @@ void init_default_trans_args()
default_trans_args.insert("create_account_url");
default_trans_args.insert("DOWNLOAD_URL"); // Viewer download url
default_trans_args.insert("VIEWER_GENERATION"); // Viewer generation (major version number)
+ default_trans_args.insert("SHORT_VIEWER_GENERATION"); // Viewer generation (major version number)
default_trans_args.insert("APP_NAME_ABBR"); // Appreviated application title
}
@@ -743,7 +744,8 @@ LLAppViewer::LLAppViewer()
mReportedCrash(false),
mNumSessions(0),
mPurgeCache(false),
- mPurgeOnExit(false),
+ mPurgeCacheOnExit(false),
+ mPurgeUserDataOnExit(false),
mSecondInstance(false),
mSavedFinalSnapshot(false),
mSavePerAccountSettings(false), // don't save settings on logout unless login succeeded.
@@ -850,16 +852,7 @@ void fast_exit(int rc)
bool LLAppViewer::init()
{
- // Breakpad merge, setup minidump type from Catznip.
-
- // setupErrorHandling(mSecondInstance);
- EMiniDumpType minidump_type = MINIDUMP_NORMAL;
- if (gSavedSettings.controlExists("SaveMiniDumpType"))
- minidump_type = (LLApp::EMiniDumpType)gSavedSettings.getU32("SaveMiniDumpType");
-
- setupErrorHandling( mSecondInstance, minidump_type );
-
- //
+ setupErrorHandling(mSecondInstance);
nd::octree::debug::setOctreeLogFilename( gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "octree.log" ) ); // Filename to log octree options to.
nd::etw::init(); // Init event tracing.
@@ -2328,7 +2321,7 @@ bool LLAppViewer::cleanup()
LLConversationLog::instance().cache();
}
- if (mPurgeOnExit)
+ if (mPurgeCacheOnExit)
{
LL_INFOS() << "Purging all cache files on exit" << LL_ENDL;
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""), "*.*");
@@ -2371,6 +2364,14 @@ bool LLAppViewer::cleanup()
}
}
+ if (mPurgeUserDataOnExit)
+ {
+ // Ideally we should not save anything from this session since it is going to be purged now,
+ // but this is a very 'rare' case (user deleting himself), not worth overcomplicating 'save&cleanup' code
+ std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + LLStartUp::getUserId();
+ gDirUtilp->deleteDirAndContents(user_path);
+ }
+
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
mAppCoreHttp.requestStop();
@@ -3473,6 +3474,7 @@ void LLAppViewer::initStrings()
LLStringUtil:: format_map_t gen_args;
gen_args["[VERSION]"] = llformat("%d", LLVersionInfo::getInstance()->getMajor());
LLTrans::setDefaultArg("[VIEWER_GENERATION]", LLTrans::getString("VIEWER_GENERATION", gen_args));
+ LLTrans::setDefaultArg("[SHORT_VIEWER_GENERATION]", LLTrans::getString("SHORT_VIEWER_GENERATION", gen_args));
//
}
@@ -4170,7 +4172,11 @@ void LLAppViewer::writeSystemInfo()
// Dump some debugging info
LL_INFOS("SystemInfo") << "Application: " << LLTrans::getString("APP_NAME") << LL_ENDL;
- LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::instance().getChannelAndVersion() << LL_ENDL;
+
+ // Print into about git sha hash this build is based on.
+ // LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::getChannelAndVersion() << LL_ENDL;
+ LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::instance().getChannelAndVersion() << " [" << LLVersionInfo::instance().getGitHash() << "]" << LL_ENDL;
+ //
// Dump the local time and time zone
time_t now;
@@ -5286,7 +5292,7 @@ void LLAppViewer::badNetworkHandler()
// Flush all of our caches on exit in the case of disconnect due to
// invalid packets.
- mPurgeOnExit = TRUE;
+ mPurgeCacheOnExit = TRUE;
std::ostringstream message;
message <<
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 4471399ef1..cb85fd3276 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -202,6 +202,7 @@ public:
void addOnIdleCallback(const boost::function& cb); // add a callback to fire (once) when idle
+ void purgeUserDataOnExit() { mPurgeUserDataOnExit = true; }
void purgeCache(); // Clear the local cache.
void purgeCacheImmediate(); //clear local cache immediately.
S32 updateTextureThreads(F32 max_time);
@@ -299,9 +300,10 @@ private:
std::string mSerialNumber;
bool mPurgeCache;
+ bool mPurgeCacheOnExit;
+ bool mPurgeUserDataOnExit;
bool mPurgeSettings; //
bool mPurgeTextures; // FIRE-13066
- bool mPurgeOnExit;
LLViewerJoystick* joystick;
bool mSavedFinalSnapshot;
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d449253ac9..35b58b1ce2 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -76,7 +76,13 @@
// Bugsplat (http://bugsplat.com) crash reporting tool
#ifdef LL_BUGSPLAT
#include "BugSplat.h"
-#include "reader.h" // JsonCpp
+
+#if LL_USESYSTEMLIBS
+#include "jsoncpp/reader.h" // JSON
+#else
+#include "json/reader.h" // JSON
+#endif
+
#include "llagent.h" // for agent location
#include "llviewerregion.h"
#include "llvoavatarself.h" // for agent name
@@ -121,27 +127,49 @@ namespace
{
// send the main viewer log file
// widen to wstring, convert to __wchar_t, then pass c_str()
- sBugSplatSender->sendAdditionalFile(
- WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log")));
+
+ // We don't send log files
+ // sBugSplatSender->sendAdditionalFile(
+ // WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.log")));
+ //
+
+ // sBugSplatSender->sendAdditionalFile(
+ // WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml")));
+
+ if (gCrashSettings.getBOOL("CrashSubmitSettings"))
+ sBugSplatSender->sendAdditionalFile( WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml")));
- sBugSplatSender->sendAdditionalFile(
- WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml")));
sBugSplatSender->sendAdditionalFile(
WCSTR(*LLAppViewer::instance()->getStaticDebugFile()));
// We don't have an email address for any user. Hijack this
// metadata field for the platform identifier.
- sBugSplatSender->setDefaultUserEmail(
- WCSTR(STRINGIZE(LLOSInfo::instance().getOSStringSimple() << " ("
- << ADDRESS_SIZE << "-bit)")));
+ // sBugSplatSender->setDefaultUserEmail(
+ // WCSTR(STRINGIZE(LLOSInfo::instance().getOSStringSimple() << " ("
+ // << ADDRESS_SIZE << "-bit)")));
- if (gAgentAvatarp)
+ // Add which flavor of FS generated an error
+ std::string flavor = "hvk";
+#ifdef OPENSIM
+ flavor = "oss";
+#endif
+ sBugSplatSender->setDefaultUserEmail( WCSTR(STRINGIZE(LLOSInfo::instance().getOSStringSimple() << " (" << ADDRESS_SIZE << "-bit, flavor " << flavor <<")")));
+ //
+
+ // Only send avatar name if enabled via prefs
+ if (gCrashSettings.getBOOL("CrashSubmitName"))
{
- // user name, when we have it
- sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
+ //
+ if (gAgentAvatarp)
+ {
+ // user name, when we have it
+ sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
+ }
+ // Only send avatar name if enabled via prefs
}
-
+ //
+
// LL_ERRS message, when there is one
sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage()));
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 1b5b2d48bd..c64d298f0c 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -674,3 +674,14 @@ void LLControlAvatar::onRegionChanged()
cav->mRegionChanged = true;
}
}
+
+// FIRE-29012: Standalone animesh avatars get affected by complexity limit
+bool LLControlAvatar::isTooComplex() const
+{
+ if (mRootVolp && !mRootVolp->isAttachment())
+ {
+ return false;
+ }
+ return LLVOAvatar::isTooComplex();
+}
+//
diff --git a/indra/newview/llcontrolavatar.h b/indra/newview/llcontrolavatar.h
index 288d07cd48..4fd0075be7 100644
--- a/indra/newview/llcontrolavatar.h
+++ b/indra/newview/llcontrolavatar.h
@@ -76,6 +76,9 @@ public:
virtual bool shouldRenderRigged() const;
virtual BOOL isImpostor();
+
+ bool isTooComplex() const; // FIRE-29012: Standalone animesh avatars get affected by complexity limit
+
bool mPlaying;
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 396fbbd586..5f6003c69b 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -666,10 +666,10 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram
}
else
{
- // Don't use fixed functions when using shader renderer; found by Drake Arconis
- if (!LLGLSLShader::sNoFixedFunction)
- {
- //
+ // Don't use fixed functions when using shader renderer; found by Drake Arconis
+ if (!LLGLSLShader::sNoFixedFunction)
+ {
+ //
LLGLEnable fog(GL_FOG);
glFogi(GL_FOG_MODE, GL_LINEAR);
float d = (LLViewerCamera::getInstance()->getPointOfInterest() - LLViewerCamera::getInstance()->getOrigin()).magVec();
@@ -677,9 +677,9 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram
glFogf(GL_FOG_START, d);
glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
glFogfv(GL_FOG_COLOR, fogCol.mV);
- // Don't use fixed functions when using shader renderer; found by Drake Arconis
- }
- //
+ // Don't use fixed functions when using shader renderer; found by Drake Arconis
+ }
+ //
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
{
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 2e5fff5589..991a68b3d7 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -143,6 +143,10 @@ BOOL LLFloaterAbout::postBuild()
// boost::bind(&LLFloaterAbout::onClickUpdateCheck, this));
//
+#if LL_FMODSTUDIO || LL_FMODEX
+ childSetVisible("logos_panel", true);
+#endif
+
static const LLUIColor about_color = LLUIColorTable::instance().getColor("TextFgReadOnlyColor");
if (gAgent.getRegion())
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index b0867f10aa..d5248267f1 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -31,13 +31,13 @@
#include "llbvhloader.h"
#include "lldatapacker.h"
#include "lldir.h"
-#include "lleconomy.h"
#include "llnotificationsutil.h"
#include "llvfile.h"
#include "llapr.h"
#include "llstring.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llanimationstates.h"
#include "llbbox.h"
#include "llbutton.h"
@@ -72,7 +72,12 @@ S32 LLFloaterBvhPreview::sOwnAvatarInstanceCount = 0; // Preview on own ava
const S32 PREVIEW_BORDER_WIDTH = 2;
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
-const S32 PREF_BUTTON_HEIGHT = 16;
+// Fix preview window location
+//const S32 PREVIEW_VPAD = 35;
+//const S32 PREF_BUTTON_HEIGHT = 16 + 35;
+const S32 PREVIEW_VPAD = 70;
+const S32 PREF_BUTTON_HEIGHT = 16 + PREVIEW_VPAD;
+//
const S32 PREVIEW_TEXTURE_HEIGHT = 300;
const F32 PREVIEW_CAMERA_DISTANCE = 4.f;
@@ -244,7 +249,7 @@ BOOL LLFloaterBvhPreview::postBuild()
reshape(rect.getWidth(), rect.getHeight() + PREVIEW_TEXTURE_HEIGHT-30);
mPreviewRect.set(PREVIEW_HPAD,
- PREVIEW_TEXTURE_HEIGHT,
+ PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD,
getRect().getWidth() - PREVIEW_HPAD,
PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
mPreviewImageRect.set(0.f, 1.f, 1.f, 0.f);
@@ -556,30 +561,30 @@ void LLFloaterBvhPreview::draw()
//gGL.begin( LLRender::QUADS );
//{
// gGL.texCoord2f(0.f, 1.f);
- // gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ // gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
// gGL.texCoord2f(0.f, 0.f);
// gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
// gGL.texCoord2f(1.f, 0.f);
// gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
// gGL.texCoord2f(1.f, 1.f);
- // gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ // gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
//}
//gGL.end();
gGL.begin( LLRender::TRIANGLES );
{
gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(0.f, 1.f);
- gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
gGL.texCoord2f(1.f, 1.f);
- gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT);
+ gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
}
gGL.end();
//
@@ -1419,16 +1424,18 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
{
std::string name = floaterp->getChild("name_form")->getValue().asString();
std::string desc = floaterp->getChild("description_form")->getValue().asString();
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
- LLResourceUploadInfo::ptr_t assetUpdloadInfo(new LLResourceUploadInfo(
+ LLResourceUploadInfo::ptr_t assetUploadInfo(new LLResourceUploadInfo(
floaterp->mTransactionID, LLAssetType::AT_ANIMATION,
name, desc, 0,
LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION,
- LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
expected_upload_cost));
- upload_new_resource(assetUpdloadInfo);
+ upload_new_resource(assetUploadInfo);
}
else
{
diff --git a/indra/newview/llfloaterforgetuser.cpp b/indra/newview/llfloaterforgetuser.cpp
index cecf13fa66..4e955c7e02 100644
--- a/indra/newview/llfloaterforgetuser.cpp
+++ b/indra/newview/llfloaterforgetuser.cpp
@@ -29,11 +29,15 @@
#if 0
#include "llfloaterforgetuser.h"
+#include "llappviewer.h"
#include "llcheckboxctrl.h"
#include "llfavoritesbar.h"
+#include "llnotificationsutil.h"
#include "llpanellogin.h" // for helper function getUserName() and to repopulate list if nessesary
#include "llscrolllistctrl.h"
#include "llsecapi.h"
+#include "llstartup.h"
+#include "llviewercontrol.h"
#include "llviewernetwork.h"
@@ -54,52 +58,69 @@ LLFloaterForgetUser::~LLFloaterForgetUser()
BOOL LLFloaterForgetUser::postBuild()
{
- // Note, storage works per grid, watever is selected currently in login screen or logged in.
- // Since login screen can change grid, store the value.
- mGrid = LLGridManager::getInstance()->getGrid();
+ mScrollList = getChild("user_list");
- LLScrollListCtrl *scroll_list = getChild("user_list");
- if (gSecAPIHandler->hasCredentialMap("login_list", mGrid))
+
+ bool show_grid_marks = gSavedSettings.getBOOL("ForceShowGrid");
+ show_grid_marks |= !LLGridManager::getInstance()->isInProductionGrid();
+
+ std::map known_grids = LLGridManager::getInstance()->getKnownGrids();
+
+ if (!show_grid_marks)
{
- LLSecAPIHandler::credential_map_t credencials;
- gSecAPIHandler->loadCredentialMap("login_list", mGrid, credencials);
-
- LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
- LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
- while (cr_iter != cr_end)
+ // Figure out if there are records for more than one grid in storage
+ for (std::map::iterator grid_iter = known_grids.begin();
+ grid_iter != known_grids.end();
+ grid_iter++)
{
- if (cr_iter->second.notNull()) // basic safety
+ if (!grid_iter->first.empty()
+ && grid_iter->first != MAINGRID) // a workaround since 'mIsInProductionGrid' might not be set
{
- LLScrollListItem::Params item_params;
- item_params.value(cr_iter->first);
- item_params.columns.add()
- .value(LLPanelLogin::getUserName(cr_iter->second))
- .column("user")
- .font(LLFontGL::getFontSansSerifSmall());
- scroll_list->addRow(item_params, ADD_BOTTOM);
+ if (!gSecAPIHandler->emptyCredentialMap("login_list", grid_iter->first))
+ {
+ show_grid_marks = true;
+ break;
+ }
+
+ // "Legacy" viewer support
+ LLPointer cred = gSecAPIHandler->loadCredential(grid_iter->first);
+ if (cred.notNull())
+ {
+ const LLSD &ident = cred->getIdentifier();
+ if (ident.isMap() && ident.has("type"))
+ {
+ show_grid_marks = true;
+ break;
+ }
+ }
}
- cr_iter++;
}
- scroll_list->selectFirstItem();
+ }
+
+ mUserGridsCount.clear();
+ if (!show_grid_marks)
+ {
+ // just load maingrid
+ loadGridToList(MAINGRID, false);
}
else
{
- LLPointer cred = gSecAPIHandler->loadCredential(mGrid);
- if (cred.notNull())
+ for (std::map::iterator grid_iter = known_grids.begin();
+ grid_iter != known_grids.end();
+ grid_iter++)
{
- LLScrollListItem::Params item_params;
- item_params.value(cred->userID());
- item_params.columns.add()
- .value(LLPanelLogin::getUserName(cred))
- .column("user")
- .font(LLFontGL::getFontSansSerifSmall());
- scroll_list->addRow(item_params, ADD_BOTTOM);
- scroll_list->selectFirstItem();
+ if (!grid_iter->first.empty())
+ {
+ loadGridToList(grid_iter->first, true);
+ }
}
}
- bool enable_button = scroll_list->getFirstSelectedIndex() != -1;
- getChild("delete_data")->setEnabled(enable_button);
+ mScrollList->selectFirstItem();
+ bool enable_button = mScrollList->getFirstSelectedIndex() != -1;
+ LLCheckBoxCtrl *chk_box = getChild("delete_data");
+ chk_box->setEnabled(enable_button);
+ chk_box->set(FALSE);
LLButton *button = getChild("forget");
button->setEnabled(enable_button);
button->setCommitCallback(boost::bind(&LLFloaterForgetUser::onForgetClicked, this));
@@ -109,36 +130,88 @@ BOOL LLFloaterForgetUser::postBuild()
void LLFloaterForgetUser::onForgetClicked()
{
- mLoginPanelDirty = true;
LLScrollListCtrl *scroll_list = getChild("user_list");
- std::string user_key = scroll_list->getSelectedValue();
+ LLSD user_data = scroll_list->getSelectedValue();
+ const std::string user_id = user_data["user_id"];
- // remove creds
- gSecAPIHandler->removeFromCredentialMap("login_list", mGrid, user_key);
-
- LLPointer cred = gSecAPIHandler->loadCredential(mGrid);
- if (cred.notNull() && cred->userID() == user_key)
- {
- gSecAPIHandler->deleteCredential(cred);
- }
-
- // Clean data
LLCheckBoxCtrl *chk_box = getChild("delete_data");
BOOL delete_data = chk_box->getValue();
- if (delete_data)
+
+ if (delete_data && mUserGridsCount[user_id] > 1)
{
- // key is edentical to one we use for name of user's folder
- std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + user_key;
- gDirUtilp->deleteDirAndContents(user_path);
-
- // Clean favorites, label is edentical to username
- LLFavoritesOrderStorage::removeFavoritesRecordOfUser(scroll_list->getSelectedItemLabel(), mGrid);
-
- // Note: we do not clean user-related files from cache because there are id dependent (inventory)
- // files and cache has separate cleaning mechanism either way.
- // Also this only cleans user from current grid, not all of them.
+ // more than 1 grid uses this id
+ LLNotificationsUtil::add("LoginRemoveMultiGridUserData", LLSD(), LLSD(), boost::bind(&LLFloaterForgetUser::onConfirmForget, this, _1, _2));
+ return;
}
+ processForgetUser();
+}
+
+bool LLFloaterForgetUser::onConfirmForget(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ processForgetUser();
+ }
+ return false;
+}
+
+// static
+bool LLFloaterForgetUser::onConfirmLogout(const LLSD& notification, const LLSD& response, const std::string &fav_id, const std::string &grid)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ // Remove creds
+ gSecAPIHandler->removeFromCredentialMap("login_list", grid, LLStartUp::getUserId());
+
+ LLPointer cred = gSecAPIHandler->loadCredential(grid);
+ if (cred.notNull() && cred->userID() == LLStartUp::getUserId())
+ {
+ gSecAPIHandler->deleteCredential(cred);
+ }
+
+ // Clean favorites
+ LLFavoritesOrderStorage::removeFavoritesRecordOfUser(fav_id, grid);
+
+ // mark data for removal
+ LLAppViewer::instance()->purgeUserDataOnExit();
+ LLAppViewer::instance()->requestQuit();
+ }
+ return false;
+}
+
+void LLFloaterForgetUser::processForgetUser()
+{
+ LLScrollListCtrl *scroll_list = getChild("user_list");
+ LLCheckBoxCtrl *chk_box = getChild("delete_data");
+ BOOL delete_data = chk_box->getValue();
+ LLSD user_data = scroll_list->getSelectedValue();
+ const std::string user_id = user_data["user_id"];
+ const std::string grid = user_data["grid"];
+ const std::string user_name = user_data["label"]; // for favorites
+
+ if (delete_data && user_id == LLStartUp::getUserId() && LLStartUp::getStartupState() > STATE_LOGIN_WAIT)
+ {
+ // we can't delete data for user that is currently logged in
+ // we need to pass grid because we are deleting data universal to grids, but specific grid's user
+ LLNotificationsUtil::add("LoginCantRemoveCurUsername", LLSD(), LLSD(), boost::bind(onConfirmLogout, _1, _2, user_name, grid));
+ return;
+ }
+
+ // key is used for name of user's folder and in credencials
+ // user_name is edentical to favorite's username
+ forgetUser(user_id, user_name, grid, delete_data);
+ mLoginPanelDirty = true;
+ if (delete_data)
+ {
+ mUserGridsCount[user_id] = 0; //no data left to care about
+ }
+ else
+ {
+ mUserGridsCount[user_id]--;
+ }
// Update UI
scroll_list->deleteSelectedItems();
@@ -150,5 +223,126 @@ void LLFloaterForgetUser::onForgetClicked()
chk_box->setEnabled(false);
}
}
+
+//static
+void LLFloaterForgetUser::forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data)
+{
+ // Remove creds
+ gSecAPIHandler->removeFromCredentialMap("login_list", grid, userid);
+
+ LLPointer cred = gSecAPIHandler->loadCredential(grid);
+ if (cred.notNull() && cred->userID() == userid)
+ {
+ gSecAPIHandler->deleteCredential(cred);
+ }
+
+ // Clean data
+ if (delete_data)
+ {
+ std::string user_path = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter() + userid;
+ gDirUtilp->deleteDirAndContents(user_path);
+
+ // Clean favorites
+ LLFavoritesOrderStorage::removeFavoritesRecordOfUser(fav_id, grid);
+
+ // Note: we do not clean user-related files from cache because there are id dependent (inventory)
+ // files and cache has separate cleaning mechanism either way.
+ // Also this only cleans user from current grid, not all of them.
+ }
+}
+
+void LLFloaterForgetUser::loadGridToList(const std::string &grid, bool show_grid_name)
+{
+ std::string grid_label;
+ if (show_grid_name)
+ {
+ grid_label = LLGridManager::getInstance()->getGridId(grid); //login id (shortened label)
+ }
+ if (gSecAPIHandler->hasCredentialMap("login_list", grid))
+ {
+ LLSecAPIHandler::credential_map_t credencials;
+ gSecAPIHandler->loadCredentialMap("login_list", grid, credencials);
+
+ LLSecAPIHandler::credential_map_t::iterator cr_iter = credencials.begin();
+ LLSecAPIHandler::credential_map_t::iterator cr_end = credencials.end();
+ while (cr_iter != cr_end)
+ {
+ if (cr_iter->second.notNull()) // basic safety
+ {
+ std::string user_label = LLPanelLogin::getUserName(cr_iter->second);
+ LLSD user_data;
+ user_data["user_id"] = cr_iter->first;
+ user_data["label"] = user_label;
+ user_data["grid"] = grid;
+
+ if (show_grid_name)
+ {
+ user_label += " (" + grid_label + ")";
+ }
+
+ LLScrollListItem::Params item_params;
+ item_params.value(user_data);
+ item_params.columns.add()
+ .value(user_label)
+ .column("user")
+ .font(LLFontGL::getFontSansSerifSmall());
+ mScrollList->addRow(item_params, ADD_BOTTOM);
+
+ // Add one to grid count
+ std::map::iterator found = mUserGridsCount.find(cr_iter->first);
+ if (found != mUserGridsCount.end())
+ {
+ found->second++;
+ }
+ else
+ {
+ mUserGridsCount[cr_iter->first] = 1;
+ }
+ }
+ cr_iter++;
+ }
+ }
+ else
+ {
+ // "Legacy" viewer support
+ LLPointer cred = gSecAPIHandler->loadCredential(grid);
+ if (cred.notNull())
+ {
+ const LLSD &ident = cred->getIdentifier();
+ if (ident.isMap() && ident.has("type"))
+ {
+ std::string user_label = LLPanelLogin::getUserName(cred);
+ LLSD user_data;
+ user_data["user_id"] = cred->userID();
+ user_data["label"] = user_label;
+ user_data["grid"] = grid;
+
+ if (show_grid_name)
+ {
+ user_label += " (" + grid_label + ")";
+ }
+
+ LLScrollListItem::Params item_params;
+ item_params.value(user_data);
+ item_params.columns.add()
+ .value(user_label)
+ .column("user")
+ .font(LLFontGL::getFontSansSerifSmall());
+ mScrollList->addRow(item_params, ADD_BOTTOM);
+
+ // Add one to grid count
+ std::map::iterator found = mUserGridsCount.find(cred->userID());
+ if (found != mUserGridsCount.end())
+ {
+ found->second++;
+ }
+ else
+ {
+ mUserGridsCount[cred->userID()] = 1;
+ }
+ }
+ }
+ }
+}
#endif
diff --git a/indra/newview/llfloaterforgetuser.h b/indra/newview/llfloaterforgetuser.h
index 30bb33b1f5..fb892fd5cc 100644
--- a/indra/newview/llfloaterforgetuser.h
+++ b/indra/newview/llfloaterforgetuser.h
@@ -29,6 +29,8 @@
#include "llfloater.h"
+class LLScrollListCtrl;
+
class LLFloaterForgetUser : public LLFloater
{
public:
@@ -39,8 +41,16 @@ public:
void onForgetClicked();
private:
+ bool onConfirmForget(const LLSD& notification, const LLSD& response);
+ static bool onConfirmLogout(const LLSD& notification, const LLSD& response, const std::string &favorites_id, const std::string &grid);
+ void processForgetUser();
+ static void forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data);
+ void loadGridToList(const std::string &grid, bool show_grid_name);
+
+ LLScrollListCtrl *mScrollList;
+
bool mLoginPanelDirty;
- std::string mGrid;
+ std::map mUserGridsCount;
};
#endif
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
index 43b552c60a..1d1704b983 100644
--- a/indra/newview/llfloatergroups.cpp
+++ b/indra/newview/llfloatergroups.cpp
@@ -38,6 +38,7 @@
#include "roles_constants.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llbutton.h"
#include "llgroupactions.h"
#include "llscrolllistctrl.h"
@@ -175,7 +176,7 @@ void LLPanelGroups::reset()
}
// [CR] FIRE-12229
//getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.size()));
- //getChild("groupcount")->setTextArg("[MAX]", llformat("%d",gMaxAgentGroups));
+ //getChild("groupcount")->setTextArg("[MAX]", llformat("%d",LLAgentBenefitsMgr::current().getGroupMembershipLimit()));
getChild("groupcount")->setValue(FSCommon::populateGroupCount());
// [/CR]
@@ -189,7 +190,7 @@ BOOL LLPanelGroups::postBuild()
// [CR] FIRE-12229
//getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.size()));
- //getChild("groupcount")->setTextArg("[MAX]", llformat("%d",gMaxAgentGroups));
+ //getChild("groupcount")->setTextArg("[MAX]", llformat("%d",LLAgentBenefitsMgr::current().getGroupMembershipLimit()));
getChild("groupcount")->setValue(FSCommon::populateGroupCount());
// [/CR]
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 4314429d5c..d99e346570 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -53,7 +53,6 @@
#include "llviewershadermgr.h"
#include "llviewertexturelist.h"
#include "llviewercontrol.h"
-#include "lleconomy.h"
#include "llstring.h"
#include "llendianswizzle.h"
@@ -63,12 +62,13 @@
#include "llimagedimensionsinfo.h"
#include "llviewerregion.h" // getCentralBakeVersion()
#include "llcheckboxctrl.h"
+#include "llagentbenefits.h"
const S32 PREVIEW_BORDER_WIDTH = 2;
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
-const S32 PREVIEW_VPAD = -24; // yuk, hard coded
-const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
+const S32 PREVIEW_VPAD = -24 + 35; // yuk, hard coded
+const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16 + 35;
const S32 PREVIEW_TEXTURE_HEIGHT = 320;
//-----------------------------------------------------------------------------
@@ -119,18 +119,30 @@ BOOL LLFloaterImagePreview::postBuild()
mSculptedPreview = new LLImagePreviewSculpted(256, 256);
mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f);
+ // BUG-228331 - lossless_check is misleading don't show it if it won't be used.
+ // if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
+ // getChildView("lossless_check")->setEnabled(TRUE);
if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
+ {
getChildView("lossless_check")->setEnabled(TRUE);
+ getChildView("lossless_check")->setVisible(TRUE);
+ }
+ else
+ {
+ getChildView("lossless_check")->setEnabled(FALSE);
+ getChildView("lossless_check")->setVisible(FALSE);
+ }
+ //
-// Temporary texture uploads
- BOOL enable_temp_uploads = (LLGlobalEconomy::getInstance()->getPriceUpload() != 0
+ // Temporary texture uploads
+ BOOL enable_temp_uploads = (LLAgentBenefitsMgr::current().getTextureUploadCost() != 0
&& gAgent.getRegion()->getCentralBakeVersion() == 0);
if (!enable_temp_uploads)
{
gSavedSettings.setBOOL("TemporaryUpload", FALSE);
}
getChild("temp_check")->setVisible(enable_temp_uploads);
-//
+ //
}
else
{
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index f6e223a68c..27fc60be75 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -44,7 +44,6 @@
#include "lldrawable.h"
#include "llrender.h"
#include "llface.h"
-#include "lleconomy.h"
#include "llfocusmgr.h"
#include "llfloaterperms.h"
#include "lliconctrl.h"
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index c9a689281e..87a741bb7b 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -46,12 +46,13 @@
#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
#include "llstring.h"
-#include "lleconomy.h"
#include "llpermissions.h"
+#include "lltrans.h"
// linden includes
#include "llassetstorage.h"
#include "llinventorytype.h"
+#include "llagentbenefits.h"
const S32 PREVIEW_LINE_HEIGHT = 19;
const S32 PREVIEW_BORDER_WIDTH = 2;
@@ -63,7 +64,7 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
//-----------------------------------------------------------------------------
LLFloaterNameDesc::LLFloaterNameDesc(const LLSD& filename )
: LLFloater(filename),
- mIsAudio(FALSE)
+ mIsAudio(FALSE)
{
mFilenameAndPath = filename.asString();
mFilename = gDirUtilp->getBaseFileName(mFilenameAndPath, false);
@@ -123,13 +124,39 @@ BOOL LLFloaterNameDesc::postBuild()
// Cancel button
getChild("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnCancel, this));
- getChild("ok_btn")->setLabelArg("[AMOUNT]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload() ));
+ S32 expected_upload_cost = getExpectedUploadCost();
+ getChild("ok_btn")->setLabelArg("[AMOUNT]", llformat("%d", expected_upload_cost));
+
+ LLTextBox* info_text = getChild("info_text");
+ if (info_text)
+ {
+ info_text->setValue(LLTrans::getString("UploadFeeInfo"));
+ }
setDefaultBtn("ok_btn");
return TRUE;
}
+S32 LLFloaterNameDesc::getExpectedUploadCost() const
+{
+ std::string exten = gDirUtilp->getExtension(mFilename);
+ LLAssetType::EType asset_type;
+ S32 upload_cost = -1;
+ if (LLResourceUploadInfo::findAssetTypeOfExtension(exten, asset_type))
+ {
+ if (!LLAgentBenefitsMgr::current().findUploadCost(asset_type, upload_cost))
+ {
+ LL_WARNS() << "Unable to find upload cost for asset type " << asset_type << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS() << "Unable to find upload cost for " << mFilename << LL_ENDL;
+ }
+ return upload_cost;
+}
+
//-----------------------------------------------------------------------------
// LLFloaterNameDesc()
//-----------------------------------------------------------------------------
@@ -162,8 +189,7 @@ void LLFloaterNameDesc::onBtnOK( )
getChildView("ok_btn")->setEnabled(FALSE); // don't allow inadvertent extra uploads
LLAssetStorage::LLStoreAssetCallback callback = NULL;
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
-
+ S32 expected_upload_cost = getExpectedUploadCost();
if (can_afford_transaction(expected_upload_cost))
{
void *nruserdata = NULL;
@@ -185,7 +211,7 @@ void LLFloaterNameDesc::onBtnOK( )
{
LLSD args;
args["COST"] = llformat("%d", expected_upload_cost);
- LLNotificationsUtil::add("ErrorTextureCannotAfford", args);
+ LLNotificationsUtil::add("ErrorCannotAffordUpload", args);
}
closeFloater(false);
diff --git a/indra/newview/llfloaternamedesc.h b/indra/newview/llfloaternamedesc.h
index 41643681ac..589f470e82 100644
--- a/indra/newview/llfloaternamedesc.h
+++ b/indra/newview/llfloaternamedesc.h
@@ -30,6 +30,7 @@
#include "llfloater.h"
#include "llresizehandle.h"
#include "llstring.h"
+#include "llassettype.h"
class LLLineEditor;
class LLButton;
@@ -45,6 +46,8 @@ public:
void onBtnOK();
void onBtnCancel();
void doCommit();
+
+ S32 getExpectedUploadCost() const;
protected:
virtual void onCommit();
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 1a7f1c1fa7..fc6f24419d 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -4955,10 +4955,16 @@ void LLPanelPreferenceCrashReports::refresh()
pSendCrashReports->setEnabled(TRUE);
bool fEnable = pSendCrashReports->get();
- getChild("comboSaveMiniDumpType")->setEnabled(fEnable);
getChild("checkSendCrashReportsAlwaysAsk")->setEnabled(fEnable);
getChild("checkSendSettings")->setEnabled(fEnable);
getChild("checkSendName")->setEnabled(fEnable);
+
+// Disable options not available when compiling with Bugsplat and set those to default values.
+#ifdef LL_BUGSPLAT
+ getChild("checkSendCrashReportsAlwaysAsk")->setEnabled(false);
+ getChild("checkSendCrashReportsAlwaysAsk")->setValue(false);
+#endif
+//
}
void LLPanelPreferenceCrashReports::apply()
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index a1f7c97a37..c5f95b7260 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -102,7 +102,6 @@ public:
virtual LLSD prepareUpload();
virtual LLSD generatePostBody();
- virtual S32 getEconomyUploadCost();
virtual LLUUID finishUpload(LLSD &result);
virtual bool showInventoryPanel() const { return false; }
@@ -129,11 +128,6 @@ LLSD LLARScreenShotUploader::generatePostBody()
return mReport;
}
-S32 LLARScreenShotUploader::getEconomyUploadCost()
-{ // Abuse report screen shots do not cost anything to upload.
- return 0;
-}
-
LLUUID LLARScreenShotUploader::finishUpload(LLSD &result)
{
/* *TODO$: Report success or failure. Carried over from previous todo on responder*/
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 132064e4d3..eba41c59bd 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -573,18 +573,18 @@ void LLGroupActions::createGroup()
{
LLSD params;
params["group_id"] = LLUUID::null;
- params["open_tab_name"] = "panel_group_info_sidetray";
+ params["open_tab_name"] = "panel_group_creation_sidetray";
params["action"] = "create";
// Standalone group floaters
- //LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
+ //LLFloaterSidePanelContainer::showPanel("people", "panel_group_creation_sidetray", params);
if (gSavedSettings.getBOOL("FSUseStandaloneGroupFloater"))
{
FSFloaterGroup::openGroupFloater(params);
}
else
{
- LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_creation_sidetray", params);
}
//
}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 24a92ded53..102514869f 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -55,9 +55,8 @@
#include "roles_constants.h"
#include "lltransactiontypes.h"
#include "llstatusbar.h"
-#include "lleconomy.h"
#include "llviewerwindow.h"
-#include "llpanelgroup.h"
+#include "llpanelgroupcreate.h"
#include "llgroupactions.h"
#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
@@ -1480,7 +1479,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
gAgent.mGroups.push_back(gd);
- LLPanelGroup::refreshCreatedGroup(group_id);
+ LLPanelGroupCreate::refreshCreatedGroup(group_id);
//FIXME
//LLFloaterGroupInfo::closeCreateGroup();
//LLFloaterGroupInfo::showFromUUID(group_id,"roles_tab");
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index fc2d33cdd9..5a9c92373e 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1369,9 +1369,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
{
LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
delete info;
- // Don't flash task icon
- //break;
- return;
+ break;
}
info->mType = (LLAssetType::EType) binary_bucket[0];
info->mObjectID = LLUUID::null;
@@ -2233,6 +2231,12 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
return;
}
+ if (gAgent.getRegion() == NULL)
+ {
+ LL_WARNS("Messaging") << "Region null while attempting to load messages." << LL_ENDL;
+ return;
+ }
+
LL_INFOS("Messaging") << "Processing offline messages." << LL_ENDL;
std::vector data;
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 6bd1d79c97..ada1cae47c 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -337,6 +337,14 @@ BOOL LLInvFVBridge::isItemRemovable() const
// Can be moved to another folder
BOOL LLInvFVBridge::isItemMovable() const
{
+ // FIRE-28977: Lock special and locked folders from being DaD'ed
+ if (isLockedFolder())
+ {
+ // Child of a protected folder -> not movable
+ return FALSE;
+ }
+ // Protected folder
+ // Locked folder
//if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0))
- if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0) || isProtectedFolder())
+ if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0) || isLockedFolder())
//
{
disabled_items.push_back(std::string("Rename"));
@@ -920,7 +928,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
//if (!isCOFFolder() && !isInboxFolder()
if (!isCOFFolder()
// Client LSL Bridge (also for #AO)
- && !isProtectedFolder())
+ && !isLockedFolder())
//
{
items.push_back(std::string("Paste"));
@@ -932,7 +940,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (gSavedSettings.getBOOL("InventoryLinking")
// Client LSL Bridge (also for #AO)
- && !isProtectedFolder()
+ && !isLockedFolder()
//
)
{
@@ -1223,7 +1231,7 @@ void LLInvFVBridge::addMoveToDefaultFolderMenuOption(menuentry_vec_t& items)
{
const LLInventoryObject* obj = getInventoryObject();
- if (isAgentInventory() && !isProtectedFolder(true) && obj &&
+ if (isAgentInventory() && !isLockedFolder(true) && obj &&
obj->getActualType() != LLAssetType::AT_CATEGORY &&
obj->getActualType() != LLAssetType::AT_LINK_FOLDER &&
obj->getActualType() != LLAssetType::AT_LINK &&
@@ -1354,7 +1362,7 @@ BOOL LLInvFVBridge::isCOFFolder() const
}
// Client LSL Bridge (also for #AO)
-BOOL LLInvFVBridge::isProtectedFolder(bool ignore_setting /*= false*/) const
+BOOL LLInvFVBridge::isLockedFolder(bool ignore_setting /*= false*/) const
{
const LLInventoryModel* model = getInventoryModel();
if (!model)
@@ -1364,21 +1372,21 @@ BOOL LLInvFVBridge::isProtectedFolder(bool ignore_setting /*= false*/) const
if ((mUUID == FSLSLBridge::instance().getBridgeFolder()
|| model->isObjectDescendentOf(mUUID, FSLSLBridge::instance().getBridgeFolder()))
- && (gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder") || ignore_setting))
+ && (gSavedPerAccountSettings.getBOOL("LockBridgeFolder") || ignore_setting))
{
return TRUE;
}
if ((mUUID == AOEngine::instance().getAOFolder()
|| model->isObjectDescendentOf(mUUID, AOEngine::instance().getAOFolder()))
- && (gSavedPerAccountSettings.getBOOL("ProtectAOFolders") || ignore_setting))
+ && (gSavedPerAccountSettings.getBOOL("LockAOFolders") || ignore_setting))
{
return TRUE;
}
if ((mUUID == FSFloaterWearableFavorites::getFavoritesFolder()
|| model->isObjectDescendentOf(mUUID, FSFloaterWearableFavorites::getFavoritesFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockWearableFavoritesFolders"))
{
return TRUE;
}
@@ -2384,6 +2392,21 @@ BOOL LLFolderBridge::isItemMovable() const
// If it's a protected type folder, we can't move it
if (LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()))
return FALSE;
+
+ // FIRE-28977: Lock special and locked folders from being DaD'ed
+ if (obj->getName() == ROOT_FIRESTORM_FOLDER || obj->getName() == RLV_ROOT_FOLDER || isLockedFolder())
+ {
+ return FALSE;
+ }
+ //
+
+ // FIRE-29342: Protect folder option
+ if (isProtected())
+ {
+ return FALSE;
+ }
+ //
+
return TRUE;
}
return FALSE;
@@ -2528,6 +2551,13 @@ BOOL LLFolderBridge::isItemRemovable() const
return FALSE;
}
+ // FIRE-29342: Protected folder option
+ if (isProtected())
+ {
+ return FALSE;
+ }
+ //
+
LLInventoryPanel* panel = mInventoryPanel.get();
LLFolderViewFolder* folderp = dynamic_cast(panel ? panel->getItemByID(mUUID) : NULL);
if (folderp)
@@ -2702,7 +2732,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (!isAgentAvatarValid()) return FALSE;
if (!isAgentInventory()) return FALSE; // cannot drag categories into library
// Client LSL Bridge (also for #AO)
- if (isProtectedFolder()) return FALSE;
+ if (isLockedFolder()) return FALSE;
//
LLInventoryPanel* destination_panel = mInventoryPanel.get();
@@ -3673,6 +3703,27 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
move_folder_to_marketplacelistings(cat, marketplacelistings_id, ("move_to_marketplace_listings" != action), (("copy_or_move_to_marketplace_listings" == action)));
}
+ // FIRE-29342: Protect folder option
+ else if ("protect_folder" == action)
+ {
+ LLSD protected_folders = gSavedPerAccountSettings.getLLSD("FSProtectedFolders");
+ protected_folders.append(mUUID);
+ gSavedPerAccountSettings.setLLSD("FSProtectedFolders", protected_folders);
+ }
+ else if ("unprotect_folder" == action)
+ {
+ LLSD protected_folders = gSavedPerAccountSettings.getLLSD("FSProtectedFolders");
+ LLSD new_protected_folders;
+ for (LLSD::array_const_iterator it = protected_folders.beginArray(); it != protected_folders.endArray(); ++it)
+ {
+ if ((*it).asUUID() != mUUID)
+ {
+ new_protected_folders.append(*it);
+ }
+ }
+ gSavedPerAccountSettings.setLLSD("FSProtectedFolders", new_protected_folders);
+ }
+ //
}
void LLFolderBridge::gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level)
@@ -4416,7 +4467,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
else if(isAgentInventory()
// moved from buildContextMenu after merge
- && !isProtectedFolder()
+ && !isLockedFolder()
//
) // do not allow creating in library
{
@@ -4551,7 +4602,26 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
}
-
+ // FIRE-29342: Protect folder option
+ if (isAgentInventory())
+ {
+ LLInventoryObject* obj = getInventoryObject();
+ if (obj)
+ {
+ if (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()))
+ {
+ if (isProtected())
+ {
+ items.push_back((std::string("UnprotectFolder")));
+ }
+ else
+ {
+ items.push_back((std::string("ProtectFolder")));
+ }
+ }
+ }
+ }
+ //
// Add menu items that are dependent on the contents of the folder.
LLViewerInventoryCategory* category = (LLViewerInventoryCategory *) model->getCategory(mUUID);
@@ -4949,6 +5019,19 @@ void LLFolderBridge::modifyOutfit(BOOL append)
}
}
+// FIRE-29342: Protect folder option
+bool LLFolderBridge::isProtected() const
+{
+ LLInventoryModel* model = getInventoryModel();
+ if (model)
+ {
+ const uuid_set_t& categories = model->getProtectedCategories();
+ return categories.find(mUUID) != categories.end();
+ }
+
+ return false;
+}
+//
// +=================================================+
// | LLMarketplaceFolderBridge |
@@ -5338,7 +5421,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if (!isAgentInventory()) return FALSE; // cannot drag into library
if (!isAgentAvatarValid()) return FALSE;
// Client LSL Bridge (also for #AO)
- if (isProtectedFolder()) return FALSE;
+ if (isLockedFolder()) return FALSE;
//
LLInventoryPanel* destination_panel = mInventoryPanel.get();
@@ -5843,16 +5926,16 @@ bool check_item(const LLUUID& item_id,
#endif // 0
// Unused 2013.10.12
-// Special for protected folders
-bool LLFolderBridge::isProtected() const
+// Special for locked folders
+bool LLFolderBridge::isLocked() const
{
- static LLCachedControl protectAOFolders(gSavedPerAccountSettings, "ProtectAOFolders");
- static LLCachedControl protectBridgeFolder(gSavedPerAccountSettings, "ProtectBridgeFolder");
- static LLCachedControl WearableFavoritesprotectBridgeFolder(gSavedPerAccountSettings, "ProtectWearableFavoritesFolders");
+ static LLCachedControl LockAOFolders(gSavedPerAccountSettings, "LockAOFolders");
+ static LLCachedControl LockBridgeFolder(gSavedPerAccountSettings, "LockBridgeFolder");
+ static LLCachedControl LockWearableFavoritesFolders(gSavedPerAccountSettings, "LockWearableFavoritesFolders");
- return ((mUUID == AOEngine::instance().getAOFolder() && protectAOFolders) ||
- (mUUID == FSLSLBridge::instance().getBridgeFolder() && protectBridgeFolder) ||
- (mUUID == FSFloaterWearableFavorites::getFavoritesFolder() && WearableFavoritesprotectBridgeFolder));
+ return ((mUUID == AOEngine::instance().getAOFolder() && LockAOFolders) ||
+ (mUUID == FSLSLBridge::instance().getBridgeFolder() && LockBridgeFolder) ||
+ (mUUID == FSFloaterWearableFavorites::getFavoritesFolder() && LockWearableFavoritesFolders));
}
//
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 36fc906635..0dd4767468 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -182,7 +182,7 @@ protected:
BOOL isLostInventory() const;
// [/SL:KB]
// Client LSL Bridge
- BOOL isProtectedFolder(bool ignore_setting = false) const;
+ BOOL isLockedFolder(bool ignore_setting = false) const;
//
virtual BOOL isItemPermissive() const;
@@ -350,7 +350,10 @@ public:
bool isLoading() { return mIsLoading; }
- // Special for protected folders
+ // Special for locked folders
+ virtual bool isLocked() const;
+
+ // FIRE-29342: Protect folder option
virtual bool isProtected() const;
protected:
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 39eae60adf..711d581462 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -204,10 +204,15 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
// when applying a filter, matching folders get their contents downloaded first
// but make sure we are not interfering with pre-download
if (isNotDefault()
- && !gInventory.isCategoryComplete(folder_id)
&& LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
- {
- LLInventoryModelBackgroundFetch::instance().start(folder_id);
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+ if (!cat || (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN))
+ {
+ // At the moment background fetch only cares about VERSION_UNKNOWN,
+ // so do not check isCategoryComplete that compares descendant count
+ LLInventoryModelBackgroundFetch::instance().start(folder_id);
+ }
}
// Marketplace folder filtering
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 17c315dcf7..111edeb7e0 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -643,21 +643,21 @@ BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)
return FALSE;
}
- // Protected Folders
+ // Locked Folders
if (
(model->isObjectDescendentOf(id, AOEngine::instance().getAOFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectAOFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockAOFolders"))
||
(model->isObjectDescendentOf(id, FSLSLBridge::instance().getBridgeFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder"))
+ && gSavedPerAccountSettings.getBOOL("LockBridgeFolder"))
||
(model->isObjectDescendentOf(id, FSFloaterWearableFavorites::getFavoritesFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockWearableFavoritesFolders"))
)
{
return FALSE;
}
- // Protected Folders
+ // Locked Folders
// Disable delete from COF folder; have users explicitly choose "detach/take off",
// unless the item is not worn but in the COF (i.e. is bugged).
@@ -713,21 +713,21 @@ BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id)
}
// [/RLVa:KB]
- // Protected Folders
+ // Locked Folders
if (
((id == AOEngine::instance().getAOFolder() || model->isObjectDescendentOf(id, AOEngine::instance().getAOFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectAOFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockAOFolders"))
||
((id == FSLSLBridge::instance().getBridgeFolder() || model->isObjectDescendentOf(id, FSLSLBridge::instance().getBridgeFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder"))
+ && gSavedPerAccountSettings.getBOOL("LockBridgeFolder"))
||
((id == FSFloaterWearableFavorites::getFavoritesFolder() || model->isObjectDescendentOf(id, FSFloaterWearableFavorites::getFavoritesFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockWearableFavoritesFolders"))
)
{
return FALSE;
}
- // Protected Folders
+ // Locked Folders
if (!isAgentAvatarValid()) return FALSE;
@@ -771,21 +771,21 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)
}
// [/RLVa:KB]
- // Protected Folders
+ // Locked Folders
if (
((id == AOEngine::instance().getAOFolder() || model->isObjectDescendentOf(id, AOEngine::instance().getAOFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectAOFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockAOFolders"))
||
((id == FSLSLBridge::instance().getBridgeFolder() || model->isObjectDescendentOf(id, FSLSLBridge::instance().getBridgeFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder"))
+ && gSavedPerAccountSettings.getBOOL("LockBridgeFolder"))
||
((id == FSFloaterWearableFavorites::getFavoritesFolder() || model->isObjectDescendentOf(id, FSFloaterWearableFavorites::getFavoritesFolder()))
- && gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders"))
+ && gSavedPerAccountSettings.getBOOL("LockWearableFavoritesFolders"))
)
{
return FALSE;
}
- // Protected Folders
+ // Locked Folders
LLViewerInventoryCategory* cat = model->getCategory(id);
@@ -2611,8 +2611,8 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
model->collectDescendents(obj->getUUID(), cats, items, FALSE);
LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- BOOL old_setting = gSavedPerAccountSettings.getBOOL("ProtectAOFolders");
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", FALSE);
+ BOOL old_setting = gSavedPerAccountSettings.getBOOL("LockAOFolders");
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", FALSE);
for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); ++it)
{
if ((*it)->getIsLinkType() && LLAssetType::lookupIsLinkType((*it)->getType()))
@@ -2620,7 +2620,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
model->removeItem((*it)->getUUID());
}
}
- gSavedPerAccountSettings.setBOOL("ProtectAOFolders", old_setting);
+ gSavedPerAccountSettings.setBOOL("LockAOFolders", old_setting);
}
}
return;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 355a997e78..a26e9f6e3c 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -167,6 +167,7 @@ LLInventoryModel::LLInventoryModel()
mModifyMask(LLInventoryObserver::ALL),
mChangedItemIDs(),
mObservers(),
+ mProtectedCategoriesChangedCallbackConnection(), // FIRE-29342: Protect folder option
mHttpRequestFG(NULL),
mHttpRequestBG(NULL),
mHttpOptions(),
@@ -187,6 +188,13 @@ LLInventoryModel::LLInventoryModel()
LLInventoryModel::~LLInventoryModel()
{
cleanupInventory();
+
+ // FIRE-29342: Protect folder option
+ if (mProtectedCategoriesChangedCallbackConnection.connected())
+ {
+ mProtectedCategoriesChangedCallbackConnection.disconnect();
+ }
+ //
}
void LLInventoryModel::cleanupInventory()
@@ -1353,13 +1361,13 @@ void LLInventoryModel::changeItemParent(LLViewerInventoryItem* item,
<< ") from " << item->getParentUUID() << " to folder "
<< new_parent_id << LL_ENDL;
- // Protected folder
+ // Locked folder
if ((isObjectDescendentOf(item->getUUID(), AOEngine::instance().getAOFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectAOFolders")) ||
+ && gSavedPerAccountSettings.getBOOL("LockAOFolders")) ||
(isObjectDescendentOf(item->getUUID(), FSLSLBridge::instance().getBridgeFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder")) ||
+ && gSavedPerAccountSettings.getBOOL("LockBridgeFolder")) ||
(isObjectDescendentOf(item->getUUID(), FSFloaterWearableFavorites::getFavoritesFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders")))
+ && gSavedPerAccountSettings.getBOOL("LockWearableFavoritesFolders")))
{
LL_INFOS("Inventory") << "Cannot move item because it is descendent of a protected folder" << LL_ENDL;
return;
@@ -1399,11 +1407,11 @@ void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat,
// Protected folder
if ((isObjectDescendentOf(cat->getUUID(), AOEngine::instance().getAOFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectAOFolders")) ||
+ && gSavedPerAccountSettings.getBOOL("LockAOFolders")) ||
(isObjectDescendentOf(cat->getUUID(), FSLSLBridge::instance().getBridgeFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectBridgeFolder")) ||
+ && gSavedPerAccountSettings.getBOOL("LockBridgeFolder")) ||
(isObjectDescendentOf(cat->getUUID(), FSFloaterWearableFavorites::getFavoritesFolder())
- && gSavedPerAccountSettings.getBOOL("ProtectWearableFavoritesFolders")))
+ && gSavedPerAccountSettings.getBOOL("LockWearableFavoritesFolders")))
{
LL_INFOS("Inventory") << "Cannot move category because it is descendent of a protected folder" << LL_ENDL;
return;
@@ -3746,6 +3754,11 @@ const LLUUID &LLInventoryModel::getRootFolderID() const
void LLInventoryModel::setRootFolderID(const LLUUID& val)
{
mRootFolderID = val;
+
+ // FIRE-29342: Lock folder option
+ mProtectedCategoriesChangedCallbackConnection = gSavedPerAccountSettings.getControl("FSProtectedFolders")->getCommitSignal()->connect(boost::bind(&LLInventoryModel::onProtectedCategoriesChanged, this, _2));
+ onProtectedCategoriesChanged(gSavedPerAccountSettings.getLLSD("FSProtectedFolders"));
+ //
}
const LLUUID &LLInventoryModel::getLibraryRootFolderID() const
@@ -4043,6 +4056,18 @@ void LLInventoryModel::wearItemsOnAvatar(LLInventoryCategory* category)
}
//
+// FIRE-29342: Protect folder option
+void LLInventoryModel::onProtectedCategoriesChanged(const LLSD& newvalue)
+{
+ mProtectedCategories.clear();
+
+ for (LLSD::array_const_iterator it = newvalue.beginArray(); it != newvalue.endArray(); ++it)
+ {
+ mProtectedCategories.insert(*it);
+ }
+}
+//
+
class LLViewerInventoryItemSort
{
public:
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 9cc1c33fad..7a8fca8875 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -342,17 +342,28 @@ public:
// Note : This method has been designed for FT_OUTBOX (aka Merchant Outbox) but can be used for other categories
void consolidateForType(const LLUUID& id, LLFolderType::EType type);
-// ReplaceWornItemsOnly
+ // ReplaceWornItemsOnly
void wearItemsOnAvatar(LLInventoryCategory* category);
void wearAttachmentsOnAvatarCheckRemove(LLViewerObject *object, const LLViewerJointAttachment *attachment);
+ //
+
+ // FIRE-29342: Protect folder option
+ const uuid_set_t& getProtectedCategories() const { return mProtectedCategories; };
private:
+ mutable LLPointer mLastItem; // cache recent lookups
+
+ // ReplaceWornItemsOnly
void wearWearablesOnAvatar(const LLUUID& category_id);
void wearAttachmentsOnAvatar(const LLUUID& category_id);
void wearGesturesOnAvatar(const LLUUID& category_id);
-//
-private:
- mutable LLPointer mLastItem; // cache recent lookups
+ //
+
+ // FIRE-29342: Protect folder option
+ uuid_set_t mProtectedCategories;
+ boost::signals2::connection mProtectedCategoriesChangedCallbackConnection;
+ void onProtectedCategoriesChanged(const LLSD& newvalue);
+ //
//--------------------------------------------------------------------
// Count
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 2f7246d2b0..4642dd8afe 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -506,6 +506,17 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list& m
std::string line(buffer);
+ // FIRE-28990: Unable to open chat transcript if file is UTF-8-BOM encoded
+ // Technically it doesn't make sense to do it each iteration and ideally we
+ // would do it once before the loop starts, but seeking backwards to the start of
+ // the file causes the viewer's process being locked up for several seconds
+ // during login, we just do it here to skip seeking backwards.
+ if (line.length() > 3 && line[0] == char(239) && line[1] == char(187) && line[2] == char(191))
+ {
+ line = line.substr(3);
+ }
+ //
+
//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])
{
@@ -908,11 +919,19 @@ bool LLLogChat::isTranscriptFileFound(std::string fullname)
if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
{
+ // FIRE-28990: Unable to open chat transcript if file is UTF-8-BOM encoded
+ std::string bufferstr(buffer);
+ if (bufferstr.length() > 3 && bufferstr[0] == char(239) && bufferstr[1] == char(187) && bufferstr[2] == char(191))
+ {
+ bufferstr = bufferstr.substr(3);
+ }
+ //
+
//matching a timestamp
boost::match_results matches;
// Seconds in timestamp
//if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
- if (boost::regex_match(std::string(buffer), matches, TIMESTAMP) || boost::regex_match(std::string(buffer), matches, TIMESTAMP_AND_SEC))
+ if (boost::regex_match(bufferstr, matches, TIMESTAMP) || boost::regex_match(bufferstr, matches, TIMESTAMP_AND_SEC))
//
{
result = true;
@@ -1278,6 +1297,18 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list FIRE-28990: Unable to open chat transcript if file is UTF-8-BOM encoded
+ // Technically it doesn't make sense to do it each iteration and ideally we
+ // would do it once before the loop starts, but since this code was duplicated
+ // from further above and in the other case seeking backwards to the start of
+ // the file causes the viewer's process being locked up for several seconds
+ // during login, we just do it here the same way we do above.
+ if (line.length() > 3 && line[0] == char(239) && line[1] == char(187) && line[2] == char(191))
+ {
+ line = line.substr(3);
+ }
+ //
+
//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])
{
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 4579f116d6..40b68be79a 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -62,7 +62,7 @@
#include
#include
-const S32 LOGIN_MAX_RETRIES = 3;
+const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login
const F32 LOGIN_SRV_TIMEOUT_MIN = 10.f;
const F32 LOGIN_SRV_TIMEOUT_MAX = 120.f;
const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9f; // make DNS wait shorter then retry time
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 7e994cb817..f4b58dfe3a 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -41,7 +41,6 @@
#include "lldeadmantimer.h"
#include "llfloatermodelpreview.h"
#include "llfloaterperms.h"
-#include "lleconomy.h"
#include "llimagej2c.h"
#include "llhost.h"
#include "llmath.h"
diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp
index efd068d155..cbfd3fcc2d 100644
--- a/indra/newview/llnotificationlistitem.cpp
+++ b/indra/newview/llnotificationlistitem.cpp
@@ -598,8 +598,13 @@ LLTransactionNotificationListItem::LLTransactionNotificationListItem(const Param
BOOL LLTransactionNotificationListItem::postBuild()
{
- // Unscrew avatar icon for transaction messages
- mParams.title = mParams.payment_message;
+ // Unscrew avatar icon for transaction messages
+ if (mParams.notification_name == "PaymentReceived" ||
+ mParams.notification_name == "PaymentSent")
+ {
+ mParams.title = mParams.payment_message;
+ }
+ //
BOOL rv = LLNotificationListItem::postBuild();
@@ -624,42 +629,42 @@ BOOL LLTransactionNotificationListItem::postBuild()
// Unscrew avatar icon for transaction messages
//mAvatarIcon->setValue(mParams.paid_from_id);
//mAvatarIconExp->setValue(mParams.paid_from_id);
- if (!mParams.payment_is_group)
- {
- mAvatarIcon->setValue(mParams.paid_from_id);
- mAvatarIconExp->setValue(mParams.paid_from_id);
- }
- else
- {
- mGroupIcon->setValue(mParams.paid_from_id);
- mGroupIconExp->setValue(mParams.paid_from_id);
- mGroupIcon->setVisible(TRUE);
- mGroupIconExp->setVisible(TRUE);
- mAvatarIcon->setVisible(FALSE);
- mAvatarIconExp->setVisible(FALSE);
- }
- //
+ if (!mParams.payment_is_group)
+ {
+ mAvatarIcon->setValue(mParams.paid_from_id);
+ mAvatarIconExp->setValue(mParams.paid_from_id);
+ }
+ else
+ {
+ mGroupIcon->setValue(mParams.paid_from_id);
+ mGroupIconExp->setValue(mParams.paid_from_id);
+ mGroupIcon->setVisible(TRUE);
+ mGroupIconExp->setVisible(TRUE);
+ mAvatarIcon->setVisible(FALSE);
+ mAvatarIconExp->setVisible(FALSE);
+ }
+ //
}
else if (mParams.notification_name == "PaymentSent")
{
// Unscrew avatar icon for transaction messages
//mAvatarIcon->setValue(mParams.paid_to_id);
//mAvatarIconExp->setValue(mParams.paid_to_id);
- if (!mParams.payment_is_group)
- {
- mAvatarIcon->setValue(mParams.paid_to_id);
- mAvatarIconExp->setValue(mParams.paid_to_id);
- }
- else
- {
- mGroupIcon->setValue(mParams.paid_to_id);
- mGroupIconExp->setValue(mParams.paid_to_id);
- mGroupIcon->setVisible(TRUE);
- mGroupIconExp->setVisible(TRUE);
- mAvatarIcon->setVisible(FALSE);
- mAvatarIconExp->setVisible(FALSE);
- }
- //
+ if (!mParams.payment_is_group)
+ {
+ mAvatarIcon->setValue(mParams.paid_to_id);
+ mAvatarIconExp->setValue(mParams.paid_to_id);
+ }
+ else
+ {
+ mGroupIcon->setValue(mParams.paid_to_id);
+ mGroupIconExp->setValue(mParams.paid_to_id);
+ mGroupIcon->setVisible(TRUE);
+ mGroupIconExp->setVisible(TRUE);
+ mAvatarIcon->setVisible(FALSE);
+ mAvatarIconExp->setVisible(FALSE);
+ }
+ //
}
return rv;
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index d411e1b60a..765cea2c28 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -36,7 +36,7 @@
#include "llaccordionctrltab.h"
#include "llappearancemgr.h"
-#include "lleconomy.h"
+#include "llagentbenefits.h"
#include "llerror.h"
#include "llfilepicker.h"
#include "llfloaterperms.h"
@@ -838,16 +838,7 @@ LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitGalleryContextMenu::onEnable, this, _2));
enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitGalleryContextMenu::onVisible, this, _2));
- // Show correct upload fee in context menu
- //return createFromFile("menu_gallery_outfit_tab.xml");
- LLContextMenu* menu = createFromFile("menu_gallery_outfit_tab.xml");
- LLMenuItemCallGL* upload_item = menu->findChild("upload_photo");
- if (upload_item)
- {
- upload_item->setLabelArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload()));
- }
- return menu;
- //
+ return createFromFile("menu_gallery_outfit_tab.xml");
}
void LLOutfitGalleryContextMenu::onUploadPhoto(const LLUUID& outfit_cat_id)
@@ -922,6 +913,7 @@ bool LLOutfitGalleryContextMenu::onEnable(LLSD::String param)
bool LLOutfitGalleryContextMenu::onVisible(LLSD::String param)
{
+ mMenuHandle.get()->getChild("upload_photo")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
if ("remove_photo" == param)
{
LLOutfitGallery* gallery = dynamic_cast(mOutfitList);
@@ -1217,7 +1209,7 @@ void LLOutfitGallery::uploadOutfitImage(const std::vector& filename
return;
}
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
+ S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
void *nruserdata = NULL;
nruserdata = (void *)&outfit_id;
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 46472051ab..c0662cddda 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -35,6 +35,7 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llagentbenefits.h"
#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -1270,14 +1271,6 @@ LLOutfitListGearMenuBase::LLOutfitListGearMenuBase(LLOutfitListBase* olist)
mMenu = LLUICtrlFactory::getInstance()->createFromFile(
"menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
llassert(mMenu);
-
- // Show correct upload fee in context menu
- LLMenuItemCallGL* upload_item = mMenu->findChild("upload_photo");
- if (upload_item)
- {
- upload_item->setLabelArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload()));
- }
- //
}
LLOutfitListGearMenuBase::~LLOutfitListGearMenuBase()
@@ -1386,6 +1379,7 @@ bool LLOutfitListGearMenuBase::onEnable(LLSD::String param)
bool LLOutfitListGearMenuBase::onVisible(LLSD::String param)
{
+ getMenu()->getChild("upload_photo")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
const LLUUID& selected_outfit_id = getSelectedOutfitID();
if (selected_outfit_id.isNull()) // no selection or invalid outfit selected
{
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index f0805cacb8..817e630c20 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -30,7 +30,6 @@
#include "llpanelcontents.h"
// linden library includes
-#include "lleconomy.h"
#include "llerror.h"
#include "llfloaterreg.h"
#include "llfontgl.h"
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 609d6f6c11..8c0d9c3915 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -184,10 +184,6 @@ void LLPanelGroup::onOpen(const LLSD& key)
{
onBackBtnClick();
}
- else if(str_action == "create")
- {
- setGroupID(LLUUID::null);
- }
else if(str_action == "refresh_notices")
{
LLPanelGroupNotices* panel_notices = findChild("group_notices_tab_panel");
@@ -218,12 +214,8 @@ BOOL LLPanelGroup::postBuild()
button = getChild("btn_refresh");
button->setClickedCallback(onBtnRefresh, this);
- getChild("btn_create")->setVisible(false);
-
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
- childSetCommitCallback("btn_create",boost::bind(&LLPanelGroup::onBtnCreate,this),NULL);
-
LLPanelGroupTab* panel_general = findChild("group_general_tab_panel");
LLPanelGroupTab* panel_roles = findChild("group_roles_tab_panel");
LLPanelGroupTab* panel_notices = findChild("group_notices_tab_panel");
@@ -282,7 +274,6 @@ void LLPanelGroup::reposButtons()
}
reposButton("btn_apply");
- reposButton("btn_create");
reposButton("btn_refresh");
reposButton("btn_cancel");
reposButton("btn_chat");
@@ -305,23 +296,6 @@ void LLPanelGroup::onBackBtnClick()
}
}
-
-void LLPanelGroup::onBtnCreate()
-{
- LLPanelGroupGeneral* panel_general = findChild("group_general_tab_panel");
- if(!panel_general)
- return;
- std::string apply_mesg;
- if(panel_general->apply(apply_mesg))//yes yes you need to call apply to create...
- return;
- if ( !apply_mesg.empty() )
- {
- LLSD args;
- args["MESSAGE"] = apply_mesg;
- LLNotificationsUtil::add("GenericAlert", args);
- }
-}
-
void LLPanelGroup::onBtnRefresh(void* user_data)
{
LLPanelGroup* self = static_cast(user_data);
@@ -461,7 +435,6 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
LLButton* button_apply = findChild("btn_apply");
LLButton* button_refresh = findChild("btn_refresh");
- LLButton* button_create = findChild("btn_create");
LLButton* button_cancel = findChild("btn_cancel");
LLButton* button_call = findChild("btn_call");
@@ -474,8 +447,6 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(button_refresh)
button_refresh->setVisible(!is_null_group_id);
- if(button_create)
- button_create->setVisible(is_null_group_id);
if(button_cancel)
button_cancel->setVisible(!is_null_group_id);
@@ -766,32 +737,6 @@ void LLPanelGroup::showNotice(const std::string& subject,
panel_notices->showNotice(subject,message,has_inventory,inventory_name,inventory_offer);
}
-
-
-
-//static
-void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id)
-{
- // Standalone group floaters
- //LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel("people", "panel_group_info_sidetray");
- //if(!panel)
- // return;
- //panel->setGroupID(group_id);
- if (gSavedSettings.getBOOL("FSUseStandaloneGroupFloater"))
- {
- FSFloaterGroup::closeGroupFloater(LLUUID::null);
- FSFloaterGroup::openGroupFloater(group_id);
- }
- else
- {
- LLPanelGroup* panel = LLFloaterSidePanelContainer::getPanel("people", "panel_group_info_sidetray");
- if(!panel)
- return;
- panel->setGroupID(group_id);
- }
- //
-}
-
//static
void LLPanelGroup::showNotice(const std::string& subject,
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 749677b2b0..5cbf75827c 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -79,8 +79,6 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- static void refreshCreatedGroup(const LLUUID& group_id);
-
static void showNotice(const std::string& subject,
const std::string& message,
const LLUUID& group_id,
@@ -97,7 +95,6 @@ public:
protected:
virtual void update(LLGroupChange gc);
- void onBtnCreate();
void onBackBtnClick();
void onBtnJoin();
diff --git a/indra/newview/llpanelgroupcreate.cpp b/indra/newview/llpanelgroupcreate.cpp
new file mode 100644
index 0000000000..9ec79eb802
--- /dev/null
+++ b/indra/newview/llpanelgroupcreate.cpp
@@ -0,0 +1,270 @@
+/**
+ * @file llpanelgroupcreate.cpp
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelgroupcreate.h"
+
+// UI includes
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llsidetraypanelcontainer.h"
+#include "llscrolllistctrl.h"
+#include "llspinctrl.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lltexturectrl.h"
+#include "lluictrlfactory.h"
+
+// Viewer includes
+#include "llagentbenefits.h"
+#include "llfloaterreg.h"
+#include "llfloater.h"
+#include "llgroupmgr.h"
+#include "lltrans.h"
+#include "llnotificationsutil.h"
+#include "lluicolortable.h"
+
+// Standalone group floaters
+#include "fsfloatergroup.h"
+#include "llviewercontrol.h"
+//
+
+
+const S32 MATURE_CONTENT = 1;
+const S32 NON_MATURE_CONTENT = 2;
+const S32 DECLINE_TO_STATE = 0;
+
+static LLPanelInjector t_panel_group_creation("panel_group_creation_sidetray");
+
+LLPanelGroupCreate::LLPanelGroupCreate()
+: LLPanel()
+{
+}
+
+LLPanelGroupCreate::~LLPanelGroupCreate()
+{
+}
+
+BOOL LLPanelGroupCreate::postBuild()
+{
+ childSetCommitCallback("back", boost::bind(&LLPanelGroupCreate::onBackBtnClick, this), NULL);
+
+ mComboMature = getChild("group_mature_check", TRUE);
+ mCtrlOpenEnrollment = getChild("open_enrollement", TRUE);
+ mCtrlEnrollmentFee = getChild("check_enrollment_fee", TRUE);
+ mEditCharter = getChild("charter", TRUE);
+ mSpinEnrollmentFee = getChild("spin_enrollment_fee", TRUE);
+ mMembershipList = getChild("membership_list", TRUE);
+
+ mCreateButton = getChild("btn_create", TRUE);
+ mCreateButton->setCommitCallback(boost::bind(&LLPanelGroupCreate::onBtnCreate, this));
+
+ mGroupNameEditor = getChild("group_name_editor", TRUE);
+ mGroupNameEditor->setPrevalidate(LLTextValidate::validateASCIINoLeadingSpace);
+
+ mInsignia = getChild("insignia", TRUE);
+ mInsignia->setAllowLocalTexture(FALSE);
+ mInsignia->setCanApplyImmediately(FALSE);
+
+ return TRUE;
+}
+
+void LLPanelGroupCreate::onOpen(const LLSD& key)
+{
+ mInsignia->setImageAssetID(LLUUID::null);
+ mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
+ mGroupNameEditor->clear();
+ mEditCharter->clear();
+ mSpinEnrollmentFee->set(0.f);
+ mCtrlEnrollmentFee->set(FALSE);
+ mCtrlOpenEnrollment->set(FALSE);
+ mMembershipList->clearRows();
+
+ // populate list
+ addMembershipRow("Base");
+ addMembershipRow("Premium");
+ addMembershipRow("Premium Plus");
+ addMembershipRow("Internal");// Present only if you are already in one, needed for testing
+
+ S32 cost = LLAgentBenefitsMgr::current().getCreateGroupCost();
+ mCreateButton->setLabelArg("[COST]", llformat("%d", cost));
+}
+
+//static
+void LLPanelGroupCreate::refreshCreatedGroup(const LLUUID& group_id)
+{
+ // Standalone group floaters
+ //LLSD params;
+ //params["group_id"] = group_id;
+ //params["open_tab_name"] = "panel_group_info_sidetray";
+ //LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
+ if (gSavedSettings.getBOOL("FSUseStandaloneGroupFloater"))
+ {
+ FSFloaterGroup::closeGroupFloater(LLUUID::null);
+ FSFloaterGroup::openGroupFloater(group_id);
+ }
+ else
+ {
+ LLSD params;
+ params["group_id"] = group_id;
+ params["open_tab_name"] = "panel_group_info_sidetray";
+ LLFloaterSidePanelContainer::showPanel("people", "panel_group_info_sidetray", params);
+ }
+ //
+}
+
+void LLPanelGroupCreate::addMembershipRow(const std::string &name)
+{
+ if (LLAgentBenefitsMgr::has(name))
+ {
+ bool is_current = LLAgentBenefitsMgr::isCurrent(name);
+
+ LLScrollListItem::Params item_params;
+ LLScrollListCell::Params cell_params;
+ cell_params.font = LLFontGL::getFontSansSerif();
+ // Start out right justifying numeric displays
+ cell_params.font_halign = LLFontGL::LEFT;
+ if (is_current)
+ {
+ cell_params.color = LLUIColorTable::instance().getColor("DrYellow");
+ }
+
+ cell_params.column = "clmn_name";
+ std::string mem_str = name + "Membership";
+ if (is_current)
+ {
+ cell_params.value = LLTrans::getString(mem_str) + " " + getString("current_membership");
+ }
+ else
+ {
+ cell_params.value = LLTrans::getString(mem_str);
+ }
+ item_params.columns.add(cell_params);
+ cell_params.column = "clmn_price";
+ cell_params.value = llformat("L$ %d",LLAgentBenefitsMgr::get(name).getCreateGroupCost());
+ item_params.columns.add(cell_params);
+ mMembershipList->addRow(item_params);
+ }
+}
+
+void LLPanelGroupCreate::onBackBtnClick()
+{
+ // Standalone group floaters
+ //LLSideTrayPanelContainer* parent = dynamic_cast(getParent());
+ //if(parent)
+ //{
+ // parent->openPreviousPanel();
+ //}
+ if (gSavedSettings.getBOOL("FSUseStandaloneGroupFloater"))
+ {
+ FSFloaterGroup::closeGroupFloater(LLUUID::null);
+ }
+ else
+ {
+ LLSideTrayPanelContainer* parent = dynamic_cast(getParent());
+ if(parent)
+ {
+ parent->openPreviousPanel();
+ }
+ }
+ //
+}
+
+bool LLPanelGroupCreate::confirmMatureApply(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // 0 == Yes
+ // 1 == No
+ // 2 == Cancel
+ switch (option)
+ {
+ case 0:
+ mComboMature->setCurrentByIndex(MATURE_CONTENT);
+ createGroup();
+ break;
+ case 1:
+ mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
+ createGroup();
+ break;
+ default:
+ break;
+ }
+
+ return true;
+}
+
+void LLPanelGroupCreate::onBtnCreate()
+{
+ LL_INFOS() << "Validating group creation" << LL_ENDL;
+
+ // Validate the group name length.
+ std::string gr_name = mGroupNameEditor->getText();
+ LLStringUtil::trim(gr_name);
+ S32 group_name_len = gr_name.size();
+ if (group_name_len < DB_GROUP_NAME_MIN_LEN
+ || group_name_len > DB_GROUP_NAME_STR_LEN)
+ {
+ LLSD args;
+ args["MIN_LEN"] = DB_GROUP_NAME_MIN_LEN;
+ args["MAX_LEN"] = DB_GROUP_NAME_STR_LEN;
+ LLNotificationsUtil::add("GroupNameLengthWarning", args);
+ }
+ else
+ // Check to make sure mature has been set
+ if (mComboMature &&
+ mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
+ {
+ LLNotificationsUtil::add("SetGroupMature", LLSD(), LLSD(),
+ boost::bind(&LLPanelGroupCreate::confirmMatureApply, this, _1, _2));
+ }
+ else
+ {
+ createGroup();
+ }
+}
+
+void LLPanelGroupCreate::createGroup()
+{
+ LL_INFOS() << "Creating group" << LL_ENDL;
+
+ U32 enrollment_fee = (mCtrlEnrollmentFee->get() ?
+ (U32)mSpinEnrollmentFee->get() : 0);
+ LLUUID insignia_id = mInsignia->getImageItemID().isNull() ? LLUUID::null : mInsignia->getImageAssetID();
+
+ std::string gr_name = mGroupNameEditor->getText();
+ LLStringUtil::trim(gr_name);
+ LLGroupMgr::getInstance()->sendCreateGroupRequest(gr_name,
+ mEditCharter->getText(),
+ true,
+ insignia_id,
+ enrollment_fee,
+ mCtrlOpenEnrollment->get(),
+ false,
+ mComboMature->getCurrentIndex() == MATURE_CONTENT);
+}
+
diff --git a/indra/newview/llpanelgroupcreate.h b/indra/newview/llpanelgroupcreate.h
new file mode 100644
index 0000000000..3ae2e7f24a
--- /dev/null
+++ b/indra/newview/llpanelgroupcreate.h
@@ -0,0 +1,73 @@
+/**
+ * @file llpanelgroupcreate.h
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2019, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELGROUPCREATE_H
+#define LL_LLPANELGROUPCREATE_H
+
+#include "llpanel.h"
+
+
+// Forward declares
+class LLButton;
+class LLCheckBoxCtrl;
+class LLComboBox;
+class LLLineEditor;
+class LLTextEditor;
+class LLTextureCtrl;
+class LLScrollListCtrl;
+class LLSpinCtrl;
+
+
+class LLPanelGroupCreate : public LLPanel
+{
+public:
+ LLPanelGroupCreate();
+ virtual ~LLPanelGroupCreate();
+
+ virtual BOOL postBuild();
+
+ void onOpen(const LLSD& key);
+
+ static void refreshCreatedGroup(const LLUUID& group_id);
+
+private:
+ void addMembershipRow(const std::string &name);
+ bool confirmMatureApply(const LLSD& notification, const LLSD& response);
+ void onBtnCreate();
+ void onBackBtnClick();
+ void createGroup();
+
+ LLComboBox *mComboMature;
+ LLButton *mCreateButton;
+ LLCheckBoxCtrl *mCtrlOpenEnrollment;
+ LLCheckBoxCtrl *mCtrlEnrollmentFee;
+ LLTextEditor *mEditCharter;
+ LLTextureCtrl *mInsignia;
+ LLLineEditor *mGroupNameEditor;
+ LLScrollListCtrl *mMembershipList;
+ LLSpinCtrl *mSpinEnrollmentFee;
+};
+
+#endif // LL_LLPANELGROUPCREATE_H
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index c8936ed6ec..9d6f04d419 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -30,6 +30,7 @@
#include "llavatarnamecache.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llsdparam.h"
#include "lluictrlfactory.h"
#include "roles_constants.h"
@@ -55,6 +56,7 @@
// Firestorm includes
#include "exogroupmutelist.h"
+#include "fsnamelistavatarmenu.h"
#include "llclipboard.h"
#include "lleconomy.h" //
#include "llurlaction.h"
@@ -135,7 +137,9 @@ BOOL LLPanelGroupGeneral::postBuild()
if (mListVisibleMembers)
{
mListVisibleMembers->setDoubleClickCallback(openProfile, this);
- mListVisibleMembers->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ // Special Firestorm menu also allowing multi-select action
+ //mListVisibleMembers->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ mListVisibleMembers->setContextMenu(&gFSNameListAvatarMenu);
mListVisibleMembers->setSortCallback(boost::bind(&LLPanelGroupGeneral::sortMembersList,this,_1,_2,_3));
}
@@ -377,6 +381,11 @@ void LLPanelGroupGeneral::draw()
bool LLPanelGroupGeneral::apply(std::string& mesg)
{
+ if (mGroupID.isNull())
+ {
+ return false;
+ }
+
if (!mGroupID.isNull() && mAllowEdit && mComboActiveTitle && mComboActiveTitle->isDirty())
{
LLGroupMgr::getInstance()->sendGroupTitleUpdate(mGroupID,mComboActiveTitle->getCurrentID());
@@ -386,7 +395,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
BOOL has_power_in_group = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY);
- if (has_power_in_group || mGroupID.isNull())
+ if (has_power_in_group)
{
LL_INFOS() << "LLPanelGroupGeneral::apply" << LL_ENDL;
@@ -399,31 +408,6 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
return false;
}
- if (mGroupID.isNull())
- {
- // Validate the group name length.
- S32 group_name_len = mGroupNameEditor->getText().size();
- if ( group_name_len < DB_GROUP_NAME_MIN_LEN
- || group_name_len > DB_GROUP_NAME_STR_LEN)
- {
- std::ostringstream temp_error;
- temp_error << "A group name must be between " << DB_GROUP_NAME_MIN_LEN
- << " and " << DB_GROUP_NAME_STR_LEN << " characters.";
- mesg = temp_error.str();
- return false;
- }
-
- // FIRE-7091 group creation cost inaccurate on opensim>
- //LLNotificationsUtil::add("CreateGroupCost", LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));
- LLSD args;
- S32 cost = LLGlobalEconomy::getInstance()->getPriceGroupCreate();
- args["[COST]"] = llformat("%d", cost);
- LLNotificationsUtil::add("CreateGroupCost", args, LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));
- // FIRE-7091 group creation cost inaccurate on opensim>
-
- return false;
- }
-
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
{
@@ -544,37 +528,6 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS
return ret;
}
-// static
-bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- switch(option)
- {
- case 0:
- {
- // Yay! We are making a new group!
- U32 enrollment_fee = (mCtrlEnrollmentFee->get() ?
- (U32) mSpinEnrollmentFee->get() : 0);
- LLUUID insignia_id = mInsignia->getImageItemID().isNull() ? LLUUID::null : mInsignia->getImageAssetID();
-
- LLGroupMgr::getInstance()->sendCreateGroupRequest(mGroupNameEditor->getText(),
- mEditCharter->getText(),
- mCtrlShowInGroupList->get(),
- insignia_id,
- enrollment_fee,
- mCtrlOpenEnrollment->get(),
- false,
- mComboMature->getCurrentIndex() == MATURE_CONTENT);
-
- }
- break;
- case 1:
- default:
- break;
- }
- return false;
-}
-
// virtual
void LLPanelGroupGeneral::update(LLGroupChange gc)
{
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index f9d7841691..5764626468 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -53,7 +53,6 @@ public:
virtual bool needsApply(std::string& mesg);
virtual bool apply(std::string& mesg);
virtual void cancel();
- bool createGroupCallback(const LLSD& notification, const LLSD& response);
virtual void update(LLGroupChange gc);
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index eca833ab08..a06217f818 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -2136,7 +2136,9 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
mRolesList->setCommitOnSelectionChange(TRUE);
mRolesList->setCommitCallback(onRoleSelect, this);
- mAssignedMembersList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ // Special Firestorm menu also allowing multi-select action
+ //mAssignedMembersList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ mAssignedMembersList->setContextMenu(&gFSNameListAvatarMenu);
mMemberVisibleCheck->setCommitCallback(onMemberVisibilityChange, this);
@@ -2968,7 +2970,9 @@ BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root)
mActionList->setCommitOnSelectionChange(TRUE);
mActionList->setCommitCallback(boost::bind(&LLPanelGroupActionsSubTab::handleActionSelect, this));
- mActionList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ // Special Firestorm menu also allowing multi-select action
+ //mActionList->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+ mActionMembers->setContextMenu(&gFSNameListAvatarMenu);
update(GC_ALL);
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index e76543a585..a6f320c964 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -169,7 +169,10 @@ void LLPanelLandAudio::refresh()
std::string current_url = parcel->getMusicURL();
mMusicURLEdit->clearRows();
LLSD streamlist = gSavedSettings.getLLSD("FSStreamList");
- LLSD streams = streamlist["audio"];
+ // FIRE-29157 - Remove invalid URLs that were rejected by the server
+ //LLSD streams = streamlist["audio"];
+ LLSD& streams = streamlist["audio"];
+ //
for(LLSD::array_iterator s_itr = streams.beginArray(); s_itr != streams.endArray(); ++s_itr)
{
@@ -186,6 +189,23 @@ void LLPanelLandAudio::refresh()
//
mMusicURLEdit->setEnabled( can_change_media );
+ // FIRE-29157 - Remove invalid URLs that were rejected by the server
+ if (current_url != mLastSetURL)
+ {
+ mMusicURLEdit->remove(mLastSetURL);
+ LLSD::Integer index = 0;
+ for (LLSD::array_iterator iter = streams.beginArray(), end = streams.endArray(); iter != end; ++iter, ++index)
+ {
+ if ((*iter).asString() == mLastSetURL)
+ {
+ streams.erase(index);
+ break;
+ }
+ }
+ gSavedSettings.setLLSD("FSStreamList", streamlist);
+ }
+ //
+
BOOL can_change_av_sounds = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS) && parcel->getHaveNewParcelLimitData();
mCheckAVSoundAny->set(parcel->getAllowAnyAVSounds());
mCheckAVSoundAny->setEnabled(can_change_av_sounds);
@@ -232,6 +252,10 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
}
//
+ // FIRE-29157 - Remove invalid URLs that were rejected by the server
+ self->mLastSetURL = music_url;
+ //
+
// Push data into current parcel
parcel->setParcelFlag(PF_ALLOW_VOICE_CHAT, voice_enabled);
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
@@ -281,6 +305,13 @@ void LLPanelLandAudio::onBtnStreamDelete()
{
std::string music_url = mMusicURLEdit->getSimple();
LLStringUtil::trim(music_url);
+ // FIRE-29157 - Stream can't be deleted if onCommitAny() prepended "http://" to the URL since it doesn't match in the list.
+ std::string music_url_no_http;
+ if (music_url.find("http://") == 0)
+ {
+ music_url_no_http = music_url.substr(7, music_url.size() - 7);
+ }
+ //
LLSD streamlist = gSavedSettings.getLLSD("FSStreamList");
LLSD streamlist_new;
@@ -289,10 +320,13 @@ void LLPanelLandAudio::onBtnStreamDelete()
for (LLSD::array_const_iterator it = streamlist["audio"].beginArray(); it != streamlist["audio"].endArray(); ++it)
{
std::string current_url = (*it).asString();
- if (current_url != music_url)
+ // FIRE-29157 - Stream can't be deleted if onCommitAny() prepended "http://" to the URL since it doesn't match in the list.
+ //if (current_url != music_url)
+ if (current_url != music_url && !(current_url.find("://") == std::string::npos && current_url == music_url_no_http))
{
streamlist_new["audio"].append(current_url);
}
+ //
}
gSavedSettings.setLLSD("FSStreamList", streamlist_new);
diff --git a/indra/newview/llpanellandaudio.h b/indra/newview/llpanellandaudio.h
index b4673467c0..54a636c88e 100644
--- a/indra/newview/llpanellandaudio.h
+++ b/indra/newview/llpanellandaudio.h
@@ -70,6 +70,10 @@ private:
LLCheckBoxCtrl* mCheckAVSoundGroup;
LLSafeHandle& mParcel;
+
+ // FIRE-29157 - Remove invalid URLs that were rejected by the server
+ std::string mLastSetURL;
+ //
};
#endif
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 71eae6158d..cde85cbdc0 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -1090,16 +1090,35 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
return true;
}
- else if("category" == command_name)
+ else if ("category" == command_name)
{
- // we can add folder only in Landmarks Accordion
- if (mCurrentSelectedList == mLandmarksInventoryPanel)
+ // FIRE-29367: Available actions in "Add" button menu in places window are incorrect
+ //// we can add folder only in Landmarks Accordion
+ //if (mCurrentSelectedList == mLandmarksInventoryPanel)
+ //{
+ // // ... but except Received folder
+ // return !isReceivedFolderSelected();
+ //}
+ ////"Add a folder" is enabled by default (case when My Landmarks is empty)
+ //else return true;
+ std::string current_tabname;
+ LLView* accordion_view = findChildView("landmarks_accordion");
+ LLAccordionCtrl* accordion = dynamic_cast(accordion_view);
+ if (accordion)
{
- // ... but except Received folder
- return !isReceivedFolderSelected();
+ current_tabname = accordion->getSelectedTab()->getName();
}
- //"Add a folder" is enabled by default (case when My Landmarks is empty)
- else return true;
+ else
+ {
+ LLTabContainer* tabcontainer = dynamic_cast(accordion_view);
+ if (tabcontainer)
+ {
+ current_tabname = tabcontainer->getCurrentPanel()->getName();
+ }
+ }
+
+ return current_tabname == "tab_landmarks";
+ //
}
else if("create_pick" == command_name)
{
@@ -1116,7 +1135,23 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
// [RLVa:KB] - Checked: 2012-02-08 (RLVa-1.4.5) | Added: RLVa-1.4.5
else if("add_landmark" == command_name)
{
- return !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC);
+ std::string current_tabname;
+ LLView* accordion_view = findChildView("landmarks_accordion");
+ LLAccordionCtrl* accordion = dynamic_cast(accordion_view);
+ if (accordion)
+ {
+ current_tabname = accordion->getSelectedTab()->getName();
+ }
+ else
+ {
+ LLTabContainer* tabcontainer = dynamic_cast(accordion_view);
+ if (tabcontainer)
+ {
+ current_tabname = tabcontainer->getCurrentPanel()->getName();
+ }
+ }
+
+ return !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC) && current_tabname != "tab_library";
}
// [/RLVa:KB]
else
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index f639ad7f56..3ac1fab1e0 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -551,18 +551,20 @@ void LLPanelLogin::populateFields(LLPointer credential, bool remem
LL_WARNS() << "Attempted fillFields with no login view shown" << LL_ENDL;
return;
}
- LLUICtrl* remember_check = sInstance->getChild("remember_check");
- remember_check->setValue(remember_psswrd);
if (sInstance->mFirstLoginThisInstall)
{
+ LLUICtrl* remember_check = sInstance->getChild("remember_check");
+ remember_check->setValue(remember_psswrd);
// no list to populate
- setFields(credential, remember_psswrd);
+ setFields(credential);
}
else
{
sInstance->getChild("remember_name")->setValue(remember_user);
- sInstance->populateUserList(credential, remember_psswrd);
- remember_check->setEnabled(remember_user);
+ LLUICtrl* remember_password = sInstance->getChild("remember_password");
+ remember_password->setValue(remember_psswrd);
+ remember_password->setEnabled(remember_user);
+ sInstance->populateUserList(credential);
}
}
@@ -582,16 +584,13 @@ void LLPanelLogin::resetFields()
}
else
{
- LLUICtrl* remember_check = sInstance->getChild("remember_check");
- bool remember_psswrd = remember_check->getValue();
LLPointer cred = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
- sInstance->populateUserList(cred, remember_psswrd);
+ sInstance->populateUserList(cred);
}
}
// static
-void LLPanelLogin::setFields(LLPointer credential,
- bool remember_psswrd)
+void LLPanelLogin::setFields(LLPointer credential)
{
if (!sInstance)
{
@@ -615,15 +614,19 @@ void LLPanelLogin::setFields(LLPointer credential,
login_id += " ";
login_id += lastname;
}
- sInstance->getChild("username_combo")->setLabel(login_id);
+ sInstance->getChild("username_combo")->setLabel(login_id);
+ sInstance->mUsernameLength = login_id.length();
}
else if(identifier.has("type") && (std::string)identifier["type"] == "account")
{
- sInstance->getChild("username_combo")->setLabel((std::string)identifier["account_name"]);
+ std::string login_id = identifier["account_name"].asString();
+ sInstance->getChild("username_combo")->setLabel(login_id);
+ sInstance->mUsernameLength = login_id.length();
}
else
{
- sInstance->getChild("username_combo")->setLabel(std::string());
+ sInstance->getChild("username_combo")->setLabel(std::string());
+ sInstance->mUsernameLength = 0;
}
sInstance->addFavoritesToStartLocation();
@@ -633,7 +636,7 @@ void LLPanelLogin::setFields(LLPointer credential,
LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL;
if(authenticator.isMap() &&
authenticator.has("secret") &&
- (authenticator["secret"].asString().size() > 0) && remember_psswrd)
+ (authenticator["secret"].asString().size() > 0))
{
// This is a MD5 hex digest of a password.
@@ -647,7 +650,8 @@ void LLPanelLogin::setFields(LLPointer credential,
}
else
{
- sInstance->getChild("password_edit")->setValue(std::string());
+ sInstance->getChild("password_edit")->setValue(std::string());
+ sInstance->mPasswordLength = 0;
}
}
@@ -665,7 +669,7 @@ void LLPanelLogin::getFields(LLPointer& credential,
LLSD identifier = LLSD::emptyMap();
LLSD authenticator = LLSD::emptyMap();
- std::string username = sInstance->getChild("username_combo")->getValue().asString();
+ std::string username = sInstance->getChild("username_combo")->getSimple();
std::string password = sInstance->getChild("password_edit")->getValue().asString();
LLStringUtil::trim(username);
@@ -747,14 +751,15 @@ void LLPanelLogin::getFields(LLPointer& credential,
}
}
credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
- remember_psswrd = sInstance->getChild("remember_check")->getValue();
if (!sInstance->mFirstLoginThisInstall)
{
+ remember_psswrd = sInstance->getChild("remember_password")->getValue();
remember_user = sInstance->getChild("remember_name")->getValue();
}
else
{
- remember_user = true;
+ remember_psswrd = sInstance->getChild("remember_check")->getValue();
+ remember_user = remember_psswrd; // on panel_login_first "remember_check" is named as 'remember me'
}
}
@@ -768,11 +773,8 @@ BOOL LLPanelLogin::areCredentialFieldsDirty()
}
else
{
- std::string username = sInstance->getChild("username_combo")->getValue().asString();
- LLStringUtil::trim(username);
- std::string password = sInstance->getChild("password_edit")->getValue().asString();
LLComboBox* combo = sInstance->getChild("username_combo");
- if(combo && combo->isDirty())
+ if (combo && combo->getCurrentIndex() == -1 && !combo->getValue().asString().empty())
{
return true;
}
@@ -1032,19 +1034,19 @@ void LLPanelLogin::onClickConnect(void *)
LLSD allowed_credential_types;
LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types);
- // check the typed in credential type against the credential types expected by the server.
- for(LLSD::array_iterator i = allowed_credential_types.beginArray();
- i != allowed_credential_types.endArray();
- i++)
- {
+ // check the typed in credential type against the credential types expected by the server.
+ for(LLSD::array_iterator i = allowed_credential_types.beginArray();
+ i != allowed_credential_types.endArray();
+ i++)
+ {
- if(i->asString() == identifier_type)
- {
- // yay correct credential type
- sInstance->mCallback(0, sInstance->mCallbackData);
- return;
- }
+ if(i->asString() == identifier_type)
+ {
+ // yay correct credential type
+ sInstance->mCallback(0, sInstance->mCallbackData);
+ return;
}
+ }
// Right now, maingrid is the only thing that is picky about
// credential format, as it doesn't yet allow account (single username)
@@ -1064,7 +1066,7 @@ void LLPanelLogin::onClickVersion(void*)
//static
void LLPanelLogin::onClickForgotPassword(void*)
{
- if (sInstance)
+ if (sInstance )
{
LLWeb::loadURLExternal(sInstance->getString( "forgot_password_url" ));
}
@@ -1084,6 +1086,7 @@ void LLPanelLogin::onUserNameTextEnty(void*)
{
sInstance->mPasswordModified = true;
sInstance->getChild("password_edit")->setValue(std::string());
+ sInstance->mPasswordLength = 0;
sInstance->addFavoritesToStartLocation(); //will call updateLoginButtons()
}
@@ -1098,8 +1101,7 @@ void LLPanelLogin::onUserListCommit(void*)
{
std::string user_key = username_combo->getSelectedValue();
LLPointer cred = gSecAPIHandler->loadFromCredentialMap("login_list", LLGridManager::getInstance()->getGrid(), user_key);
- bool remember_psswrd = sInstance->getChild("remember_check")->getValue();
- setFields(cred, remember_psswrd);
+ setFields(cred);
sInstance->mPasswordModified = false;
}
else
@@ -1118,14 +1120,22 @@ void LLPanelLogin::onUserListCommit(void*)
}
// static
+// At the moment only happens if !mFirstLoginThisInstall
void LLPanelLogin::onRememberUserCheck(void*)
{
- if (sInstance)
+ if (sInstance && !sInstance->mFirstLoginThisInstall)
{
LLCheckBoxCtrl* remember_name(sInstance->getChild("remember_name"));
- LLCheckBoxCtrl* remember_psswrd(sInstance->getChild("remember_check"));
+ LLCheckBoxCtrl* remember_psswrd(sInstance->getChild("remember_password"));
+ LLComboBox* user_combo(sInstance->getChild("username_combo"));
bool remember = remember_name->getValue().asBoolean();
+ if (user_combo->getCurrentIndex() != -1 && !remember)
+ {
+ remember = true;
+ remember_name->setValue(true);
+ LLNotificationsUtil::add("LoginCantRemoveUsername");
+ }
remember_psswrd->setEnabled(remember);
}
}
@@ -1154,14 +1164,37 @@ void LLPanelLogin::updateServer()
try
{
// if they've selected another grid, we should load the credentials
- // for that grid and set them to the UI.
- if(!sInstance->areCredentialFieldsDirty())
+ // for that grid and set them to the UI. But if there were any modifications to
+ // fields, modifications should carry over.
+ // Not sure if it should carry over password but it worked like this before login changes
+ // Example: you started typing in and found that your are under wrong grid,
+ // you switch yet don't lose anything
+ if (sInstance->areCredentialFieldsDirty())
{
+ // save modified creds
+ LLComboBox* user_combo = sInstance->getChild("username_combo");
+ LLLineEditor* pswd_edit = sInstance->getChild("password_edit");
+ std::string username = user_combo->getSimple();
+ LLStringUtil::trim(username);
+ std::string password = pswd_edit->getValue().asString();
+
// populate dropbox and setFields
- bool remember_psswrd = sInstance->getChild("remember_check")->getValue();
// Note: following call is related to initializeLoginInfo()
LLPointer credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
- sInstance->populateUserList(credential, remember_psswrd);
+ sInstance->populateUserList(credential);
+
+ // restore creds
+ user_combo->setTextEntry(username);
+ pswd_edit->setValue(password);
+ sInstance->mUsernameLength = username.length();
+ sInstance->mPasswordLength = password.length();
+ }
+ else
+ {
+ // populate dropbox and setFields
+ // Note: following call is related to initializeLoginInfo()
+ LLPointer credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+ sInstance->populateUserList(credential);
}
// update the login panel links
@@ -1192,19 +1225,28 @@ void LLPanelLogin::updateLoginButtons()
login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);
- if (!mFirstLoginThisInstall)
- {
- LLComboBox* user_combo = getChild("username_combo");
- LLCheckBoxCtrl* remember_name = getChild("remember_name");
- remember_name->setEnabled(user_combo->getCurrentIndex() == -1);
- }
+ if (!mFirstLoginThisInstall)
+ {
+ LLComboBox* user_combo = getChild("username_combo");
+ LLCheckBoxCtrl* remember_name = getChild("remember_name");
+ if (user_combo->getCurrentIndex() != -1)
+ {
+ remember_name->setValue(true);
+ LLCheckBoxCtrl* remember_pass = getChild("remember_password");
+ remember_pass->setEnabled(TRUE);
+ } // Note: might be good idea to do "else remember_name->setValue(mRememberedState)" but it might behave 'weird' to user
+ }
}
-void LLPanelLogin::populateUserList(LLPointer credential, bool remember_psswrd)
+void LLPanelLogin::populateUserList(LLPointer credential)
{
LLComboBox* user_combo = getChild("username_combo");
user_combo->removeall();
user_combo->clear();
+ user_combo->setValue(std::string());
+ getChild("password_edit")->setValue(std::string());
+ mUsernameLength = 0;
+ mPasswordLength = 0;
if (gSecAPIHandler->hasCredentialMap("login_list", LLGridManager::getInstance()->getGrid()))
{
@@ -1225,20 +1267,33 @@ void LLPanelLogin::populateUserList(LLPointer credential, bool rem
if (credential.isNull() || !user_combo->setSelectedByValue(LLSD(credential->userID()), true))
{
- // selection failed, just deselect whatever might be selected
- user_combo->setValue(std::string());
+ // selection failed, fields will be mepty
+ updateLoginButtons();
}
else
{
- setFields(credential, remember_psswrd);
+ setFields(credential);
}
}
else
{
if (credential.notNull())
{
- user_combo->add(LLPanelLogin::getUserName(credential), credential->userID(), ADD_BOTTOM, TRUE);
- setFields(credential, remember_psswrd);
+ const LLSD &ident = credential->getIdentifier();
+ if (ident.isMap() && ident.has("type"))
+ {
+ // this llsd might hold invalid credencial (failed login), so
+ // do not add to the list, just set field.
+ setFields(credential);
+ }
+ else
+ {
+ updateLoginButtons();
+ }
+ }
+ else
+ {
+ updateLoginButtons();
}
}
}
@@ -1288,6 +1343,7 @@ void LLPanelLogin::onSelectServer()
}
break;
}
+
updateServer();
}
@@ -1336,4 +1392,3 @@ std::string LLPanelLogin::getUserName(LLPointer &cred)
return "unknown";
}
#endif
-
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 8774e4c33c..963e9a3996 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -98,7 +98,7 @@ private:
void onSelectServer();
void onLocationSLURL();
- static void setFields(LLPointer credential, bool remember_psswrd);
+ static void setFields(LLPointer credential);
static void onClickConnect(void*);
static void onClickNewAccount(void*);
@@ -115,7 +115,7 @@ private:
boost::scoped_ptr mListener;
void updateLoginButtons();
- void populateUserList(LLPointer credential, bool remember_psswrd);
+ void populateUserList(LLPointer credential);
void (*mCallback)(S32 option, void *userdata);
void* mCallbackData;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 1e88278952..0c80d842bd 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -28,12 +28,12 @@
#include "llpanelmaininventory.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llavataractions.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldndbutton.h"
-#include "lleconomy.h"
#include "llfilepicker.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -324,19 +324,28 @@ BOOL LLPanelMainInventory::postBuild()
initListCommandsHandlers();
//
-// // *TODO:Get the cost info from the server
-// const std::string upload_cost("10");
- S32 cost = LLGlobalEconomy::getInstance()->getPriceUpload();
- std::string upload_cost;
+ //const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
+ //const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
+ //const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
+ S32 texture_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 sound_upload_cost = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ S32 animation_upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ std::string texture_upload_cost_str;
+ std::string sound_upload_cost_str;
+ std::string animation_upload_cost_str;
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
- upload_cost = cost > 0 ? llformat("%s%d", "L$", cost) : LLTrans::getString("free");
+ texture_upload_cost_str = texture_upload_cost > 0 ? llformat("%s%d", "L$", texture_upload_cost) : LLTrans::getString("free");
+ sound_upload_cost_str = sound_upload_cost > 0 ? llformat("%s%d", "L$", sound_upload_cost) : LLTrans::getString("free");
+ animation_upload_cost_str = animation_upload_cost > 0 ? llformat("%s%d", "L$", animation_upload_cost) : LLTrans::getString("free");
}
else
#endif
{
- upload_cost = "L$" + (cost > 0 ? llformat("%d", cost) : llformat("%d", gSavedSettings.getU32("DefaultUploadCost")));
+ texture_upload_cost_str = "L$" + llformat("%d", texture_upload_cost);
+ sound_upload_cost_str = "L$" + llformat("%d", sound_upload_cost);
+ animation_upload_cost_str = "L$" + llformat("%d", animation_upload_cost);
}
//
@@ -344,10 +353,9 @@ BOOL LLPanelMainInventory::postBuild()
LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
if (menu)
{
- menu->getChild("Upload Image")->setLabelArg("[COST]", upload_cost);
- menu->getChild("Upload Sound")->setLabelArg("[COST]", upload_cost);
- menu->getChild("Upload Animation")->setLabelArg("[COST]", upload_cost);
- menu->getChild("Bulk Upload")->setLabelArg("[COST]", upload_cost);
+ menu->getChild("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
+ menu->getChild("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
+ menu->getChild("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
}
// Trigger callback for focus received so we can deselect items in inbox/outbox
@@ -2051,47 +2059,37 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType
void LLPanelMainInventory::setUploadCostIfNeeded()
{
- // *NOTE dzaporozhan
- // Upload cost is set in process_economy_data() (llviewermessage.cpp). But since we
- // have two instances of Inventory panel at the moment(and two instances of context menu),
- // call to gMenuHolder->childSetLabelArg() sets upload cost only for one of the instances.
-
LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
if(mNeedUploadCost && menu)
{
- LLMenuItemBranchGL* upload_menu = menu->findChild("upload");
- if(upload_menu)
- {
- S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
- std::string cost_str;
-
- // getPriceUpload() returns -1 if no data available yet.
//
-// if(upload_cost >= 0)
-// {
-// mNeedUploadCost = false;
-// cost_str = llformat("%d", upload_cost);
-// }
-// else
-// {
-// cost_str = llformat("%d", gSavedSettings.getU32("DefaultUploadCost"));
-// }
+ //const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
+ //const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
+ //const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
+ S32 texture_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 sound_upload_cost = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ S32 animation_upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ std::string texture_upload_cost_str;
+ std::string sound_upload_cost_str;
+ std::string animation_upload_cost_str;
#ifdef OPENSIM
- if (LLGridManager::getInstance()->isInOpenSim())
- {
- cost_str = upload_cost > 0 ? llformat("%s%d", "L$", upload_cost) : LLTrans::getString("free");
- }
- else
-#endif
- {
- cost_str = "L$" + (upload_cost > 0 ? llformat("%d", upload_cost) : llformat("%d", gSavedSettings.getU32("DefaultUploadCost")));
- }
-//
- upload_menu->getChild("Upload Image")->setLabelArg("[COST]", cost_str);
- upload_menu->getChild("Upload Sound")->setLabelArg("[COST]", cost_str);
- upload_menu->getChild("Upload Animation")->setLabelArg("[COST]", cost_str);
- upload_menu->getChild("Bulk Upload")->setLabelArg("[COST]", cost_str);
+ if (LLGridManager::getInstance()->isInOpenSim())
+ {
+ texture_upload_cost_str = texture_upload_cost > 0 ? llformat("%s%d", "L$", texture_upload_cost) : LLTrans::getString("free");
+ sound_upload_cost_str = sound_upload_cost > 0 ? llformat("%s%d", "L$", sound_upload_cost) : LLTrans::getString("free");
+ animation_upload_cost_str = animation_upload_cost > 0 ? llformat("%s%d", "L$", animation_upload_cost) : LLTrans::getString("free");
}
+ else
+#endif
+ {
+ texture_upload_cost_str = "L$" + llformat("%d", texture_upload_cost);
+ sound_upload_cost_str = "L$" + llformat("%d", sound_upload_cost);
+ animation_upload_cost_str = "L$" + llformat("%d", animation_upload_cost);
+ }
+//
+ menu->getChild("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
+ menu->getChild("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
+ menu->getChild("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
}
}
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 8d670f8c80..4a5fb35645 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -30,7 +30,6 @@
#include "llpanelobject.h"
// linden library includes
-#include "lleconomy.h"
#include "llerror.h"
#include "llfontgl.h"
#include "llpermissionsflags.h"
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 0df8b32aeb..9c7ae73454 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1733,12 +1733,13 @@ void LLPanelObjectInventory::refresh()
//LL_INFOS() << "LLPanelObjectInventory::refresh()" << LL_ENDL;
BOOL has_inventory = FALSE;
const BOOL non_root_ok = TRUE;
- LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok);
- if(node)
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ LLSelectNode* node = selection->getFirstRootNode(NULL, non_root_ok);
+ if(node && node->mValid)
{
LLViewerObject* object = node->getObject();
- if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
- || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)))
+ if(object && ((selection->getRootObjectCount() == 1)
+ || (selection->getObjectCount() == 1)))
{
// determine if we need to make a request. Start with a
// default based on if we have inventory at all.
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 795b8d0f32..c58e420d53 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -47,6 +47,7 @@
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llavataractions.h"
#include "llavatarlist.h"
#include "llavatarlistitem.h"
@@ -99,9 +100,6 @@ static const std::string BLOCKED_TAB_NAME = "blocked_panel"; // blocked avatars
static const std::string CONTACT_SETS_TAB_NAME = "contact_sets_panel"; // [FS:CR] Contact sets
static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
-const S32 BASE_MAX_AGENT_GROUPS = 42;
-const S32 PREMIUM_MAX_AGENT_GROUPS = 60;
-
// [FS] FIRE-12229
//extern S32 gMaxAgentGroups;
@@ -662,16 +660,7 @@ void LLPanelPeople::removePicker()
BOOL LLPanelPeople::postBuild()
{
// Don't bother with "want more?" advertisement
- //S32 max_premium = PREMIUM_MAX_AGENT_GROUPS;
- //if (gAgent.getRegion())
- //{
- // LLSD features;
- // gAgent.getRegion()->getSimulatorFeatures(features);
- // if (features.has("MaxAgentGroupsPremium"))
- // {
- // max_premium = features["MaxAgentGroupsPremium"].asInteger();
- // }
- //}
+ //S32 max_premium = LLAgentBenefitsMgr::get("Premium").getGroupMembershipLimit();
//
// Firestorm radar
@@ -681,13 +670,12 @@ BOOL LLPanelPeople::postBuild()
getChild("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
// Don't bother with "want more?" advertisement
- //if(gMaxAgentGroups <= max_premium)
+ //if(LLAgentBenefitsMgr::current().getGroupMembershipLimit() < max_premium)
//{
- // getChild("groupcount")->setText(getString("GroupCountWithInfo"));
- // getChild("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
+ // getChild("groupcount")->setText(getString("GroupCountWithInfo"));
+ // getChild("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
//}
//
-
mTabContainer = getChild("tabs");
mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2));
mSavedFilters.resize(mTabContainer->getTabCount());
@@ -1009,13 +997,14 @@ void LLPanelPeople::updateButtons()
LLPanel* groups_panel = mTabContainer->getCurrentPanel();
groups_panel->getChildView("minus_btn")->setEnabled(item_selected && selected_id.notNull()); // a real group selected
- // [CR] FIRE-12229
+ // FIRE-12229
//U32 groups_count = gAgent.mGroups.size();
- //U32 groups_ramaining = gMaxAgentGroups > groups_count ? gMaxAgentGroups - groups_count : 0;
+ //S32 max_groups = LLAgentBenefitsMgr::current().getGroupMembershipLimit();
+ //U32 groups_remaining = max_groups > groups_count ? max_groups - groups_count : 0;
//groups_panel->getChild("groupcount")->setTextArg("[COUNT]", llformat("%d", groups_count));
- //groups_panel->getChild("groupcount")->setTextArg("[REMAINING]", llformat("%d", groups_ramaining));
+ //groups_panel->getChild("groupcount")->setTextArg("[REMAINING]", llformat("%d", groups_remaining));
getChild("groupcount")->setValue(FSCommon::populateGroupCount());
- // [/CR]
+ //
}
else
{
@@ -1260,25 +1249,22 @@ void LLPanelPeople::onGroupLimitInfo()
{
LLSD args;
- S32 max_basic = BASE_MAX_AGENT_GROUPS;
- S32 max_premium = PREMIUM_MAX_AGENT_GROUPS;
- if (gAgent.getRegion())
- {
- LLSD features;
- gAgent.getRegion()->getSimulatorFeatures(features);
- if (features.has("MaxAgentGroupsBasic"))
- {
- max_basic = features["MaxAgentGroupsBasic"].asInteger();
- }
- if (features.has("MaxAgentGroupsPremium"))
- {
- max_premium = features["MaxAgentGroupsPremium"].asInteger();
- }
- }
- args["MAX_BASIC"] = max_basic;
- args["MAX_PREMIUM"] = max_premium;
+ S32 max_basic = LLAgentBenefitsMgr::get("Base").getGroupMembershipLimit();
+ S32 max_premium = LLAgentBenefitsMgr::get("Premium").getGroupMembershipLimit();
+
+ args["MAX_BASIC"] = max_basic;
+ args["MAX_PREMIUM"] = max_premium;
- LLNotificationsUtil::add("GroupLimitInfo", args);
+ if (LLAgentBenefitsMgr::has("Premium Plus"))
+ {
+ S32 max_premium_plus = LLAgentBenefitsMgr::get("Premium Plus").getGroupMembershipLimit();
+ args["MAX_PREMIUM_PLUS"] = max_premium_plus;
+ LLNotificationsUtil::add("GroupLimitInfoPlus", args);
+ }
+ else
+ {
+ LLNotificationsUtil::add("GroupLimitInfo", args);
+ }
}
void LLPanelPeople::onTabSelected(const LLSD& param)
diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp
index a49fde5fc8..ce12c5ea2a 100644
--- a/indra/newview/llpanelsnapshot.cpp
+++ b/indra/newview/llpanelsnapshot.cpp
@@ -39,6 +39,8 @@
#include "llsidetraypanelcontainer.h"
#include "llviewercontrol.h" // gSavedSettings
+#include "llagentbenefits.h"
+
const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512
S32 power_of_two(S32 sz, S32 upper)
@@ -59,6 +61,7 @@ LLPanelSnapshot::LLPanelSnapshot()
// virtual
BOOL LLPanelSnapshot::postBuild()
{
+ getChild("save_btn")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
getChild(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshot::onResolutionComboCommit, this, _1));
if (!getWidthSpinnerName().empty())
{
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index 45e4318f4c..17011a9626 100644
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -27,7 +27,6 @@
#include "llviewerprecompiledheaders.h"
#include "llcombobox.h"
-#include "lleconomy.h"
#include "llsidetraypanelcontainer.h"
#include "llspinctrl.h"
@@ -38,6 +37,8 @@
#include "llstatusbar.h" // can_afford_transaction()
#include "llnotificationsutil.h"
+#include "llagentbenefits.h"
+
// FIRE-10537 - Temp texture uploads aren't functional on SSB regions
#include "llagent.h"
#include "llviewerregion.h"
@@ -150,14 +151,13 @@ BOOL LLPanelSnapshotInventory::postBuild()
// virtual
void LLPanelSnapshotInventory::onOpen(const LLSD& key)
{
- getChild("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload()));
// FIRE-10537 - Temp texture uploads aren't functional on SSB regions
- if (LLGlobalEconomy::getInstance()->getPriceUpload() == 0
+ if (LLAgentBenefitsMgr::current().getTextureUploadCost() == 0
|| gAgent.getRegion()->getCentralBakeVersion() > 0)
{
gSavedSettings.setBOOL("TemporaryUpload", FALSE);
}
- getChild("inventory_temp_upload")->setVisible(LLGlobalEconomy::getInstance()->getPriceUpload() > 0 && gAgent.getRegion()->getCentralBakeVersion() == 0);
+ getChild("inventory_temp_upload")->setVisible(LLAgentBenefitsMgr::current().getTextureUploadCost() > 0 && gAgent.getRegion()->getCentralBakeVersion() == 0);
//
LLPanelSnapshot::onOpen(key);
}
@@ -187,7 +187,7 @@ LLPanelSnapshotInventory::~LLPanelSnapshotInventory()
void LLPanelSnapshotInventoryBase::onSend()
{
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
if (can_afford_transaction(expected_upload_cost))
{
if (mSnapshotFloater)
@@ -223,7 +223,7 @@ BOOL LLPanelOutfitSnapshotInventory::postBuild()
// virtual
void LLPanelOutfitSnapshotInventory::onOpen(const LLSD& key)
{
- getChild("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::getInstance()->getPriceUpload()));
+ getChild("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLAgentBenefitsMgr::current().getTextureUploadCost()));
LLPanelSnapshot::onOpen(key);
}
diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp
index 45c7b2ba49..84749e42b2 100644
--- a/indra/newview/llpanelsnapshotoptions.cpp
+++ b/indra/newview/llpanelsnapshotoptions.cpp
@@ -26,7 +26,6 @@
#include "llviewerprecompiledheaders.h"
-#include "lleconomy.h"
#include "llpanel.h"
#include "llsidetraypanelcontainer.h"
@@ -34,12 +33,14 @@
#include "llfloaterreg.h"
#include "llfloaterflickr.h" // Share to Flickr
+#include "llagentbenefits.h"
+
+
/**
* Provides several ways to save a snapshot.
*/
class LLPanelSnapshotOptions
: public LLPanel
-, public LLEconomyObserver
{
LOG_CLASS(LLPanelSnapshotOptions);
@@ -48,7 +49,6 @@ public:
~LLPanelSnapshotOptions();
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
- /*virtual*/ void onEconomyDataChange() { updateUploadCost(); }
private:
void updateUploadCost();
@@ -71,13 +71,10 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions()
mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this));
mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this));
mCommitCallbackRegistrar.add("Snapshot.SendToFlickr", boost::bind(&LLPanelSnapshotOptions::onSendToFlickr, this)); // Share to Flickr
-
- LLGlobalEconomy::getInstance()->addObserver(this);
}
LLPanelSnapshotOptions::~LLPanelSnapshotOptions()
{
- LLGlobalEconomy::getInstance()->removeObserver(this);
}
// virtual
@@ -95,7 +92,7 @@ void LLPanelSnapshotOptions::onOpen(const LLSD& key)
void LLPanelSnapshotOptions::updateUploadCost()
{
- S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
+ S32 upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
getChild("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost));
}
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index a545cba557..9404c6bfbd 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -31,7 +31,6 @@
// linden library includes
#include "llclickaction.h"
-#include "lleconomy.h"
#include "llerror.h"
#include "llfontgl.h"
#include "llflexibleobject.h"
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 0e585dc63f..2b6f6a8596 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -612,7 +612,9 @@ void LLPanelWearing::onRemoveAttachment()
{
LLSelectMgr::getInstance()->deselectAll();
LLSelectMgr::getInstance()->selectObjectAndFamily(mAttachmentsMap[item->getUUID()]);
- LLSelectMgr::getInstance()->sendDropAttachment();
+ // Can't drop to the ground, so detach instead
+ //LLSelectMgr::getInstance()->sendDropAttachment();
+ LLSelectMgr::getInstance()->sendDetach();
}
}
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
index 1809c57968..dfd7aeb9e9 100644
--- a/indra/newview/llsecapi.h
+++ b/indra/newview/llsecapi.h
@@ -493,6 +493,10 @@ public:
virtual bool hasCredentialMap(const std::string& storage,
const std::string& grid)=0;
+ // returns true if map is empty or does not exist
+ virtual bool emptyCredentialMap(const std::string& storage,
+ const std::string& grid)=0;
+
// load map of credentials from specific storage
typedef std::map > credential_map_t;
virtual void loadCredentialMap(const std::string& storage,
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
index dca4748115..4d641ae17b 100644
--- a/indra/newview/llsechandler_basic.cpp
+++ b/indra/newview/llsechandler_basic.cpp
@@ -1274,8 +1274,9 @@ void LLSecAPIBasicHandler::init()
"bin_conf.dat");
mLegacyPasswordPath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "password.dat");
- mProtectedDataFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
- "bin_conf.dat");
+ // Duplicate line
+ //mProtectedDataFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ // "bin_conf.dat");
std::string store_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
"CA.pem");
@@ -1676,6 +1677,19 @@ bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const st
return credential.isMap();
}
+// returns true if map is empty or does not exist
+bool LLSecAPIBasicHandler::emptyCredentialMap(const std::string& storage, const std::string& grid)
+{
+ if (storage == DEFAULT_CREDENTIAL_STORAGE)
+ {
+ LL_ERRS() << "Storing maps in default, single-items storage is not allowed" << LL_ENDL;
+ }
+
+ LLSD credential = getProtectedData(storage, grid);
+
+ return !credential.isMap() || credential.size() == 0;
+}
+
// Load map of credentials from specified credential store, given the grid
void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map)
{
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
index c3e338c9c2..59dc6f803a 100644
--- a/indra/newview/llsechandler_basic.h
+++ b/indra/newview/llsechandler_basic.h
@@ -295,6 +295,10 @@ public:
virtual bool hasCredentialMap(const std::string& storage,
const std::string& grid);
+ // returns true if map is empty or does not exist
+ virtual bool emptyCredentialMap(const std::string& storage,
+ const std::string& grid);
+
// load map of credentials from specific storage
virtual void loadCredentialMap(const std::string& storage,
const std::string& grid,
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 11f317c1b3..3f7e53e5d9 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -35,7 +35,6 @@
#include "llcachename.h"
#include "llavatarnamecache.h"
#include "lldbstrings.h"
-#include "lleconomy.h"
#include "llgl.h"
#include "llmediaentry.h"
#include "llrender.h"
@@ -5618,7 +5617,7 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
}
else
{
- if (node->mInventorySerial != inv_serial)
+ if (node->mInventorySerial != inv_serial && node->getObject())
{
node->getObject()->dirtyInventory();
}
diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp
index f169e72ac7..e102e25269 100644
--- a/indra/newview/llskinningutil.cpp
+++ b/indra/newview/llskinningutil.cpp
@@ -125,49 +125,49 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin
}
// Per frame SkinningMatrix Caching
-//void LLSkinningUtil::initSkinningMatrixPalette(
-// LLMatrix4* mat,
-// S32 count,
-// const LLMeshSkinInfo* skin,
-// LLVOAvatar *avatar)
-//{
-// initJointNums(const_cast(skin), avatar);
-// for (U32 j = 0; j < count; ++j)
-// {
-// LLJoint *joint = avatar->getJoint(skin->mJointNums[j]);
-// if (joint)
-// {
-//#define MAT_USE_SSE
-//#ifdef MAT_USE_SSE
-// LLMatrix4a bind, world, res;
-// bind.loadu(skin->mInvBindMatrix[j]);
-// world.loadu(joint->getWorldMatrix());
-// matMul(bind, world, res);
-// memcpy(mat[j].mMatrix, res.mMatrix, 16 * sizeof(float));
-//#else
-// mat[j] = skin->mInvBindMatrix[j];
-// mat[j] *= joint->getWorldMatrix();
-//#endif
-// }
-// else
-// {
-// mat[j] = skin->mInvBindMatrix[j];
-// // This shouldn't happen - in mesh upload, skinned
-// // rendering should be disabled unless all joints are
-// // valid. In other cases of skinned rendering, invalid
-// // joints should already have been removed during scrubInvalidJoints().
-// LL_WARNS_ONCE("Avatar") << avatar->getFullname()
-// << " rigged to invalid joint name " << skin->mJointNames[j]
-// << " num " << skin->mJointNums[j] << LL_ENDL;
-// LL_WARNS_ONCE("Avatar") << avatar->getFullname()
-// << " avatar build state: isBuilt() " << avatar->isBuilt()
-// << " mInitFlags " << avatar->mInitFlags << LL_ENDL;
-//#if 0
-// dump_avatar_and_skin_state("initSkinningMatrixPalette joint not found", avatar, skin);
-//#endif
-// }
-// }
-//}
+//void LLSkinningUtil::initSkinningMatrixPalette(
+// LLMatrix4* mat,
+// S32 count,
+// const LLMeshSkinInfo* skin,
+// LLVOAvatar *avatar)
+//{
+// initJointNums(const_cast(skin), avatar);
+// for (U32 j = 0; j < count; ++j)
+// {
+// LLJoint *joint = avatar->getJoint(skin->mJointNums[j]);
+// if (joint)
+// {
+//#define MAT_USE_SSE
+//#ifdef MAT_USE_SSE
+// LLMatrix4a bind, world, res;
+// bind.loadu(skin->mInvBindMatrix[j]);
+// world.loadu(joint->getWorldMatrix());
+// matMul(bind, world, res);
+// memcpy(mat[j].mMatrix, res.mMatrix, 16 * sizeof(float));
+//#else
+// mat[j] = skin->mInvBindMatrix[j];
+// mat[j] *= joint->getWorldMatrix();
+//#endif
+// }
+// else
+// {
+// mat[j] = skin->mInvBindMatrix[j];
+// // This shouldn't happen - in mesh upload, skinned
+// // rendering should be disabled unless all joints are
+// // valid. In other cases of skinned rendering, invalid
+// // joints should already have been removed during scrubInvalidJoints().
+// LL_WARNS_ONCE("Avatar") << avatar->getFullname()
+// << " rigged to invalid joint name " << skin->mJointNames[j]
+// << " num " << skin->mJointNums[j] << LL_ENDL;
+// LL_WARNS_ONCE("Avatar") << avatar->getFullname()
+// << " avatar build state: isBuilt() " << avatar->isBuilt()
+// << " mInitFlags " << avatar->mInitFlags << LL_ENDL;
+//#if 0
+// dump_avatar_and_skin_state("initSkinningMatrixPalette joint not found", avatar, skin);
+//#endif
+// }
+// }
+//}
#ifndef LL_RELEASE_FOR_DOWNLOAD
static LLTrace::BlockTimerStatHandle FTM_SKINNING_INIT("Init Skinning Mats");
@@ -201,17 +201,17 @@ void LLSkinningUtil::initSkinningMatrixPalette(
else
{
mat[j].loadu(skin->mInvBindMatrix[j]);
- // This shouldn't happen - in mesh upload, skinned
- // rendering should be disabled unless all joints are
- // valid. In other cases of skinned rendering, invalid
+ // This shouldn't happen - in mesh upload, skinned
+ // rendering should be disabled unless all joints are
+ // valid. In other cases of skinned rendering, invalid
// joints should already have been removed during scrubInvalidJoints().
- // Beq note - Oct 2018 Animesh - Many rigged meshes still fail here. ('mElbowLeeft' typo in the rigging data)
- LL_WARNS_ONCE("Avatar") << avatar->getFullname()
- << " rigged to invalid joint name " << skin->mJointNames[j]
- << " num " << skin->mJointNums[j] << LL_ENDL;
- LL_WARNS_ONCE("Avatar") << avatar->getFullname()
- << " avatar build state: isBuilt() " << avatar->isBuilt()
- << " mInitFlags " << avatar->mInitFlags << LL_ENDL;
+ // Beq note - Oct 2018 Animesh - Many rigged meshes still fail here. ('mElbowLeeft' typo in the rigging data)
+ LL_WARNS_ONCE("Avatar") << avatar->getFullname()
+ << " rigged to invalid joint name " << skin->mJointNames[j]
+ << " num " << skin->mJointNums[j] << LL_ENDL;
+ LL_WARNS_ONCE("Avatar") << avatar->getFullname()
+ << " avatar build state: isBuilt() " << avatar->isBuilt()
+ << " mInitFlags " << avatar->mInitFlags << LL_ENDL;
}
//LL_DEBUGS("Skinning") << "[" << avatar->getFullname() << "] joint(" << skin->mJointNames[j] << ") matices bind(" << bind << ") world(" << world << ")" << LL_ENDL;
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 38c07e43fe..d7da7d94b8 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -28,10 +28,10 @@
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llagentui.h"
#include "llcombobox.h"
-#include "lleconomy.h"
#include "llfloaterperms.h"
#include "llfloaterreg.h"
#include "llfloaterflickr.h" // Share to Flickr
@@ -1122,7 +1122,7 @@ void LLSnapshotLivePreview::saveTexture(BOOL outfit_snapshot, std::string name)
LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);
std::string who_took_it;
LLAgentUI::buildFullname(who_took_it);
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
+ S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
std::string res_name = outfit_snapshot ? name : "Snapshot : " + pos_string;
std::string res_desc = outfit_snapshot ? "" : "Taken by " + who_took_it + " at " + pos_string;
LLFolderType::EType folder_type = outfit_snapshot ? LLFolderType::FT_NONE : LLFolderType::FT_SNAPSHOT_CATEGORY;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index b682a0e151..afb38033ce 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -92,6 +92,7 @@
#include "v3math.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llagentpicksinfo.h"
#include "llagentwearables.h"
@@ -255,7 +256,7 @@
// exported globals
//
bool gAgentMovementCompleted = false;
-S32 gMaxAgentGroups;
+S32 gMaxAgentGroups; // OpenSim legacy economy support
const std::string SCREEN_HOME_FILENAME = "screen_home%s.png";
const std::string SCREEN_LAST_FILENAME = "screen_last%s.png";
@@ -294,9 +295,8 @@ static std::string gFirstSimSeedCap;
static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f);
static std::string gAgentStartLocation = "safe";
static bool mLoginStatePastUI = false;
+static bool mBenefitsSuccessfullyInit = false;
-const S32 DEFAULT_MAX_AGENT_GROUPS = 42;
-const S32 ALLOWED_MAX_AGENT_GROUPS = 500;
const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds
boost::scoped_ptr LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
@@ -330,6 +330,7 @@ void apply_udp_blacklist(const std::string& csv);
//bool process_login_success_response();
bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y);
// Aurora Sim
+void on_benefits_failed_callback(const LLSD& notification, const LLSD& response);
void transition_back_to_login_panel(const std::string& emsg);
// FIRE-18250: Option to disable default eye movement
void update_static_eyes();
@@ -1640,9 +1641,6 @@ bool idle_startup()
progress += 0.02f;
display_startup();
- // FIRE-17287: Force HttpPipelining off on OpenSim
- LLAppViewer::instance()->getAppCoreHttp().refreshSettings(false);
-
//
eLastExecEvent last_exec_event = gLastExecEvent;
const std::string current_grid = LLGridManager::getInstance()->getGrid();
@@ -2309,8 +2307,15 @@ bool idle_startup()
send_complete_agent_movement(regionp->getHost());
gAssetStorage->setUpstream(regionp->getHost());
gCacheName->setUpstream(regionp->getHost());
- msg->newMessageFast(_PREHASH_EconomyDataRequest);
- gAgent.sendReliableMessage();
+ // OpenSim legacy economy support
+#ifdef OPENSIM
+ if (!LLGridManager::instance().isInSecondLife())
+ {
+ msg->newMessageFast(_PREHASH_EconomyDataRequest);
+ gAgent.sendReliableMessage();
+ }
+#endif
+ //
}
display_startup();
@@ -3003,6 +3008,11 @@ bool idle_startup()
set_startup_status(1.0, "", "");
display_startup();
+ if (!mBenefitsSuccessfullyInit)
+ {
+ LLNotificationsUtil::add("FailedToGetBenefits", LLSD(), LLSD(), boost::bind(on_benefits_failed_callback, _1, _2));
+ }
+
// Client LSL Bridge
if (gSavedSettings.getBOOL("UseLSLBridge"))
{
@@ -3656,6 +3666,15 @@ std::string& LLStartUp::getInitialOutfitName()
return sInitialOutfit;
}
+std::string LLStartUp::getUserId()
+{
+ if (gUserCredential.isNull())
+ {
+ return "";
+ }
+ return gUserCredential->userID();
+}
+
// Loads a bitmap to display during load
void init_start_screen(S32 location_id)
{
@@ -4248,6 +4267,64 @@ void apply_udp_blacklist(const std::string& csv)
}
+void on_benefits_failed_callback(const LLSD& notification, const LLSD& response)
+{
+ LL_WARNS("Benefits") << "Failed to load benefits information" << LL_ENDL;
+}
+
+bool init_benefits(LLSD& response)
+{
+ bool succ = true;
+
+ std::string package_name = response["account_type"].asString();
+ const LLSD& benefits_sd = response["account_level_benefits"];
+ if (!LLAgentBenefitsMgr::init(package_name, benefits_sd) ||
+ !LLAgentBenefitsMgr::initCurrent(package_name, benefits_sd))
+ {
+ succ = false;
+ }
+ else
+ {
+ LL_DEBUGS("Benefits") << "Initialized current benefits, level " << package_name << " from " << benefits_sd << LL_ENDL;
+ }
+ const LLSD& packages_sd = response["premium_packages"];
+ for(LLSD::map_const_iterator package_iter = packages_sd.beginMap();
+ package_iter != packages_sd.endMap();
+ ++package_iter)
+ {
+ std::string package_name = package_iter->first;
+ const LLSD& benefits_sd = package_iter->second["benefits"];
+ if (LLAgentBenefitsMgr::init(package_name, benefits_sd))
+ {
+ LL_DEBUGS("Benefits") << "Initialized benefits for package " << package_name << " from " << benefits_sd << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("Benefits") << "Failed init for package " << package_name << " from " << benefits_sd << LL_ENDL;
+ succ = false;
+ }
+ }
+
+ if (!LLAgentBenefitsMgr::has("Base"))
+ {
+ LL_WARNS("Benefits") << "Benefits info did not include required package Base" << LL_ENDL;
+ succ = false;
+ }
+ if (!LLAgentBenefitsMgr::has("Premium"))
+ {
+ LL_WARNS("Benefits") << "Benefits info did not include required package Premium" << LL_ENDL;
+ succ = false;
+ }
+
+ // FIXME PREMIUM - for testing if login does not yet provide Premium Plus. Should be removed thereafter.
+ //if (succ && !LLAgentBenefitsMgr::has("Premium Plus"))
+ //{
+ // LLAgentBenefitsMgr::init("Premium Plus", packages_sd["Premium"]["benefits"]);
+ // llassert(LLAgentBenefitsMgr::has("Premium Plus"));
+ //}
+ return succ;
+}
+
// Aurora Sim
//bool process_login_success_response()
bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y)
@@ -4255,6 +4332,18 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
{
LLSD response = LLLoginInstance::getInstance()->getResponse();
+ // OpenSim legacy economy support
+ //mBenefitsSuccessfullyInit = init_benefits(response);
+ if (LLGridManager::instance().isInSecondLife())
+ {
+ mBenefitsSuccessfullyInit = init_benefits(response);
+ }
+ else
+ {
+ mBenefitsSuccessfullyInit = true;
+ }
+ //
+
std::string text(response["udp_blacklist"]);
if(!text.empty())
{
@@ -4666,50 +4755,30 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
std::string openid_token = response["openid_token"];
LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);
}
- // opensim max groups support
- //gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
- //if(response.has("max-agent-groups"))
- //{
- // S32 agent_groups = atoi(std::string(response["max-agent-groups"]).c_str());
- // if (agent_groups > 0 && agent_groups <= ALLOWED_MAX_AGENT_GROUPS)
- // {
- // gMaxAgentGroups = agent_groups;
- // LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
- // << gMaxAgentGroups << LL_ENDL;
- // }
- // else
- // {
- // LL_INFOS("LLStartup") << "Invalid value received, using defaults for gMaxAgentGroups: "
- // << gMaxAgentGroups << LL_ENDL;
- // }
- //}
- //else {
- // LL_INFOS("LLStartup") << "Missing max-agent-groups, using default value for gMaxAgentGroups: "
- // << gMaxAgentGroups << LL_ENDL;
- //}
- if(response.has("max-agent-groups") || response.has("max_groups"))
- {
- std::string max_agent_groups;
- response.has("max_groups") ?
- max_agent_groups = response["max_groups"].asString()
- : max_agent_groups = response["max-agent-groups"].asString();
- gMaxAgentGroups = atoi(max_agent_groups.c_str());
- LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
- << gMaxAgentGroups << LL_ENDL;
- }
- else
- {
+ // OpenSim legacy economy support
#ifdef OPENSIM
- gMaxAgentGroups = 0;
- LL_INFOS("LLStartup") << "did not receive max-agent-groups. unlimited groups activated" << LL_ENDL;
-#else
- gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS;
- LL_INFOS("LLStartup") << "using gMaxAgentGroups default: "
- << gMaxAgentGroups << LL_ENDL;
-#endif
+ if (!LLGridManager::instance().isInSecondLife())
+ {
+ if (response.has("max-agent-groups") || response.has("max_groups"))
+ {
+ std::string max_agent_groups;
+ response.has("max_groups") ?
+ max_agent_groups = response["max_groups"].asString()
+ : max_agent_groups = response["max-agent-groups"].asString();
+
+ gMaxAgentGroups = atoi(max_agent_groups.c_str());
+ LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: "
+ << gMaxAgentGroups << LL_ENDL;
+ }
+ else
+ {
+ gMaxAgentGroups = 0;
+ LL_INFOS("LLStartup") << "did not receive max-agent-groups. unlimited groups activated" << LL_ENDL;
+ }
}
- //
+#endif
+ //
//
std::string prev_currency_symbol = Tea::getCurrency();
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index 0456205f07..f5b18d7626 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -90,7 +90,7 @@ typedef enum {
// exported symbols
extern bool gAgentMovementCompleted;
-extern S32 gMaxAgentGroups;
+extern S32 gMaxAgentGroups; // OpenSim legacy economy support
extern LLPointer gStartTexture;
class LLStartUp
@@ -125,6 +125,7 @@ public:
static void saveInitialOutfit();
static std::string& getInitialOutfitName();
+ static std::string getUserId();
static bool dispatchURL();
// if we have a SLURL or sim string ("Ahern/123/45") that started
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 877d247519..a18c2cb5bc 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -198,6 +198,11 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
- 3*VPAD - BTN_HEIGHT;
// reshape to calculate real text width and height
msg_box->reshape( MAX_ALLOWED_MSG_WIDTH, max_allowed_msg_height );
+
+ if ("GroupLimitInfo" == mNotification->getName() || "GroupLimitInfoPlus" == mNotification->getName())
+ {
+ msg_box->setSkipLinkUnderline(true);
+ }
msg_box->setValue(msg);
S32 pixel_width = msg_box->getTextPixelWidth();
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index f2458b99a0..1df4f2183c 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -125,10 +125,6 @@ std::string LLVersionInfo::getShortVersion()
}
- // Same as above, with version number in Firestorm FSDATA
- // format. Unlike the above, the channel name will always be the
- // hardcoded version.
- std::string sVersionChannelFS("");
std::string LLVersionInfo::getChannelAndVersion()
{
if (mVersionChannel.empty())
@@ -143,6 +139,7 @@ std::string LLVersionInfo::getChannelAndVersion()
// Get version and channel in the format needed for FSDATA.
std::string LLVersionInfo::getChannelAndVersionFS()
{
+ static std::string sVersionChannelFS;
if (sVersionChannelFS.empty())
{
// cache the version string
@@ -215,6 +212,11 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
return maturity;
}
+std::string LLVersionInfo::getReleaseNotes()
+{
+ return mReleaseNotes;
+}
+
// [SL:KB] - Patch: Viewer-CrashReporting | Checked: 2011-05-08 (Catznip-2.6.0a) | Added: Catznip-2.6.0a
const char* getBuildPlatformString()
{
@@ -256,7 +258,8 @@ std::string LLVersionInfo::getBuildConfig()
return build_configuration;
}
-std::string LLVersionInfo::getReleaseNotes()
+// return hash of HEAD
+std::string LLVersionInfo::getGitHash()
{
- return mReleaseNotes;
+ return LL_VIEWER_VERSION_GITHASH;
}
diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h
index 9a0a94fa7f..a67577b020 100644
--- a/indra/newview/llversioninfo.h
+++ b/indra/newview/llversioninfo.h
@@ -112,7 +112,8 @@ public:
/// get the release-notes URL, once it becomes available -- until then,
/// return empty string
std::string getReleaseNotes();
-
+
+ static std::string getGitHash();
private:
std::string version;
std::string short_version;
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 7848475042..aea73efc07 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -473,8 +473,8 @@ void LLViewerAssetStorage::assetRequestCoro(
LL_WARNS_ONCE("ViewerAsset") << "region " << gAgent.getRegion() << " mViewerAssetUrl " << mViewerAssetUrl << LL_ENDL;
}
// FIRE-23657 [OPENSIM] Update the Viewer Asset Url irrespective of previous setting (Fix provided by Liru Frs)
- // if (mViewerAssetUrl.empty() && gAgent.getRegion())
- if (gAgent.getRegion())
+ // if (mViewerAssetUrl.empty() && gAgent.getRegion())
+ if (gAgent.getRegion())
//
{
mViewerAssetUrl = gAgent.getRegion()->getViewerAssetUrl();
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index d7b9163262..9f6711c11d 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -36,7 +36,6 @@
#include "lluploaddialog.h"
#include "llpreviewscript.h"
#include "llnotificationsutil.h"
-#include "lleconomy.h"
#include "llagent.h"
#include "llfloaterreg.h"
#include "llfloatersnapshot.h"
@@ -177,22 +176,6 @@ void LLResourceUploadInfo::logPreparedUpload()
"Asset Type: " << LLAssetType::lookup(mAssetType) << LL_ENDL;
}
-S32 LLResourceUploadInfo::getEconomyUploadCost()
-{
- // Update L$ and ownership credit information
- // since it probably changed on the server
- if (getAssetType() == LLAssetType::AT_TEXTURE ||
- getAssetType() == LLAssetType::AT_SOUND ||
- getAssetType() == LLAssetType::AT_ANIMATION ||
- getAssetType() == LLAssetType::AT_MESH)
- {
- return LLGlobalEconomy::instance().getPriceUpload();
- }
-
- return 0;
-}
-
-
LLUUID LLResourceUploadInfo::finishUpload(LLSD &result)
{
if (getFolderId().isNull())
@@ -329,6 +312,51 @@ std::string LLResourceUploadInfo::getDisplayName() const
return (mName.empty()) ? mAssetId.asString() : mName;
};
+bool LLResourceUploadInfo::findAssetTypeOfExtension(const std::string& exten, LLAssetType::EType& asset_type)
+{
+ U32 codec;
+ return findAssetTypeAndCodecOfExtension(exten, asset_type, codec, false);
+}
+
+// static
+bool LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(const std::string& exten, LLAssetType::EType& asset_type, U32& codec, bool bulk_upload)
+{
+ bool succ = false;
+
+ codec = LLImageBase::getCodecFromExtension(exten);
+ if (codec != IMG_CODEC_INVALID)
+ {
+ asset_type = LLAssetType::AT_TEXTURE;
+ succ = true;
+ }
+ else if (exten == "wav")
+ {
+ asset_type = LLAssetType::AT_SOUND;
+ succ = true;
+ }
+ else if (exten == "anim")
+ {
+ asset_type = LLAssetType::AT_ANIMATION;
+ succ = true;
+ }
+ else if (!bulk_upload && (exten == "bvh"))
+ {
+ asset_type = LLAssetType::AT_ANIMATION;
+ succ = true;
+ }
+ else if (exten == "ogg")
+ {
+ asset_type = LLAssetType::AT_SOUND;
+ succ = true;
+ }
+ else if (exten == "j2k")
+ {
+ asset_type = LLAssetType::AT_TEXTURE;
+ succ = true;
+ }
+ return succ;
+}
+
//=========================================================================
LLNewFileResourceUploadInfo::LLNewFileResourceUploadInfo(
std::string fileName,
@@ -366,9 +394,11 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
std::string filename = gDirUtilp->getTempFilename();
std::string exten = gDirUtilp->getExtension(getFileName());
- U32 codec = LLImageBase::getCodecFromExtension(exten);
LLAssetType::EType assetType = LLAssetType::AT_NONE;
+ U32 codec = IMG_CODEC_INVALID;
+ bool found_type = findAssetTypeAndCodecOfExtension(exten, assetType, codec);
+
std::string errorMessage;
std::string errorLabel;
@@ -387,10 +417,16 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
errorLabel = "NoFileExtension";
error = true;
}
- else if (codec != IMG_CODEC_INVALID)
+ else if (!found_type)
+ {
+ // Unknown extension
+ errorMessage = llformat(LLTrans::getString("UnknownFileExtension").c_str(), exten.c_str());
+ errorLabel = "ErrorMessage";
+ error = TRUE;;
+ }
+ else if (assetType == LLAssetType::AT_TEXTURE)
{
// It's an image file, the upload procedure is the same for all
- assetType = LLAssetType::AT_TEXTURE;
if (!LLViewerTextureList::createUploadFile(getFileName(), filename, codec))
{
// Duplicate error message output
@@ -402,9 +438,8 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
error = true;
}
}
- else if (exten == "wav")
+ else if (assetType == LLAssetType::AT_SOUND)
{
- assetType = LLAssetType::AT_SOUND; // tag it as audio
S32 encodeResult = 0;
LL_INFOS() << "Attempting to encode wav as an ogg file" << LL_ENDL;
@@ -437,28 +472,10 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()
errorLabel = "DoNotSupportBulkAnimationUpload";
error = true;
}
- else if (exten == "anim")
+ else if (assetType == LLAssetType::AT_ANIMATION)
{
- assetType = LLAssetType::AT_ANIMATION;
filename = getFileName();
}
- else if (exten == "ogg")
- {
- assetType = LLAssetType::AT_SOUND;
- filename = getFileName();
- }
- else if (exten == "j2k")
- {
- assetType = LLAssetType::AT_TEXTURE;
- filename = getFileName();
- }
- else
- {
- // Unknown extension
- errorMessage = llformat(LLTrans::getString("UnknownFileExtension").c_str(), exten.c_str());
- errorLabel = "ErrorMessage";
- error = TRUE;;
- }
if (error)
{
@@ -774,7 +791,7 @@ void LLViewerAssetUpload::AssetInventoryUploadCoproc(LLCoreHttpUtil::HttpCorouti
return;
}
- S32 uploadPrice = result["upload_price"].asInteger();//uploadInfo->getEconomyUploadCost();
+ S32 uploadPrice = result["upload_price"].asInteger();
if (uploadPrice > 0)
{
@@ -822,7 +839,12 @@ void LLViewerAssetUpload::AssetInventoryUploadCoproc(LLCoreHttpUtil::HttpCorouti
sidepanel_inventory->showInventoryPanel();
}
//
- LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, serverInventoryItem, TRUE, TAKE_FOCUS_NO, (panel == NULL));
+
+ // FIRE-22943: Don't switch away from the "Recent Items" tab.
+ //LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, serverInventoryItem, TRUE, TAKE_FOCUS_NO, (panel == NULL));
+ BOOL show_main_panel = (!panel || panel->getName() != "Recent Items");
+ LLInventoryPanel::openInventoryPanelAndSetSelection(TRUE, serverInventoryItem, show_main_panel, TAKE_FOCUS_NO, (panel == NULL));
+ //
// restore keyboard focus
gFocusMgr.setKeyboardFocus(focus);
diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h
index ee1806b782..08b03e3059 100644
--- a/indra/newview/llviewerassetupload.h
+++ b/indra/newview/llviewerassetupload.h
@@ -62,7 +62,6 @@ public:
virtual LLSD prepareUpload();
virtual LLSD generatePostBody();
virtual void logPreparedUpload();
- virtual S32 getEconomyUploadCost();
virtual LLUUID finishUpload(LLSD &result);
LLTransactionID getTransactionId() const { return mTransactionId; }
@@ -88,6 +87,9 @@ public:
LLUUID getItemId() const { return mItemId; }
LLAssetID getAssetId() const { return mAssetId; }
+ static bool findAssetTypeOfExtension(const std::string& exten, LLAssetType::EType& asset_type);
+ static bool findAssetTypeAndCodecOfExtension(const std::string& exten, LLAssetType::EType& asset_type, U32& codec, bool bulk_upload = true);
+
protected:
LLResourceUploadInfo(
std::string name,
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index f79fe5b6ec..6e7292ff50 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -189,6 +189,7 @@
#include "fsfloaterplacedetails.h"
#include "fsfloaterposestand.h"
#include "fsfloaterprofile.h"
+#include "fsfloaterprotectedfolders.h"
#include "fsfloaterradar.h"
#include "fsfloatersearch.h"
#include "fsfloaterstatistics.h"
@@ -467,6 +468,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("fs_import", "floater_fs_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("fs_posestand", "floater_fs_posestand.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("fs_placedetails", "floater_fs_placedetails.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
+ LLFloaterReg::add("fs_protectedfolders", "floater_fs_protectedfolders.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("fs_radar", "floater_fs_radar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("fs_teleporthistory", "floater_fs_teleporthistory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
LLFloaterReg::add("fs_voice_controls", "floater_fs_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build);
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index 88431c5985..d36763c7ab 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -150,11 +150,17 @@ NDOF_HotPlugResult LLViewerJoystick::HotPlugAddCallback(NDOF_Device *dev)
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
if (joystick->mDriverState == JDS_UNINITIALIZED)
{
- LL_INFOS("joystick") << "HotPlugAddCallback: will use device:" << LL_ENDL;
- ndof_dump(stderr, dev);
+ LL_INFOS() << "HotPlugAddCallback: will use device:" << LL_ENDL;
+
+ // Disable for Linux till vs017 gets merged in to no having to support multiple version of libndofdev
+#ifndef LL_LINUX
+ // ndof_dump(dev);
+#endif
+ //
+
joystick->mNdofDev = dev;
- joystick->mDriverState = JDS_INITIALIZED;
- res = NDOF_KEEP_HOTPLUGGED;
+ joystick->mDriverState = JDS_INITIALIZED;
+ res = NDOF_KEEP_HOTPLUGGED;
}
joystick->updateEnabled(true);
return res;
@@ -168,9 +174,15 @@ void LLViewerJoystick::HotPlugRemovalCallback(NDOF_Device *dev)
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
if (joystick->mNdofDev == dev)
{
- LL_INFOS("joystick") << "HotPlugRemovalCallback: joystick->mNdofDev="
+ LL_INFOS() << "HotPlugRemovalCallback: joystick->mNdofDev="
<< joystick->mNdofDev << "; removed device:" << LL_ENDL;
- ndof_dump(stderr, dev);
+
+ // Disable for Linux till vs017 gets merged in to no having to support multiple version of libndofdev
+#ifndef LL_LINUX
+ // ndof_dump(dev);
+#endif
+ //
+
joystick->mDriverState = JDS_UNINITIALIZED;
}
joystick->updateEnabled(true);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index a4f854cecf..bb19d6aafe 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -2742,10 +2742,12 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
{
// FIXME: THIS IS SO WRONG.
// Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it...
- if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
- {
- result = true;
- }
+ // FIRE-5479: CTRL-A doesn't work in CEF
+ //if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
+ //{
+ // result = true;
+ //}
+ //
if (!result)
{
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index fcc4763aad..9467a138f0 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -79,7 +79,7 @@ class LLViewerMedia: public LLSingleton
public:
// String to get/set media autoplay in gSavedSettings
- static const char* AUTO_PLAY_MEDIA_SETTING;
+ static const char* AUTO_PLAY_MEDIA_SETTING;
static const char* SHOW_MEDIA_ON_OTHERS_SETTING;
static const char* SHOW_MEDIA_WITHIN_PARCEL_SETTING;
static const char* SHOW_MEDIA_OUTSIDE_PARCEL_SETTING;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index f3f9f5df67..b42e77cdfe 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -46,6 +46,7 @@
// newview includes
#include "llagent.h"
#include "llagentaccess.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llagentui.h"
#include "llagentwearables.h"
@@ -131,13 +132,13 @@
#include "lluilistener.h"
#include "llappearancemgr.h"
#include "lltrans.h"
-#include "lleconomy.h"
#include "lltoolgrab.h"
#include "llwindow.h"
#include "llpathfindingmanager.h"
#include "llstartup.h"
#include "boost/unordered_map.hpp"
#include
+#include
#include "llcleanup.h"
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
#include "fsavatarrenderpersistence.h"
@@ -630,28 +631,35 @@ void init_menus()
gViewerWindow->setMenuBackgroundColor(false,
!LLGridManager::getInstance()->isInSLBeta());
//
-// // Assume L$10 for now, the server will tell us the real cost at login
-// // *TODO:Also fix cost in llfolderview.cpp for Inventory menus
-// const std::string upload_cost("10");
- // \0/ Copypasta! See llviewermessage, llviewermenu and llpanelmaininventory
- S32 cost = LLGlobalEconomy::getInstance()->getPriceUpload();
- std::string upload_cost;
+ // *TODO:Also fix cost in llfolderview.cpp for Inventory menus
+ //const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
+ //const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
+ //const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
+ S32 texture_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 sound_upload_cost = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ S32 animation_upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ std::string texture_upload_cost_str;
+ std::string sound_upload_cost_str;
+ std::string animation_upload_cost_str;
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
- upload_cost = cost > 0 ? llformat("%s%d", "L$", cost) : LLTrans::getString("free");
+ texture_upload_cost_str = texture_upload_cost > 0 ? llformat("%s%d", "L$", texture_upload_cost) : LLTrans::getString("free");
+ sound_upload_cost_str = sound_upload_cost > 0 ? llformat("%s%d", "L$", sound_upload_cost) : LLTrans::getString("free");
+ animation_upload_cost_str = animation_upload_cost > 0 ? llformat("%s%d", "L$", animation_upload_cost) : LLTrans::getString("free");
}
else
#endif
{
- upload_cost = "L$" + (cost > 0 ? llformat("%d", cost) : llformat("%d", gSavedSettings.getU32("DefaultUploadCost")));
+ texture_upload_cost_str = "L$" + llformat("%d", texture_upload_cost);
+ sound_upload_cost_str = "L$" + llformat("%d", sound_upload_cost);
+ animation_upload_cost_str = "L$" + llformat("%d", animation_upload_cost);
}
//
- gMenuHolder->childSetLabelArg("Upload Image", "[COST]", upload_cost);
- gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", upload_cost);
- gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", upload_cost);
- gMenuHolder->childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
-
+ gMenuHolder->childSetLabelArg("Upload Image", "[COST]", texture_upload_cost_str);
+ gMenuHolder->childSetLabelArg("Upload Sound", "[COST]", sound_upload_cost_str);
+ gMenuHolder->childSetLabelArg("Upload Animation", "[COST]", animation_upload_cost_str);
+
gAutorespondMenu = gMenuBarView->getChild("Set Autorespond", TRUE);
gAutorespondNonFriendsMenu = gMenuBarView->getChild("Set Autorespond to non-friends", TRUE);
gAttachSubMenu = gMenuBarView->findChildMenuByName("Attach Object", TRUE);
@@ -9411,17 +9419,30 @@ class LLSomethingSelectedNoHUD : public view_listener_t
static bool is_editable_selected()
{
// [RLVa:KB] - Checked: 2010-09-28 (RLVa-1.2.1f) | Modified: RLVa-1.0.5a
- // RELEASE-RLVa: [SL-2.2.0] Check that this still isn't called by anything but script actions in the Build menu
- if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) )
+ // Changed for Firestorm because of script reset function in object menus (see FIRE-8213)
+ if (rlv_handler_t::isEnabled())
{
LLObjectSelectionHandle hSelection = LLSelectMgr::getInstance()->getSelection();
// NOTE: this is called for 5 different menu items so we'll trade accuracy for efficiency and only
// examine root nodes (LLToolsSelectedScriptAction::handleEvent() will catch what we miss)
- RlvSelectHasLockedAttach f;
- if ( (hSelection->isAttachment()) && (hSelection->getFirstRootNode(&f)) )
+ if (hSelection->isAttachment())
{
- return false;
+ RlvSelectHasLockedAttach f;
+ if (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE) && hSelection->getFirstRootNode(&f))
+ {
+ return false;
+ }
+ }
+ else
+ {
+ // RlvSelectIsEditable will sort out all editable objects
+ // => if result = NULL, we can't edit all selected objects
+ RlvSelectIsEditable f;
+ if (hSelection->getFirstRootNode(&f) != NULL)
+ {
+ return false;
+ }
}
}
// [/RLVa:KB]
@@ -10915,22 +10936,31 @@ class LLUploadCostCalculator : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
- std::string menu_name = userdata.asString();
- // AW:this fights the update in llviewermessage
- calculateCost();//
+ std::vector fields;
+ std::string str = userdata.asString();
+ boost::split(fields, str, boost::is_any_of(","));
+ if (fields.size()<1)
+ {
+ return false;
+ }
+ std::string menu_name = fields[0];
+ std::string asset_type_str = "texture";
+ if (fields.size()>1)
+ {
+ asset_type_str = fields[1];
+ }
+ LL_DEBUGS("Benefits") << "userdata " << userdata << " menu_name " << menu_name << " asset_type_str " << asset_type_str << LL_ENDL;
+ calculateCost(asset_type_str);
gMenuHolder->childSetLabelArg(menu_name, "[COST]", mCostStr);
return true;
}
- void calculateCost();
+ void calculateCost(const std::string& asset_type_str);
public:
LLUploadCostCalculator()
{
-// we don't know the costs yet
-// calculateCost();
-//
}
};
@@ -10956,20 +10986,26 @@ class LLToggleUIHints : public view_listener_t
}
};
-void LLUploadCostCalculator::calculateCost()
+void LLUploadCostCalculator::calculateCost(const std::string& asset_type_str)
{
- S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
-
- // getPriceUpload() returns -1 if no data available yet.
-//
-// if(upload_cost >= 0)
-// {
-// mCostStr = llformat("%d", upload_cost);
-// }
-// else
-// {
-// mCostStr = llformat("%d", gSavedSettings.getU32("DefaultUploadCost"));
-// }
+ S32 upload_cost = -1;
+
+ if (asset_type_str == "texture")
+ {
+ upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ }
+ else if (asset_type_str == "animation")
+ {
+ upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ }
+ else if (asset_type_str == "sound")
+ {
+ upload_cost = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ }
+ if (upload_cost < 0)
+ {
+ LL_WARNS() << "Unable to find upload cost for asset_type_str " << asset_type_str << LL_ENDL;
+ }
#ifdef OPENSIM //
if (LLGridManager::getInstance()->isInOpenSim())
{
@@ -10977,10 +11013,7 @@ void LLUploadCostCalculator::calculateCost()
}
else
#endif // OPENSIM //
- {
- mCostStr = "L$" + (upload_cost > 0 ? llformat("%d", upload_cost) : llformat("%d", gSavedSettings.getU32("DefaultUploadCost")));
- }
-//
+ mCostStr = std::to_string(upload_cost);
}
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y)
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index ac066ccb02..064a740790 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -30,6 +30,7 @@
// project includes
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llfilepicker.h"
#include "llfloaterreg.h"
@@ -67,7 +68,6 @@
#include "llviewerassetupload.h"
// linden libraries
-#include "lleconomy.h"
#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "llsdutil.h"
@@ -88,11 +88,7 @@ class LLFileEnableUpload : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- // Make asset upload balance check work again
- //return true;
- bool new_value = gStatusBar && LLGlobalEconomy::getInstance() && (gStatusBar->getBalance() >= LLGlobalEconomy::getInstance()->getPriceUpload());
- return new_value;
- //
+ return true;
}
};
@@ -419,6 +415,77 @@ const void upload_single_file(const std::vector& filenames, LLFileP
return;
}
+void do_bulk_upload(std::vector filenames, const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0)
+ {
+ // Cancel upload
+ return;
+ }
+
+ for (std::vector::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
+ {
+ std::string filename = (*in_iter);
+
+ std::string name = gDirUtilp->getBaseFileName(filename, true);
+ std::string asset_name = name;
+ LLStringUtil::replaceNonstandardASCII(asset_name, '?');
+ LLStringUtil::replaceChar(asset_name, '|', '?');
+ LLStringUtil::stripNonprintable(asset_name);
+ LLStringUtil::trim(asset_name);
+
+ std::string ext = gDirUtilp->getExtension(filename);
+ LLAssetType::EType asset_type;
+ U32 codec;
+ S32 expected_upload_cost;
+ if (LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(ext, asset_type, codec) &&
+ LLAgentBenefitsMgr::current().findUploadCost(asset_type, expected_upload_cost))
+ {
+ LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
+ filename,
+ asset_name,
+ asset_name, 0,
+ LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
+ LLFloaterPerms::getNextOwnerPerms("Uploads"),
+ LLFloaterPerms::getGroupPerms("Uploads"),
+ LLFloaterPerms::getEveryonePerms("Uploads"),
+ expected_upload_cost));
+
+ upload_new_resource(uploadInfo, NULL, NULL);
+ }
+ }
+}
+
+bool get_bulk_upload_expected_cost(const std::vector& filenames, S32& total_cost, S32& file_count, S32& bvh_count)
+{
+ total_cost = 0;
+ file_count = 0;
+ bvh_count = 0;
+ for (std::vector::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
+ {
+ std::string filename = (*in_iter);
+ std::string ext = gDirUtilp->getExtension(filename);
+
+ if (ext == "bvh")
+ {
+ bvh_count++;
+ }
+
+ LLAssetType::EType asset_type;
+ U32 codec;
+ S32 cost;
+
+ if (LLResourceUploadInfo::findAssetTypeAndCodecOfExtension(ext, asset_type, codec) &&
+ LLAgentBenefitsMgr::current().findUploadCost(asset_type, cost))
+ {
+ total_cost += cost;
+ file_count++;
+ }
+ }
+
+ return file_count > 0;
+}
const void upload_bulk(const std::vector& filenames, LLFilePicker::ELoadFilter type)
{
@@ -430,31 +497,50 @@ const void upload_bulk(const std::vector& filenames, LLFilePicker::
//
// Also fix single upload to charge first, then refund
- S32 expected_upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
+ // FIXME PREMIUM what about known types that can't be bulk uploaded
+ // (bvh)? These will fail in the item by item upload but won't be
+ // mentioned in the notification.
+ std::vector filtered_filenames;
for (std::vector::const_iterator in_iter = filenames.begin(); in_iter != filenames.end(); ++in_iter)
{
- std::string filename = (*in_iter);
- if (!check_file_extension(filename, type)) continue;
-
- std::string name = gDirUtilp->getBaseFileName(filename, true);
- std::string asset_name = name;
- LLStringUtil::replaceNonstandardASCII(asset_name, '?');
- LLStringUtil::replaceChar(asset_name, '|', '?');
- LLStringUtil::stripNonprintable(asset_name);
- LLStringUtil::trim(asset_name);
-
- LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
- filename,
- asset_name,
- asset_name, 0,
- LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms("Uploads"),
- LLFloaterPerms::getGroupPerms("Uploads"),
- LLFloaterPerms::getEveryonePerms("Uploads"),
- expected_upload_cost));
-
- upload_new_resource(uploadInfo, NULL, NULL);
+ const std::string& filename = *in_iter;
+ if (check_file_extension(filename, type))
+ {
+ filtered_filenames.push_back(filename);
+ }
}
+
+ S32 expected_upload_cost;
+ S32 expected_upload_count;
+ S32 bvh_count;
+ if (get_bulk_upload_expected_cost(filtered_filenames, expected_upload_cost, expected_upload_count, bvh_count))
+ {
+ LLSD args;
+ args["COST"] = expected_upload_cost;
+ args["COUNT"] = expected_upload_count;
+ LLNotificationsUtil::add("BulkUploadCostConfirmation", args, LLSD(), boost::bind(do_bulk_upload, filtered_filenames, _1, _2));
+
+ if (filtered_filenames.size() > expected_upload_count)
+ {
+ if (bvh_count == filtered_filenames.size() - expected_upload_count)
+ {
+ LLNotificationsUtil::add("DoNotSupportBulkAnimationUpload");
+ }
+ else
+ {
+ LLNotificationsUtil::add("BulkUploadIncompatibleFiles");
+ }
+ }
+ }
+ else if (bvh_count == filtered_filenames.size())
+ {
+ LLNotificationsUtil::add("DoNotSupportBulkAnimationUpload");
+ }
+ else
+ {
+ LLNotificationsUtil::add("BulkUploadNoCompatibleFiles");
+ }
+
}
class LLFileUploadImage : public view_listener_t
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 99fef7e512..bcef2a7f83 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -32,7 +32,6 @@
#include "llaudioengine.h"
#include "llavataractions.h"
#include "llavatarnamecache.h" // IDEVO HACK
-#include "lleconomy.h"
#include "lleventtimer.h"
#include "llfloaterreg.h"
#include "llfolderview.h"
@@ -51,6 +50,7 @@
#include "mean_collision_data.h"
#include "llagent.h"
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llbuycurrencyhtml.h"
@@ -148,6 +148,7 @@
#include "fslslbridge.h"
#include "fsmoneytracker.h"
#include "llattachmentsmgr.h"
+#include "lleconomy.h"
#include "llfloaterbump.h"
#include "llfloaterreg.h"
#include "llfriendcard.h"
@@ -1003,7 +1004,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
if(option == 0 && !group_id.isNull())
{
// check for promotion or demotion.
- S32 max_groups = gMaxAgentGroups;
+ S32 max_groups = LLAgentBenefitsMgr::current().getGroupMembershipLimit();
if(gAgent.isInGroup(group_id)) ++max_groups;
// [CR] FIRE-12229
@@ -2431,7 +2432,10 @@ std::string LLOfferInfo::getSanitizedDescription()
std::size_t start = mDesc.find_first_of("'");
std::size_t end = mDesc.find_last_of("'");
- if ((start != std::string::npos) && (end != std::string::npos))
+ // FIRE-29194: tags showing in offline inventory offer log
+ //if ((start != std::string::npos) && (end != std::string::npos))
+ if ((start != std::string::npos) && (end != std::string::npos) && start != end)
+ //
{
description.insert(start, "");
description.insert(end + 8, "");
@@ -6878,33 +6882,32 @@ void process_frozen_message(LLMessageSystem *msgsystem, void **user_data)
// do some extra stuff once we get our economy data
void process_economy_data(LLMessageSystem *msg, void** /*user_data*/)
{
- LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::getInstance());
- S32 upload_cost = LLGlobalEconomy::getInstance()->getPriceUpload();
-//
-// AW: from this point anything is bogus because it's all replaced by the LLUploadCostCalculator in llviewermenu
-// LL_INFOS_ONCE("Messaging") << "EconomyData message arrived; upload cost is L$" << upload_cost << LL_ENDL;
-// gMenuHolder->getChild("Upload Image")->setLabelArg("[COST]", llformat("%d", upload_cost));
-// gMenuHolder->getChild("Upload Sound")->setLabelArg("[COST]", llformat("%d", upload_cost));
-// gMenuHolder->getChild("Upload Animation")->setLabelArg("[COST]", llformat("%d", upload_cost));
-// gMenuHolder->getChild("Bulk Upload")->setLabelArg("[COST]", llformat("%d", upload_cost));
- std::string cost_str;
+ //
+ //LL_DEBUGS("Benefits") << "Received economy data, not currently used" << LL_ENDL;
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
- cost_str = upload_cost > 0 ? llformat("%s%d", "L$", upload_cost) : LLTrans::getString("free");
+ LLGlobalEconomy::processEconomyData(msg, LLGlobalEconomy::getInstance());
+
+ S32 texture_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
+ S32 sound_upload_cost = LLAgentBenefitsMgr::current().getSoundUploadCost();
+ S32 animation_upload_cost = LLAgentBenefitsMgr::current().getAnimationUploadCost();
+ std::string texture_upload_cost_str;
+ std::string sound_upload_cost_str;
+ std::string animation_upload_cost_str;
+
+ texture_upload_cost_str = texture_upload_cost > 0 ? llformat("%s%d", "L$", texture_upload_cost) : LLTrans::getString("free");
+ sound_upload_cost_str = sound_upload_cost > 0 ? llformat("%s%d", "L$", sound_upload_cost) : LLTrans::getString("free");
+ animation_upload_cost_str = animation_upload_cost > 0 ? llformat("%s%d", "L$", animation_upload_cost) : LLTrans::getString("free");
+ gMenuHolder->getChild("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
+ gMenuHolder->getChild("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
+ gMenuHolder->getChild("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
}
else
#endif
{
- cost_str = "L$" + (upload_cost > 0 ? llformat("%d", upload_cost) : llformat("%d", gSavedSettings.getU32("DefaultUploadCost")));
+ LL_DEBUGS("Benefits") << "Received economy data, not currently used" << LL_ENDL;
}
-
- LL_INFOS_ONCE("Messaging") << Tea::wrapCurrency("EconomyData message arrived; upload cost is L$") << cost_str << LL_ENDL;
-
- gMenuHolder->getChild("Upload Image")->setLabelArg("[COST]", cost_str);
- gMenuHolder->getChild("Upload Sound")->setLabelArg("[COST]", cost_str);
- gMenuHolder->getChild("Upload Animation")->setLabelArg("[COST]", cost_str);
- gMenuHolder->getChild("Bulk Upload")->setLabelArg("[COST]", cost_str);
//
// update L$ substitution for "Buy and Sell L$", it was set before we knew the currency
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index dc78a622c0..35fd368772 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -924,6 +924,8 @@ void LLViewerObject::addChild(LLViewerObject *childp)
mChildList.push_back(childp);
childp->afterReparent();
}
+
+ mExtrap.changedlink(*this); // if linking update, check for sitters
}
void LLViewerObject::onReparent(LLViewerObject *old_parent, LLViewerObject *new_parent)
@@ -955,6 +957,8 @@ void LLViewerObject::removeChild(LLViewerObject *childp)
}
}
+ mExtrap.changedlink(*this); // if linking update, check for sitters
+
if (childp->isSelected())
{
LLSelectMgr::getInstance()->deselectObjectAndFamily(childp);
@@ -2420,6 +2424,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
avatar->clampAttachmentPositions();
}
+ // Region crossing extrapolation improvement
+ mExtrap.update(*this); // update extrapolation if needed
+ mRegionCrossExpire = 0; // restart extrapolation clock on object update
+
// If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps
if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) )
{
@@ -2752,7 +2760,13 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_tim
// so just write down time 'after the fact', it is far from optimal in
// case of lags, but for lags sMaxUpdateInterpolationTime will kick in first
LL_DEBUGS("Interpolate") << "Predicted region crossing, new position " << new_pos << LL_ENDL;
- mRegionCrossExpire = frame_time + sMaxRegionCrossingInterpolationTime;
+ // Limit region crossing time using smart limiting
+ //mRegionCrossExpire = frame_time + sMaxRegionCrossingInterpolationTime;
+ F64Seconds saferegioncrosstimelimit(mExtrap.getextraptimelimit()); // longest time we can safely extrapolate
+ F64Seconds maxregioncrosstime = std::min(saferegioncrosstimelimit,sMaxRegionCrossingInterpolationTime); // new interpolation code
+ mRegionCrossExpire = frame_time + maxregioncrosstime; // region cross expires then
+ setAcceleration(LLVector3::zero); // no accel during region crossings
+ // Limit region crossing time using smart limiting end
}
else if (frame_time > mRegionCrossExpire)
{
@@ -2760,7 +2774,14 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_tim
// Stop motion
LL_DEBUGS("Interpolate") << "Predicting region crossing for too long, stopping at " << new_pos << LL_ENDL;
new_v.clear();
- setAcceleration(LLVector3::zero);
+ // For region crossing vehicles, stop rotation too. Paranoia consideration above about endlessly rotating objects does not apply.
+ //setAcceleration(LLVector3::zero);
+ if (mExtrap.ismovingssaton(*this)) // if moving and sat on and crossing regions, almost certainly a vehicle with avatars
+ {
+ setAngularVelocity(LLVector3::zero); // for region crossing vehicles, stop rotation too.
+ setAcceleration(LLVector3::zero); // Stop everything
+ }
+ // Limit region crossing time using smart limiting end
mRegionCrossExpire = 0;
}
// FIRE-24184: Replace previous region crossing movement fix with LL's version and add option to turn it off
@@ -3066,6 +3087,7 @@ void LLViewerObject::fetchInventoryFromServer()
if (!isInventoryPending())
{
delete mInventory;
+ mInventory = NULL;
// Results in processTaskInv
LLMessageSystem* msg = gMessageSystem;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index b23c13326d..320090b0d8 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -44,6 +44,8 @@
#include "llbbox.h"
#include "llrigginginfo.h"
+#include "fsregioncross.h" // Improved region crossing support
+
class LLAgent; // TODO: Get rid of this.
class LLAudioSource;
class LLAudioSourceVO;
@@ -922,6 +924,8 @@ private:
EObjectUpdateType mLastUpdateType;
BOOL mLastUpdateCached;
+ RegionCrossExtrapolate mExtrap; // improved extrapolator
+
// export
public:
LLViewerPartSourceScript* getPartSourceScript() { return mPartSourcep.get(); }
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index a1591b21a3..541b528339 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -46,6 +46,7 @@
#include "llagentcamera.h"
#include "llappviewer.h"
#include "llavatarrenderinfoaccountant.h"
+#include "llavatarappearancedefines.h"
#include "llcallingcard.h"
#include "llcommandhandler.h"
#include "lldir.h"
@@ -81,14 +82,11 @@
#include "llcorehttputil.h"
#include "llcallstack.h"
-// Opensim
-#include "llviewerparcelmgr.h" //Aurora Sim
-#ifdef OPENSIM
-#include "llviewernetwork.h"
-#endif
-//
-#include "llviewermenu.h"
+// Firestorm includes
#include "lfsimfeaturehandler.h"
+#include "llviewermenu.h"
+#include "llviewernetwork.h"
+#include "llviewerparcelmgr.h" //Aurora Sim
#ifdef LL_WINDOWS
#pragma warning(disable:4355)
@@ -299,6 +297,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
LL_INFOS("AppInit", "Capabilities") << "Requesting seed from " << url
<< " region name " << regionp->getName()
<< " (attempt #" << mSeedCapAttempts + 1 << ")" << LL_ENDL;
+ LL_DEBUGS("AppInit", "Capabilities") << "Capabilities requested: " << capabilityNames << LL_ENDL;
regionp = NULL;
result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames);
@@ -580,6 +579,14 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mPaused(FALSE),
mRegionCacheHitCount(0),
mRegionCacheMissCount(0),
+// BOM tests for OS
+ mMaxBakes(LLGridManager::getInstance()->isInSecondLife()?
+ LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES:
+ LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM),
+ mMaxTEs(LLGridManager::getInstance()->isInSecondLife()?
+ LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES:
+ LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO),
+//
// Aurora Sim
mWidth(region_width_meters),
mWidthScaleFactor(region_width_meters / REGION_WIDTH_METERS) // FIRE-19563: Scaling for OpenSim VarRegions
@@ -2411,6 +2418,23 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
}
#endif // OPENSIM
//
+// limit num bakes by region support
+#ifdef OPENSIM
+ if (mSimulatorFeatures.has("BakesOnMeshEnabled") && (mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean()==true))
+ {
+ 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;
+ }
+#else
+ mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES;
+ mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES;
+#endif // OPENSIM
+//
}
//this is called when the parent is not cacheable.
@@ -3168,6 +3192,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("UploadBakedTexture");
capabilityNames.append("UserInfo");
capabilityNames.append("ViewerAsset");
+ capabilityNames.append("ViewerBenefits");
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 3e807eabff..61042c59a9 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -242,6 +242,8 @@ public:
F32 getWidth() const { return mWidth; }
F32 getWidthScaleFactor() const { return mWidthScaleFactor; } // FIRE-19563: Scaling for OpenSim VarRegions
+ S32 getRegionMaxBakes() const { return mMaxBakes; } // FS BOM for OS max bakes restriction
+ S32 getRegionMaxTEs() const { return mMaxTEs; } // FS BOM for OS max TEs restriction
void idleUpdate(F32 max_update_time);
void lightIdleUpdate();
bool addVisibleGroup(LLViewerOctreeGroup* group);
@@ -503,7 +505,8 @@ private:
F32 mTimeDilation; // time dilation of physics simulation on simulator
S32 mLastUpdate; //last time called idleUpdate()
F32 mWidthScaleFactor; // FIRE-19563: Scaling for OpenSim VarRegions
-
+ S32 mMaxBakes; // store max bakes on the region
+ S32 mMaxTEs; // store max bakes on the region
// simulator name
std::string mName;
std::string mZoning;
diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp
index 94fdce456f..d5ccb841da 100644
--- a/indra/newview/llviewertexlayer.cpp
+++ b/indra/newview/llviewertexlayer.cpp
@@ -209,8 +209,9 @@ void LLViewerTexLayerSetBuffer::midRenderTexLayerSet(BOOL success)
{
// OpenSim BOM fallback
// layer_set->getAvatar()->debugBakedTextureUpload(layer_set->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish.
+ // doUpload();
auto bakedTexIdx = layer_set->getBakedTexIndex();
- if(bakedTexIdx <= LLVOAvatar::sMaxBakes)
+ if(bakedTexIdx <= layer_set->getAvatar()->getNumBakes())
{
layer_set->getAvatar()->debugBakedTextureUpload(bakedTexIdx, FALSE); // FALSE for start of upload, TRUE for finish.
doUpload();
@@ -219,6 +220,7 @@ void LLViewerTexLayerSetBuffer::midRenderTexLayerSet(BOOL success)
{
LL_DEBUGS("Avatar") << "Skipping bake for unsupported layer on this region" << LL_ENDL;
}
+ //
}
else
{
diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp
index a9eb4df746..2a1d4972bd 100644
--- a/indra/newview/llviewerwearable.cpp
+++ b/indra/newview/llviewerwearable.cpp
@@ -51,7 +51,7 @@ public:
{
// OpenSim BOM fallback
// U32 num_bakes = (U32) LLAvatarAppearanceDefines::BAKED_NUM_INDICES;
- U32 num_bakes = (U32) LLVOAvatar::sMaxBakes;
+ U32 num_bakes = (U32) gAgentAvatarp->getNumBakes();
//
for( U32 index = 0; index < num_bakes; ++index )
{
@@ -64,7 +64,7 @@ public:
{
// OpenSim BOM fallback
// U32 num_bakes = (U32) LLAvatarAppearanceDefines::BAKED_NUM_INDICES;
- U32 num_bakes = (U32) LLVOAvatar::sMaxBakes;
+ U32 num_bakes = (U32) gAgentAvatarp->getNumBakes();
//
for( U32 index = 0; index < num_bakes; ++index )
{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index a9a055baec..18f818c9a3 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -39,6 +39,7 @@
#include "aoengine.h" // ## Zi: Animation Overrider
#include "llagent.h" // Get state values from here
+#include "llagentbenefits.h"
#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llanimationstates.h"
@@ -624,9 +625,6 @@ F32 LLVOAvatar::sUnbakedTime = 0.f;
F32 LLVOAvatar::sUnbakedUpdateTime = 0.f;
F32 LLVOAvatar::sGreyTime = 0.f;
F32 LLVOAvatar::sGreyUpdateTime = 0.f;
-// BOM bake limits
-S32 LLVOAvatar::sMaxBakes;
-//
//-----------------------------------------------------------------------------
// Helper functions
//-----------------------------------------------------------------------------
@@ -737,12 +735,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mImpostorDistance = 0;
mImpostorPixelArea = 0;
- // BOM constrain number of bake requests when BOM not supported
- // BAKED_LEFT_ARM is equal to the pre-BOM BAKED_NUM_INDICES
- sMaxBakes = gAgent.getRegion()->bakesOnMeshEnabled()?BAKED_NUM_INDICES:BAKED_LEFT_ARM;
- //
setNumTEs(TEX_NUM_INDICES);
-
mbCanSelect = TRUE;
mSignaledAnimations.clear();
@@ -783,6 +776,47 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mVisuallyMuteSetting = FSAvatarRenderPersistence::instance().getAvatarRenderSettings(id);
}
+// BOM constrain number of bake requests when BOM not supported
+S32 LLVOAvatar::getNumBakes() const
+{
+#ifdef OPENSIM
+ // BAKED_LEFT_ARM is equal to the pre-BOM BAKED_NUM_INDICES
+ if(getRegion())
+ {
+ // LL_INFOS("BOMOS")
+ // << getFullname()
+ // << "Using avatar region settings [" << getRegion()->getName() << "]"
+ // << " bakesOnMesh = " << static_cast(getRegion()->bakesOnMeshEnabled()?"True":"False")
+ // << LL_ENDL;
+ return getRegion()->getRegionMaxBakes();
+ }
+ // LL_INFOS("BOMOS")
+ // << " Using fallback settings"
+ // << " bakesOnMesh = " << static_cast(LLGridManager::instance().isInSecondLife()?"True":"False")
+ // << LL_ENDL;
+ // fallback, in SL assume BOM, elsewhere assume not.
+ return LLGridManager::instance().isInSecondLife()?BAKED_NUM_INDICES:BAKED_LEFT_ARM;
+#else
+ return BAKED_NUM_INDICES;
+#endif
+}
+
+// U8 LLVOAvatar::getNumTEs() const
+// {
+// #ifdef OPENSIM
+// // TEX_HEAD_UNIVERSAL_TATTOO is equal to the pre-BOM TEX_NUM_INDICES
+// if(!mTEImages){return 0;}
+// if(getRegion())
+// {
+// return getRegion()->getRegionMaxTEs();
+// }
+// // fallback, in SL assume BOM, elsewhere assume not.
+// return LLGridManager::instance().isInSecondLife()?TEX_NUM_INDICES:TEX_HEAD_UNIVERSAL_TATTOO;
+// #else
+// return TEX_NUM_INDICES;
+// #endif
+// }
+//
std::string LLVOAvatar::avString() const
{
if (isControlAvatar())
@@ -870,8 +904,9 @@ BOOL LLVOAvatar::isFullyBaked()
{
if (mIsDummy) return TRUE;
if (getNumTEs() == 0) return FALSE;
-
- for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
+ // OS BOM limit the tests to avoid "invalid face error"
+ // for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
+ for (U32 i = 0; i < getNumBakes(); i++)
{
if (!isTextureDefined(mBakedTextureDatas[i].mTextureIndex)
&& ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT))
@@ -927,9 +962,8 @@ BOOL LLVOAvatar::hasGray() const
S32 LLVOAvatar::getRezzedStatus() const
{
if (getIsCloud()) return 0;
- bool textured = isFullyTextured();
- if (textured && allBakedTexturesCompletelyDownloaded()) return 3;
- if (textured) return 2;
+ if (isFullyTextured() && allBakedTexturesCompletelyDownloaded()) return 3;
+ if (isFullyTextured()) return 2;
llassert(hasGray());
return 1; // gray
}
@@ -7875,20 +7909,7 @@ U32 LLVOAvatar::getNumAttachments() const
//-----------------------------------------------------------------------------
S32 LLVOAvatar::getMaxAttachments() const
{
- const S32 MAX_AGENT_ATTACHMENTS = 38;
-
- S32 max_attach = MAX_AGENT_ATTACHMENTS;
-
- if (gAgent.getRegion())
- {
- LLSD features;
- gAgent.getRegion()->getSimulatorFeatures(features);
- if (features.has("MaxAgentAttachments"))
- {
- max_attach = features["MaxAgentAttachments"].asInteger();
- }
- }
- return max_attach;
+ return LLAgentBenefitsMgr::current().getAttachmentLimit();
}
//-----------------------------------------------------------------------------
@@ -7922,24 +7943,7 @@ U32 LLVOAvatar::getNumAnimatedObjectAttachments() const
//-----------------------------------------------------------------------------
S32 LLVOAvatar::getMaxAnimatedObjectAttachments() const
{
- S32 max_attach = 0;
- if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits"))
- {
- max_attach = getMaxAttachments();
- }
- else
- {
- if (gAgent.getRegion())
- {
- LLSD features;
- gAgent.getRegion()->getSimulatorFeatures(features);
- if (features.has("AnimatedObjects"))
- {
- max_attach = features["AnimatedObjects"]["MaxAgentAnimatedObjectAttachments"].asInteger();
- }
- }
- }
- return max_attach;
+ return LLAgentBenefitsMgr::current().getAnimatedObjectLimit();
}
//-----------------------------------------------------------------------------
@@ -8517,13 +8521,14 @@ bool LLVOAvatar::getIsCloud() const
);
}
-void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status)
+void LLVOAvatar::updateRezzedStatusTimers()
{
// State machine for rezzed status. Statuses are -1 on startup, 0
// = cloud, 1 = gray, 2 = downloading, 3 = full.
// Purpose is to collect time data for each it takes avatar to reach
// various loading landmarks: gray, textured (partial), textured fully.
+ S32 rez_status = getRezzedStatus();
if (rez_status != mLastRezzedStatus)
{
LL_DEBUGS("Avatar") << avString() << "rez state change: " << mLastRezzedStatus << " -> " << rez_status << LL_ENDL;
@@ -8695,13 +8700,8 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse
// returns true if the value has changed.
BOOL LLVOAvatar::updateIsFullyLoaded()
{
- S32 rez_status = getRezzedStatus();
- bool loading = getIsCloud();
- if (mFirstFullyVisible && !mIsControlAvatar && rez_status < 3)
- {
- loading = ((rez_status < 2) || !isFullyBaked());
- }
- updateRezzedStatusTimers(rez_status);
+ const bool loading = getIsCloud();
+ updateRezzedStatusTimers();
updateRuthTimer(loading);
return processFullyLoadedChange(loading);
}
@@ -8737,22 +8737,13 @@ void LLVOAvatar::updateRuthTimer(bool loading)
BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
{
- // We wait a little bit before giving the 'all clear', to let things to
- // settle down (models to snap into place, textures to get first packets)
- const F32 LOADED_DELAY = 1.f;
- const F32 FIRST_USE_DELAY = 3.f;
-
+ // we wait a little bit before giving the all clear,
+ // to let textures settle down
+ const F32 PAUSE = 1.f;
if (loading)
mFullyLoadedTimer.reset();
-
- if (mFirstFullyVisible)
- {
- mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > FIRST_USE_DELAY);
- }
- else
- {
- mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > LOADED_DELAY);
- }
+
+ mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
if (!mPreviousFullyLoaded && !loading && mFullyLoaded)
{
@@ -9000,7 +8991,9 @@ void LLVOAvatar::updateMeshTextures()
mBakedTextureDebugText += llformat("%06d\n",update_counter++);
mBakedTextureDebugText += "indx layerset linvld ltda ilb ulkg ltid\n";
- for (U32 i=0; i < mBakedTextureDatas.size(); i++)
+ // BOM OS
+ // for (U32 i=0; i < mBakedTextureDatas.size(); i++)
+ for (U32 i=0; i < getNumBakes(); i++)
{
is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex);
LLViewerTexLayerSet* layerset = NULL;
@@ -9048,8 +9041,10 @@ void LLVOAvatar::updateMeshTextures()
use_lkg_baked_layer[i],
last_id_string.c_str());
}
-
- for (U32 i=0; i < mBakedTextureDatas.size(); i++)
+ // BOM OS
+ // for (U32 i=0; i < mBakedTextureDatas.size(); i++)
+ for (U32 i=0; i < getNumBakes(); i++)
+ //
{
debugColorizeSubMeshes(i, LLColor4::white);
@@ -9329,7 +9324,7 @@ void LLVOAvatar::releaseComponentTextures()
// BOM constrain number of bake requests when BOM not supported
// for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
- for (U8 baked_index = 0; baked_index < sMaxBakes; baked_index++)
+ for (U8 baked_index = 0; baked_index < getNumBakes(); baked_index++)
//
{
const LLAvatarAppearanceDictionary::BakedEntry * bakedDicEntry = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
@@ -9912,7 +9907,12 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
// prevent the overwriting of valid baked textures with invalid baked textures
for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)
{
- if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex)
+ // refactor a little to help debug
+ // if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex)
+ auto isDefined = isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex);
+ LL_DEBUGS("Avatar") << avString() << "sb " << (S32) isUsingServerBakes() << " baked_index " << (S32) baked_index << " textureDefined= " << isDefined << LL_ENDL;
+ if (!isDefined
+ //
&& mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT
&& baked_index != BAKED_SKIRT && baked_index != BAKED_LEFT_ARM && baked_index != BAKED_LEFT_LEG && baked_index != BAKED_AUX1 && baked_index != BAKED_AUX2 && baked_index != BAKED_AUX3)
{
@@ -9937,8 +9937,8 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived;
mFirstAppearanceMessageReceived = TRUE;
- //LL_DEBUGS("Avatar") << avString() << "processAvatarAppearance start " << mID
- // << " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL;
+ // LL_DEBUGS("Avatar") << avString() << "processAvatarAppearance start " << mID
+ // << " first? " << is_first_appearance_message << " self? " << isSelf() << LL_ENDL;
if (is_first_appearance_message )
{
@@ -10066,7 +10066,7 @@ LLViewerTexture* LLVOAvatar::getBakedTexture(const U8 te)
// BOM constrain number of bake requests when BOM not supported
// prior to BOM BAKES beyond BAKED_HAIR were not supported.
// if (te < 0 || te >= BAKED_NUM_INDICES)
- if (te < 0 || te >= sMaxBakes)
+ if (te < 0 || te >= getNumBakes())
//
{
return NULL;
@@ -10768,11 +10768,6 @@ void LLVOAvatar::removeMissingBakedTextures()
//virtual
void LLVOAvatar::updateRegion(LLViewerRegion *regionp)
{
- // BOM constrain number of bake requests when BOM not supported,
- // TEX_HEAD_TATTOO and BAKED_LEFT_ARM are the first new entries
- // TODO(Beq): We might need to force some kind off rebake here?
- sMaxBakes = gAgent.getRegion()->bakesOnMeshEnabled()?BAKED_NUM_INDICES:BAKED_LEFT_ARM;
- //
LLViewerObject::updateRegion(regionp);
}
@@ -11415,7 +11410,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
// Disable useless diagnostics
//static std::set all_textures;
- if (mVisualComplexityStale)
+ if (mVisualComplexityStale)
{
// Show per-item complexity in COF
@@ -11429,7 +11424,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
hud_complexity_list_t hud_complexity_list;
// BOM constrain number of bake requests when BOM not supported
// for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
- for (U8 baked_index = 0; baked_index < sMaxBakes; baked_index++)
+ for (U8 baked_index = 0; baked_index < getNumBakes(); baked_index++)
//
{
const LLAvatarAppearanceDictionary::BakedEntry *baked_dict
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 9652b8c83a..842c6923e2 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -346,9 +346,6 @@ public:
static BOOL sJointDebug; // output total number of joints being touched for each avatar
static BOOL sDebugAvatarRotation;
static LLPartSysData sCloud;
- // BOM bake limits
- static S32 sMaxBakes;
- //
//--------------------------------------------------------------------
// Region state
@@ -361,13 +358,15 @@ public:
//--------------------------------------------------------------------
public:
BOOL isFullyLoaded() const;
- bool isTooComplex() const;
+ virtual bool isTooComplex() const; // FIRE-29012: Standalone animesh avatars get affected by complexity limit; changed to virtual
bool visualParamWeightsAreDefault();
virtual bool getIsCloud() const;
BOOL isFullyTextured() const;
BOOL hasGray() const;
S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
- void updateRezzedStatusTimers(S32 status);
+ void updateRezzedStatusTimers();
+ S32 getNumBakes() const;// BOM bake limits
+ // U8 getNumTEs() const override;// BOM bake limits
S32 mLastRezzedStatus;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index addd464cfe..b876ae6fd4 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -82,9 +82,7 @@
// [Legacy Bake]
-#ifdef OPENSIM
#include "llviewernetwork.h"
-#endif
// [Legacy Bake]
#if LL_MSVC
@@ -1258,11 +1256,32 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
// [Legacy Bake]
}
}
+// Check whether the BOM capability is different to last time we changed region (even across login)
+void LLVOAvatarSelf::checkBOMRebakeRequired()
+{
+ if(!getRegion())
+ {
+ auto newBOMStatus = getRegion()->bakesOnMeshEnabled();
+ if(!gSavedSettings.getBOOL("CurrentlyUsingBakesOnMesh") != newBOMStatus)
+ {
+ // 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.
+ if(!LLGridManager::instance().isInSecondLife())
+ {
+ 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);
+ }
+ }
+}
+//
void LLVOAvatarSelf::onSimulatorFeaturesReceived(const LLUUID& region_id)
{
LL_INFOS("Avatar") << "simulator features received, setting hover based on region props" << LL_ENDL;
setHoverIfRegionEnabled();
+ checkBOMRebakeRequired();// BOM we may have stale cache, rebake may be needed
}
//virtual
@@ -1289,6 +1308,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
if (regionp->simulatorFeaturesReceived())
{
setHoverIfRegionEnabled();
+ checkBOMRebakeRequired();// BOM we may have stale cache, rebake may be needed
}
else
{
@@ -3186,7 +3206,7 @@ LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index)
return mHeadLayerSet; */
// BOM fallback support for OpenSim legacy
// if (baked_index >= 0 && baked_index < BAKED_NUM_INDICES)
- if (baked_index >= 0 && baked_index < LLVOAvatar::sMaxBakes)
+ if (baked_index >= 0 && baked_index < getNumBakes())
//
{
return getTexLayerSet(baked_index);
@@ -3278,7 +3298,18 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
{
const ETextureIndex index = iter->first;
const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;
- if (!texture_dict->mIsBakedTexture)
+ // hide the surplus bakes and universals from non-BOM
+ // if (!texture_dict->mIsBakedTexture)
+ if( (index == TEX_SKIRT || index == TEX_SKIRT_TATTOO) && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT) )
+ {
+ // TODO(BEQ): combine this with clause below once proven it works.
+ LL_DEBUGS("Avatar") << "Ignoring skirt related texture at index=" << index << LL_ENDL;
+ LLTextureEntry &entry = getTEref((U8) index);
+ texture_id[index] = entry.getID();
+ entry.setID(IMG_DEFAULT_AVATAR);
+ }
+ if (!texture_dict->mIsBakedTexture || index >= getRegion()->getRegionMaxTEs())
+ //
{
LLTextureEntry &entry = getTEref((U8) index);
texture_id[index] = entry.getID();
@@ -3311,7 +3342,7 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
//}
//
-
+
bool success = packTEMessage(mesgsys);
// unpack TEs to make sure we don't re-trigger a bake
@@ -3321,7 +3352,10 @@ bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
{
const ETextureIndex index = iter->first;
const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second;
- if (!texture_dict->mIsBakedTexture)
+ // hide the surplus bakes and universals from non-BOM
+ // if (!texture_dict->mIsBakedTexture)
+ if (!texture_dict->mIsBakedTexture || index >= getRegion()->getRegionMaxTEs())
+ //
{
LLTextureEntry &entry = getTEref((U8) index);
entry.setID(texture_id[index]);
@@ -3513,7 +3547,9 @@ void LLVOAvatarSelf::requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedText
// virtual
bool LLVOAvatarSelf::hasPendingBakedUploads() const
{
- for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
+ // BOMOS constrain uploads for non-BOM.
+ // for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
+ for (U32 i = 0; i < getNumBakes(); i++)
{
LLViewerTexLayerSet* layerset = getTexLayerSet(i);
if (layerset && layerset->getViewerComposite() && layerset->getViewerComposite()->uploadPending())
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index dc359e65fc..417f067a75 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -449,7 +449,7 @@ private:
F32 mDebugTextureLoadTimes[LLAvatarAppearanceDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level
F32 mDebugBakedTextureTimes[LLAvatarAppearanceDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture
void debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
-
+ void checkBOMRebakeRequired();
void appearanceChangeMetricsCoro(std::string url);
bool mInitialMetric;
S32 mMetricSequence;
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 9648d958df..bafeb29728 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -843,34 +843,11 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
#if LL_WINDOWS
// On windows use exe (not work or RO) directory
std::string exe_path = gDirUtilp->getExecutableDir();
- // FIRE-22709: Local voice not working in OpenSim
-#ifdef OPENSIM
- if (!LLGridManager::instance().isInSecondLife())
- {
- gDirUtilp->append(exe_path, "voice_os" + gDirUtilp->getDirDelimiter() + "SLVoice.exe");
- }
- else
-#endif
- //
gDirUtilp->append(exe_path, "SLVoice.exe");
#elif LL_DARWIN
// On MAC use resource directory
std::string exe_path = gDirUtilp->getAppRODataDir();
- // FIRE-22709: Local voice not working in OpenSim
- //gDirUtilp->append(exe_path, "SLVoice");
-#ifdef OPENSIM
- if (LLGridManager::instance().isInSecondLife())
- {
-#endif
- gDirUtilp->append(exe_path, "SLVoice");
-#ifdef OPENSIM
- }
- else
- {
- gDirUtilp->append(exe_path, "voice_os/SLVoice");
- }
-#endif
- //
+ gDirUtilp->append(exe_path, "SLVoice");
#else
std::string exe_path = gDirUtilp->getExecutableDir();
// On Linux the viewer can run SLVoice.exe through wine (https://www.winehq.org/)
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index aae8332235..719363c3c4 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8875,15 +8875,24 @@ void LLPipeline::renderDeferredLighting()
}
}
- const LLViewerObject *vobj = drawablep->getVObj();
- if((vobj && vobj->getAvatar() && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList()))
- || (vobj && dist_vec(vobj->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip))
- {
- continue;
- }
+ const LLViewerObject *vobj = drawablep->getVObj();
+ if (vobj)
+ {
+ LLVOAvatar *av = vobj->getAvatar();
+ if (av && (av->isTooComplex() || av->isInMuteList()))
+ {
+ continue;
+ }
+ }
+
+ const LLVector3 position = drawablep->getPositionAgent();
+ if (dist_vec(position, LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip + volume->getLightRadius())
+ {
+ continue;
+ }
LLVector4a center;
- center.load3(drawablep->getPositionAgent().mV);
+ center.load3(position.mV);
const F32* c = center.getF32ptr();
F32 s = volume->getLightRadius()*1.5f;
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 767ea212fa..4323cdcd17 100755
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -160,7 +160,7 @@ BEGIN
VALUE "FileDescription", "Firestorm"
VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
VALUE "InternalName", "Firestorm"
- VALUE "LegalCopyright", "Copyright \251 2010-2019, The Phoenix Firestorm Project, Inc."
+ VALUE "LegalCopyright", "Copyright \251 2010-2020, The Phoenix Firestorm Project, Inc."
VALUE "OriginalFilename", "Firestorm.exe"
VALUE "ProductName", "Firestorm"
VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}"
diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp
index 89d1682a93..a81071e1ff 100644
--- a/indra/newview/rlvui.cpp
+++ b/indra/newview/rlvui.cpp
@@ -138,7 +138,7 @@ void RlvUIEnabler::onToggleShowLoc()
LLTeleportHistoryStorage* pTpHistoryStg = LLTeleportHistoryStorage::getInstance();
RLV_ASSERT( (pTpHistory) && (pTpHistoryStg) && (pTpHistory->getItems().size() > 0) && (pTpHistory->getCurrentItemIndex() >= 0) );
if ( (pTpHistory) && (pTpHistory->getItems().size() > 0) && (pTpHistory->getCurrentItemIndex() >= 0) &&
- (pTpHistoryStg) && (pTpHistory->getItems().size() > 0) )
+ (pTpHistoryStg) && (pTpHistoryStg->getItems().size() > 0) )
{
const LLTeleportHistoryItem& tpItem = pTpHistory->getItems().back();
const LLTeleportHistoryPersistentItem& tpItemStg = pTpHistoryStg->getItems().back();
diff --git a/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml
index 1d0b7b0648..e1c085d903 100644
--- a/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml
+++ b/indra/newview/skins/ansastorm/xui/de/panel_main_inventory.xml
@@ -15,6 +15,7 @@
+
diff --git a/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml
index e80fc6111e..d23ec59a51 100644
--- a/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/ansastorm/xui/en/panel_group_info_sidetray.xml
@@ -278,17 +278,6 @@ background_visible="false"
left="1"
top="0"
width="96" />
-
diff --git a/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml
index ae5e447dd5..497b5b29ab 100644
--- a/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/ansastorm/xui/en/panel_main_inventory.xml
@@ -66,6 +66,16 @@
+
+
+
+
- Załadował/a:
+ Przesłał/a:
diff --git a/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml
index bc8613e080..08621cdaf9 100644
--- a/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml
+++ b/indra/newview/skins/ansastorm/xui/pl/panel_main_inventory.xml
@@ -18,6 +18,7 @@
+
diff --git a/indra/newview/skins/default/textures/icons/FMOD_logo.png b/indra/newview/skins/default/textures/icons/FMOD_logo.png
new file mode 100644
index 0000000000..0675b5d13d
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/FMOD_logo.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index b34fa8c61e..af0b05d32f 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1026,6 +1026,7 @@ with the same filename but different name
+
diff --git a/indra/newview/skins/default/xui/da/menu_inventory_add.xml b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
index 197e63e3ed..9419e4ea3c 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory_add.xml
@@ -1,12 +1,12 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/de/floater_NACL_explore_sounds.xml b/indra/newview/skins/default/xui/de/floater_NACL_explore_sounds.xml
index 4170583460..9cf016d6b2 100644
--- a/indra/newview/skins/default/xui/de/floater_NACL_explore_sounds.xml
+++ b/indra/newview/skins/default/xui/de/floater_NACL_explore_sounds.xml
@@ -32,8 +32,9 @@
-
-
+
+
+
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index a6e23e7edd..fe15e040ce 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -44,38 +44,6 @@ UI-Künstler und Designer:
-
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion.
-APR Copyright (C) 2011 The Apache Software Foundation
-Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
-cURL Copyright (C) 1996-2010, Daniel Stenberg (daniel@haxx.se).
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FMOD Sound System Copyright (C) Firelight Technologies Pty, Ltd., 1994-2013
-FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm und Werner Lemberg.
-GL Copyright (C) 1999-2004 Brian Paul.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University sowie David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW).
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2002, Xiphophorus.
-OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
-PCRE Copyright (c) 1997-2012 University of Cambridge.
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga.
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com).
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2012 Jean-loup Gailly und Mark Adler.
-
-Second Life Viewer verwendet Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (und Lizenzgeber). Alle Rechte vorbehalten. Details siehe www.havok.com.
-
-Diese Software enthält von der NVIDIA Corporation bereitgestellten Quellcode.
-
-Alle Rechte vorbehalten. Details siehe licenses.txt.
-
-Audiocodierung für Voice-Chat: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
-
diff --git a/indra/newview/skins/default/xui/de/floater_export_collada.xml b/indra/newview/skins/default/xui/de/floater_export_collada.xml
index 9c9348df86..fea637a61f 100644
--- a/indra/newview/skins/default/xui/de/floater_export_collada.xml
+++ b/indra/newview/skins/default/xui/de/floater_export_collada.xml
@@ -27,6 +27,7 @@
+
Textur-Format:
diff --git a/indra/newview/skins/default/xui/de/floater_fs_im_session.xml b/indra/newview/skins/default/xui/de/floater_fs_im_session.xml
index 694ed38c7b..837576a501 100644
--- a/indra/newview/skins/default/xui/de/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/de/floater_fs_im_session.xml
@@ -45,6 +45,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/de/floater_fs_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_fs_nearby_chat.xml
index 0d3240ee6c..989d0c76ce 100644
--- a/indra/newview/skins/default/xui/de/floater_fs_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/de/floater_fs_nearby_chat.xml
@@ -16,6 +16,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/de/floater_fs_protectedfolders.xml b/indra/newview/skins/default/xui/de/floater_fs_protectedfolders.xml
new file mode 100644
index 0000000000..672fa4f443
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_fs_protectedfolders.xml
@@ -0,0 +1,15 @@
+
+
+
+ (Unbekannter Ordner)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
deleted file mode 100644
index b93a41c283..0000000000
--- a/indra/newview/skins/default/xui/de/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- 1 Ordner
-
-
- [NUM] Ordner
-
-
- Ordner übertragen...
-
-
- Initialisieren...
-
-
-
-
-
- Laden...
-
-
-
-
-
-
- Objekte hier ablegen, um Ordner zu erstellen
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/de/floater_phototools.xml b/indra/newview/skins/default/xui/de/floater_phototools.xml
index 61fff0ec46..e01e1f3fb0 100644
--- a/indra/newview/skins/default/xui/de/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/de/floater_phototools.xml
@@ -112,15 +112,6 @@
-
- Avatar-Schatten:
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
index 7855e3fb8d..403f1b5f52 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -20,6 +20,8 @@
+
+
diff --git a/indra/newview/skins/default/xui/de/menu_fs_area_search.xml b/indra/newview/skins/default/xui/de/menu_fs_area_search.xml
index 1548a33270..d77eb93994 100644
--- a/indra/newview/skins/default/xui/de/menu_fs_area_search.xml
+++ b/indra/newview/skins/default/xui/de/menu_fs_area_search.xml
@@ -11,4 +11,7 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
index ad43150f76..f1a396ccc0 100644
--- a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index f1af6dc732..57d9b032c7 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -76,6 +76,8 @@
+
+
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
index 95981478aa..f89ecc5165 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
@@ -1,12 +1,12 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
index d1eb5bc16d..5e54c05c66 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml
@@ -1,6 +1,7 @@
+
diff --git a/indra/newview/skins/default/xui/de/menu_pie_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_pie_attachment_self.xml
index 2655adc30a..b1c2418b6d 100644
--- a/indra/newview/skins/default/xui/de/menu_pie_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_pie_attachment_self.xml
@@ -14,7 +14,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 8b7665b5d8..88be7705e2 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -8,6 +8,7 @@
+
@@ -217,11 +218,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index cf8acdffcb..fcac39b3fb 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -270,6 +270,10 @@ Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren?
Möchten Sie den ausgewählten Einwohnern die Änderungsrechte entziehen?
+
+ Ein Gruppenname muss zwischen [MIN_LEN] und [MAX_LEN] Zeichen lang sein.
+
+
Gruppe konnte nicht erstellt werden.
[MESSAGE]
@@ -511,6 +515,9 @@ Um Medien nur auf einer Fläche einzufügen, wählen Sie „Oberfläche auswähl
Es kostet L$[COST], um ein Foto in Ihrem Inventar zu speichern. Sie können entweder L$ kaufen oder das Foto auf Ihrem Computer speichern.
+
+ Es kostet L$[COST], um diesen Gegenstand hochzuladen.
+
Es kostet L$[COST], um eine Textur in Ihrem Inventar zu speichern. Sie können entweder L$ kaufen oder das Foto auf Ihrem Computer speichern.
@@ -1827,11 +1834,14 @@ Eingehende Gruppeneinladungen werden jetzt automatisch abgewiesen. Sie erhalten
- Die Gruppenbegrenzung für Basiskonten ist [MAX_BASIC]; für
-[https://secondlife.com/premium/ Premium-]Konten ist sie [MAX_PREMIUM].
-Wenn Sie ein Downgrade Ihres Kontos durchgeführt haben, müssen Sie das Gruppenlimit unter [MAX_BASIC] bringen, bevor sich weitere Personen registrieren können.
-
-[https://secondlife.com/my/account/membership.php Noch heute upgraden!]
+ Einwohner mit einer Basis-Mitgliedschaft können bis zu [MAX_BASIC] Gruppen beitreten.
+Eine Premium-Mitgliedschaft erlaubt bis zu [MAX_PREMIUM]. [https://secondlife.com/my/account/membership.php Mehr erfahren oder upgraden]
+
+
+
+ Einwohner mit einer Basis-Mitgliedschaft können bis zu [MAX_BASIC] Gruppen beitreten.
+Eine Premium-Mitgliedschaft erlaubt bis zu [MAX_PREMIUM]. [https://secondlife.com/my/account/membership.php Mehr erfahren oder upgraden]
+Eine Premium-Plus-Mitgliedschaft erlaubt bis zu [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php Mehr erfahren oder upgraden]
@@ -3511,6 +3521,22 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
Sie wurden vom Moderator stummgeschaltet.
+
+ Leider konnten die Vorteilsinformationen für diese Sitzung nicht abgerufen werden. Dieses sollte normalerweise nicht passieren. Bitte kontaktieren Sie den Support. Diese Sitzung wird nicht normal funktionieren und wir empfehlen einen Neustart.
+
+
+
+ Das Hochladen von [COUNT] Gegenständen wird insgesamt [COST] L$ kosten. Möchten Sie mit dem Hochladen fortfahren?
+
+
+
+ Die ausgewählten Dateien können nicht per Mehrfach-Upload hochgeladen werden.
+
+
+
+ Einige der ausgewählten Dateien können nicht per Mehrfach-Upload hochgeladen werden.
+
+
Das Hochladen kostet [PRICE] L$. Möchten Sie fortfahren?
diff --git a/indra/newview/skins/default/xui/de/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/de/panel_group_creation_sidetray.xml
new file mode 100644
index 0000000000..5ac7ff0170
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_group_creation_sidetray.xml
@@ -0,0 +1,58 @@
+
+
+
+ (Ihre Mitgliedschaft)
+
+
+
+ Gruppenname:
+
+
+
+
+
+
+
+
+
+
+ Gruppen-Charta
+
+
+
+
+
+
+
+
+ - Inhaltseinstufung auswählen -
+
+
+
+
+
+
+
+
+ Die Gebühr zum Erstellen einer Gruppe hängig von Ihrer Mitgliedschaftsstufe ab. [https://secondlife.com/my/account/membership.php Weitere Informationen]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hinweis: Nach 7 Tagen wird eine Gruppe ohne Mitglieder (ausgenommen des Erstellers) gelöscht!
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
deleted file mode 100644
index 789e71c6b6..0000000000
--- a/indra/newview/skins/default/xui/de/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_UI.xml b/indra/newview/skins/default/xui/de/panel_preferences_UI.xml
index 616095d3cc..3c749d3b12 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_UI.xml
@@ -100,7 +100,7 @@
-
+
@@ -117,7 +117,7 @@
-
+
Eigene Fenster verwenden für:
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 733eebfdab..c5f6172488 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -55,7 +55,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml
index 4b95547210..d15b516e78 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_crashreports.xml
@@ -1,14 +1,6 @@
-
- Typ Speicherabbild:
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index 642c4a3f46..7f57acf805 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -108,10 +108,10 @@
-
-
+
+
- S3TC Aktivieren:
+ S3TC aktivieren:
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_move.xml b/indra/newview/skins/default/xui/de/panel_preferences_move.xml
index 98a48ad121..d8f22347e8 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_move.xml
@@ -3,7 +3,7 @@
-
+
@@ -59,12 +59,12 @@
-
- Bewegung beim Regionswechsel:
+
+ Bewegungsvorhersage beim Regionswechsel:
-
-
+
+
Falls Movelock in der LSL-Brücke aktiviert ist...
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
index b9b2383619..12f140e0be 100644
--- a/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_inventory.xml
@@ -14,7 +14,7 @@
- Das Speichern eines Bilds in Ihrem Inventar kostet [UPLOAD_COST] L$. Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
+ Um das Bild als Textur zu speichern, wählen Sie eines der quadratischen Formate aus.
diff --git a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
index 8a0c32309b..0d909312ed 100644
--- a/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/de/panel_snapshot_options.xml
@@ -5,7 +5,7 @@
-
+
@@ -23,4 +23,7 @@
+
+ Die Gebühr richtet sich nach der Mitgliedsstufe. Höhere Stufen berechnen niedrigere Gebühren.
+
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 13eef83a7d..5d576d504c 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -798,6 +798,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
Wird geladen...
+
+ gesperrt
+
geschützt
diff --git a/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml b/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml
index 7fe8c383ab..c194052347 100644
--- a/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml
+++ b/indra/newview/skins/default/xui/en/floater_NACL_explore_sounds.xml
@@ -47,6 +47,7 @@
+
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 735f9f6b5d..d85b9d9ba3 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
-Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
+Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
+
+
+
+
3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
APR Copyright (C) 2011 The Apache Software Foundation
@@ -245,11 +268,10 @@ Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FMOD Sound System, Copyright (C) Firelight Technologies Pty, Ltd., 1994-2013
+FMOD Sound System, Copyright (C) Firelight Technologies Pty, Ltd., 1994-2020
FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
GL Copyright (C) 1999-2004 Brian Paul.
GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
@@ -271,6 +293,70 @@ All rights reserved. See licenses.txt for details.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml
index 1c32b1d889..17f78acd8a 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_anim_preview.xml
@@ -1,7 +1,7 @@
+
diff --git a/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml
index 23e7e53047..3d8c44ae61 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_bvh_preview.xml
@@ -2,7 +2,7 @@
+
diff --git a/indra/newview/skins/default/xui/en/floater_export_collada.xml b/indra/newview/skins/default/xui/en/floater_export_collada.xml
index 87c7c5e3d4..a0edb9dbaa 100644
--- a/indra/newview/skins/default/xui/en/floater_export_collada.xml
+++ b/indra/newview/skins/default/xui/en/floater_export_collada.xml
@@ -1,6 +1,6 @@
Options:
@@ -120,6 +120,15 @@
name="texture_params_check"
top_pad="2"
width="235" />
+
+ tool_tip="Deletes local files: chat history, last session screenshot, browser cookies, teleport history, toolbar settings, e t c. Some of local files are shared between grids."/>
diff --git a/indra/newview/skins/default/xui/en/floater_fs_group.xml b/indra/newview/skins/default/xui/en/floater_fs_group.xml
index dea5f54780..bcff41cf82 100644
--- a/indra/newview/skins/default/xui/en/floater_fs_group.xml
+++ b/indra/newview/skins/default/xui/en/floater_fs_group.xml
@@ -30,4 +30,14 @@
name="panel_group_info_sidetray"
filename="panel_group_info_sidetray.xml"
/>
+
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_fs_im_session.xml b/indra/newview/skins/default/xui/en/floater_fs_im_session.xml
index e3580fc74d..38ae198893 100644
--- a/indra/newview/skins/default/xui/en/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_fs_im_session.xml
@@ -422,6 +422,28 @@
tool_tip="Chat Options"
name="chat_options_btn"/>
+
+
+
+
+
+
+
+
+ (Unknown Folder)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 0e30f2462b..3d98b279f5 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -2,7 +2,7 @@
+
diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml
index fd3e049e41..ca3cdfcf3c 100644
--- a/indra/newview/skins/default/xui/en/floater_people.xml
+++ b/indra/newview/skins/default/xui/en/floater_people.xml
@@ -32,5 +32,11 @@
filename="panel_group_info_sidetray.xml"
label="Group Profile"
font="SansSerifBold"/>
+
diff --git a/indra/newview/skins/default/xui/en/floater_phototools.xml b/indra/newview/skins/default/xui/en/floater_phototools.xml
index f7acd9c24f..359b3a2b3d 100644
--- a/indra/newview/skins/default/xui/en/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/en/floater_phototools.xml
@@ -679,7 +679,7 @@
top_pad="5"
left="4"
width="275"
- height="60"
+ height="65"
border_visible="true"
background_visible="true">
@@ -730,7 +730,7 @@
top_pad="5"
left="4"
width="275"
- height="65"
+ height="40"
border_visible="true"
background_visible="true">
-
- Avatar Shadows:
-
-
-
-
-
-
-
@@ -1545,7 +1507,7 @@
layout="topleft"
left="5"
top_pad="15"
- tool_tip="In real world terms this is a Zoom feature. This will change the field of view in you viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
+ tool_tip="In real world terms this is a Zoom feature. This will change the field of view in your viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
width="80">
View angle
@@ -4183,7 +4145,7 @@
layout="topleft"
left="10"
top_pad="7"
- tool_tip="In real world terms this is a Zoom feature. This will change the field of view in you viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
+ tool_tip="In real world terms this is a Zoom feature. This will change the field of view in your viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
width="100">
View angle
diff --git a/indra/newview/skins/default/xui/en/floater_phototools_camera.xml b/indra/newview/skins/default/xui/en/floater_phototools_camera.xml
index 38d7524086..ae2c2fae5a 100644
--- a/indra/newview/skins/default/xui/en/floater_phototools_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_phototools_camera.xml
@@ -362,7 +362,7 @@
layout="topleft"
left="10"
top_pad="12"
- tool_tip="In real world terms this is a Zoom feature. This will change the field of view in you viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpacenNavigator)."
+ tool_tip="In real world terms this is a Zoom feature. This will change the field of view in your viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
width="100">
View angle
diff --git a/indra/newview/skins/default/xui/en/floater_sound_preview.xml b/indra/newview/skins/default/xui/en/floater_sound_preview.xml
index 7c6f4c617c..0821344477 100644
--- a/indra/newview/skins/default/xui/en/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_sound_preview.xml
@@ -1,7 +1,7 @@
+
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index c64119a17e..0f43ae7dcc 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -170,6 +170,21 @@ name="Edit Outfit">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/menu_fs_radar_options.xml b/indra/newview/skins/default/xui/en/menu_fs_radar_options.xml
index bd2ea60aac..1c341c8756 100644
--- a/indra/newview/skins/default/xui/en/menu_fs_radar_options.xml
+++ b/indra/newview/skins/default/xui/en/menu_fs_radar_options.xml
@@ -197,7 +197,7 @@
diff --git a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
index 55187199ff..788d3ccb5c 100644
--- a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
@@ -66,7 +66,7 @@
parameter="ShowMenuBarLocation" />
+
+
+
+
+
+
@@ -24,7 +24,7 @@
function="File.EnableUpload" />
-
\ No newline at end of file
+
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
index 96a437e862..3f4489925c 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -15,6 +15,16 @@
function="Inventory.GearDefault.Custom.Action"
parameter="new_window" />
+
+
+
+
-
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/menu_teleport_history_timezone.xml b/indra/newview/skins/default/xui/en/menu_teleport_history_timezone.xml
index 214ddbee57..f6f8d5dbac 100644
--- a/indra/newview/skins/default/xui/en/menu_teleport_history_timezone.xml
+++ b/indra/newview/skins/default/xui/en/menu_teleport_history_timezone.xml
@@ -1,39 +1,39 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 2688268b46..847f4e0d25 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -63,7 +63,16 @@
function="Floater.Toggle"
parameter="inventory" />
-
+
+
+
+
@@ -1832,7 +1841,7 @@
name="Upload"
tear_off="true">
@@ -1843,10 +1852,10 @@
function="File.EnableUpload" />
+ parameter="Upload Image,texture" />
+ parameter="Upload Sound,sound" />
+ parameter="Upload Animation,animation" />
+
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 60eb9d0b75..35602725dd 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -685,6 +685,18 @@ Do you want to revoke modify rights for the selected Residents?
yestext="Yes"/>
+
+A group name must be between [MIN_LEN] and [MAX_LEN] characters.
+ group
+ fail
+
+
+
fail
+
+ You need L$[COST] to upload this item.
+ fail
+
+
+
+ fail
+Already remembered user can be forgotten from Me > Preferences > Advanced > Remembered Usernames.
+
+
+
+ confirm
+Forgetting the logged-in user requires you to log out.
+
+
+
+
+ confirm
+Local Data you are deleting is shared between multiple grids, are you sure you want to delete it?
+
+
+
-The group limit for base accounts is [MAX_BASIC], and for [https://secondlife.com/premium/ premium]
-accounts is [MAX_PREMIUM].
-If you downgraded your account, you will need to get below [MAX_BASIC] group limit before you can join more.
+Residents with Basic memberships may join up to [MAX_BASIC] groups.
+Premium memberships allow up to [MAX_PREMIUM]. [https://secondlife.com/my/account/membership.php? Learn more or upgrade]
+ group
+
+
-[https://secondlife.com/my/account/membership.php Upgrade today!]
+
+Residents with Basic memberships may join up to [MAX_BASIC] groups.
+Premium memberships allow up to [MAX_PREMIUM]. Premium Plus
+memberships allow up to [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php? Learn more or upgrade]
group
-This land has media:
+This location plays media:
[URL]
Would you like to play it?
confirm
@@ -6366,7 +6428,7 @@ Would you like to play it?
ignore="Ignore Media"
index="0"
name="No"
- text="Ignore"/>
+ text="Don't play"/>
@@ -9140,7 +9202,48 @@ Your voice has been muted by a moderator.
name="okbutton"
yestext="OK"/>
+
+
+ Unfortunately, we were unable to get benefits information for this session. This should not happen in a normal production environment. Please contact support. This session will not work normally and we recommend that you restart.
+
+
+
+
+This will upload [COUNT] items at a total cost of L$[COST]. Do you wish to continue with the upload?
+
+
+
+Selected files can not be bulk-uploaded.
+
+
+
+
+Some of the selected files can not be bulk-uploaded.
+
+
+
-
-
+ combo_button.scale_image="true" >
+
+
-
+
+
+(your membership)
+
+
+
+ Group Name:
+
+
+
+
+
+
+
+
+
+
+
+
+ Group Charter
+
+
+
+
+
+
+
+
+ - Select maturity rating -
+
+
+
+
+
+
+
+
+ The fee to create a group is based on your membership level. [https://secondlife.com/my/account/membership.php More info]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Note: After 7 days, a group with no members (other than the creator) is deleted!
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 957da63f15..c59866f5e2 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -168,6 +168,7 @@ Hover your mouse over the options for more help.
draw_heading="true"
heading_height="23"
name="visible_members"
+ multi_select="true"
short_names="false"
follows="all"
layout="topleft">
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index d4f1047ba1..38a85d0365 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -312,17 +312,6 @@ background_visible="false"
left="1"
top="0"
width="90" />
-
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 407b5e0805..ff1d782b1e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -704,6 +704,7 @@ things in this group. There's a broad variety of Abilities.
right="-1"
height="69"
draw_stripes="true"
+ multi_select="true"
follows="all"
layout="topleft" />
@@ -882,6 +883,7 @@ things in this group. There's a broad variety of Abilities.
top_pad="0"
right="-1"
height="46"
+ multi_select="true"
follows="all"
layout="topleft" />
Viewer [VERSION]
+ V[VERSION]
FS
@@ -374,10 +375,10 @@ Please try logging in again in a minute.
Loading...
-
+
+ locked
protected
-
(nobody)
@@ -804,6 +805,8 @@ If you continue to receive this message, please contact Second Life support for
out of stock
updating...
+ Fee is based on your subscription level. Higher levels are charged lower fees. [https://secondlife.com/my/account/membership.php? Learn more]
+
Open landmarks
Unconstrained
@@ -2417,6 +2420,12 @@ If you continue to experience problems, please check your network and firewall s
Accounting
Notices
Chat
+
+
+ Base
+ Premium
+ Premium Plus
+ Internal
Delete selected items?
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index 62082d0276..061a2bdeef 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -83,39 +83,6 @@ Artistas y Diseñadores de la interfaz:
-
-3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
-APR Copyright (C) 2011 The Apache Software Foundation
-Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
-cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FMOD Sound System, Copyright (C) Firelight Technologies Pty, Ltd., 1994-2013
-FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, y Werner Lemberg.
-GL Copyright (C) 1999-2004 Brian Paul.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2002, Xiphophorus
-OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
-PCRE Copyright (c) 1997-2012 University of Cambridge
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2012 Jean-loup Gailly y Mark Adler.
-Algunos iconos por Joseph Wain / glyphish.com
-
-Second Life Viewer usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (y sus licenciadores). Todos los derechos reservados. Ver www.havok.com para más detalles.
-
-Este software contiene código fuente proporcionado por NVIDIA Corporation.
-
-Todos los derechos reservados. Ver licenses.txt para más detalles.
-
-Codificación de audio del chat de voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
-
diff --git a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
deleted file mode 100644
index 707aa7de98..0000000000
--- a/indra/newview/skins/default/xui/es/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- 1 carpeta
- [NUM] carpetas
- Enviando carpetas...
- Inicializando...
-
-
-
-
- Cargando...
-
-
-
-
-
-
- Arrastra items aquí para crear carpetas
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
index 1deb2f9e82..5255af8d0a 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
@@ -1,12 +1,12 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 2e9b0c228f..3534167353 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -40,9 +40,9 @@
-
-
-
+
+
+
diff --git a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
deleted file mode 100644
index 1f2df34138..0000000000
--- a/indra/newview/skins/default/xui/es/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/es/panel_preferences_crashreports.xml
index ac3ebbd1a0..f8eb919760 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_crashreports.xml
@@ -1,14 +1,6 @@
-
- Tipo de volcado:
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
index 217f7bc044..28768870b2 100644
--- a/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_snapshot_inventory.xml
@@ -1,7 +1,7 @@
- Guardar una imagen en el inventario cuesta [UPLOAD_COST] L$. Para guardar una imagen como textura, selecciona uno de los formatos cuadrados.
+ Para guardar una imagen como textura, selecciona uno de los formatos cuadrados.
diff --git a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
deleted file mode 100644
index c3b3a3a017..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
- 1 dossier
- [NUM] dossiers
- Envoi des dossiers...
- Initialisation...
-
-
-
- Chargement...
-
-
-
-
- Glissez les objets ici pour créer vos dossiers
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
index bca15ff079..903769616a 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
@@ -1,11 +1,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 12c50464da..d37b4954e4 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -168,7 +168,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml
index 868fa3f68a..ecc11fcd95 100644
--- a/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml
+++ b/indra/newview/skins/default/xui/fr/panel_experience_list_editor.xml
@@ -1,14 +1,14 @@
-
-
- Chargement...
- Exp. autorisées :
- Exp. bloquées :
- Exp. de premier plan :
- (vide)
- Liste des expériences
-
-
-
-
-
-
+
+
+ Chargement...
+ Exp. autorisées :
+ Exp. bloquées :
+ Exp. de premier plan :
+ (vide)
+ Liste des expériences
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_fs_profile_web.xml b/indra/newview/skins/default/xui/fr/panel_fs_profile_web.xml
index 7d7e9ec909..770cd298ac 100644
--- a/indra/newview/skins/default/xui/fr/panel_fs_profile_web.xml
+++ b/indra/newview/skins/default/xui/fr/panel_fs_profile_web.xml
@@ -1,12 +1,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
deleted file mode 100644
index 8a5dfb8ef2..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml b/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml
index 80e1a25c85..6c5a1ccc17 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_UI.xml
@@ -67,7 +67,7 @@
-
+
Utiliser des fenêtres distinctes pour :
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index a6f7159d8b..37850aad09 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -40,7 +40,7 @@
-
+
Notification de nouveau message pour :
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/fr/panel_preferences_crashreports.xml
index 0606afe6f8..e5421a9d07 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_crashreports.xml
@@ -1,14 +1,6 @@
-
- Type de rapport :
-
-
-
-
-
-
(contient le nom d'utilisateur Second Life)
diff --git a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
index a552a2bd77..bd902d0942 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
@@ -1,29 +1,29 @@
-
-
- Le terrain dans cette région peut être revendu.
- Le terrain dans cette région ne peut être revendu.
- Le terrain dans cette région peut être fusionné ou subdivisé.
- Le terrain dans cette région ne peut être fusionné ou subdivisé.
- Domaine
- Nom :
- Continent
- Propriétaire :
- (Aucun)
- Règlement :
- Dernière modification le Wed Dec 31 16:00:00 1969
- Il n'y a aucun règlement rédigé pour ce domaine.
-
- Les modifications apportées au règlement seront affichées sur tous les terrains de ce domaine.
- Faire glisser une note pour modifier le règlement de ce domaine.
- Région
- Nom :
- Erica
- Type :
- Continental / Résidentiel
- Classification :
- Adulte
- Revente :
- Le terrain dans cette région ne peut être revendu.
- Subdivision :
- Le terrain dans cette région ne peut être fusionné/subdivisé.
-
+
+
+ Le terrain dans cette région peut être revendu.
+ Le terrain dans cette région ne peut être revendu.
+ Le terrain dans cette région peut être fusionné ou subdivisé.
+ Le terrain dans cette région ne peut être fusionné ou subdivisé.
+ Domaine
+ Nom :
+ Continent
+ Propriétaire :
+ (Aucun)
+ Règlement :
+ Dernière modification le Wed Dec 31 16:00:00 1969
+ Il n'y a aucun règlement rédigé pour ce domaine.
+
+ Les modifications apportées au règlement seront affichées sur tous les terrains de ce domaine.
+ Faire glisser une note pour modifier le règlement de ce domaine.
+ Région
+ Nom :
+ Erica
+ Type :
+ Continental / Résidentiel
+ Classification :
+ Adulte
+ Revente :
+ Le terrain dans cette région ne peut être revendu.
+ Subdivision :
+ Le terrain dans cette région ne peut être fusionné/subdivisé.
+
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index 0729c6426e..1e3fd64637 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -1,25 +1,25 @@
-
-
- Région :
- inconnue
-
-
-
-
- Renvoi d'objet
- Propriétaire :
- (aucun)
-
- Options :
-
-
-
-
-
-
-
- Secondes :
-
-
-
-
+
+
+ Région :
+ inconnue
+
+
+
+
+ Renvoi d'objet
+ Propriétaire :
+ (aucun)
+
+ Options :
+
+
+
+
+
+
+
+ Secondes :
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_region_environment.xml b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
index ab7261d48e..9609620011 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_environment.xml
@@ -1,21 +1,21 @@
-
-
- Sélectionnez les paramétrages aquatiques et le cycle temporel que vous souhaiteriez que vos visiteurs voient.
-
-
-
-
-
- Paramétrage aquatique
-
- Cycle Jour / Nuit
-
-
-
-
-
-
-
-
-
-
+
+
+ Sélectionnez les paramétrages aquatiques et le cycle temporel que vous souhaiteriez que vos visiteurs voient.
+
+
+
+
+
+ Paramétrage aquatique
+
+ Cycle Jour / Nuit
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index abd8f5827e..1d4041ad6b 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -1,34 +1,34 @@
-
-
- Région :
- inconnue
- ID du domaine :
- Version :
- inconnue
- Pos. dans la Grille :
- Type :
- inconnue
-
-
-
-
-
-
-
-
-
-
-
- Classification :
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ Région :
+ inconnue
+ ID du domaine :
+ Version :
+ inconnue
+ Pos. dans la Grille :
+ Type :
+ inconnue
+
+
+
+
+
+
+
+
+
+
+
+ Classification :
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
index 889800e3e3..0103ec2bfb 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_terrain.xml
@@ -1,32 +1,32 @@
-
-
- Région :
- inconnue
-
-
-
- Textures du terrain (Requis : fichiers .tga de taille 512x512 ou 1024x1024, 24 bits)
- 1 (Basse altitude)
- 2
- 3
- 4 (Haute altitude)
- Variation des textures
- Ces valeurs représentent l'altitude de changement des textures ci-dessus.
- Mesurées en mètres, la valeur Basse est l'altitude maximum de la première texture, et la valeur Haute est l'altitude minimum de la dernière texture.
- Nord-Ouest
- Nord-Est
-
-
-
-
- Sud-Ouest
- Sud-Est
-
-
-
-
-
-
-
-
-
+
+
+ Région :
+ inconnue
+
+
+
+ Textures du terrain (Requis : fichiers .tga de taille 512x512 ou 1024x1024, 24 bits)
+ 1 (Basse altitude)
+ 2
+ 3
+ 4 (Haute altitude)
+ Variation des textures
+ Ces valeurs représentent l'altitude de changement des textures ci-dessus.
+ Mesurées en mètres, la valeur Basse est l'altitude maximum de la première texture, et la valeur Haute est l'altitude minimum de la dernière texture.
+ Nord-Ouest
+ Nord-Est
+
+
+
+
+ Sud-Ouest
+ Sud-Est
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
index 4e6ee21c54..ebfcf6adcf 100644
--- a/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_snapshot_inventory.xml
@@ -12,7 +12,7 @@
- Enregistrer une image dans votre inventaire coute [UPLOAD_COST] L$. Pour enregistrer votre image en tant que texture, sélectionnez un des formats listés.
+ Pour enregistrer votre image en tant que texture, sélectionnez un des formats listés.
diff --git a/indra/newview/skins/default/xui/fr/widgets/bodyparts_list_item.xml b/indra/newview/skins/default/xui/fr/widgets/bodyparts_list_item.xml
index 21d2fd5b52..78cc5b9aa9 100644
--- a/indra/newview/skins/default/xui/fr/widgets/bodyparts_list_item.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/bodyparts_list_item.xml
@@ -1,5 +1,5 @@
-
-
+
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/clothing_list_item.xml b/indra/newview/skins/default/xui/fr/widgets/clothing_list_item.xml
index e7eec1e84c..96b3158a43 100644
--- a/indra/newview/skins/default/xui/fr/widgets/clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/clothing_list_item.xml
@@ -1,5 +1,5 @@
-
-
+
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/fr/widgets/deletable_wearable_list_item.xml
index 6161715f80..d0cc821aec 100644
--- a/indra/newview/skins/default/xui/fr/widgets/deletable_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/deletable_wearable_list_item.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/fr/widgets/dummy_clothing_list_item.xml
index c42f87bc92..485313f9b7 100644
--- a/indra/newview/skins/default/xui/fr/widgets/dummy_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/dummy_clothing_list_item.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_folder.xml
index 42260f74bc..1e40fda2d1 100644
--- a/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_folder.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_folder.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_item.xml
index 7555d63c9b..3b2efc27c5 100644
--- a/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_item.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/inbox_folder_view_item.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/panel_camera_item.xml b/indra/newview/skins/default/xui/fr/widgets/panel_camera_item.xml
index df8b31778d..92516453c6 100644
--- a/indra/newview/skins/default/xui/fr/widgets/panel_camera_item.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/panel_camera_item.xml
@@ -1,6 +1,6 @@
- Texte
+ Texte
diff --git a/indra/newview/skins/default/xui/fr/widgets/person_view.xml b/indra/newview/skins/default/xui/fr/widgets/person_view.xml
index 6188bdf31b..ef817b50c4 100644
--- a/indra/newview/skins/default/xui/fr/widgets/person_view.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/person_view.xml
@@ -1,10 +1,10 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/widgets/texture_picker.xml b/indra/newview/skins/default/xui/fr/widgets/texture_picker.xml
index 018fdc0b12..8c1b14d54e 100644
--- a/indra/newview/skins/default/xui/fr/widgets/texture_picker.xml
+++ b/indra/newview/skins/default/xui/fr/widgets/texture_picker.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index e2c403e9a2..9ff9741d40 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -64,38 +64,6 @@ con contributi open source da:
-
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
-APR Copyright (C) 2011 The Apache Software Foundation
-Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
-cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FMOD Sound System Copyright (C) Firelight Technologies Pty, Ltd., 1994-2013
-FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
-GL Copyright (C) 1999-2004 Brian Paul.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2002, Xiphophorus
-OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
-PCRE Copyright (c) 1997-2012 University of Cambridge
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
-
-Il Viewer Second Life utilizza Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e licenziatari). Tutti i diritti riservati. Per informazioni dettagliate, vedere www.havok.com.
-
-Questo software contiene codice sorgente fornito da NVIDIA Corporation.
-
-Tutti i diritti riservati. Per informazioni dettagliate, vedere licenses.txt.
-
-Codifica audio chat vocale: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
-
diff --git a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
deleted file mode 100644
index 6b5ec6425b..0000000000
--- a/indra/newview/skins/default/xui/it/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
- [NUM] cartelle
-
-
- Invio cartelle...
-
-
- Inizializzazione...
-
-
-
-
-
- Caricamento in corso...
-
-
-
-
-
-
- Trascina elementi qui per creare cartelle
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/it/floater_phototools.xml b/indra/newview/skins/default/xui/it/floater_phototools.xml
index 1a43128f14..db02cc3384 100644
--- a/indra/newview/skins/default/xui/it/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/it/floater_phototools.xml
@@ -99,15 +99,6 @@
-
- Ombre avatar
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
index ab318c2345..bad724f295 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
@@ -1,11 +1,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 87a5b27ef0..7db28b9e73 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -214,11 +214,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
deleted file mode 100644
index af5e05336e..0000000000
--- a/indra/newview/skins/default/xui/it/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_UI.xml b/indra/newview/skins/default/xui/it/panel_preferences_UI.xml
index 1d616c6df6..594634c023 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_UI.xml
@@ -99,7 +99,7 @@
-
+
Usa finestre singole per:
@@ -215,7 +215,7 @@ linee della chat:
pixel (richiesto riavvio)
-[VIEWER_GENERATION]-V3 Default 0. V1 Default 2.
+[VIEWER_GENERATION]-Default 0. V1 Default 2.
Distanza massima
@@ -223,7 +223,7 @@ cartelle inventario:
pixel (richiesto riavvio)
-[VIEWER_GENERATION]-V3 Default 20. V1 Default 18.
+[VIEWER_GENERATION]-Default 20. V1 Default 18.
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index 03ef901ab2..7413757652 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -51,7 +51,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/it/panel_preferences_crashreports.xml
index 862597f584..0017d01692 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_crashreports.xml
@@ -1,14 +1,6 @@
-
- Tipo minidump:
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
index 788f5a8387..bb6f059cce 100644
--- a/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_snapshot_inventory.xml
@@ -14,7 +14,7 @@
- Salvare in inventario costa L$[UPLOAD_COST]. Per salvare come texture, selezionare un formato quadrato.
+ Per salvare come texture, selezionare un formato quadrato.
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index cf5e97bd8d..0e0b04d33f 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -11,34 +11,6 @@
Dummy Name は実行時間に置き換え
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
-APR Copyright (C) 2011 The Apache Software Foundation
-Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
-cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
-GL Copyright (C) 1999-2004 Brian Paul.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2002, Xiphophorus
-OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
-PCRE Copyright (c) 1997-2012 University of Cambridge
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
-
-Second Life ビューワでは Havok (TM) Physics が使用されています。(c)Copyright 1999-2010 Havok.com Inc. (and its Licensors).無断複写・複製・転載を禁じます。詳細については www.havok.com をご参照ください。
-
-このソフトウェアには、NVIDIA Corporation によるソースコードが含まれます。
-
-無断複写・複製・転載を禁じます。詳細については licenses.txt をご参照ください。
-
-ボイスチャットのオーディオコーディング:Polycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)
diff --git a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
deleted file mode 100644
index b022515174..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
- 1 個のフォルダ
-
-
- [NUM] 個のフォルダ
-
-
- フォルダを送信中...
-
-
- 初期化中...
-
-
-
-
-
-
-
- ロード中...
-
-
-
-
-
-
- アイテムをここにドラッグしてフォルダを作成
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ja/floater_phototools.xml b/indra/newview/skins/default/xui/ja/floater_phototools.xml
index 14c37481eb..20c32dd0bc 100644
--- a/indra/newview/skins/default/xui/ja/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_phototools.xml
@@ -127,16 +127,7 @@
-
- アバターの影
-
-
-
-
-
-
-
-
+
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
index e81efa11d4..11a6bc851f 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
@@ -1,12 +1,12 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 1bb02aea9f..009c60fd6d 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -53,17 +53,6 @@
-
都
@@ -105,42 +94,6 @@
-
@@ -294,11 +247,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
deleted file mode 100644
index 0b9af8f4e7..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml b/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml
index d83992915c..bfa5587469 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_UI.xml
@@ -123,7 +123,7 @@
-
+
次の項目に独立したウィンドウを使用:
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/ja/panel_preferences_crashreports.xml
index 0b9e52e9ed..f061c7f280 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_crashreports.xml
@@ -1,16 +1,6 @@
-
-
- ミニダンプのタイプ:
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
index 92a5a976ec..f1e238f3b1 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
@@ -19,7 +19,7 @@
- 画像をインベントリに保存するには L$[UPLOAD_COST] の費用がかかります。画像をテクスチャとして保存するには正方形の形式から 1 つを選択してください。
+ 画像をテクスチャとして保存するには正方形の形式から 1 つを選択してください。
diff --git a/indra/newview/skins/default/xui/pl/floater_NACL_explore_sounds.xml b/indra/newview/skins/default/xui/pl/floater_NACL_explore_sounds.xml
index a4c2fb4210..f5ee7a3124 100644
--- a/indra/newview/skins/default/xui/pl/floater_NACL_explore_sounds.xml
+++ b/indra/newview/skins/default/xui/pl/floater_NACL_explore_sounds.xml
@@ -24,6 +24,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index 16c65b6163..c92019b84b 100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -374,11 +374,11 @@ teksturę:
Obiekty używające tej tekstury będą wyświetlały film lub stronę internetową po naciśnięciu przycisku odtwarzania. Wybierz miniaturę, jeśli chcesz zmienić teksturę.
-
+
Rozmiar:
-
-
+
+
pikseli
diff --git a/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml
index ff2fee6f2f..c56f103d21 100644
--- a/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml
@@ -6,6 +6,6 @@
Opis:
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml
index 3fc2e6cd90..5c385aa1bb 100644
--- a/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml
@@ -181,6 +181,6 @@ Maksymalna długość pliku animacji wynosi [MAX_LENGTH] sekund.
Nie można wczytać pliku animacji. Doradzamy eksport plików BVH z Poser 4.
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_export_collada.xml b/indra/newview/skins/default/xui/pl/floater_export_collada.xml
index eff2bd144a..caacd9bfee 100644
--- a/indra/newview/skins/default/xui/pl/floater_export_collada.xml
+++ b/indra/newview/skins/default/xui/pl/floater_export_collada.xml
@@ -27,6 +27,7 @@
+
Format tekstur:
diff --git a/indra/newview/skins/default/xui/pl/floater_forget_user.xml b/indra/newview/skins/default/xui/pl/floater_forget_user.xml
index 03930e8835..149342ef6f 100644
--- a/indra/newview/skins/default/xui/pl/floater_forget_user.xml
+++ b/indra/newview/skins/default/xui/pl/floater_forget_user.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_contact_set_configuration.xml b/indra/newview/skins/default/xui/pl/floater_fs_contact_set_configuration.xml
index f948d6b646..ad16834b7d 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_contact_set_configuration.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_contact_set_configuration.xml
@@ -21,9 +21,9 @@
Powiadomienia online:
-
+
-
+
Własne kolory:
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml b/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
index 432520fb5a..70887395b0 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
@@ -42,6 +42,9 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_import.xml b/indra/newview/skins/default/xui/pl/floater_fs_import.xml
index cb30138344..5a1d0f8dca 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_import.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_import.xml
@@ -32,7 +32,7 @@
Przesyłanie zasobu danych [ASSET] z [ASSETTOTAL].
- Łączny koszt ładowanych: [COST] L$.
+ Łączny koszt przesyłanych: [COST] L$.
obiekt
@@ -57,7 +57,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml
index 6788cbb9a3..244735f525 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml
@@ -1,21 +1,24 @@
-
+
- Na czat lokalny
+ Na czat w pobliżu
-
+
-
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_protectedfolders.xml b/indra/newview/skins/default/xui/pl/floater_fs_protectedfolders.xml
new file mode 100644
index 0000000000..58146356f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_fs_protectedfolders.xml
@@ -0,0 +1,15 @@
+
+
+
+ (nieznany folder)
+
+
+
+
+
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_image_preview.xml b/indra/newview/skins/default/xui/pl/floater_image_preview.xml
index 597c310c56..425ec60a1a 100644
--- a/indra/newview/skins/default/xui/pl/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_image_preview.xml
@@ -29,5 +29,5 @@ Spróbuj zapisać obraz jako 24 bitową Targa (.tga).
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_import_collada.xml b/indra/newview/skins/default/xui/pl/floater_import_collada.xml
index 124ae67a81..72a260aeed 100644
--- a/indra/newview/skins/default/xui/pl/floater_import_collada.xml
+++ b/indra/newview/skins/default/xui/pl/floater_import_collada.xml
@@ -11,6 +11,6 @@
Bezczynny
- Ładowanie [NAME]
+ Przesyłanie [NAME]
Tworzenie obiektu [NAME]
diff --git a/indra/newview/skins/default/xui/pl/floater_model_preview.xml b/indra/newview/skins/default/xui/pl/floater_model_preview.xml
index a900e47e48..0d1275206c 100644
--- a/indra/newview/skins/default/xui/pl/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_model_preview.xml
@@ -1,6 +1,6 @@
-
- ładowanie meszy z fizyką
+
+ przesyłanie meszy z fizyką
Błąd: Problem z parsowaniem Dae, zobacz log.
Uwaga: Macierz powiązań kształtu nie jest w standardowej orientacji X-forward.
Błąd: Materiał nie jest podzbiorem modelu referencyjnego.
@@ -151,7 +151,7 @@
-
+
Skala (1=bez skali):
@@ -187,7 +187,7 @@ Rozważ użycie innego punktu doczepienia, bliżej do pozycji obiektu na ciele.
-
+
Opłata: [FEE]L$
@@ -259,7 +259,7 @@ Analiza:
UWAGA:
- Nie masz uprawnień do ładowania modeli meszowych. [[VURL] Zobacz jak] uzyskać certyfikat.
+ Nie masz uprawnień do przesyłania modeli meszowych. [[VURL] Zobacz jak] uzyskać certyfikat.
diff --git a/indra/newview/skins/default/xui/pl/floater_people.xml b/indra/newview/skins/default/xui/pl/floater_people.xml
index 5079daa413..1512db8e75 100644
--- a/indra/newview/skins/default/xui/pl/floater_people.xml
+++ b/indra/newview/skins/default/xui/pl/floater_people.xml
@@ -2,5 +2,6 @@
+
diff --git a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
index aa635c4677..1e4549c26d 100755
--- a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_perms_default.xml b/indra/newview/skins/default/xui/pl/floater_perms_default.xml
index 7310f8ef19..da00e13836 100644
--- a/indra/newview/skins/default/xui/pl/floater_perms_default.xml
+++ b/indra/newview/skins/default/xui/pl/floater_perms_default.xml
@@ -22,7 +22,7 @@
Obiekty
-
+
Z dysku
diff --git a/indra/newview/skins/default/xui/pl/floater_phototools.xml b/indra/newview/skins/default/xui/pl/floater_phototools.xml
index 23b40acb23..27383c7298 100644
--- a/indra/newview/skins/default/xui/pl/floater_phototools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_phototools.xml
@@ -99,15 +99,6 @@
-
- Cienie postaci:
-
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/pl/floater_phototools_camera.xml b/indra/newview/skins/default/xui/pl/floater_phototools_camera.xml
index 253e926b4f..e67fae44c9 100644
--- a/indra/newview/skins/default/xui/pl/floater_phototools_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_phototools_camera.xml
@@ -65,7 +65,7 @@
-
+
Kąt widzenia
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
index bb818cd874..5499c68640 100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
@@ -10,7 +10,7 @@
[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt], [hour24, datetime, slt]:[min, datetime, slt]:[second, datetime, slt] [timezone, datetime, slt]
- Załadował/a [UPLOADER]: [DATE_TIME]
+ Przesłał/a [UPLOADER]: [DATE_TIME]
Opis:
diff --git a/indra/newview/skins/default/xui/pl/floater_snapshot.xml b/indra/newview/skins/default/xui/pl/floater_snapshot.xml
index 0b31abafdc..4874fd86e1 100644
--- a/indra/newview/skins/default/xui/pl/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pl/floater_snapshot.xml
@@ -16,7 +16,7 @@
Zapisywanie na komputer
- Obraz załadowany
+ Obraz przesłany
Mail wysłany!
diff --git a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
index 7db92e6b17..69d468a7b6 100644
--- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
@@ -7,5 +7,5 @@
Opis:
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
index 566210558f..414b6ee150 100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -28,7 +28,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
index d18e0a3668..7c72a33b80 100644
--- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
@@ -20,6 +20,8 @@
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/pl/menu_conversation_log_view.xml
index 9dca0aa052..d179164e69 100644
--- a/indra/newview/skins/default/xui/pl/menu_conversation_log_view.xml
+++ b/indra/newview/skins/default/xui/pl/menu_conversation_log_view.xml
@@ -3,5 +3,5 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_fs_area_search.xml b/indra/newview/skins/default/xui/pl/menu_fs_area_search.xml
index 3dcdc882a9..0d972e480d 100644
--- a/indra/newview/skins/default/xui/pl/menu_fs_area_search.xml
+++ b/indra/newview/skins/default/xui/pl/menu_fs_area_search.xml
@@ -11,4 +11,7 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_fs_radar_options.xml b/indra/newview/skins/default/xui/pl/menu_fs_radar_options.xml
index 98056ebba9..cb28cb5f9d 100644
--- a/indra/newview/skins/default/xui/pl/menu_fs_radar_options.xml
+++ b/indra/newview/skins/default/xui/pl/menu_fs_radar_options.xml
@@ -21,10 +21,10 @@
-
+
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/pl/menu_gallery_outfit_tab.xml
index 41b80a5343..56ee2f02d9 100644
--- a/indra/newview/skins/default/xui/pl/menu_gallery_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/pl/menu_gallery_outfit_tab.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
index 794e1cfd96..14975e0d6e 100644
--- a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml
index 1cf2f9db4f..a5678c1334 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml
@@ -75,6 +75,8 @@
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
index 8196dc8b92..e5f3c2710a 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
@@ -1,11 +1,11 @@
-
-
-
-
+
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
index 07e67f9782..eb270f2c2c 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
@@ -1,6 +1,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml
index 3d8c523cca..b06127461c 100644
--- a/indra/newview/skins/default/xui/pl/menu_login.xml
+++ b/indra/newview/skins/default/xui/pl/menu_login.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
index 834631e85b..af1a26d13f 100644
--- a/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_outfit_gear.xml
@@ -3,7 +3,7 @@
-
+
@@ -32,4 +32,5 @@
+
diff --git a/indra/newview/skins/default/xui/pl/menu_participant_view.xml b/indra/newview/skins/default/xui/pl/menu_participant_view.xml
index 5520ce75b1..cd08807e79 100644
--- a/indra/newview/skins/default/xui/pl/menu_participant_view.xml
+++ b/indra/newview/skins/default/xui/pl/menu_participant_view.xml
@@ -8,6 +8,6 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/menu_pie_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_pie_attachment_self.xml
index 29e59d33a8..4db2244dfb 100644
--- a/indra/newview/skins/default/xui/pl/menu_pie_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_pie_attachment_self.xml
@@ -14,6 +14,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 7c050883d6..9cc5dc2e44 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -6,6 +6,7 @@
+
@@ -62,7 +63,7 @@
-
+
@@ -211,12 +212,12 @@
-
-
-
-
+
+
+
+
-
+
@@ -251,7 +252,7 @@
-->
-
+
@@ -385,7 +386,7 @@
-
+
@@ -490,7 +491,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 606d7bba22..0fe36a4c8d 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -165,7 +165,7 @@ Inicjalizacja Marketplace nieudana z powodu błędu sieci lub systemu. Spróbuj
Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut.
- W trakcie ładowania obrazu aukcji pojawił się problem z następującego powodu: [REASON].
+ W trakcie przesyłania obrazu aukcji pojawił się problem z następującego powodu: [REASON].
Nie można przeglądać zawartości więcej niż jednego obiektu naraz.
@@ -202,6 +202,9 @@ Czy chcesz dać prawa modyfikacji wybranym osobom?
Czy chcesz odebrać prawa modyfikacji wybranym Rezydentom?
+
+ Nazwa grupy musi zawierać od [MIN_LEN] do [MAX_LEN] znaków.
+
Założenie grupy nie jest możliwe.
[MESSAGE]
@@ -430,14 +433,17 @@ W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z narzędzia
Potrzebujesz [COST]L$ aby zapisać zdjęcie do swojej Szafy. Możesz zamiast tego kupić L$ lub zapisać zdjęcie na swoim komputerze.
+
+ Potrzebujesz [COST]L$ aby przesłać ten element.
+
Potrzebujesz [COST]L$ aby zapisać teksturę do swojej Szafy. Możesz zamiast tego kupić L$ lub zapisać teksturę na swoim komputerze.
- W trakcie ładowania zdjęcia pojawił się problem z następującego powodu: [REASON]
+ W trakcie przesyłania zdjęcia pojawił się problem z następującego powodu: [REASON]
- W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
+ W trakcie przesyłania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
Musisz zaakceptować Regulamin (Terms and Conditions), Politykę Prywatności (Privacy Policy) i Warunki korzystania z Usług (Terms of Service) by kontynuować logowanie się do [CURRENT_GRID].
@@ -469,10 +475,10 @@ Potrzebujesz konta aby się zalogować do [CURRENT_GRID]. Czy chcesz utworzyć j
Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika, a następnie ponownie się zalogować.
- '[GRID]' nie jest prawidłowym identyfikatorem siatki.
+ '[GRID]' nie jest prawidłowym identyfikatorem świata.
- Twój punkt startowy nie znajduje się na prawidłowej siatce.
+ Twój punkt startowy nie znajduje się w prawidłowym świecie.
Usunąć reklamę '[NAME]'?
@@ -757,7 +763,7 @@ Upewnij się, że nazwa pliku ma poprawne rozszerzenie.
Oczekiwane: [VALIDS]
- Nie można otworzyć załadowanego pliku dźwiękowego:
+ Nie można otworzyć przesłanego pliku dźwiękowego:
[FILE]
@@ -820,10 +826,10 @@ To może się zdarzyć, kiedy zmieniasz ustawienia sieci. Zrestartowanie Przegl
Nie można utworzyć pliku wyjściowego: [FILE]
- [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji w formacie BVH.
+ [APP_NAME] obecnie nie wspomaga przesyłania grupowego plików animacji w formacie BVH.
- Ładowanie pliku [FILE] nie powiodło się z powodu: [REASON]
+ Przesyłanie pliku [FILE] nie powiodło się z powodu: [REASON]
Spróbuj jeszcze raz później.
@@ -1379,6 +1385,13 @@ Jeżeli używasz [CURRENT_GRID] po raz pierwszy to musisz stworzyć konto żeby
Czy chcesz przejść na stronę [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto?
+
+ Zapamiętany użytkownik może zostać zapomniany w Awatar > Ustawienia > Zaawansowane > Zapamiętani użytkownicy.
+
+
+ Zapomnienie zalogowanego użytkownika wymaga jego wylogowania.
+
+
Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
@@ -1396,6 +1409,10 @@ Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kil
+
+ Usuwane Dane Lokalne są współużytkowane przez wiele światów, czy na pewno chcesz je usunąć?
+
+
Twoja postać pojawi się za moment.
@@ -1405,7 +1422,7 @@ Wybierz awatara właściwej płci. Ten wybór będzie można później zmienić.
- Nie można teleportować do [SLURL], ponieważ jest na innej siatce ([GRID]) niż obecna siatka ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie.
+ Nie można teleportować do [SLURL], ponieważ jest w innym świecie ([GRID]) niż obecny ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie.
Połączenie z serwerem nie mogło zostać nawiązane.
@@ -1486,7 +1503,7 @@ Tekstura terenu [TEXTURE_NUM] jest za duża - [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
Zamień teksturę [TEXTURE_NUM] na 24-bitową teksturę o wymiarze 1024x1024 lub mniejszą i ponownie kliknij na "Zastosuj".
- Ładowanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia.
+ Przesyłanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia.
Na pewno chcesz zapisać obecne ukształtowanie terenu jako punkt odniesienia dla górnego i dolnego limitu terenu oraz jako domyślną wartość dla opcji 'Odtwórz'?
@@ -1643,7 +1660,7 @@ Chcesz ją opuścić?
Nie możesz opuścić tej grupy.
- Na pewno chcesz wyrzucić wszystkich Rezydentów z siatki?
+ Na pewno chcesz wyrzucić wszystkich Rezydentów ze świata?
@@ -1706,6 +1723,17 @@ Wszystkie nadchodzące zaproszenia do grup będą automatycznie odrzucane. Nie b
[NAME] oferuje Ci członkostwo w grupie.
+
+ Rezydenci z członkostwem podstawowym mogą dołączyć do [MAX_BASIC] grup.
+Członkostwo premium pozwala na [MAX_PREMIUM]. [https://secondlife.com/my/account/membership.php? Dowiedz się więcej]
+
+
+
+ Rezydenci z członkostwem podstawowym mogą dołączyć do [MAX_BASIC] grup.
+Członkostwo premium pozwala na [MAX_PREMIUM]. Członkostwo
+Premium Plus pozwala na [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php? Dowiedz się więcej]
+
+
Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
@@ -2347,13 +2375,13 @@ Chcesz wyłączyć Tryb Zajętości przed zakończeniem tej transakcji?
- Ta ziemia ma media:
+ Ta lokalizacja odtwarza media:
[URL]
Czy chcesz je odtworzyć?
@@ -2574,17 +2602,17 @@ Temat: [SUBJECT], Treść: [MESSAGE]
Nie możesz dodać siebie do listy wyjątków renderowania.
- Ładowanie obrazów z Internetu...
+ Przesyłanie obrazów...
(Zajmuje około 5 minut.)
- Ładowanie kosztowało [AMOUNT]L$.
+ Przesyłanie kosztowało [AMOUNT]L$.
- Ładowanie obrazu z Internetu zakończone pomyślnie.
+ Przesyłanie obrazu do sieci zakończone pomyślnie.
- Ładowanie zdjęcia zakończone pomyślnie.
+ Przesyłanie zdjęcia zakończone pomyślnie.
Plik terrain.raw ściągnięty.
@@ -3278,19 +3306,19 @@ Wybierz Zablokuj żeby wyciszyć tą osobę.
Przepraszamy. Limit rozmów został przekroczony w tym obszarze. Spróbuj w innym miejscu.
- [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy w czacie w pobliżu.
- [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy w czacie w pobliżu.
- [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy w czacie w pobliżu.
- [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy w czacie w pobliżu.
- Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj później. Przełączanie do rozmowy w czacie lokalnym.
+ Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj później. Przełączanie do rozmowy w czacie w pobliżu.
Subskrypcja jednego lub więcej Przekształceń Głosu wygasła.
@@ -3382,9 +3410,22 @@ Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
Twoja rozmowa głosowa została wyciszona przez moderatora.
+
+ Niestety nie udało nam się uzyskać informacji o korzyściach dla tej sesji. Nie powinno się to zdarzyć w normalnym środowisku produkcyjnym. Skontaktuj się z pomocą techniczną. Ta sesja nie będzie działać normalnie i zalecamy restart.
+
+
+ Spowoduje to przesłanie [COUNT] elementów o łącznym koszcie [COST]L$. Czy chcesz kontynuować przesyłanie?
+
+
+
+ Wybranych plików nie można przesłać zbiorczo.
+
+
+ Niektórych z wybranych plików nie można przesłać zbiorczo.
+
- Załadowanie tego na serwer będzie kosztować [PRICE]L$, chcesz kontynuować?
-
+ Przesłanie tego na serwer będzie kosztować [PRICE]L$, chcesz kontynuować?
+
Czy na pewno chcesz usunąć historię teleportacji?
@@ -3398,15 +3439,15 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
Zaznacz Rezydentów, z którymi chcesz się podzielić.
- Nie można załadować [LABEL]: [MESSAGE]
+ Nie można przesłać [LABEL]: [MESSAGE]
[DETAILS] Zobacz Firestorm.log, aby dowiedzieć się więcej.
- Nie można załadować [LABEL]: [MESSAGE]
+ Nie można przesłać [LABEL]: [MESSAGE]
Zobacz Firestorm.log, aby dowiedzieć się więcej.
- Wystąpił błąd podczas pobierania uprawnień ładowania meszy.
+ Wystąpił błąd podczas pobierania uprawnień przesyłania meszy.
Nie udało się uzyskać zdolności regionu: '[CAPABILITY]'.
@@ -3518,14 +3559,14 @@ Awatar '[NAME]' pozostał w pełni załadowany.
( [EXISTENCE] sekund w Second Life )
-Wstępnie przetworzone tekstury [RESOLUTION] dla '[BODYREGION]' zostały załadowane po [TIME] sekundach.
+Wstępnie przetworzone tekstury [RESOLUTION] dla '[BODYREGION]' zostały przesłane po [TIME] sekundach.
( [EXISTENCE] sekund w Second Life )
Wstępnie przetworzone tekstury [RESOLUTION] zostały lokalnie zaktualizowane dla '[BODYREGION]' po [TIME] sekundach.
- Nie można załadować tekstury.
+ Nie można przesłać tekstury.
[REASON]
@@ -3773,12 +3814,12 @@ W innym przypadku możesz poszukać na mapie miejsc oznaczonych jako "Infoh
- Na pewno chcesz usunąć [REMOVE_GRID] z listy siatek?
-
+ Na pewno chcesz usunąć [REMOVE_GRID] z listy światów?
+
- Nie możesz usunąć siatki [REMOVE_GRID], gdy jesteś z nią połączony/a.
-
+ Nie możesz usunąć świata [REMOVE_GRID], gdy jesteś z nim połączony/a.
+
'[PARCEL_NAME]', własność [OWNER_NAME], chce zmienić ustawienia otoczenia systemu Windlight.
@@ -3893,7 +3934,7 @@ Na pewno chcesz zresetować wszystkie ustawienia?
Ustawienia zostaną zresetowane po zrestartowaniu [APP_NAME].
- Nie można dodać [GRID] do listy siatek.
+ Nie można dodać [GRID] do listy światów.
[REASON] skontaktuj się ze wsparciem [GRID].
@@ -3906,7 +3947,7 @@ Na pewno chcesz zresetować wszystkie ustawienia?
Nie można znaleźć nowo utworzonego skryptu dla tego systemu cząsteczkowego.
- Nie można utworzyć tymczasowego pliku skryptu do załadowania.
+ Nie można utworzyć tymczasowego pliku skryptu do przesłania.
Skrypt cząsteczkowy został wstawiony w obiekt poprawnie.
@@ -4460,7 +4501,7 @@ Spróbuj ponownie za minutę.
Sprecyzuj proszę swoje parametry usuwania.
- Nie można załadować zasobu danych (assetu).
+ Nie można przesłać zasobu danych (assetu).
Nie można znaleźć użytkownika, aby teleportować do domu
@@ -4472,7 +4513,7 @@ Spróbuj ponownie za minutę.
żądanie ogólne nie powiodło się
- Nie można załadować pocztówki. Spróbuj ponownie później.
+ Nie można przesłać pocztówki. Spróbuj ponownie później.
Nie można pobrać szczegółów dołączonego przedmiotu dla ogłoszenia grupy.
@@ -4487,7 +4528,7 @@ Spróbuj ponownie za minutę.
Nie można zanalizować przedmiotu z ogłoszenia.
- Ładowanie podłoża na serwer nie powiodło się.
+ Przesyłanie podłoża na serwer nie powiodło się.
Plik podłoża zapisany.
@@ -4868,9 +4909,9 @@ Nie można tego cofnąć.
- Aby móc ładować zdjęcia na Flickr musisz autoryzować dostęp do konta dla [APP_NAME]. Jeśli kontynuujesz, to Twoja przeglądarka internetowa otworzy stronę Flickr, gdzie zostaniesz poproszony/a, aby autoryzować [APP_NAME]. Dostaniesz kod, który będzie trzeba wkleić w odpowiednie pole [APP_NAME].
+ Aby móc przesyłać zdjęcia na Flickr musisz autoryzować dostęp do konta dla [APP_NAME]. Jeśli kontynuujesz, to Twoja przeglądarka internetowa otworzy stronę Flickr, gdzie zostaniesz poproszony/a, aby autoryzować [APP_NAME]. Dostaniesz kod, który będzie trzeba wkleić w odpowiednie pole [APP_NAME].
-Czy chcesz autoryzować [APP_NAME] do ładowania zdjęć na Flickr?
+Czy chcesz autoryzować [APP_NAME] do przesyłania zdjęć na Flickr?
diff --git a/indra/newview/skins/default/xui/pl/panel_fs_login.xml b/indra/newview/skins/default/xui/pl/panel_fs_login.xml
index 96916a2e7a..e7e3e77a35 100644
--- a/indra/newview/skins/default/xui/pl/panel_fs_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_fs_login.xml
@@ -26,7 +26,7 @@
- Loguj na siatkę:
+ Loguj do świata:
diff --git a/indra/newview/skins/default/xui/pl/panel_fs_nui_login.xml b/indra/newview/skins/default/xui/pl/panel_fs_nui_login.xml
index 3cb966a798..2919451eef 100644
--- a/indra/newview/skins/default/xui/pl/panel_fs_nui_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_fs_nui_login.xml
@@ -29,8 +29,9 @@
- Siatka:
+ Świat:
+
diff --git a/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml
new file mode 100644
index 0000000000..a2e765b15c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_group_creation_sidetray.xml
@@ -0,0 +1,58 @@
+
+
+
+ (twoje członkostwo)
+
+
+
+ Nazwa grupy:
+
+
+
+
+
+
+
+
+
+
+ Statut grupy
+
+
+
+
+
+
+
+
+ - Wybierz klasyfikację wieku -
+
+
+
+
+
+
+
+
+ Opłata za utworzenie grupy zależy od Twojego poziomu członkostwa. [https://secondlife.com/my/account/membership.php Więcej]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Uwaga: Po 7 dniach grupa bez członków (poza jej twórcą) zostanie usunięta!
+
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/panel_group_general.xml b/indra/newview/skins/default/xui/pl/panel_group_general.xml
index 988bac59c3..030e66c822 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_general.xml
@@ -24,7 +24,7 @@ By otrzymać dodatkowe wskazówki przytrzymuj kursor ponad opcjami.
- Status grupy
+ Statut grupy
Wstęp wolny
@@ -54,8 +54,8 @@ By otrzymać dodatkowe wskazówki przytrzymuj kursor ponad opcjami.
-
-
+
+
- Wybierz klasyfikację wieku -
diff --git a/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml
index 762ac9443b..d97f3476a7 100644
--- a/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml
@@ -40,7 +40,6 @@
-
diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml
index 0dc6cf81e6..3034244602 100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -12,9 +12,9 @@
Dołącz
-
-
-
+
+
+
Pomoc z hasłem
diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
index 41eeaf0f26..eac94e4b35 100644
--- a/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_outfit_snapshot_inventory.xml b/indra/newview/skins/default/xui/pl/panel_outfit_snapshot_inventory.xml
index fe02739c3b..0d2fe341e2 100644
--- a/indra/newview/skins/default/xui/pl/panel_outfit_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/panel_outfit_snapshot_inventory.xml
@@ -4,7 +4,9 @@
Szafa
- Ładowanie zdjęcia do Twojej Szafy kosztuje [UPLOAD_COST] L$.
+ Przesłanie zdjęcia do Twojej Szafy kosztuje [UPLOAD_COST] L$.
+
+Opłata zależy od Twojego poziomu członkostwa. Wyższe poziomy to niższe opłaty.
diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml
index 8b61e654c0..d91c472d93 100644
--- a/indra/newview/skins/default/xui/pl/panel_people.xml
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -17,7 +17,7 @@ Chcesz spotkać ludzi? Spróbuj użyć [secondlife:///app/worldmap Mapy Świata]
-
+
Ten zestaw kontaktów jest pusty.
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml
index b39bfef47a..26ac17ee2d 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml
@@ -94,7 +94,7 @@
-
+
@@ -109,7 +109,7 @@
-
+
Używaj osobnych okien dla:
@@ -172,15 +172,15 @@
sekund
-
+
sekund
-
+
pikseli
-
+
sekund
@@ -200,7 +200,7 @@
pikseli
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
index b77f4eb5d5..52dd3c807b 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
@@ -4,7 +4,7 @@
Środkowy przycisk myszki
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
index 2f6a0ee227..95b7f69ae6 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
@@ -3,7 +3,7 @@
-
+
@@ -19,12 +19,12 @@
Powiadom, gdy znajomi się logują/wylogowywują:
-
-
+
+
-
+
@@ -36,7 +36,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_backup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_backup.xml
index dbb9b406bd..98c36caf32 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_backup.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_backup.xml
@@ -29,7 +29,7 @@
Pomijalne dialogi
- Siatki (gridy) użytkownika
+ Światy (gridy) użytkownika
Autokorekta
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 1b46e3e986..f90c395204 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -19,14 +19,14 @@
-
+
Pokazuj znaczniki czasu w:
-
+
@@ -51,13 +51,13 @@
-
+
Informuj o nowych wiadomościach:
-
+
Pokaż wiad. IM w:
@@ -118,7 +118,7 @@
-
+
Długość tymczasowego wyciszenia czatu grupowego:
@@ -135,14 +135,14 @@
-
+
-
-
+
+
-
+
@@ -151,9 +151,9 @@
Używaj skrótów klawiszowych:
-
-
-
+
+
+
@@ -170,8 +170,8 @@
-
-
+
+
Wyszarzanie tekstu wiadomości IM w tle okna logów czatu
@@ -179,9 +179,9 @@
-
+
-
+
@@ -230,7 +230,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_crashreports.xml b/indra/newview/skins/default/xui/pl/panel_preferences_crashreports.xml
index f9357e36b2..3c57043adb 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_crashreports.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_crashreports.xml
@@ -1,14 +1,6 @@
-
- Typ zrzutu:
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml b/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml
index 61fc491b62..fbec8ccbd0 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_firestorm.xml
@@ -230,7 +230,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_move.xml b/indra/newview/skins/default/xui/pl/panel_preferences_move.xml
index 85169111f0..27fe6c707e 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_move.xml
@@ -2,7 +2,7 @@
-
+
@@ -55,11 +55,11 @@
- Ruch przy zmianie regionu:
+ Przewiduj ruch przy zmianie regionu:
-
-
+
+
Jeśli unieruchamianie wbudowane w Most LSL jest aktywne...
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_opensim.xml b/indra/newview/skins/default/xui/pl/panel_preferences_opensim.xml
index b5658bf930..4d8c66f6ab 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_opensim.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_opensim.xml
@@ -1,15 +1,15 @@
-
+
- Dodaj siatkę
+ Dodaj świat
- Zarządzaj siatkami
+ Zarządzaj światami
@@ -19,10 +19,10 @@
- Nazwa siatki:
+ Nazwa świata:
- URI siatki:
+ URI świata:
Strona logowania:
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index da766db3ab..de26b74031 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -25,11 +25,11 @@
-
+
-
+
@@ -45,7 +45,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
index 0d3ef782dd..a93e587a06 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -91,7 +91,7 @@
-
+
@@ -371,7 +371,7 @@ Przytrzymaj kursor myszki ponad polem na UUID, aby zobaczyć jego domyślną war
-
+
Pisanie wiadomości:
diff --git a/indra/newview/skins/default/xui/pl/panel_region_experiences.xml b/indra/newview/skins/default/xui/pl/panel_region_experiences.xml
index 6bdb45410c..3ed3f68c65 100644
--- a/indra/newview/skins/default/xui/pl/panel_region_experiences.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_experiences.xml
@@ -13,7 +13,7 @@ Tylko przygody o zasięgu ziemi mogą zostać dozwolone.
Dozwolone przygody mogą być uruchamiane w tym Majątku.
-Tylko przygody o zasięgu siatki mogą zostać blokowane.
+Tylko przygody o zasięgu świata mogą zostać blokowane.
Zablokowane przygody nie mogą być uruchamiane w tym Majątku.
diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
index f086a52dcd..ff23f2e15c 100644
--- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
@@ -44,8 +44,8 @@
-
-
+
+
diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
index 544379eda4..9ac9b82c44 100644
--- a/indra/newview/skins/default/xui/pl/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed_preproc.xml b/indra/newview/skins/default/xui/pl/panel_script_ed_preproc.xml
index d4465c3402..db9232a736 100644
--- a/indra/newview/skins/default/xui/pl/panel_script_ed_preproc.xml
+++ b/indra/newview/skins/default/xui/pl/panel_script_ed_preproc.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pl/panel_snapshot_inventory.xml
index 4de2017e12..994bb4d5b8 100644
--- a/indra/newview/skins/default/xui/pl/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/panel_snapshot_inventory.xml
@@ -14,7 +14,7 @@
- Zapisanie zdjęcia do Szafy kosztuje [UPLOAD_COST]L$. Aby zapisać je jako teksturę wybierz jeden z kwadratowych formatów.
+ Aby zapisać je jako teksturę wybierz jeden z kwadratowych formatów.
diff --git a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml
index b7eb944baa..00a9cd6450 100644
--- a/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/pl/panel_snapshot_options.xml
@@ -17,4 +17,7 @@
+
+ Opłata zależy od Twojego poziomu członkostwa. Wyższe poziomy to niższe opłaty.
+
diff --git a/indra/newview/skins/default/xui/pl/panel_toolbar_view.xml b/indra/newview/skins/default/xui/pl/panel_toolbar_view.xml
index 804a55a230..8798f3e149 100644
--- a/indra/newview/skins/default/xui/pl/panel_toolbar_view.xml
+++ b/indra/newview/skins/default/xui/pl/panel_toolbar_view.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 9793d16ca8..f2037cf9bb 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -167,22 +167,22 @@ Wersja serwera głosu (Voice Server): [VOICE_VERSION]
Pobieranie ubrania...
- Serwer zwrócił nieważny lub zniekształcony certyfikat. Proszę skontaktuj się z administratorem siatki.
+ Serwer zwrócił nieważny lub zniekształcony certyfikat. Proszę skontaktuj się z administratorem świata.
- Nazwa hosta jest nieważna, proszę sprawdź SLURL lub nazwę hosta siatki.
+ Nazwa hosta jest nieważna, proszę sprawdź SLURL lub nazwę hosta świata.
- Termin ważności certyfikatu zwróconego przez siatkę minął. Proszę sprawdzić swój zegar systemowy lub skontaktować się z administratorem siatki.
+ Termin ważności certyfikatu zwróconego przez świat minął. Proszę sprawdzić swój zegar systemowy lub skontaktować się z administratorem świata.
- Certyfikat zwrócony przez serwer nie może być użyty dla SSL. Proszę skontaktuj się z administratorem siatki.
+ Certyfikat zwrócony przez serwer nie może być użyty dla SSL. Proszę skontaktuj się z administratorem świata.
- Zbyt wiele certyfikatów w łańcuchu certyfikatów serwera. Proszę skontaktować się z administratorem siatki.
+ Zbyt wiele certyfikatów w łańcuchu certyfikatów serwera. Proszę skontaktować się z administratorem świata.
- Podpis certyfikatu zwrócony przez siatkę nie mógł zostać zweryfikowany. Proszę skontaktować się z administratorem siatki.
+ Podpis certyfikatu zwrócony przez świat nie mógł zostać zweryfikowany. Proszę skontaktować się z administratorem świata.
Błąd sieci: Brak połączenia z siecią, sprawdź status swojego połączenia internetowego.
@@ -194,10 +194,10 @@ Wersja serwera głosu (Voice Server): [VOICE_VERSION]
Wyłącz
- Second Life: siatka główna (Agni)
+ Second Life: świat główny (Agni)
- Second Life Beta: siatka testowa (Aditi)
+ Second Life Beta: świat testowy (Aditi)
Przeglądarka używana przez Ciebie nie ma już dostępu do Second Life. Proszę przejść na poniższą stronę i pobrać nową:
@@ -725,6 +725,9 @@ Spróbuj zalogować się ponownie za minutę.
Wczytywanie...
+
+ zablokowany
+
chroniony
@@ -786,7 +789,7 @@ Spróbuj zalogować się ponownie za minutę.
Usługa niedostępna lub osiągnięto limit czasu.
- Błąd podczas ładowania. Odwiedź
+ Błąd podczas przesyłania. Odwiedź
http://www.firestormviewer.org/support aby uzyskać pomoc.
@@ -1132,10 +1135,10 @@ http://www.firestormviewer.org/support aby uzyskać pomoc.
(bez nazwy)
- Czat lokalny
+ Czat w pobliżu
- (Czat lokalny)
+ (Czat w pobliżu)
szepcze:
@@ -1696,6 +1699,9 @@ Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą technic
aktualizacja...
+
+ Opłata zależy od Twojego poziomu członkostwa. Wyższe poziomy to niższe opłaty. [https://secondlife.com/my/account/membership.php? Więcej]
+
Otwórz landmarki
@@ -2240,7 +2246,7 @@ Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą technic
Zapisywanie zakończone.
- Ładowanie nieudane: [REASON]
+ Przesyłanie nieudane: [REASON]
Skrypt (obiekt poza zasięgiem)
@@ -2710,7 +2716,7 @@ Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą technic
Anuluj
- Załadowanie [NAME] kosztuje [AMOUNT]L$
+ Przesyłanie [NAME] kosztuje [AMOUNT]L$
Cena zakupu tego wynosi [AMOUNT]L$
@@ -4705,7 +4711,7 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
aby dołączyć do grupy
- aby załadować
+ aby przesłać
publikacja reklamy
@@ -4714,7 +4720,7 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
Dajesz [AMOUNT]L$
- Ładowanie kosztuje [AMOUNT]L$
+ Przesyłanie kosztuje [AMOUNT]L$
To kosztuje [AMOUNT]L$
@@ -4738,7 +4744,7 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
Obecnie w SL
- Ładowanie...
+ Przesyłanie...
Raport o Nadużyciu
@@ -5000,6 +5006,12 @@ Jeśli problemy będą występowały nadal, proszę sprawdź sieć i ustawienia
Czat
+
+ Podstawowe
+
+
+ Wewnętrzne
+
Usunąć zaznaczone obiekty?
@@ -5264,7 +5276,7 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
Gesty Twojego awatara (CTRL+G)
- Pokaż obecny status świata (siatki)
+ Pokaż obecny status świata
Jak wykonywać zwyczajne rzeczy
@@ -5642,7 +5654,7 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
Zakres: Ziemia
- Zakres: Cała siatka
+ Zakres: Cały świat
Zezwalam
@@ -6279,7 +6291,7 @@ Twoja aktualna pozycja: [AVATAR_POS]
Tekstowy
- Ładowanie na serwer...
+ Przesyłanie na serwer...
[ASSET_NAME]
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index ddc7c0bc9d..01f4e527fd 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -64,38 +64,6 @@ com contribuições de código aberto de:
-
- 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
-APR Copyright (C) 2011 The Apache Software Foundation
-Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
-cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
-DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
-expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
-FMOD Sound System Copyright (C) Firelight Technologies Pty, Ltd., 1994-2013
-FreeType Copyright (C) 1996-2002, 2006 David Turner, Robert Wilhelm, and Werner Lemberg.
-GL Copyright (C) 1999-2004 Brian Paul.
-GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University e David Luebke, Brenden Schubert, University of Virginia.
-google-perftools Copyright (c) 2005, Google Inc.
-Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
-HACD Copyright (C) 2011, Khaled Mamou (kmamou@gmail.com)
-jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
-jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
-ogg/vorbis Copyright (C) 2002, Xiphophorus
-OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
-PCRE Copyright (c) 1997-2012 University of Cambridge
-SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
-SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
-xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
-zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
-
-O Visualizador do Second Life usa Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (e seus Licenciantes). Todos os direitos reservados. Consulte www.havok.com para obter detalhes.
-
-Este software contém código fonte fornecido pela NVIDIA Corporation.
-
-Todos os direitos reservados. Consulte licenses.txt para obter detalhes.
-
-Codificação de áudio da conversa com voz: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
-
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 2a9075ea3a..ff98670c3c 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -372,7 +372,7 @@ Apenas lotes maiores podem ser listados na busca.
Avatares em outros lotes podem ver e conversar com avatares neste lote
-
+
Ponto de Aterrissagem: [LANDING]
diff --git a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
deleted file mode 100644
index 3beada1fc0..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- 1 pasta
-
-
- [NUM] pasta(s)
-
-
- Enviando pastas...
-
-
- Iniciando...
-
-
-
-
-
- Carregando...
-
-
-
-
-
-
- Arraste itens para cá para criar pastas
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
index 3e713cc0b8..aae0eb5ce6 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
@@ -1,12 +1,12 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 37544f1f7e..032b197fc9 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -165,11 +165,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
deleted file mode 100644
index 442622035a..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_outbox_inventory.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
index f3357026d5..50e6cbe8be 100644
--- a/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_snapshot_inventory.xml
@@ -4,7 +4,7 @@
Inventário
- Salvar uma imagem em seu inventário custa L$[UPLOAD_COST]. Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.
+ Para salvar sua imagem como uma textura, selecione um dos formatos quadrados.
diff --git a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
deleted file mode 100644
index c51c100fc6..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_merchant_outbox.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- 1 папка
-
-
- [NUM] папки
-
-
- Отправка папок....
-
-
- Инициализация...
-
-
-
-
-
- Загрузка...
-
-
-
-
-
-
- Перетаскивайте предметы для создания папок
-
-
-
-
-
-
diff --git a/indra/newview/skins/default/xui/ru/menu_inventory_add.xml b/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
index faebab7df6..89c9b29bfd 100644
--- a/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/ru/menu_inventory_add.xml
@@ -1,11 +1,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index a6059d80c4..bfabcae3f6 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -207,11 +207,11 @@
-
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml
index d7320c9d49..daa6238490 100644
--- a/indra/newview/skins/default/xui/ru/notifications.xml
+++ b/indra/newview/skins/default/xui/ru/notifications.xml
@@ -2563,8 +2563,8 @@ URL: [MEDIAURL]
Этот участок предоставляет музыку из:
-Домен: [MEDIADOMAIN]
-URL: [MEDIAURL]
+Домен: [AUDIODOMAIN]
+URL: [AUDIOURL]
View angle
@@ -4251,7 +4213,7 @@
layout="topleft"
left="10"
top_pad="7"
- tool_tip="In real world terms this is a Zoom feature. This will change the field of view in you viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
+ tool_tip="In real world terms this is a Zoom feature. This will change the field of view in your viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
width="100">
View angle
diff --git a/indra/newview/skins/starlight/xui/en/floater_phototools_camera.xml b/indra/newview/skins/starlight/xui/en/floater_phototools_camera.xml
index fddca09966..1eb43fba86 100644
--- a/indra/newview/skins/starlight/xui/en/floater_phototools_camera.xml
+++ b/indra/newview/skins/starlight/xui/en/floater_phototools_camera.xml
@@ -363,7 +363,7 @@
layout="topleft"
left="10"
top_pad="12"
- tool_tip="In real world terms this is a Zoom feature. This will change the field of view in you viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpacenNavigator)."
+ tool_tip="In real world terms this is a Zoom feature. This will change the field of view in your viewer window. It is the same as hitting Ctrl + 0 or Ctrl+8. NOTE: This will not function if you have flycam enabled (3D SpaceNavigator)."
width="100">
View angle
diff --git a/indra/newview/skins/starlight/xui/en/panel_fs_nui_login.xml b/indra/newview/skins/starlight/xui/en/panel_fs_nui_login.xml
index 6d72351d3f..0e3e7370cc 100644
--- a/indra/newview/skins/starlight/xui/en/panel_fs_nui_login.xml
+++ b/indra/newview/skins/starlight/xui/en/panel_fs_nui_login.xml
@@ -261,20 +261,25 @@
Grid:
-
-
+ combo_button.scale_image="true" >
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -148,7 +82,6 @@
-
@@ -165,7 +98,6 @@
-
@@ -177,5 +109,4 @@
Elemente
-
diff --git a/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml b/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
index 599b6167d5..d0a6087a2f 100644
--- a/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
+++ b/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
@@ -407,6 +407,28 @@
tool_tip="Chat Options"
name="chat_options_btn"/>
+
+
+
-
+
+
+
+
diff --git a/indra/newview/skins/vintage/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/vintage/xui/en/panel_group_info_sidetray.xml
index a538a3d045..3b82f2ea79 100644
--- a/indra/newview/skins/vintage/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/vintage/xui/en/panel_group_info_sidetray.xml
@@ -267,17 +267,6 @@ background_visible="true"
left="1"
top="0"
width="90" />
-
diff --git a/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml b/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml
index 075adc43f9..2aa6b8eae3 100644
--- a/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/vintage/xui/en/panel_main_inventory.xml
@@ -66,6 +66,16 @@
+
+
+
+
-
+
Rozmiar:
-
-
+
+
pikseli
diff --git a/indra/newview/skins/vintage/xui/pl/floater_people.xml b/indra/newview/skins/vintage/xui/pl/floater_people.xml
index 7f715fad0a..e4b04c89b9 100644
--- a/indra/newview/skins/vintage/xui/pl/floater_people.xml
+++ b/indra/newview/skins/vintage/xui/pl/floater_people.xml
@@ -3,5 +3,6 @@
+
diff --git a/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml b/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml
index 6b379b41de..27c4ddc135 100644
--- a/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml
+++ b/indra/newview/skins/vintage/xui/pl/panel_main_inventory.xml
@@ -15,6 +15,7 @@
+
diff --git a/indra/newview/skins/vintage/xui/pl/panel_toolbar_view.xml b/indra/newview/skins/vintage/xui/pl/panel_toolbar_view.xml
index 9c04fd0c2c..8dd529d77a 100644
--- a/indra/newview/skins/vintage/xui/pl/panel_toolbar_view.xml
+++ b/indra/newview/skins/vintage/xui/pl/panel_toolbar_view.xml
@@ -6,8 +6,8 @@
-
-
+
+
diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp
index a1005c654c..caa3016d2e 100644
--- a/indra/newview/tests/llsecapi_test.cpp
+++ b/indra/newview/tests/llsecapi_test.cpp
@@ -69,6 +69,7 @@ LLPointer LLSecAPIBasicHandler::loadCredential(const std::string&
void LLSecAPIBasicHandler::saveCredential(LLPointer cred, bool save_authenticator) {}
void LLSecAPIBasicHandler::deleteCredential(LLPointer cred) {}
bool LLSecAPIBasicHandler::hasCredentialMap(const std::string& storage, const std::string& grid) { return false; }
+bool LLSecAPIBasicHandler::emptyCredentialMap(const std::string& storage, const std::string& grid) { return false; }
void LLSecAPIBasicHandler::loadCredentialMap(const std::string& storage, const std::string& grid, credential_map_t& credential_map) {}
LLPointer LLSecAPIBasicHandler::loadFromCredentialMap(const std::string& storage, const std::string& grid, const std::string& userkey) { return NULL; }
void LLSecAPIBasicHandler::addToCredentialMap(const std::string& storage, LLPointer cred, bool save_authenticator) {}
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index b1ebbbd6b2..b0fb4328db 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -248,6 +248,11 @@ class ViewerManifest(LLManifest,FSViewerManifest):
def channel_type(self): # returns 'release', 'beta', 'project', or 'test'
channel_qualifier=self.channel_variant().lower()
+ # Somehow, we started leaving the - separating the variant from the app name
+ # on the beginning of the channel qualifier. This screws up later processing that
+ # depends on the channel type. If it's there, we chop it off.
+ if channel_qualifier[0] == '-':
+ channel_qualifier = channel_qualifier[1:]
if channel_qualifier.startswith('release'):
channel_type='release'
elif channel_qualifier.startswith('beta'):
@@ -589,6 +594,11 @@ class WindowsManifest(ViewerManifest):
else:
self.path("fmodex.dll")
+ # Get openal dll
+ if self.args.get('openal') == 'ON':
+ self.path("OpenAL32.dll")
+ self.path("alut.dll")
+
# For textures
self.path("openjpeg.dll")
@@ -772,18 +782,6 @@ class WindowsManifest(ViewerManifest):
self.path("msvcp120.dll")
self.path("msvcr120.dll")
- # FIRE-22709: Local voice not working in OpenSim
- if self.fs_is_opensim():
- with self.prefix(src=os.path.join(relpkgdir, 'voice_os'), dst="voice_os"):
- self.path("libsndfile-1.dll")
- self.path("ortp.dll")
- self.path("SLVoice.exe")
- self.path("vivoxoal.dll")
- self.path("vivoxsdk.dll")
- with self.prefix(src=pkgdir, dst="voice_os"):
- self.path("ca-bundle.crt")
- #
-
if not self.is_packaging_viewer():
self.package_file = "copied_deps"
@@ -1412,19 +1410,6 @@ class DarwinManifest(ViewerManifest):
):
self.path2basename(relpkgdir, libfile)
- # FIRE-22709: Local voice not working in OpenSim
- if self.fs_is_opensim():
- with self.prefix(src=os.path.join(relpkgdir, 'voice_os'), dst="voice_os"):
- self.path('libortp.dylib')
- self.path('libsndfile.dylib')
- self.path('libvivoxoal.dylib')
- self.path('libvivoxsdk.dylib')
- self.path('libvivoxplatform.dylib')
- self.path('SLVoice')
- with self.prefix(src=pkgdir, dst="voice_os"):
- self.path("ca-bundle.crt")
- #
-
# dylibs that vary based on configuration
if self.args['fmodversion'].lower() == 'fmodstudio':
if self.args['configuration'].lower() == 'debug':
@@ -1489,7 +1474,7 @@ class DarwinManifest(ViewerManifest):
helperappfile = 'DullahanHelper.app'
self.path2basename(relpkgdir, helperappfile)
- pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework');
+ pluginframeworkpath = self.dst_path_of('Chromium Embedded Framework.framework')
# Putting a Frameworks directory under Contents/MacOS
# isn't canonical, but the path baked into Dullahan
# Helper.app/Contents/MacOS/DullahanHelper is:
@@ -1732,12 +1717,41 @@ class DarwinManifest(ViewerManifest):
signed=False
sign_attempts=3
sign_retry_wait=15
+ # The order of these is critical. When two things need signing and one is contained within the
+ # other, they must be signed from the innermost out.
+ things_to_sign = ['Frameworks/Chromium Embedded Framework.framework/Chromium Embedded Framework',
+ 'Resources/SLPlugin.app/Contents/Frameworks/DullahanHelper.app',
+ 'Resources/SLPlugin.app',
+ 'Resources/SLVoice',
+ 'Resources/mac-crash-logger.app']
while (not signed) and (sign_attempts > 0):
try:
- sign_attempts-=1;
- self.run_command(
+ sign_attempts-=1
+ # This is ugly as hell, but it's the only way to make sure that every dylib in the
+ # entire package gets signed, as required for notarization. Apparently the --deep option
+ # isn't sufficient any more. Don't ask me why.
+ contents_dir = os.path.join(app_in_dmg, 'Contents')
+ try:
+ all_dylibs = subprocess.check_output(['find', contents_dir, '-name', '*.dylib', '-print'])
+ except subprocess.CalledProcessError as err:
+ sys.exit("failed to get list of dylib files")
+ for dylib in all_dylibs.split('\n'):
+ if dylib: # ignore any empty lines
+ self.run_command(
+ ['codesign', '--verbose', '--deep', '--force', '--option=runtime',
+ '--keychain', viewer_keychain, '--sign', identity,
+ dylib])
+ for item in things_to_sign:
# Note: See blurb above about names of keychains
- ['codesign', '--verbose', '--deep', '--force',
+ sign_path = os.path.join(contents_dir, item)
+ print "Signing %s" % sign_path
+ self.run_command(
+ ['codesign', '--verbose', '--deep', '--force', '--option=runtime',
+ '--keychain', viewer_keychain, '--sign', identity,
+ sign_path])
+ print "Signing main app bundle %s" % app_in_dmg
+ self.run_command(
+ ['codesign', '--verbose', '--deep', '--force', '--option=runtime',
'--keychain', viewer_keychain, '--sign', identity,
app_in_dmg])
signed=True # if no exception was raised, the codesign worked
@@ -2233,6 +2247,7 @@ if __name__ == "__main__":
extra_arguments = [
dict(name='bugsplat', description="""BugSplat database to which to post crashes,
if BugSplat crash reporting is desired""", default=''),
+ dict(name='openal', description="""Indication openal libraries are needed""", default='OFF')
]
try:
main(extra=extra_arguments)
diff --git a/indra/tools/manifests/compatibility.manifest b/indra/tools/manifests/compatibility.manifest
index 6e80aff779..f1aed452ab 100644
--- a/indra/tools/manifests/compatibility.manifest
+++ b/indra/tools/manifests/compatibility.manifest
@@ -1,31 +1,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true/PM
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true/PM
+
+
+
diff --git a/indra/tools/manifests/legacy.manifest b/indra/tools/manifests/legacy.manifest
index 899438c020..39e6aa16cd 100644
--- a/indra/tools/manifests/legacy.manifest
+++ b/indra/tools/manifests/legacy.manifest
@@ -1,17 +1,17 @@
-
-
-
-
-
-
-
-
-
-
- true/PM
-
-
-
+
+
+
+
+
+
+
+
+
+
+ true/PM
+
+
+
diff --git a/scripts/configure_firestorm.sh b/scripts/configure_firestorm.sh
index f775b20dca..b7549f4913 100755
--- a/scripts/configure_firestorm.sh
+++ b/scripts/configure_firestorm.sh
@@ -35,6 +35,7 @@ WANTS_VERSION=$FALSE
WANTS_KDU=$FALSE
WANTS_FMODSTUDIO=$FALSE
WANTS_FMODEX=$FALSE
+WANTS_OPENAL=$FALSE
WANTS_OPENSIM=$TRUE
WANTS_SINGLEGRID=$FALSE
WANTS_AVX=$FALSE
@@ -72,6 +73,7 @@ showUsage()
echo " --no-package : Build without installer (Overrides --package)"
echo " --fmodstudio : Build with FMOD Studio"
echo " --fmodex : Build with FMOD Ex"
+ echo " --openal : Build with OpenAL"
echo " --opensim : Build with OpenSim support (Disables Havok features)"
echo " --no-opensim : Build without OpenSim support (Overrides --opensim)"
echo " --singlegrid : Build for single grid usage (Requires --opensim)"
@@ -91,7 +93,7 @@ getArgs()
# $* = the options passed in from main
{
if [ $# -gt 0 ]; then
- while getoptex "clean build config version package no-package fmodstudio fmodex ninja jobs: platform: kdu opensim no-opensim singlegrid: avx avx2 crashreporting testbuild: help chan: btype:" "$@" ; do
+ while getoptex "clean build config version package no-package fmodstudio fmodex openal ninja jobs: platform: kdu opensim no-opensim singlegrid: avx avx2 crashreporting testbuild: help chan: btype:" "$@" ; do
#ensure options are valid
if [ -z "$OPTOPT" ] ; then
@@ -111,6 +113,7 @@ getArgs()
kdu) WANTS_KDU=$TRUE;;
fmodstudio) WANTS_FMODSTUDIO=$TRUE;;
fmodex) WANTS_FMODEX=$TRUE;;
+ openal) WANTS_OPENAL=$TRUE;;
opensim) WANTS_OPENSIM=$TRUE;;
no-opensim) WANTS_OPENSIM=$FALSE;;
singlegrid) WANTS_SINGLEGRID=$TRUE
@@ -294,10 +297,11 @@ if [ ! -d `dirname "$LOG"` ] ; then
fi
echo -e "configure_firestorm.sh" > $LOG
-echo -e " PLATFORM: '$PLATFORM'" | tee -a $LOG
+echo -e " PLATFORM: $PLATFORM" | tee -a $LOG
echo -e " KDU: `b2a $WANTS_KDU`" | tee -a $LOG
echo -e " FMODSTUDIO: `b2a $WANTS_FMODSTUDIO`" | tee -a $LOG
echo -e " FMODEX: `b2a $WANTS_FMODEX`" | tee -a $LOG
+echo -e " OPENAL: `b2a $WANTS_OPENAL`" | tee -a $LOG
echo -e " OPENSIM: `b2a $WANTS_OPENSIM`" | tee -a $LOG
if [ $WANTS_SINGLEGRID -eq $TRUE ] ; then
echo -e " SINGLEGRID: `b2a $WANTS_SINGLEGRID` ($SINGLEGRID_URI)" | tee -a $LOG
@@ -405,8 +409,10 @@ if [ \( $WANTS_VERSION -eq $TRUE \) -o \( $WANTS_CONFIG -eq $TRUE \) ] ; then
majorVer=`cat indra/newview/VIEWER_VERSION.txt | cut -d "." -f 1`
minorVer=`cat indra/newview/VIEWER_VERSION.txt | cut -d "." -f 2`
patchVer=`cat indra/newview/VIEWER_VERSION.txt | cut -d "." -f 3`
+ gitHash=`git describe --always --exclude '*'`
echo "Channel : ${CHANNEL}"
- echo "Version : ${majorVer}.${minorVer}.${patchVer}.${buildVer}"
+ echo "Version : ${majorVer}.${minorVer}.${patchVer}.${buildVer} [${gitHash}]"
+ GITHASH=-DVIEWER_VERSION_GITHASH=\"${gitHash}\"
popd
fi
@@ -428,6 +434,11 @@ if [ $WANTS_CONFIG -eq $TRUE ] ; then
else
FMODEX="-DFMODEX:BOOL=OFF"
fi
+ if [ $WANTS_OPENAL -eq $TRUE ] ; then
+ OPENAL="-DOPENAL:BOOL=ON"
+ else
+ OPENAL="-DOPENAL:BOOL=OFF"
+ fi
if [ $WANTS_OPENSIM -eq $TRUE ] ; then
OPENSIM="-DOPENSIM:BOOL=ON"
else
@@ -495,6 +506,7 @@ if [ $WANTS_CONFIG -eq $TRUE ] ; then
if [ $PLATFORM == "darwin" ] ; then
TARGET="Xcode"
elif [ \( $PLATFORM == "linux" \) ] ; then
+ OPENAL="-DOPENAL:BOOL=ON"
if [ $WANTS_NINJA -eq $TRUE ] ; then
TARGET="Ninja"
else
@@ -505,7 +517,8 @@ if [ $WANTS_CONFIG -eq $TRUE ] ; then
UNATTENDED="-DUNATTENDED=ON"
fi
- cmake -G "$TARGET" ../indra $CHANNEL $FMODSTUDIO $FMODEX $KDU $OPENSIM $SINGLEGRID $AVX_OPTIMIZATION $AVX2_OPTIMIZATION $TESTBUILD $PACKAGE $UNATTENDED -DLL_TESTS:BOOL=OFF -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DCMAKE_BUILD_TYPE:STRING=$BTYPE \
+ cmake -G "$TARGET" ../indra $CHANNEL ${GITHASH} $FMODSTUDIO $FMODEX $OPENAL $KDU $OPENSIM $SINGLEGRID $AVX_OPTIMIZATION $AVX2_OPTIMIZATION $TESTBUILD $PACKAGE \
+ $UNATTENDED -DLL_TESTS:BOOL=OFF -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DCMAKE_BUILD_TYPE:STRING=$BTYPE \
$CRASH_REPORTING -DVIEWER_SYMBOL_FILE:STRING="${VIEWER_SYMBOL_FILE:-}" -DROOT_PROJECT_NAME:STRING=Firestorm $LL_ARGS_PASSTHRU | tee $LOG
if [ $PLATFORM == "windows" ] ; then