Merge branch 'master' into fs-vs2017

master
Nicky Dasmijn 2020-04-29 20:02:19 +02:00
commit a4aff377e6
454 changed files with 6186 additions and 3194 deletions

119
.clang-format Normal file
View File

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

35
.gitattributes vendored Normal file
View File

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

19
.gitignore vendored
View File

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

View File

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

View File

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

View File

@ -197,46 +197,6 @@
</map>
</map>
</map>
<key>slvoice_os</key>
<map>
<key>copyright</key>
<string>2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C)</string>
<key>description</key>
<string>Vivox SDK components compatible with OpenSim</string>
<key>license</key>
<string>Mixed</string>
<key>license_file</key>
<string>LICENSES/slvoice_os.txt</string>
<key>name</key>
<string>slvoice_os</string>
<key>platforms</key>
<map>
<key>windows</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>8d0a31f4653202cbd5ea1711be47e669</string>
<key>url</key>
<uri>http://downloads.phoenixviewer.com/slvoice_os-4.6.0017.22050.302004-windows-302004.tar.bz2</uri>
</map>
<key>name</key>
<string>windows</string>
</map>
<key>darwin64</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>d5673fc7ad1ec9595a9b97537681e060</string>
<key>url</key>
<uri>http://downloads.phoenixviewer.com/slvoice_os-4.6.0017.22050.302004-darwin-302004.tar.bz2</uri>
</map>
<key>name</key>
<string>darwin64</string>
</map>
</map>
</map>
<key>discord-rpc</key>
<map>
<key>copyright</key>
@ -1070,11 +1030,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>d892f61440dd1888327d764b04158c88</string>
<string>b5b6897fb6f5413f3396b0666a6422ab</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-2.00.05-darwin-192862021.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-2.00.08-darwin-201031332.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -1084,11 +1044,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>4bf66af7313c2a859bde553a563698e3</string>
<string>aed9fbd15995e71f9b600eb2ed2b73b1</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-2.00.05-linux64-192862026.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-2.00.08-linux64-201031328.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -1098,11 +1058,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>c668bd6961489c9bd6f07f1203a9d6eb</string>
<string>670b2dc83403cc9024bc68728d851a4d</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.05-windows-192861134.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.08-windows-200921513.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1112,18 +1072,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>2cf52c44f8943f69b91c950ae7ea356a</string>
<string>b97c88e262d37dd1514c0e580a8cc775</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.05-windows64-192861136.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.00.08-windows64-200921514.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>2.00.05</string>
<string>2.00.08</string>
</map>
<key>fmodex</key>
<map>
@ -3626,9 +3586,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>175b1f90cd3679a2a64ad948dae3f2fa</string>
<string>e5a4261599f47045428b520b20405022</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/44332/391669/vlc_bin-2.2.8.531366-darwin64-531366.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/vlc_bin-3.0.8.200601940-darwin64-200601940.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -3871,9 +3831,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>package_description</key>
<map>
<key>canonical_repo</key>
<string>https://bitbucket.org/lindenlab/viewer-release</string>
<string>https://bitbucket.org/lindenlab/viewer</string>
<key>copyright</key>
<string>Copyright (c) 2019, The Phoenix Firestorm Project, Inc.</string>
<string>Copyright (c) 2020, The Phoenix Firestorm Project, Inc.</string>
<key>description</key>
<string>Firestorm Viewer</string>
<key>license</key>

View File

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

View File

@ -1437,6 +1437,8 @@ Thickbrick Sleaford
STORM-956
STORM-1147
STORM-1325
Thoys Pan
SL-12396
Thraxis Epsilon
SVC-371
VWR-383

View File

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

View File

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

View File

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

View File

@ -8,13 +8,6 @@ if (NOT USESYSTEMLIBS)
endif (LINUX)
use_prebuilt_binary(libhunspell)
use_prebuilt_binary(slvoice)
# <FS:Ansariel> 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)
# </FS:Ansariel>
# use_prebuilt_binary(libidn)
endif(NOT USESYSTEMLIBS)

View File

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

View File

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

View File

@ -1 +1,4 @@

View File

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

View File

@ -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); // <FS:Ansariel> Don't add physics layer
return (getClothingLayerCount() < MAX_CLOTHING_LAYERS);
}
else if (a_type==LLAssetType::AT_BODYPART)

View File

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

View File

@ -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)
// / <FS:Testy> 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();
// <FS:Testy> 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);

View File

@ -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);
// <FS:Testy> 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);

View File

