Merge branch 'master' into fs-vs2017
|
|
@ -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
|
||||
...
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
17
build.sh
|
|
@ -259,6 +259,23 @@ then
|
|||
export additional_packages=
|
||||
fi
|
||||
|
||||
begin_section "select viewer channel"
|
||||
# Look for a branch-specific viewer_channel setting
|
||||
# changeset_branch is set in the sling-buildscripts
|
||||
viewer_build_branch=$(echo -n "${changeset_branch:-$(repo_branch ${BUILDSCRIPTS_SRC:-$(pwd)})}" | tr -Cs 'A-Za-z0-9_' '_' | sed -E 's/^_+//; s/_+$//')
|
||||
if [ -n "$viewer_build_branch" ]
|
||||
then
|
||||
branch_viewer_channel_var="${viewer_build_branch}_viewer_channel"
|
||||
if [ -n "${!branch_viewer_channel_var}" ]
|
||||
then
|
||||
viewer_channel="${!branch_viewer_channel_var}"
|
||||
record_event "Overriding viewer_channel for branch '$changeset_branch' to '$viewer_channel'"
|
||||
else
|
||||
record_event "No branch-specific viewer_channel for branch '$viewer_build_branch'; to set a branch build channel set '$branch_viewer_channel_var'"
|
||||
fi
|
||||
fi
|
||||
end_section "select viewer channel"
|
||||
|
||||
python_cmd "$helpers/codeticket.py" addinput "Viewer Channel" "${viewer_channel}"
|
||||
|
||||
initialize_version # provided by buildscripts build.sh; sets version id
|
||||
|
|
|
|||
|
|
@ -1437,6 +1437,8 @@ Thickbrick Sleaford
|
|||
STORM-956
|
||||
STORM-1147
|
||||
STORM-1325
|
||||
Thoys Pan
|
||||
SL-12396
|
||||
Thraxis Epsilon
|
||||
SVC-371
|
||||
VWR-383
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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" )
|
||||
|
|
|
|||
|
|
@ -1 +1,4 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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=""):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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()))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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") + ") ";
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
|
|
|||
|
|
@ -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.";
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.3.6
|
||||
6.3.10
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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@"
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 418 KiB |
|
After Width: | Height: | Size: 153 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 953 B |
|
After Width: | Height: | Size: 192 KiB |
|
After Width: | Height: | Size: 143 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 500 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 404 KiB After Width: | Height: | Size: 169 KiB |
BIN
indra/newview/installers/darwin/firestorm-nightly-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 404 KiB After Width: | Height: | Size: 174 KiB |
BIN
indra/newview/installers/darwin/firestorm-private-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 405 KiB After Width: | Height: | Size: 174 KiB |
BIN
indra/newview/installers/darwin/firestorm-release-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 404 KiB After Width: | Height: | Size: 158 KiB |
BIN
indra/newview/installers/darwin/firestormos-beta-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 409 KiB After Width: | Height: | Size: 176 KiB |
BIN
indra/newview/installers/darwin/firestormos-nightly-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 409 KiB After Width: | Height: | Size: 181 KiB |
BIN
indra/newview/installers/darwin/firestormos-private-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 410 KiB After Width: | Height: | Size: 181 KiB |
BIN
indra/newview/installers/darwin/firestormos-release-dmg/background.png
Normal file → Executable file
|
Before Width: | Height: | Size: 408 KiB After Width: | Height: | Size: 166 KiB |
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||