@ -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;
// <FS:ND> 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;
}
// </FS:ND>
U32 maskMiniDumpType = MiniDumpNormal | MiniDumpFilterModulePaths;
mExceptionHandler = new google_breakpad::ExceptionHandler(
wdump_path,
NULL, //No filter

View File

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

View File

@ -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;
// <FS:ND/> 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()))

View File

@ -23,7 +23,7 @@ include_directories(SYSTEM
set(llinventory_SOURCE_FILES
llcategory.cpp
lleconomy.cpp
lleconomy.cpp #<FS:Ansariel> 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 #<FS:Ansariel> OpenSim legacy economy
llfoldertype.h
llinventory.h
llinventorydefines.h

View File

@ -5295,21 +5295,14 @@ bool LLVolumeFace::cacheOptimize()
llassert(!mOptimized);
mOptimized = TRUE;
// <FS:ND> FIRE-23370/BUG-8801/MAIN-5060
// <FS:ND> 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]);
}
// <FS:ND> 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
// <FS:ND> 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<U16> new_indices;
LLVCacheTriangleData* tri;
//prime pump by adding first triangle to cache;
// <FS:ND> 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)
{
// <FS:ND> 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;
}

View File

@ -47,10 +47,18 @@ static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
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),
// <FS:Ansariel> on_check callback parameter
on_check("on_check"),
// </FS:Ansariel>
@ -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<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
static LLUICachedControl<S32> 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<LLTextBox> (tbparams);
mLabel = LLUICtrlFactory::create<LLTextBox>(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);

View File

@ -50,6 +50,19 @@ class LLCheckBoxCtrl
, public ll::ui::SearchableControl
{
public:
enum EWordWrap
{
WRAP_NONE,
WRAP_UP,
WRAP_DOWN
};
struct WordWrap : public LLInitParam::TypeValuesHelper<EWordWrap, WordWrap>
{
static void declareValues();
};
struct Params
: public LLInitParam::Block<Params, LLUICtrl::Params>
{
@ -58,6 +71,8 @@ public:
Optional<LLTextBox::Params> label_text;
Optional<LLButton::Params> check_button;
Optional<EWordWrap, WordWrap> word_wrap;
// <FS:Ansariel> on_check callback parameter
Optional<EnableCallbackParam> on_check;
// </FS:Ansariel>
@ -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

View File

@ -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'
// <FS> 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
// <FS> 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);
// </FS>
if (drawable != 0)
{
// <FS> FIRE-8257: Sometimes text is cut off on left side of console
if (drawable >= line_length)
{
skip_chars = 1;
}
// </FS>
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.
}
// <FS> FIRE-8257: Sometimes text is cut off on left side of console
else
{
break;
}
// </FS>
paragraph_offset += (drawable + skip_chars);
}
}

View File

@ -1338,7 +1338,47 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
handled = TRUE;
}
break;
// <FS:Ansariel> 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<LLFolderViewScrollContainer>();
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;
}
// </FS:Ansariel>
return handled;
}

View File

@ -971,7 +971,17 @@ void LLFolderViewItem::draw()
}
drawLabel(font, text_left, y, color, right_x);
// <FS:Ansariel> Special for protected items
// <FS:Ansariel> 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);
}
// </FS:Ansariel>
// <FS:Ansariel> FIRE-29342: Protect folder option
if (mViewModelItem->isProtected())
{
static const std::string protected_string = " (" + LLTrans::getString("ProtectedFolder") + ") ";

View File

@ -224,7 +224,10 @@ public:
// <FS:ND/>
virtual LLFolderViewModelItem* getParent() const = 0;
// <FS:Ansariel> Special for protected items
// <FS:Ansariel> Special for locked items
virtual bool isLocked() const { return false; }
// <FS:Ansariel> FIRE-29342: Protect folder option
virtual bool isProtected() const { return false; }
protected:

View File

@ -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),
// <FS:Ansariel> 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 );
}
}

View File

@ -108,7 +108,8 @@ public:
// layout
Optional<S32> 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;

View File

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

View File

@ -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<LLContextMenu> mPopupMenuHandle;
LLView* mDocumentView;

View File

@ -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 )
# </FS:ND>
# <FS:ND> Get rid of memory limit exceeded for -fvar-tracking-assignments.
SET_SOURCE_FILES_PROPERTIES(llviewermenu.cpp PROPERTIES COMPILE_FLAGS -fno-var-tracking-assignments)
# </FS:ND>
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)
# </FS:Ansariel>
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)
# <FS:Ansariel> Output device selection
# set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
set_source_files_properties(llstartup.cpp llfloaterpreference.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
set_source_files_properties(llstartup.cpp llfloaterpreference.cpp llfloaterabout.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
# </FS:Ansariel>
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})

View File

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

View File

@ -63,6 +63,8 @@ NACLFloaterExploreSounds::~NACLFloaterExploreSounds()
}
}
mBlacklistAvatarNameCacheConnections.clear();
mLocalPlayingAudioSourceIDs.clear();
}
BOOL NACLFloaterExploreSounds::postBuild()
@ -71,6 +73,7 @@ BOOL NACLFloaterExploreSounds::postBuild()
getChild<LLButton>("look_at_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleLookAt, this));
getChild<LLButton>("stop_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStop, this));
getChild<LLButton>("bl_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::blacklistSound, this));
getChild<LLButton>("stop_locally_btn")->setClickedCallback(boost::bind(&NACLFloaterExploreSounds::handleStopLocally, this));
mHistoryScroller = getChild<LLScrollListCtrl>("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()
{

View File

@ -29,6 +29,7 @@ private:
void handlePlayLocally();
void handleLookAt();
void handleStop();
void handleStopLocally();
void handleSelection();
void blacklistSound();
@ -41,6 +42,8 @@ private:
std::list<LLSoundHistoryItem> mLastHistory;
uuid_vec_t mLocalPlayingAudioSourceIDs;
typedef std::map<LLUUID, boost::signals2::connection> blacklist_avatar_name_cache_connection_map_t;
blacklist_avatar_name_cache_connection_map_t mBlacklistAvatarNameCacheConnections;

View File

@ -1 +1 @@
6.3.6
6.3.10

View File

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

View File

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

View File

@ -3777,6 +3777,19 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>CurrentlyUsingBakesOnMesh</key>
<map>
<key>Comment</key>
<string>Are we currently on a grid that uses bakes on mesh? Persisted to force rebakes on login to named grids.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>CurrentGrid</key>
<map>
<key>Comment</key>
@ -21391,17 +21404,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<string>Grey</string>
</map>
<key>FSReleaseCandidateChannelId</key>
<map>
<key>Comment</key>
<string>Defines the string that identifies a simulator release candidate channel in the simulator version string.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>RC</string>
</map>
<key>FSStatusbarShowSimulatorVersion</key>
<map>
<key>Comment</key>
@ -23420,6 +23422,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>DAEExportSingleUVMap</key>
<map>
<key>Comment</key>
<string>set all objects to have the same UV map name</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>DAEExportTextureParams</key>
<map>
<key>Comment</key>
@ -25073,7 +25086,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>FSExperimentalRegionCrossingMovementFix</key>
<map>
<key>Comment</key>
<string>Enables the experimental fix for region crossing movements being bogus due to false predictions by the viewer (0 = Disabled, 1 = Enabled)</string>
<string>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))</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@ -25081,6 +25094,39 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSRegionCrossingPositionErrorLimit</key>
<map>
<key>Comment</key>
<string>Region crossing position error limit in meters</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.25</real>
</map>
<key>FSRegionCrossingAngleErrorLimit</key>
<map>
<key>Comment</key>
<string>Region crossing angle error limit in degrees</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>20.0</real>
</map>
<key>FSRegionCrossingSmoothingTime</key>
<map>
<key>Comment</key>
<string>Region crossing smoothing filter time in seconds</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>10.0</real>
</map>
<key>FSStatisticsNoFocus</key>
<map>
<key>Comment</key>
@ -25178,7 +25224,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>FSRestrictMaxTextureSize</key>
<map>

View File

@ -744,7 +744,7 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>ProtectAOFolders</key>
<key>LockAOFolders</key>
<map>
<key>Comment</key>
<string>Keep the AO folders in Inventory safe from manual changes.</string>
@ -769,7 +769,7 @@
<integer>0</integer>
</array>
</map>
<key>ProtectBridgeFolder</key>
<key>LockBridgeFolder</key>
<map>
<key>Comment</key>
<string>Keep the Bridge folder in Inventory safe from manual changes.</string>
@ -778,7 +778,7 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>ProtectWearableFavoritesFolders</key>
<key>LockWearableFavoritesFolders</key>
<map>
<key>Comment</key>
<string>Keep the Wearable Favorites folder in Inventory safe from manual changes.</string>
@ -1279,5 +1279,16 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>FSProtectedFolders</key>
<map>
<key>Comment</key>
<string>A list of folder UUIDs that are protected from moving and deleting.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>LLSD</string>
<key>Value</key>
<array/>
</map>
</map>
</llsd>

View File

@ -640,7 +640,14 @@ void DAESaver::addPolygons(daeElement* mesh, const char* geomID, const char* mat
domInputLocalOffset* input = daeSafeCast<domInputLocalOffset>(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<F32> normal_data;
std::vector<F32> 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 <vertices> element
{

View File

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

View File

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

View File

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

View File

@ -126,6 +126,7 @@ public:
void onButtonClickedSearch();
void onCommitCheckboxRegex();
bool isSearchableObject (LLViewerObject* objectp, LLViewerRegion* our_region);
void setFindOwnerText(std::string value);
std::map<LLUUID, FSObjectProperties> mObjectDetails;

View File

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

View File

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

View File

@ -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<LLPanelGroup>("panel_group_info_sidetray");
if (!mGroupPanel)
mGroupCreatePanel = findChild<LLPanelGroupCreate>("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);
}
}

View File

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

View File

@ -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<std::string> 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 + ") "));
}
// <FS:Techwolf Lupindo> 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<LLButton>("send_chat")->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL));
getChild<LLButton>("chat_search_btn")->setCommitCallback(boost::bind(&FSFloaterIM::onChatSearchButtonClicked, this));
bool isFSSupportGroup = FSData::getInstance()->isFirestormGroup(mSessionID);
bool isFSTestingGroup = FSData::getInstance()->isTestingGroup(mSessionID);

View File

@ -120,6 +120,8 @@ public:
static void clearAllOpenHistories(); // <FS:CR> FIRE-11734
void onChatSearchButtonClicked();
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type,
void *cargo_data, EAcceptance *accept,

View File

@ -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<LLCheckBoxCtrl>("temp_asset")->setVisible(FALSE);
@ -520,7 +520,7 @@ void FSFloaterImport::onClickBtnImport()
if (!getChild<LLCheckBoxCtrl>("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<LLCheckBoxCtrl>("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<LLTextBox>("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<LLTextBox>("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();

View File

@ -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<LLButton>("chat_history_btn")->setCommitCallback(boost::bind(&FSFloaterNearbyChat::onHistoryButtonClicked, this));
getChild<LLButton>("chat_search_btn")->setCommitCallback(boost::bind(&FSFloaterNearbyChat::onSearchButtonClicked, this));
// chat type selector and send chat button
mChatTypeCombo = getChild<LLComboBox>("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);

View File

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

View File

@ -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<LLScrollListCtrl>("folder_list");
mFolderList->setFilterColumn(0);
mFolderList->setDoubleClickCallback(boost::bind(&FSFloaterProtectedFolders::onDoubleClick, this));
mRemoveFolderBtn = getChild<LLButton>("remove_btn");
mRemoveFolderBtn->setCommitCallback(boost::bind(&FSFloaterProtectedFolders::handleRemove, this));
mFilterEditor = getChild<LLFilterEditor>("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<LLScrollListItem*> selected_items = mFolderList->getAllSelected();
for (std::vector<LLScrollListItem*>::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);
}
}

View File

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

View File

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

View File

@ -591,8 +591,6 @@ BOOL FSPanelClassifiedEdit::postBuild()
FSPanelClassifiedInfo::postBuild();
LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot");
snapshot->setOnSelectCallback(boost::bind(&FSPanelClassifiedEdit::onChange, this));
LLUICtrl* edit_icon = getChild<LLUICtrl>("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();
}
//////////////////////////////////////////////////////////////////////////

View File

@ -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<LLComboBox>("server_combo");
LLSD server_combo_val = server_combo->getSelectedValue();
LL_INFOS("AppInit") << "grid "<<server_combo_val.asString()<< LL_ENDL;
LL_INFOS("AppInit") << "grid "<<(!server_combo_val.isUndefined()?server_combo_val.asString():server_combo->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<LLComboBox>("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 ["<<sPendingNewGridURI<<"]=["<< (grid_name.isUndefined()?"FAILED TO ADD":grid_name.asString())<< "]"<<LL_ENDL;
server_choice_combo->setSelectedByValue(grid_name, true);
LLGridManager::getInstance()->setGridChoice(grid_name.asString());
}
std::string current_grid = LLGridManager::getInstance()->getGrid();
std::map<std::string, std::string> 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

View File

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

View File

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

View File

@ -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<F32>::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<F32> fsRegionCrossingPositionErrorLimit(gSavedSettings, "FSRegionCrossingPositionErrorLimit");
static LLCachedControl<F32> 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<F32> 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
}

View File

@ -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<RegionCrossExtrapolateImpl> 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<F32>::infinity(); // no limit if not a vehicle
}
};
#endif // FS_REGIONCROSS_H

View File

@ -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@"
// </FS:TS>
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 409 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 409 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 KiB

After

Width:  |  Height:  |  Size: 166 KiB

View File

@ -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]
// <FS: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));
}
// </FS:CR>
}
LLQuaternion LLAgent::getHeadRotation()
@ -5540,10 +5549,7 @@ LLAgentQueryManager::LLAgentQueryManager() :
mNumPendingQueries(0),
mUpdateSerialNum(0)
{
//<FS:Beq> BOM fallback legacy opensim
// for (U32 i = 0; i < BAKED_NUM_INDICES; i++)
for (U32 i = 0; i < LLVOAvatar::sMaxBakes; i++)
// </FS:Beq>
for (U32 i = 0; i < BAKED_NUM_INDICES; i++)
{
mActiveCacheQueries[i] = 0;
}
@ -5952,7 +5958,7 @@ void LLAgent::sendAgentSetAppearance()
BOOL textures_current = gAgentAvatarp->areTexturesCurrent();
//<FS:Beq> 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++ )
//</FS:Beq>
{
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;
//<FS:Beq> 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++)
//</FS:Beq>
{
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;
}
// <FS:Beq> 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;
}
// </FS:Beq>
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"); // <FS:Beq> useful when debugging appeanrce updates
gAgentAvatarp->sendAppearanceMessage( gMessageSystem );
}
else

View File

@ -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"
// <FS:Ansariel> OpenSim legacy economy
#include "llagent.h"
#include "llagentpicksinfo.h"
#include "lleconomy.h"
#include "llstartup.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llviewerregion.h"
// </FS:Ansariel>
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
{
// <FS:Ansariel> 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;
}
// </FS:Ansariel>
}
S32 LLAgentBenefits::getAnimationUploadCost() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_animation_upload_cost;
return LLGridManager::instance().isInSecondLife() ? m_animation_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
// </FS:Ansariel>
}
S32 LLAgentBenefits::getAttachmentLimit() const
{
// <FS:Ansariel> 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;
}
// </FS:Ansariel>
}
S32 LLAgentBenefits::getCreateGroupCost() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_create_group_cost;
return LLGridManager::instance().isInSecondLife() ? m_create_group_cost : 0;
// </FS:Ansariel>
}
S32 LLAgentBenefits::getGroupMembershipLimit() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_group_membership_limit;
return LLGridManager::instance().isInSecondLife() ? m_group_membership_limit : gMaxAgentGroups;
// </FS:Ansariel>
}
S32 LLAgentBenefits::getPicksLimit() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_picks_limit;
return LLGridManager::instance().isInSecondLife() ? m_picks_limit : LLAgentPicksInfo::instance().getMaxNumberOfPicks();
// </FS:Ansariel>
}
S32 LLAgentBenefits::getSoundUploadCost() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_sound_upload_cost;
return LLGridManager::instance().isInSecondLife() ? m_sound_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
// </FS:Ansariel>
}
S32 LLAgentBenefits::getTextureUploadCost() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_texture_upload_cost;
return LLGridManager::instance().isInSecondLife() ? m_texture_upload_cost : LLGlobalEconomy::instance().getPriceUpload();
// </FS:Ansariel>
}
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;
}

View File

@ -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<LLAgentBenefitsMgr>
{
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<std::string, LLAgentBenefits> mPackageMap;
};
#endif

View File

@ -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();
// <FS:Ansariel> Picks premium perks integration
//return getNumberOfPicks() >= getMaxNumberOfPicks();
return getNumberOfPicks() >= LLAgentBenefitsMgr::current().getPicksLimit();
}
void LLAgentPicksInfo::onServerRespond(LLAvatarPicks* picks)

View File

@ -105,26 +105,29 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
pos_y -= pos_y % 2;
}
// <FS:Ansariel> FIRE-1874: Show server channel in statusbar
// <FS:Ansariel> FIRE-1874: Show server version in statusbar
static LLCachedControl<bool> fsStatusbarShowSimulatorVersion(gSavedSettings, "FSStatusbarShowSimulatorVersion");
static LLCachedControl<std::string> 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);
}
}
}
// </FS:Ansariel> FIRE-1874: Show server channel in statusbar
// </FS:Ansariel> 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;
// <FS:Ansariel> 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;
// <FS:Ansariel> 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());

View File

@ -2142,7 +2142,7 @@ void LLAgentWearables::queryWearableCache()
S32 num_queries = 0;
// <FS:Beq> 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++)
// </FS:Beq>
{
LLUUID hash_id = computeBakedTextureHash((EBakedTextureIndex) baked_index);

Some files were not shown because too many files have changed in this diff Show More