RLVa mergeup
commit
bb04abd971
|
|
@ -42,6 +42,7 @@ indra/web/doc/asset-upload/plugins/verify-notecard
|
|||
indra/web/doc/asset-upload/plugins/verify-texture
|
||||
installed.xml
|
||||
libraries
|
||||
logs
|
||||
tarfile_tmp
|
||||
^indra/lib/python/mulib.*
|
||||
^web/locale.*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
f4d057d97e0d878b1741c0c66074e7ec0d544b4d
|
||||
b173c93e5f8c288f2f76644272b5a07bd520b5a1
|
||||
e277fbc52b122017f3e2f5db241f915051c67618
|
||||
|
|
@ -0,0 +1 @@
|
|||
b173c93e5f8c288f2f76644272b5a07bd520b5a1
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
[Appearance/Misc]
|
||||
- fixed : LLAppearanceMgr::filterWearableItems() doesn't properly filter body parts
|
||||
- fixed : LLWearableList::processGetAssetReply() creates multiple LLWearable instances for the same asset UUID
|
||||
-> fix for http://jira.secondlife.com/browse/VWR-20608
|
||||
- fixed : attachments sometimes detach only to instantly get reattached after logon
|
||||
- fixed : Add to/Replace Outfit removes newly worn attachments on completion
|
||||
-> fix for http://jira.secondlife.com/browse/VWR-18512
|
||||
- fixed : LLWearableBridge::removeAllClothesFromAvatar() doesn't remove all clothing from the avatar
|
||||
- fixed : attachments that attach and then instantly detach don't have their COF link removed
|
||||
- fixed : multiple LLWearableHoldingPattern instances lead to "COF corruption"
|
||||
- fixed : get_is_item_worn() shouldn't make the assumption that items in COFs are always worn
|
||||
- fixed : drag-and-drop wear behaviour of an attachment onto self isn't consistant with the drag-and-drop behaviour of wearables
|
||||
-> normal-drop : replace wear
|
||||
-> Ctrl-drop : add wear
|
||||
- fixed : LLAppearanceMgr::registerAttachment() fails to (re)add a link for worn attachments that aren't linked to in COF at log-on
|
||||
- changed : deprecated removeItemFromAvatar() in favour of having LLAppearanceMgr::removeItemFromAvatar() handle it directly/correctly
|
||||
-> wearables can't be worn/removed in 2.X without the viewer already having an LLWearable instance for it anyway
|
||||
- changed : enable "Replace Current Outfit" on the base outfit if it's marked dirty
|
||||
- changed : "RenderUnloadedAvatar" no longer affects the user's own avatar
|
||||
-> side-effect of the fix above due to the change to LLVOAvatar::isFullyLoaded()
|
||||
- added : InitialWearablesLoadedSignal signal which is emitted *once* when the initial wearables are loaded
|
||||
- added : LegacyMultiAttachmentSupport debug setting to route "secondary attachment points" to the primary attachment point
|
||||
-> maps secondary attachment point range [39,68] onto [1,30]
|
||||
-> only dislays "secondary attachment points" correctly for *other* avatars (by design)
|
||||
|
|
@ -0,0 +1 @@
|
|||
b173c93e5f8c288f2f76644272b5a07bd520b5a1
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[Appearance/MixedViewers]
|
||||
- fixed : "Worn items in Viewer 2 and Viewer 1.x aren't synchronized" (http://jira.secondlife.com/browse/VWR-17594)
|
||||
-> current fix compares *only* the wearables in COF with the wearables specified by AgentWearablesUpdate
|
||||
- fixed : minor memory leak in LLInitialWearablesFetch::processWearablesMessage()
|
||||
|
|
@ -0,0 +1 @@
|
|||
dc4e4cc3b9f3a313e19480bac7c6d37309919f39
|
||||
|
|
@ -0,0 +1 @@
|
|||
aeb7e6c3834174a472d261a89aee5462ff17cab5
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[Viewer/Build]
|
||||
- changed : compiler options for "Release with Debug" builds
|
||||
- changed : compiler and linker options for "Release" builds
|
||||
- added : imported SNOW-788 - Fix boost lib detection with Visual Studio to allow multiple VS versions
|
||||
- changed : removed LL's changeset tags and added new (consistent) SL-2.X.Y tags for releases
|
||||
7
.hgtags
7
.hgtags
|
|
@ -1,24 +1,28 @@
|
|||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2.1.1-release
|
||||
003dd9461bfa479049afcc34545ab3431b147c7c v2start
|
||||
08398e650c222336bb2b6de0cd3bba944aef11b4 2-1rn1
|
||||
0962101bfa7df0643a6e625786025fe7f8a6dc97 2-1-beta-2
|
||||
12769e547e30067d494a6c01479a18107366ce2f beta-5
|
||||
1415e6538d54fd5d568ee88343424d57c6803c2c SL-2.2.0
|
||||
17fc2908e9a1ef34a9f53a41a393caf5c3cac390 beta-3-5
|
||||
19547b909b404552593be5ec7c18241e062a6d65 2-1-1-beta-1
|
||||
1e2b517adc2ecb342cd3c865f2a6ccf82a3cf8d7 2-1-beta-3
|
||||
3469d90a115b900f8f250e137bbd9b684130f5d2 beta-4
|
||||
3e4b947f79d88c385e8218cbc0731cef0e42cfc4 2-1-beta-1
|
||||
46002088d9a4489e323b8d56131c680eaa21258c viewer-2-1-0-start
|
||||
4f777ffb99fefdc6497c61385c22688ff149c659 SL-2.0.0
|
||||
4f777ffb99fefdc6497c61385c22688ff149c659 viewer-2-0-0
|
||||
52d96ad3d39be29147c5b2181b3bb46af6164f0e alpha-3
|
||||
668851b2ef0f8cf8df07a0fba429e4a6c1e70abb viewer-2-0-1
|
||||
668851b2ef0f8cf8df07a0fba429e4a6c1e70abb SL-2.0.1
|
||||
6e3b2e13906ba8ff22d3c8490b02d518adb2c907 2-1-1-beta-2
|
||||
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f alpha-4
|
||||
7f16e79826d377f5f9f5b33dc721ab56d0d7dc8f fork to viewer-20qa
|
||||
80bc6cff515118a36108967af49d3f8105c95bc9 viewer-2-0-2-start
|
||||
b03065d018b8a2e28b7de85b293a4c992cb4c12d 2-1-release
|
||||
b03065d018b8a2e28b7de85b293a4c992cb4c12d SL-2.1.0
|
||||
b8419565906e4feb434426d8d9b17dd1458e24b2 alpha-6
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 2-1-1-release
|
||||
bb38ff1a763738609e1b3cada6d15fa61e5e84b9 SL-2.1.1
|
||||
c6969fe44e58c542bfc6f1bd6c0be2fa860929ac 2-1-beta-4
|
||||
d2382d374139850efa5bb6adfb229e3e656cfc40 howard-demo
|
||||
d40ac9dd949cba6dab1cc386da6a2027690c2519 alpha-5
|
||||
|
|
@ -35,3 +39,4 @@ b0cd7e150009809a0b5b0a9d5785cd4bb230413a 2.2.0-beta3
|
|||
a3c12342b1af0951b8aa3b828aacef17fcea8178 2.3.0-beta1
|
||||
db0fe9bb65187f365e58a717dd23d0f4754a9c1d 2.3.0-beta2
|
||||
6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-beta3
|
||||
425f96b1e81e01644bf5e951961e7d1023bffb89 RLVa-1.2.0
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
Please keep this updated with major user-facing features we add to firestorm beyond LL-snowstorm
|
||||
|
||||
FEATURE LICENSE
|
||||
|
||||
RLVa LGPL
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
phoenix-firestorm-gpl = GPL Contributions
|
||||
phoenix-firestorm-lgpl = LGPL Contributions ONLY!
|
||||
phoenix-firestorm-int = Do not use - for build integration testing
|
||||
and upstream merges.
|
||||
|
||||
|
||||
If you are working on the -gpl branch, you may merge FROM -lgpl
|
||||
|
||||
No changes from -gpl should ever be merged to -lgpl. Code can flow in one direction only.
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
First set up your system as described in the snowstorm linux wiki.
|
||||
- Additionally, make sure gcc-4.3 ang g++-4.3 are installed.
|
||||
- We do non-standalone builds
|
||||
|
||||
Run ./build_firestorm_linux.sh
|
||||
|
||||
NOTE: IF you receive build failures related to libUUID, copy your system libUUID library over the download supplied by SL:
|
||||
cd /your/firestorm/code/tree
|
||||
cp /lib/libuuid.so.1.3.0 libraries/i686-linux/lib_release_client/libuuid.so
|
||||
cp /lib/libuuid.so.1.3.0 libraries/i686-linux/lib_release_client/libuuid.so.1
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
Make sure xcode is installed, with the GCC 4.0 option.
|
||||
- Additionally, patch your source directory with fmodmacapi per the older snowglobe instructions.
|
||||
- run ./build_firestorm_macosx.sh
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
Before you start configuring your Windows build system, be aware of our tested configurations:
|
||||
Memory: You will need at least 2GB RAM
|
||||
CPU: Multiple CPUs are strongly recommended. A build can take over an hour.
|
||||
Tested Build Environments:
|
||||
WinXPSP3, 32bit, 2GB RAM, Visual Studio Pro 2005 SP1, latest VC++ runtime installed
|
||||
|
||||
If you are not using something that closely matches a tested configuration, you may run into trouble,
|
||||
particularly with different versions of Visual Studio.
|
||||
|
||||
To get started, follow the snowstorm instructions for setting up a windows build environment at this page:
|
||||
http://wiki.secondlife.com/wiki/Viewer_2_Microsoft_Windows_Builds
|
||||
|
||||
GET THE PHOENIX SOURCE
|
||||
======================
|
||||
|
||||
Open up cygwin and run the following commands one at a time
|
||||
mkdir /cygdrive/c/code
|
||||
cd /cygdrive/c/code
|
||||
hg clone http://hg.phoenixviewer.com/phoenix-firestorm-lpgl
|
||||
|
||||
Make sure to copy fmod.dll into both your indra/ folder and also libraries/i686-win32/Release and libraries/RelWithDebInfo
|
||||
|
||||
COMMAND LINE BUILDS
|
||||
===================
|
||||
|
||||
Open up cygwin and navigate to your code directory. Example:
|
||||
cd /cygdrive/c/my/path/to/phoenix-firestorm-lgpl
|
||||
|
||||
Execute the command to build firestorm in the cygwin window:
|
||||
|
||||
./build_firestorm_win32.sh
|
||||
|
||||
This will do a clean compile. Rebuilds should be possible by specifying --rebuild.
|
||||
|
||||
NOTE: It is normal to see errors about ambiguous include/library paths at this time. It will not cause the build to fail
|
||||
|
||||
A log for the build will be placed in logs/build_firestorm_windows.log
|
||||
|
||||
|
||||
VISUAL STUDIO BUILDS
|
||||
====================
|
||||
|
||||
0. Open up a regular CMD.exe command window. Navigate to your downloaded source code.
|
||||
1. Run the command "develop.py -G vc80 -t Release configure -DLL_TESTS:BOOL=OFF"
|
||||
1. Launch Visual Studio and open up <your downloaded phoenix code>\indra\build-vc80\Secondlife.sln
|
||||
2. Set the build type to Release
|
||||
3. Select the "firestorm-bin" target
|
||||
4. Build.
|
||||
2
build.sh
2
build.sh
|
|
@ -228,7 +228,7 @@ do
|
|||
fi
|
||||
else
|
||||
begin_section "Build$variant"
|
||||
build "$variant" "$build_dir" >> "$build_log" 2>&1
|
||||
build "$variant" "$build_dir" > "$build_log" 2>&1
|
||||
begin_section Tests
|
||||
grep --line-buffered "^##teamcity" "$build_log"
|
||||
end_section Tests
|
||||
|
|
|
|||
|
|
@ -0,0 +1,67 @@
|
|||
#!/bin/bash
|
||||
|
||||
###
|
||||
### Constants
|
||||
###
|
||||
|
||||
TRUE=0 # Map the shell's idea of truth to a variable for better documentation
|
||||
FALSE=1
|
||||
LOG="`pwd`/logs/build_linux.log"
|
||||
|
||||
###
|
||||
### Global Variables
|
||||
###
|
||||
|
||||
WANTS_CLEAN=$TRUE
|
||||
WANTS_CONFIG=$TRUE
|
||||
WANTS_BUILD=$TRUE
|
||||
WANTS_PACKAGE=$TRUE
|
||||
WANTS_VERSION=$TRUE
|
||||
|
||||
###
|
||||
### Helper Functions
|
||||
###
|
||||
|
||||
if [ "$1" == "--rebuild" ] ; then
|
||||
echo "rebuilding..."
|
||||
WANTS_CLEAN=$FALSE
|
||||
WANTS_CONFIG=$FALSE
|
||||
WANTS_VERSION=$FALSE
|
||||
fi
|
||||
|
||||
###
|
||||
### Main Logic
|
||||
###
|
||||
|
||||
export CC=/usr/bin/gcc-4.3
|
||||
export CXX=/usr/bin/g++-4.3
|
||||
export CMAKE_CXX_FLAGS_RELEASE="-O3 -msse -msse2"
|
||||
if [ ! -d `dirname $LOG` ] ; then
|
||||
mkdir -p `dirname $LOG`
|
||||
fi
|
||||
|
||||
pushd indra
|
||||
if [ $WANTS_CLEAN -eq $TRUE ] ; then
|
||||
./develop.py -t release clean
|
||||
find . -name "*.pyc" -exec rm {} \;
|
||||
fi
|
||||
|
||||
if [ $WANTS_CONFIG -eq $TRUE ] ; then
|
||||
mkdir -p ../logs > /dev/null 2>&1
|
||||
./develop.py -t release | tee $LOG
|
||||
fi
|
||||
|
||||
if [ $WANTS_VERSION -eq $TRUE ] ; then
|
||||
echo -n "Updating build version to "
|
||||
buildVer=`grep -o -e "LL_VERSION_BUILD = [0-9]\+" llcommon/llversionviewer.h | cut -f 3 -d " "`
|
||||
echo $((++buildVer))
|
||||
sed -e "s#LL_VERSION_BUILD = [0-9][0-9]*#LL_VERSION_BUILD = ${buildVer}#" llcommon/llversionviewer.h > llcommon/llversionviewer.h1
|
||||
mv llcommon/llversionviewer.h1 llcommon/llversionviewer.h
|
||||
fi
|
||||
|
||||
if [ $WANTS_BUILD -eq $TRUE ] ; then
|
||||
echo "Building in progress... Check $LOG for verbose status"
|
||||
./develop.py -t release build 2>&1 | tee $LOG | grep -e "make.*Error "
|
||||
echo "Complete"
|
||||
fi
|
||||
popd
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
#!/bin/bash
|
||||
|
||||
###
|
||||
### Constants
|
||||
###
|
||||
|
||||
TRUE=0 # Map the shell's idea of truth to a variable for better documentation
|
||||
FALSE=1
|
||||
LOG="`pwd`/logs/build_macosx.log"
|
||||
|
||||
###
|
||||
### Global Variables
|
||||
###
|
||||
|
||||
WANTS_CLEAN=$TRUE
|
||||
WANTS_CONFIG=$TRUE
|
||||
WANTS_BUILD=$TRUE
|
||||
WANTS_PACKAGE=$TRUE
|
||||
|
||||
###
|
||||
### Helper Functions
|
||||
###
|
||||
|
||||
if [ "$1" == "--rebuild" ] ; then
|
||||
echo "rebuilding..."
|
||||
WANTS_CLEAN=$FALSE
|
||||
WANTS_CONFIG=$FALSE
|
||||
fi
|
||||
|
||||
###
|
||||
### Main Logic
|
||||
###
|
||||
|
||||
if [ ! -d `dirname $LOG` ] ; then
|
||||
mkdir -p `dirname $LOG`
|
||||
fi
|
||||
|
||||
pushd indra
|
||||
if [ $WANTS_CLEAN -eq $TRUE ] ; then
|
||||
./develop.py clean
|
||||
find . -name "*.pyc" -exec rm {} \;
|
||||
fi
|
||||
|
||||
if [ $WANTS_CONFIG -eq $TRUE ] ; then
|
||||
mkdir -p ../logs > /dev/null 2>&1
|
||||
./develop.py -t Release | tee $LOG
|
||||
mkdir -p ./build-darwin-i386/newview/Release/Firestorm.app # work around LL bug
|
||||
fi
|
||||
|
||||
if [ $WANTS_BUILD -eq $TRUE ] ; then
|
||||
echo -n "Updating build version to "
|
||||
buildVer=`grep -o -e "LL_VERSION_BUILD = [0-9]\+" llcommon/llversionviewer.h | cut -f 3 -d " "`
|
||||
echo $((++buildVer))
|
||||
sed -e "s#LL_VERSION_BUILD = [0-9][0-9]*#LL_VERSION_BUILD = ${buildVer}#" llcommon/llversionviewer.h > llcommon/llversionviewer.h1
|
||||
mv llcommon/llversionviewer.h1 llcommon/llversionviewer.h
|
||||
|
||||
|
||||
echo "Building in progress... Check $LOG for verbose status"
|
||||
# -sdk macosx10.6
|
||||
xcodebuild -project build-darwin-i386/SecondLife.xcodeproj -alltargets -configuration Release GCC_VERSION=4.2 -sdk macosx10.6 GCC_OPTIMIZATION_LEVEL=3 ARCHS=i386 GCC_ENABLE_SSE3_EXTENSIONS=YES 2>&1 | tee $LOG | grep -e "[(make.*Error)|(xcodebuild.*Error)] "
|
||||
echo "Complete"
|
||||
fi
|
||||
popd
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
#!/bin/bash
|
||||
|
||||
###
|
||||
### Constants
|
||||
###
|
||||
|
||||
TRUE=0 # Map the shell's idea of truth to a variable for better documentation
|
||||
FALSE=1
|
||||
|
||||
# If you have some other version of python installed other than 26, do not edit this file.
|
||||
# Add a line like this to ~/.bashrc:
|
||||
# WINPYTHON="/cygdrive/c/path_to_your_python.exe"
|
||||
# And then close and restart cygwin
|
||||
if [ -z $WINPYTHON ] ; then
|
||||
WINPYTHON="/cygdrive/c/Python26/python.exe"
|
||||
LOG="`pwd`/logs/build_win32.log"
|
||||
|
||||
###
|
||||
### Global Variables
|
||||
###
|
||||
|
||||
WANTS_CLEAN=$TRUE
|
||||
WANTS_CONFIG=$TRUE
|
||||
WANTS_BUILD=$TRUE
|
||||
WANTS_PACKAGE=$TRUE
|
||||
|
||||
###
|
||||
### Helper Functions
|
||||
###
|
||||
|
||||
if [ "$1" == "--rebuild" ] ; then
|
||||
echo "rebuilding..."
|
||||
WANTS_CLEAN=$FALSE
|
||||
WANTS_CONFIG=$FALSE
|
||||
fi
|
||||
|
||||
###
|
||||
### Main Logic
|
||||
###
|
||||
|
||||
path=$WINPATH:/usr/local/bin:/usr/bin:/bin
|
||||
if [ ! -f "$WINPYTHON" ] ; then
|
||||
echo "ERROR: You need to edit .bashrc and set WINPYTHON at the top to point at the path of your windows python executable."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
pushd indra
|
||||
if [ $WANTS_CLEAN -eq $TRUE ] ; then
|
||||
$WINPYTHON develop.py clean
|
||||
find . -name "*.pyc" -exec rm {} \;
|
||||
fi
|
||||
|
||||
|
||||
if [ $WANTS_CONFIG -eq $TRUE ] ; then
|
||||
mkdir -p ../logs > /dev/null 2>&1
|
||||
$WINPYTHON develop.py -G vc80 -t Release configure -DPACKAGE:BOOL=ON -DLL_TESTS:BOOL=OFF 2>&1 | tee $LOG
|
||||
mkdir -p build-vc80/sharedlibs/RelWithDebInfo
|
||||
mkdir -p build-vc80/sharedlibs/Release
|
||||
cp fmod.dll ./build-vc80/sharedlibs/RelWithDebInfo
|
||||
cp fmod.dll ./build-vc80/sharedlibs/Release
|
||||
fi
|
||||
|
||||
if [ $WANTS_BUILD -eq $TRUE ] ; then
|
||||
echo -n "Updating build version to "
|
||||
buildVer=`grep -o -e "LL_VERSION_BUILD = [0-9]\+" llcommon/llversionviewer.h | cut -f 3 -d " "`
|
||||
echo $((++buildVer))
|
||||
sed -e "s#LL_VERSION_BUILD = [0-9][0-9]*#LL_VERSION_BUILD = ${buildVer}#" llcommon/llversionviewer.h > llcommon/llversionviewer.h1
|
||||
mv llcommon/llversionviewer.h1 llcommon/llversionviewer.h
|
||||
|
||||
|
||||
echo "Building in progress... Check $LOG for verbose status"
|
||||
$WINPYTHON develop.py -G vc80 -t Release build 2>&1 | tee -a $LOG | grep Build
|
||||
echo "Complete"
|
||||
fi
|
||||
popd
|
||||
|
||||
|
|
@ -62,25 +62,20 @@ Alejandro Rosenthal
|
|||
VWR-1184
|
||||
Aleric Inglewood
|
||||
SNOW-522
|
||||
SNOW-626
|
||||
SNOW-756
|
||||
SNOW-764
|
||||
VWR-10001
|
||||
VWR-10759
|
||||
VWR-10837
|
||||
VWR-12691
|
||||
VWR-12984
|
||||
VWR-13996
|
||||
VWR-14426
|
||||
SNOW-84
|
||||
SNOW-477
|
||||
SNOW-766
|
||||
STORM-163
|
||||
Ales Beaumont
|
||||
VWR-9352
|
||||
SNOW-240
|
||||
Alexandrea Fride
|
||||
STORM-255
|
||||
Alissa Sabre
|
||||
VWR-81
|
||||
VWR-83
|
||||
|
|
@ -129,7 +124,6 @@ Alissa Sabre
|
|||
VWR-12617
|
||||
VWR-12620
|
||||
VWR-12789
|
||||
SNOW-322
|
||||
Angus Boyd
|
||||
VWR-592
|
||||
Ann Congrejo
|
||||
|
|
@ -146,7 +140,6 @@ Asuka Neely
|
|||
Balp Allen
|
||||
VWR-4157
|
||||
Be Holder
|
||||
SNOW-322
|
||||
SNOW-397
|
||||
Benja Kepler
|
||||
VWR-746
|
||||
|
|
@ -180,7 +173,6 @@ Boroondas Gupte
|
|||
VWR-233
|
||||
VWR-20583
|
||||
VWR-20891
|
||||
VWR-23455
|
||||
WEB-262
|
||||
Bulli Schumann
|
||||
CT-218
|
||||
|
|
@ -210,8 +202,6 @@ Catherine Pfeffer
|
|||
Celierra Darling
|
||||
VWR-1274
|
||||
VWR-6975
|
||||
Cypren Christenson
|
||||
STORM-417
|
||||
Dale Glass
|
||||
VWR-120
|
||||
VWR-560
|
||||
|
|
@ -391,8 +381,6 @@ Malwina Dollinger
|
|||
CT-138
|
||||
march Korda
|
||||
SVC-1020
|
||||
Marine Kelley
|
||||
STORM-281
|
||||
Matthew Dowd
|
||||
VWR-1344
|
||||
VWR-1651
|
||||
|
|
@ -542,7 +530,6 @@ Pf Shan
|
|||
CT-230
|
||||
CT-231
|
||||
CT-321
|
||||
SNOW-422
|
||||
princess niven
|
||||
VWR-5733
|
||||
CT-85
|
||||
|
|
@ -600,8 +587,6 @@ Salahzar Stenvaag
|
|||
CT-321
|
||||
Sammy Frederix
|
||||
VWR-6186
|
||||
Satomi Ahn
|
||||
STORM-501
|
||||
Scrippy Scofield
|
||||
VWR-3748
|
||||
Seg Baphomet
|
||||
|
|
@ -660,7 +645,6 @@ Strife Onizuka
|
|||
VWR-183
|
||||
VWR-2265
|
||||
VWR-4111
|
||||
SNOW-691
|
||||
Tayra Dagostino
|
||||
SNOW-517
|
||||
SNOW-543
|
||||
|
|
@ -770,9 +754,6 @@ WolfPup Lowenhar
|
|||
VWR-20933
|
||||
Zai Lynch
|
||||
VWR-19505
|
||||
Wolfpup Lowenhar
|
||||
STORM-255
|
||||
STORM-256
|
||||
Zarkonnen Decosta
|
||||
VWR-253
|
||||
Zi Ree
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ if (VIEWER)
|
|||
endif (LINUX)
|
||||
|
||||
add_subdirectory(${VIEWER_PREFIX}newview)
|
||||
add_dependencies(viewer secondlife-bin)
|
||||
add_dependencies(viewer firestorm-bin)
|
||||
endif (VIEWER)
|
||||
|
||||
# Linux builds the viewer and server in 2 separate projects
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ if (WINDOWS)
|
|||
# Don't build DLLs.
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP"
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MD /MP"
|
||||
CACHE STRING "C++ compiler debug options" FORCE)
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
|
||||
"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP"
|
||||
|
|
@ -78,6 +78,7 @@ if (WINDOWS)
|
|||
# configure win32 API for windows XP+ compatibility
|
||||
set(WINVER "0x0501" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)")
|
||||
add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}")
|
||||
|
||||
endif (WINDOWS)
|
||||
|
||||
|
||||
|
|
@ -181,7 +182,7 @@ if (LINUX)
|
|||
endif (VIEWER)
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O2 ${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
endif (LINUX)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,26 +1,64 @@
|
|||
# -*- cmake -*-
|
||||
|
||||
set(FMOD ON CACHE BOOL "Use FMOD sound library.")
|
||||
|
||||
if (FMOD)
|
||||
if (STANDALONE)
|
||||
set(FMOD_FIND_REQUIRED ON)
|
||||
include(FindFMOD)
|
||||
else (STANDALONE)
|
||||
if (INSTALL_PROPRIETARY)
|
||||
include(Prebuilt)
|
||||
use_prebuilt_binary(fmod)
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
if (WINDOWS)
|
||||
set(FMOD_LIBRARY fmod)
|
||||
elseif (DARWIN)
|
||||
set(FMOD_LIBRARY fmod)
|
||||
elseif (LINUX)
|
||||
set(FMOD_LIBRARY fmod-3.75)
|
||||
endif (WINDOWS)
|
||||
|
||||
SET(FMOD_LIBRARIES ${FMOD_LIBRARY})
|
||||
set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
|
||||
endif (STANDALONE)
|
||||
endif (FMOD)
|
||||
# -*- cmake -*-
|
||||
|
||||
include(Linking)
|
||||
|
||||
if(INSTALL_PROPRIETARY)
|
||||
include(Prebuilt)
|
||||
use_prebuilt_binary(fmod)
|
||||
endif(INSTALL_PROPRIETARY)
|
||||
|
||||
find_library(FMOD_LIBRARY_RELEASE
|
||||
NAMES fmod fmodvc fmod-3.75
|
||||
PATHS
|
||||
${ARCH_PREBUILT_DIRS_RELEASE}
|
||||
)
|
||||
|
||||
find_library(FMOD_LIBRARY_DEBUG
|
||||
NAMES fmod fmodvc fmod-3.75
|
||||
PATHS
|
||||
${ARCH_PREBUILT_DIRS_DEBUG}
|
||||
)
|
||||
|
||||
if (FMOD_LIBRARY_RELEASE AND FMOD_LIBRARY_DEBUG)
|
||||
set(FMOD_LIBRARY
|
||||
debug ${FMOD_LIBRARY_DEBUG}
|
||||
optimized ${FMOD_LIBRARY_RELEASE})
|
||||
elseif (FMOD_LIBRARY_RELEASE)
|
||||
set(FMOD_LIBRARY ${FMOD_LIBRARY_RELEASE})
|
||||
endif (FMOD_LIBRARY_RELEASE AND FMOD_LIBRARY_DEBUG)
|
||||
|
||||
if (NOT FMOD_LIBRARY)
|
||||
set(FMOD_SDK_DIR CACHE PATH "Path to the FMOD SDK.")
|
||||
if (FMOD_SDK_DIR)
|
||||
find_library(FMOD_LIBRARY
|
||||
NAMES fmodvc fmod-3.75 fmod
|
||||
PATHS
|
||||
${FMOD_SDK_DIR}/api/lib
|
||||
${FMOD_SDK_DIR}/api
|
||||
${FMOD_SDK_DIR}/lib
|
||||
${FMOD_SDK_DIR}
|
||||
)
|
||||
endif (FMOD_SDK_DIR)
|
||||
endif (NOT FMOD_LIBRARY)
|
||||
|
||||
find_path(FMOD_INCLUDE_DIR fmod.h
|
||||
${LIBS_PREBUILT_DIR}/include
|
||||
${FMOD_SDK_DIR}/api/inc
|
||||
${FMOD_SDK_DIR}/inc
|
||||
${FMOD_SDK_DIR}
|
||||
)
|
||||
|
||||
if (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
|
||||
set(FMOD ON CACHE BOOL "Use closed source FMOD sound library.")
|
||||
else (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
|
||||
set(FMOD_LIBRARY "")
|
||||
set(FMOD_INCLUDE_DIR "")
|
||||
if (FMOD)
|
||||
message(STATUS "No support for FMOD audio (need to set FMOD_SDK_DIR?)")
|
||||
endif (FMOD)
|
||||
set(FMOD OFF CACHE BOOL "Use closed source FMOD sound library.")
|
||||
endif (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
|
||||
|
||||
if (FMOD)
|
||||
message(STATUS "Building with FMOD audio support")
|
||||
endif (FMOD)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# -*- cmake -*-
|
||||
#
|
||||
# Definitions of variables used throughout the Second Life build
|
||||
# Definitions of variables used throughout the build
|
||||
# process.
|
||||
#
|
||||
# Platform variables:
|
||||
|
|
@ -121,8 +121,8 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|||
# Default deploy grid
|
||||
set(GRID agni CACHE STRING "Target Grid")
|
||||
|
||||
set(VIEWER ON CACHE BOOL "Build Second Life viewer.")
|
||||
set(VIEWER_CHANNEL "LindenDeveloper" CACHE STRING "Viewer Channel Name")
|
||||
set(VIEWER ON CACHE BOOL "Build Firestorm viewer.")
|
||||
set(VIEWER_CHANNEL "FirestormDeveloper" CACHE STRING "Viewer Channel Name")
|
||||
set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for A/B Testing")
|
||||
|
||||
set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.")
|
||||
|
|
|
|||
|
|
@ -663,7 +663,7 @@ class WindowsSetup(PlatformSetup):
|
|||
' --solution ' +
|
||||
os.path.join(build_dir,'SecondLife.sln') +
|
||||
' --config ' + self.build_type +
|
||||
' --startup secondlife-bin')
|
||||
' --startup firestorm-bin')
|
||||
print 'Running %r in %r' % (vstool_cmd, getcwd())
|
||||
self.run(vstool_cmd, name=executable)
|
||||
print >> open(stamp, 'w'), self.build_type
|
||||
|
|
|
|||
|
|
@ -19,13 +19,13 @@ def main():
|
|||
'*.ilk','*.lib','*.obj','*.ib_pdb_index']
|
||||
pch_types = ['*.pch']
|
||||
delete_file_types("build-vc80/newview/Release", build_types)
|
||||
delete_file_types("build-vc80/newview/secondlife-bin.dir/Release/",
|
||||
delete_file_types("build-vc80/newview/firestorm-bin.dir/Release/",
|
||||
pch_types)
|
||||
delete_file_types("build-vc80/newview/RelWithDebInfo", build_types)
|
||||
delete_file_types("build-vc80/newview/secondlife-bin.dir/RelWithDebInfo/",
|
||||
delete_file_types("build-vc80/newview/firestorm-bin.dir/RelWithDebInfo/",
|
||||
pch_types)
|
||||
delete_file_types("build-vc80/newview/Debug", build_types)
|
||||
delete_file_types("build-vc80/newview/secondlife-bin.dir/Debug/",
|
||||
delete_file_types("build-vc80/newview/firestorm-bin.dir/Debug/",
|
||||
pch_types)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,18 @@
|
|||
|
||||
#include <iostream>
|
||||
|
||||
//RLVa
|
||||
#include "llavatarname.h"
|
||||
#include <string>
|
||||
|
||||
std::string rlvGetAnonym(const LLAvatarName& avName)
|
||||
{
|
||||
return "someone";
|
||||
}
|
||||
|
||||
|
||||
//</RLVa>
|
||||
|
||||
// *TODO: switch to using TUT
|
||||
// *TODO: teach Parabuild about this program, run automatically after full builds
|
||||
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ def get_channel(srctree):
|
|||
|
||||
|
||||
DEFAULT_SRCTREE = os.path.dirname(sys.argv[0])
|
||||
DEFAULT_CHANNEL = 'Second Life Release'
|
||||
DEFAULT_CHANNEL = 'Firestorm Development'
|
||||
|
||||
ARGUMENTS=[
|
||||
dict(name='actions',
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ include(LLVFS)
|
|||
|
||||
include_directories(
|
||||
${LLAUDIO_INCLUDE_DIRS}
|
||||
${FMOD_INCLUDE_DIR}
|
||||
${LLCOMMON_INCLUDE_DIRS}
|
||||
${LLMATH_INCLUDE_DIRS}
|
||||
${LLMESSAGE_INCLUDE_DIRS}
|
||||
|
|
@ -44,10 +45,6 @@ set(llaudio_HEADER_FILES
|
|||
)
|
||||
|
||||
if (FMOD)
|
||||
include_directories(
|
||||
${FMOD_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
list(APPEND llaudio_SOURCE_FILES
|
||||
llaudioengine_fmod.cpp
|
||||
lllistener_fmod.cpp
|
||||
|
|
|
|||
|
|
@ -120,13 +120,6 @@ S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& erro
|
|||
+ ((U32) wav_header[5] << 8)
|
||||
+ wav_header[4];
|
||||
|
||||
if (chunk_length > physical_file_size - file_pos - 4)
|
||||
{
|
||||
infile.close();
|
||||
error_msg = "SoundFileInvalidChunkSize";
|
||||
return(LLVORBISENC_CHUNK_SIZE_ERR);
|
||||
}
|
||||
|
||||
// llinfos << "chunk found: '" << wav_header[0] << wav_header[1] << wav_header[2] << wav_header[3] << "'" << llendl;
|
||||
|
||||
if (!(strncmp((char *)&(wav_header[0]),"fmt ",4)))
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@ const S32 LLVORBISENC_MULTICHANNEL_ERR = 7; // can't do stereo
|
|||
const S32 LLVORBISENC_UNSUPPORTED_SAMPLE_RATE = 8; // unsupported sample rate
|
||||
const S32 LLVORBISENC_UNSUPPORTED_WORD_SIZE = 9; // unsupported word size
|
||||
const S32 LLVORBISENC_CLIP_TOO_LONG = 10; // source file is too long
|
||||
const S32 LLVORBISENC_CHUNK_SIZE_ERR = 11; // chunk size is wrong
|
||||
|
||||
const F32 LLVORBIS_CLIP_MAX_TIME = 10.0f;
|
||||
const U8 LLVORBIS_CLIP_MAX_CHANNELS = 2;
|
||||
|
|
|
|||
|
|
@ -1,25 +1,31 @@
|
|||
/**
|
||||
* @file imageids.cpp
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* 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.
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* 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.
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* 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
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -80,6 +80,10 @@ public:
|
|||
mChatType(CHAT_TYPE_NORMAL),
|
||||
mAudible(CHAT_AUDIBLE_FULLY),
|
||||
mMuted(FALSE),
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Modified: RLVa-1.0.0a
|
||||
mRlvLocFiltered(FALSE),
|
||||
mRlvNamesFiltered(FALSE),
|
||||
// [/RLVa:KB]
|
||||
mTime(0.0),
|
||||
mTimeStr(),
|
||||
mPosAgent(),
|
||||
|
|
@ -97,6 +101,10 @@ public:
|
|||
EChatType mChatType;
|
||||
EChatAudible mAudible;
|
||||
BOOL mMuted; // pass muted chat to maintain list of chatters
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Modified: RLVa-1.0.0a
|
||||
BOOL mRlvLocFiltered;
|
||||
BOOL mRlvNamesFiltered;
|
||||
// [/RLVa:KB]
|
||||
F64 mTime; // viewer only, seconds from viewer start
|
||||
std::string mTimeStr;
|
||||
LLVector3 mPosAgent;
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ public:
|
|||
|
||||
LLDynamicArray(S32 size=0) : std::vector<Type>(size) { if (size < BlockSize) std::vector<Type>::reserve(BlockSize); }
|
||||
|
||||
void reset() { std::vector<Type>::clear(); }
|
||||
void reset() { std::vector<Type>::resize(0); }
|
||||
|
||||
// ACCESSORS
|
||||
const Type& get(S32 index) const { return std::vector<Type>::operator[](index); }
|
||||
|
|
|
|||
|
|
@ -30,9 +30,9 @@
|
|||
const S32 LL_VERSION_MAJOR = 2;
|
||||
const S32 LL_VERSION_MINOR = 4;
|
||||
const S32 LL_VERSION_PATCH = 0;
|
||||
const S32 LL_VERSION_BUILD = 0;
|
||||
const S32 LL_VERSION_BUILD = 58;
|
||||
|
||||
const char * const LL_CHANNEL = "Second Life Developer";
|
||||
const char * const LL_CHANNEL = "Firestorm Developer";
|
||||
|
||||
#if LL_DARWIN
|
||||
const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer";
|
||||
|
|
|
|||
|
|
@ -610,46 +610,41 @@ void LLGLManager::shutdownGL()
|
|||
void LLGLManager::initExtensions()
|
||||
{
|
||||
#if LL_MESA_HEADLESS
|
||||
# ifdef GL_ARB_multitexture
|
||||
# if GL_ARB_multitexture
|
||||
mHasMultitexture = TRUE;
|
||||
# else
|
||||
mHasMultitexture = FALSE;
|
||||
# endif
|
||||
# ifdef GL_ARB_texture_env_combine
|
||||
# if GL_ARB_texture_env_combine
|
||||
mHasARBEnvCombine = TRUE;
|
||||
# else
|
||||
mHasARBEnvCombine = FALSE;
|
||||
# endif
|
||||
# ifdef GL_ARB_texture_compression
|
||||
# if GL_ARB_texture_compression
|
||||
mHasCompressedTextures = TRUE;
|
||||
# else
|
||||
mHasCompressedTextures = FALSE;
|
||||
# endif
|
||||
# ifdef GL_ARB_vertex_buffer_object
|
||||
# if GL_ARB_vertex_buffer_object
|
||||
mHasVertexBufferObject = TRUE;
|
||||
# else
|
||||
mHasVertexBufferObject = FALSE;
|
||||
# endif
|
||||
# ifdef GL_EXT_framebuffer_object
|
||||
# if GL_EXT_framebuffer_object
|
||||
mHasFramebufferObject = TRUE;
|
||||
# else
|
||||
mHasFramebufferObject = FALSE;
|
||||
# endif
|
||||
# ifdef GL_EXT_framebuffer_multisample
|
||||
# if GL_EXT_framebuffer_multisample
|
||||
mHasFramebufferMultisample = TRUE;
|
||||
# else
|
||||
mHasFramebufferMultisample = FALSE;
|
||||
# endif
|
||||
# ifdef GL_ARB_draw_buffers
|
||||
# if GL_ARB_draw_buffers
|
||||
mHasDrawBuffers = TRUE;
|
||||
#else
|
||||
mHasDrawBuffers = FALSE;
|
||||
# endif
|
||||
# if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp)
|
||||
mHasDepthClamp = TRUE;
|
||||
#else
|
||||
mHasDepthClamp = FALSE;
|
||||
#endif
|
||||
# if GL_EXT_blend_func_separate
|
||||
mHasBlendFuncSeparate = TRUE;
|
||||
#else
|
||||
|
|
@ -676,7 +671,6 @@ void LLGLManager::initExtensions()
|
|||
mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression");
|
||||
mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
|
||||
mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
|
||||
mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
|
||||
// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
|
||||
mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts)
|
||||
&& ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts);
|
||||
|
|
@ -700,7 +694,6 @@ void LLGLManager::initExtensions()
|
|||
if (getenv("LL_GL_NOEXT"))
|
||||
{
|
||||
//mHasMultitexture = FALSE; // NEEDED!
|
||||
mHasDepthClamp = FALSE;
|
||||
mHasARBEnvCombine = FALSE;
|
||||
mHasCompressedTextures = FALSE;
|
||||
mHasVertexBufferObject = FALSE;
|
||||
|
|
@ -762,7 +755,6 @@ void LLGLManager::initExtensions()
|
|||
if (strchr(blacklist,'s')) mHasFramebufferMultisample = FALSE;
|
||||
if (strchr(blacklist,'t')) mHasTextureRectangle = FALSE;
|
||||
if (strchr(blacklist,'u')) mHasBlendFuncSeparate = FALSE;//S
|
||||
if (strchr(blacklist,'v')) mHasDepthClamp = FALSE;
|
||||
|
||||
}
|
||||
#endif // LL_LINUX || LL_SOLARIS
|
||||
|
|
@ -2072,7 +2064,7 @@ void LLGLDepthTest::checkState()
|
|||
}
|
||||
}
|
||||
|
||||
LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P)
|
||||
LLGLClampToFarClip::LLGLClampToFarClip(glh::matrix4f P)
|
||||
{
|
||||
for (U32 i = 0; i < 4; i++)
|
||||
{
|
||||
|
|
@ -2085,7 +2077,7 @@ LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P)
|
|||
glMatrixMode(GL_MODELVIEW);
|
||||
}
|
||||
|
||||
LLGLSquashToFarClip::~LLGLSquashToFarClip()
|
||||
LLGLClampToFarClip::~LLGLClampToFarClip()
|
||||
{
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
|
|
|
|||
|
|
@ -92,7 +92,6 @@ public:
|
|||
BOOL mHasOcclusionQuery;
|
||||
BOOL mHasPointParameters;
|
||||
BOOL mHasDrawBuffers;
|
||||
BOOL mHasDepthClamp;
|
||||
BOOL mHasTextureRectangle;
|
||||
|
||||
// Other extensions.
|
||||
|
|
@ -317,11 +316,11 @@ private:
|
|||
leaves this class.
|
||||
Does not stack.
|
||||
*/
|
||||
class LLGLSquashToFarClip
|
||||
class LLGLClampToFarClip
|
||||
{
|
||||
public:
|
||||
LLGLSquashToFarClip(glh::matrix4f projection);
|
||||
~LLGLSquashToFarClip();
|
||||
LLGLClampToFarClip(glh::matrix4f projection);
|
||||
~LLGLClampToFarClip();
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -829,15 +829,5 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);
|
|||
|
||||
#endif // LL_MESA / LL_WINDOWS / LL_DARWIN
|
||||
|
||||
// Even when GL_ARB_depth_clamp is available in the driver, the (correct)
|
||||
// headers, and therefore GL_DEPTH_CLAMP might not be defined.
|
||||
// In that case GL_DEPTH_CLAMP_NV should be defined, but why not just
|
||||
// use the known numeric.
|
||||
//
|
||||
// To avoid #ifdef's in the code. Just define this here.
|
||||
#ifndef GL_DEPTH_CLAMP
|
||||
// Probably (still) called GL_DEPTH_CLAMP_NV.
|
||||
#define GL_DEPTH_CLAMP 0x864F
|
||||
#endif
|
||||
|
||||
#endif // LL_LLGLHEADERS_H
|
||||
|
|
|
|||
|
|
@ -45,6 +45,10 @@ std::set<std::string> LLFloaterReg::sAlwaysShowableList;
|
|||
|
||||
static LLFloaterRegListener sFloaterRegListener;
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-02-28 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
|
||||
LLFloaterReg::validate_signal_t LLFloaterReg::mValidateSignal;
|
||||
// [/RLVa:KB]
|
||||
|
||||
//*******************************************************
|
||||
|
||||
//static
|
||||
|
|
@ -214,9 +218,12 @@ LLFloaterReg::const_instance_list_t& LLFloaterReg::getFloaterList(const std::str
|
|||
//static
|
||||
LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
|
||||
{
|
||||
if( sBlockShowFloaters
|
||||
// see EXT-7090
|
||||
&& sAlwaysShowableList.find(name) == sAlwaysShowableList.end())
|
||||
// if( sBlockShowFloaters
|
||||
// // see EXT-7090
|
||||
// && sAlwaysShowableList.find(name) == sAlwaysShowableList.end())
|
||||
// [RLVa:KB] - Checked: 2010-02-28 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
|
||||
if ( (sBlockShowFloaters && sAlwaysShowableList.find(name) == sAlwaysShowableList.end()) || (!mValidateSignal(name, key)) )
|
||||
// [/RLVa:KB]
|
||||
return 0;//
|
||||
LLFloater* instance = getInstance(name, key);
|
||||
if (instance)
|
||||
|
|
|
|||
|
|
@ -75,6 +75,15 @@ private:
|
|||
*/
|
||||
static std::set<std::string> sAlwaysShowableList;
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-02-28 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
|
||||
// Used to determine whether a floater can be shown
|
||||
public:
|
||||
typedef boost::signals2::signal<bool(const std::string&, const LLSD&), boost_boolean_combiner> validate_signal_t;
|
||||
static boost::signals2::connection setValidateCallback(const validate_signal_t::slot_type& cb) { return mValidateSignal.connect(cb); }
|
||||
private:
|
||||
static validate_signal_t mValidateSignal;
|
||||
// [/RLVa:KB]
|
||||
|
||||
public:
|
||||
// Registration
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#include "llmenubutton.h"
|
||||
|
||||
// Linden library includes
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "llmenugl.h"
|
||||
#include "llstring.h"
|
||||
#include "v4color.h"
|
||||
|
||||
|
|
@ -44,77 +44,58 @@ LLMenuButton::Params::Params()
|
|||
|
||||
LLMenuButton::LLMenuButton(const LLMenuButton::Params& p)
|
||||
: LLButton(p),
|
||||
mIsMenuShown(false),
|
||||
mMenuPosition(MP_BOTTOM_LEFT)
|
||||
mMenu(NULL),
|
||||
mMenuVisibleLastFrame(false)
|
||||
{
|
||||
std::string menu_filename = p.menu_filename;
|
||||
|
||||
if (!menu_filename.empty())
|
||||
{
|
||||
LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(menu_filename, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (!menu)
|
||||
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(menu_filename, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());
|
||||
if (!mMenu)
|
||||
{
|
||||
llwarns << "Error loading menu_button menu" << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
menu->setVisibilityChangeCallback(boost::bind(&LLMenuButton::onMenuVisibilityChange, this, _2));
|
||||
|
||||
mMenuHandle = menu->getHandle();
|
||||
|
||||
updateMenuOrigin();
|
||||
}
|
||||
}
|
||||
|
||||
boost::signals2::connection LLMenuButton::setMouseDownCallback( const mouse_signal_t::slot_type& cb )
|
||||
void LLMenuButton::toggleMenu()
|
||||
{
|
||||
return LLUICtrl::setMouseDownCallback(cb);
|
||||
}
|
||||
if(!mMenu)
|
||||
return;
|
||||
|
||||
void LLMenuButton::hideMenu()
|
||||
{
|
||||
if(mMenuHandle.isDead()) return;
|
||||
|
||||
LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
if (menu)
|
||||
if (mMenu->getVisible() || mMenuVisibleLastFrame)
|
||||
{
|
||||
menu->setVisible(FALSE);
|
||||
mMenu->setVisible(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLRect rect = getRect();
|
||||
//mMenu->needsArrange(); //so it recalculates the visible elements
|
||||
LLMenuGL::showPopup(getParent(), mMenu, rect.mLeft, rect.mBottom);
|
||||
}
|
||||
}
|
||||
|
||||
LLToggleableMenu* LLMenuButton::getMenu()
|
||||
{
|
||||
return dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
|
||||
void LLMenuButton::hideMenu()
|
||||
{
|
||||
if(!mMenu)
|
||||
return;
|
||||
mMenu->setVisible(FALSE);
|
||||
}
|
||||
|
||||
void LLMenuButton::setMenu(LLToggleableMenu* menu, EMenuPosition position /*MP_TOP_LEFT*/)
|
||||
{
|
||||
if (!menu) return;
|
||||
|
||||
mMenuHandle = menu->getHandle();
|
||||
mMenuPosition = position;
|
||||
|
||||
menu->setVisibilityChangeCallback(boost::bind(&LLMenuButton::onMenuVisibilityChange, this, _2));
|
||||
}
|
||||
|
||||
BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )
|
||||
{
|
||||
if (mMenuHandle.isDead()) return FALSE;
|
||||
|
||||
if( KEY_RETURN == key && mask == MASK_NONE && !gKeyboard->getKeyRepeated(key))
|
||||
{
|
||||
// *HACK: We emit the mouse down signal to fire the callback bound to the
|
||||
// menu emerging event before actually displaying the menu. See STORM-263.
|
||||
LLUICtrl::handleMouseDown(-1, -1, MASK_NONE);
|
||||
|
||||
toggleMenu();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
if (menu && menu->getVisible() && key == KEY_ESCAPE && mask == MASK_NONE)
|
||||
if (mMenu && mMenu->getVisible() && key == KEY_ESCAPE && mask == MASK_NONE)
|
||||
{
|
||||
menu->setVisible(FALSE);
|
||||
mMenu->setVisible(FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -123,77 +104,34 @@ BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask )
|
|||
|
||||
BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLButton::handleMouseDown(x, y, mask);
|
||||
if (hasTabStop() && !getIsChrome())
|
||||
{
|
||||
setFocus(TRUE);
|
||||
}
|
||||
|
||||
toggleMenu();
|
||||
|
||||
if (getSoundFlags() & MOUSE_DOWN)
|
||||
{
|
||||
make_ui_sound("UISndClick");
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLMenuButton::toggleMenu()
|
||||
void LLMenuButton::draw()
|
||||
{
|
||||
if(mMenuHandle.isDead()) return;
|
||||
|
||||
LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get());
|
||||
if (!menu) return;
|
||||
|
||||
// Store the button rectangle to toggle menu visibility if a mouse event
|
||||
// occurred inside or outside the button rect.
|
||||
menu->setButtonRect(this);
|
||||
|
||||
if (!menu->toggleVisibility() && mIsMenuShown)
|
||||
//we save this off so next frame when we try to close it by
|
||||
//button click, and it hides menus before we get to it, we know
|
||||
mMenuVisibleLastFrame = mMenu && mMenu->getVisible();
|
||||
|
||||
if (mMenuVisibleLastFrame)
|
||||
{
|
||||
setForcePressedState(false);
|
||||
mIsMenuShown = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
menu->buildDrawLabels();
|
||||
menu->arrangeAndClear();
|
||||
menu->updateParent(LLMenuGL::sMenuContainer);
|
||||
|
||||
updateMenuOrigin();
|
||||
|
||||
LLMenuGL::showPopup(getParent(), menu, mX, mY);
|
||||
|
||||
setForcePressedState(true);
|
||||
mIsMenuShown = true;
|
||||
}
|
||||
|
||||
LLButton::draw();
|
||||
|
||||
setForcePressedState(false);
|
||||
}
|
||||
|
||||
void LLMenuButton::updateMenuOrigin()
|
||||
{
|
||||
if (mMenuHandle.isDead()) return;
|
||||
|
||||
LLRect rect = getRect();
|
||||
|
||||
switch (mMenuPosition)
|
||||
{
|
||||
case MP_TOP_LEFT:
|
||||
{
|
||||
mX = rect.mLeft;
|
||||
mY = rect.mTop + mMenuHandle.get()->getRect().getHeight();
|
||||
break;
|
||||
}
|
||||
case MP_BOTTOM_LEFT:
|
||||
{
|
||||
mX = rect.mLeft;
|
||||
mY = rect.mBottom;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLMenuButton::onMenuVisibilityChange(const LLSD& param)
|
||||
{
|
||||
bool new_visibility = param["visibility"].asBoolean();
|
||||
bool is_closed_by_button_click = param["closed_by_button_click"].asBoolean();
|
||||
|
||||
// Reset the button "pressed" state only if the menu is shown by this particular
|
||||
// menu button (not any other control) and is not being closed by a click on the button.
|
||||
if (!new_visibility && !is_closed_by_button_click && mIsMenuShown)
|
||||
{
|
||||
setForcePressedState(false);
|
||||
mIsMenuShown = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
#include "llbutton.h"
|
||||
|
||||
class LLToggleableMenu;
|
||||
class LLMenuGL;
|
||||
|
||||
class LLMenuButton
|
||||
: public LLButton
|
||||
|
|
@ -42,41 +42,22 @@ public:
|
|||
Optional<std::string> menu_filename;
|
||||
|
||||
Params();
|
||||
};
|
||||
|
||||
typedef enum e_menu_position
|
||||
{
|
||||
MP_TOP_LEFT,
|
||||
MP_BOTTOM_LEFT
|
||||
} EMenuPosition;
|
||||
};
|
||||
|
||||
boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
|
||||
|
||||
void toggleMenu();
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
|
||||
|
||||
void hideMenu();
|
||||
|
||||
LLToggleableMenu* getMenu();
|
||||
void setMenu(LLToggleableMenu* menu, EMenuPosition position = MP_TOP_LEFT);
|
||||
|
||||
void setMenuPosition(EMenuPosition position) { mMenuPosition = position; }
|
||||
LLMenuGL* getMenu() { return mMenu; }
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
LLMenuButton(const Params&);
|
||||
|
||||
void toggleMenu();
|
||||
void updateMenuOrigin();
|
||||
|
||||
void onMenuVisibilityChange(const LLSD& param);
|
||||
|
||||
private:
|
||||
LLHandle<LLView> mMenuHandle;
|
||||
bool mIsMenuShown;
|
||||
EMenuPosition mMenuPosition;
|
||||
S32 mX;
|
||||
S32 mY;
|
||||
LLMenuGL* mMenu;
|
||||
bool mMenuVisibleLastFrame;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1848,104 +1848,89 @@ BOOL LLMenuGL::isOpen()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool LLMenuGL::scrollItems(EScrollingDirection direction)
|
||||
void LLMenuGL::scrollItemsUp()
|
||||
{
|
||||
// Slowing down items scrolling when arrow button is held
|
||||
// Slowing down the items scrolling when arrow button is held
|
||||
if (mScrollItemsTimer.hasExpired() && NULL != mFirstVisibleItem)
|
||||
{
|
||||
mScrollItemsTimer.setTimerExpirySec(.033f);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (direction)
|
||||
item_list_t::iterator cur_item_iter;
|
||||
item_list_t::iterator prev_item_iter;
|
||||
for (cur_item_iter = mItems.begin(), prev_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++)
|
||||
{
|
||||
case SD_UP:
|
||||
if( (*cur_item_iter) == mFirstVisibleItem)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if ((*cur_item_iter)->getVisible())
|
||||
{
|
||||
prev_item_iter = cur_item_iter;
|
||||
}
|
||||
}
|
||||
|
||||
if ((*prev_item_iter)->getVisible())
|
||||
{
|
||||
item_list_t::iterator cur_item_iter;
|
||||
item_list_t::iterator prev_item_iter;
|
||||
for (cur_item_iter = mItems.begin(), prev_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++)
|
||||
{
|
||||
if( (*cur_item_iter) == mFirstVisibleItem)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if ((*cur_item_iter)->getVisible())
|
||||
{
|
||||
prev_item_iter = cur_item_iter;
|
||||
}
|
||||
}
|
||||
|
||||
if ((*prev_item_iter)->getVisible())
|
||||
{
|
||||
mFirstVisibleItem = *prev_item_iter;
|
||||
}
|
||||
break;
|
||||
mFirstVisibleItem = *prev_item_iter;
|
||||
}
|
||||
case SD_DOWN:
|
||||
{
|
||||
if (NULL == mFirstVisibleItem)
|
||||
{
|
||||
mFirstVisibleItem = *mItems.begin();
|
||||
}
|
||||
|
||||
item_list_t::iterator cur_item_iter;
|
||||
|
||||
for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++)
|
||||
{
|
||||
if( (*cur_item_iter) == mFirstVisibleItem)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item_list_t::iterator next_item_iter;
|
||||
|
||||
if (cur_item_iter != mItems.end())
|
||||
{
|
||||
for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++)
|
||||
{
|
||||
if( (*next_item_iter)->getVisible())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (next_item_iter != mItems.end() &&
|
||||
(*next_item_iter)->getVisible())
|
||||
{
|
||||
mFirstVisibleItem = *next_item_iter;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SD_BEGIN:
|
||||
{
|
||||
mFirstVisibleItem = *mItems.begin();
|
||||
break;
|
||||
}
|
||||
case SD_END:
|
||||
{
|
||||
item_list_t::reverse_iterator first_visible_item_iter = mItems.rend();
|
||||
|
||||
// Advance by mMaxScrollableItems back from the end of the list
|
||||
// to make the last item visible.
|
||||
std::advance(first_visible_item_iter, mMaxScrollableItems);
|
||||
mFirstVisibleItem = *first_visible_item_iter;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
llwarns << "Unknown scrolling direction: " << direction << llendl;
|
||||
}
|
||||
|
||||
|
||||
mNeedsArrange = TRUE;
|
||||
arrangeAndClear();
|
||||
}
|
||||
|
||||
return true;
|
||||
void LLMenuGL::scrollItemsDown()
|
||||
{
|
||||
// Slowing down the items scrolling when arrow button is held
|
||||
if (mScrollItemsTimer.hasExpired())
|
||||
{
|
||||
mScrollItemsTimer.setTimerExpirySec(.033f);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (NULL == mFirstVisibleItem)
|
||||
{
|
||||
mFirstVisibleItem = *mItems.begin();
|
||||
}
|
||||
|
||||
item_list_t::iterator cur_item_iter;
|
||||
|
||||
for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++)
|
||||
{
|
||||
if( (*cur_item_iter) == mFirstVisibleItem)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item_list_t::iterator next_item_iter;
|
||||
|
||||
if (cur_item_iter != mItems.end())
|
||||
{
|
||||
for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++)
|
||||
{
|
||||
if( (*next_item_iter)->getVisible())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (next_item_iter != mItems.end() &&
|
||||
(*next_item_iter)->getVisible())
|
||||
{
|
||||
mFirstVisibleItem = *next_item_iter;
|
||||
}
|
||||
}
|
||||
|
||||
mNeedsArrange = TRUE;
|
||||
arrangeAndClear();
|
||||
}
|
||||
|
||||
// rearrange the child rects so they fit the shape of the menu.
|
||||
|
|
@ -2177,7 +2162,7 @@ void LLMenuGL::arrange( void )
|
|||
LLMenuScrollItem::Params item_params;
|
||||
item_params.name(ARROW_UP);
|
||||
item_params.arrow_type(LLMenuScrollItem::ARROW_UP);
|
||||
item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItems, this, SD_UP));
|
||||
item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItemsUp, this));
|
||||
|
||||
mArrowUpItem = LLUICtrlFactory::create<LLMenuScrollItem>(item_params);
|
||||
LLUICtrl::addChild(mArrowUpItem);
|
||||
|
|
@ -2188,7 +2173,7 @@ void LLMenuGL::arrange( void )
|
|||
LLMenuScrollItem::Params item_params;
|
||||
item_params.name(ARROW_DOWN);
|
||||
item_params.arrow_type(LLMenuScrollItem::ARROW_DOWN);
|
||||
item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItems, this, SD_DOWN));
|
||||
item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItemsDown, this));
|
||||
|
||||
mArrowDownItem = LLUICtrlFactory::create<LLMenuScrollItem>(item_params);
|
||||
LLUICtrl::addChild(mArrowDownItem);
|
||||
|
|
@ -2618,8 +2603,14 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa
|
|||
((LLFloater*)getParent())->setFocus(TRUE);
|
||||
}
|
||||
|
||||
// Current item position in the items list
|
||||
item_list_t::iterator cur_item_iter = std::find(mItems.begin(), mItems.end(), cur_item);
|
||||
item_list_t::iterator cur_item_iter;
|
||||
for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); ++cur_item_iter)
|
||||
{
|
||||
if( (*cur_item_iter) == cur_item)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item_list_t::iterator next_item_iter;
|
||||
if (cur_item_iter == mItems.end())
|
||||
|
|
@ -2630,37 +2621,9 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa
|
|||
{
|
||||
next_item_iter = cur_item_iter;
|
||||
next_item_iter++;
|
||||
|
||||
// First visible item position in the items list
|
||||
item_list_t::iterator first_visible_item_iter = std::find(mItems.begin(), mItems.end(), mFirstVisibleItem);
|
||||
|
||||
if (next_item_iter == mItems.end())
|
||||
{
|
||||
next_item_iter = mItems.begin();
|
||||
|
||||
// If current item is the last in the list, the menu is scrolled to the beginning
|
||||
// and the first item is highlighted.
|
||||
if (mScrollable && !scrollItems(SD_BEGIN))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
// If current item is the last visible, the menu is scrolled one item down
|
||||
// and the next item is highlighted.
|
||||
else if (mScrollable &&
|
||||
(U32)std::abs(std::distance(first_visible_item_iter, next_item_iter)) >= mMaxScrollableItems)
|
||||
{
|
||||
// Call highlightNextItem() recursively only if the menu was successfully scrolled down.
|
||||
// If scroll timer hasn't expired yet the menu won't be scrolled and calling
|
||||
// highlightNextItem() will result in an endless recursion.
|
||||
if (scrollItems(SD_DOWN))
|
||||
{
|
||||
return highlightNextItem(cur_item, skip_disabled);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2718,8 +2681,14 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa
|
|||
((LLFloater*)getParent())->setFocus(TRUE);
|
||||
}
|
||||
|
||||
// Current item reverse position from the end of the list
|
||||
item_list_t::reverse_iterator cur_item_iter = std::find(mItems.rbegin(), mItems.rend(), cur_item);
|
||||
item_list_t::reverse_iterator cur_item_iter;
|
||||
for (cur_item_iter = mItems.rbegin(); cur_item_iter != mItems.rend(); ++cur_item_iter)
|
||||
{
|
||||
if( (*cur_item_iter) == cur_item)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item_list_t::reverse_iterator prev_item_iter;
|
||||
if (cur_item_iter == mItems.rend())
|
||||
|
|
@ -2730,37 +2699,9 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa
|
|||
{
|
||||
prev_item_iter = cur_item_iter;
|
||||
prev_item_iter++;
|
||||
|
||||
// First visible item reverse position in the items list
|
||||
item_list_t::reverse_iterator first_visible_item_iter = std::find(mItems.rbegin(), mItems.rend(), mFirstVisibleItem);
|
||||
|
||||
if (prev_item_iter == mItems.rend())
|
||||
{
|
||||
prev_item_iter = mItems.rbegin();
|
||||
|
||||
// If current item is the first in the list, the menu is scrolled to the end
|
||||
// and the last item is highlighted.
|
||||
if (mScrollable && !scrollItems(SD_END))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
// If current item is the first visible, the menu is scrolled one item up
|
||||
// and the previous item is highlighted.
|
||||
else if (mScrollable &&
|
||||
std::distance(first_visible_item_iter, cur_item_iter) <= 0)
|
||||
{
|
||||
// Call highlightNextItem() only if the menu was successfully scrolled up.
|
||||
// If scroll timer hasn't expired yet the menu won't be scrolled and calling
|
||||
// highlightNextItem() will result in an endless recursion.
|
||||
if (scrollItems(SD_UP))
|
||||
{
|
||||
return highlightPrevItem(cur_item, skip_disabled);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2931,12 +2872,12 @@ BOOL LLMenuGL::handleScrollWheel( S32 x, S32 y, S32 clicks )
|
|||
if( clicks > 0 )
|
||||
{
|
||||
while( clicks-- )
|
||||
scrollItems(SD_DOWN);
|
||||
scrollItemsDown();
|
||||
}
|
||||
else
|
||||
{
|
||||
while( clicks++ )
|
||||
scrollItems(SD_UP);
|
||||
scrollItemsUp();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
|
|||
|
|
@ -397,15 +397,6 @@ public:
|
|||
static const std::string ARROW_UP;
|
||||
static const std::string ARROW_DOWN;
|
||||
|
||||
// for scrollable menus
|
||||
typedef enum e_scrolling_direction
|
||||
{
|
||||
SD_UP = 0,
|
||||
SD_DOWN = 1,
|
||||
SD_BEGIN = 2,
|
||||
SD_END = 3
|
||||
} EScrollingDirection;
|
||||
|
||||
protected:
|
||||
LLMenuGL(const LLMenuGL::Params& p);
|
||||
friend class LLUICtrlFactory;
|
||||
|
|
@ -512,7 +503,8 @@ public:
|
|||
|
||||
S32 getShortcutPad() { return mShortcutPad; }
|
||||
|
||||
bool scrollItems(EScrollingDirection direction);
|
||||
void scrollItemsUp();
|
||||
void scrollItemsDown();
|
||||
BOOL isScrollable() const { return mScrollable; }
|
||||
|
||||
static class LLMenuHolderGL* sMenuContainer;
|
||||
|
|
|
|||
|
|
@ -1622,7 +1622,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
|
|||
style_params.fillFrom(getDefaultStyleParams());
|
||||
|
||||
S32 part = (S32)LLTextParser::WHOLE;
|
||||
if (mParseHTML && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358).
|
||||
if(mParseHTML)
|
||||
{
|
||||
S32 start=0,end=0;
|
||||
LLUrlMatch match;
|
||||
|
|
@ -2214,39 +2214,19 @@ bool LLTextBase::scrolledToEnd()
|
|||
return mScroller->isAtBottom();
|
||||
}
|
||||
|
||||
|
||||
bool LLTextBase::setCursor(S32 row, S32 column)
|
||||
{
|
||||
if (row < 0 || column < 0) return false;
|
||||
|
||||
S32 n_lines = mLineInfoList.size();
|
||||
for (S32 line = row; line < n_lines; ++line)
|
||||
if (0 <= row && row < (S32)mLineInfoList.size())
|
||||
{
|
||||
const line_info& li = mLineInfoList[line];
|
||||
|
||||
if (li.mLineNum < row)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if (li.mLineNum > row)
|
||||
{
|
||||
break; // invalid column specified
|
||||
}
|
||||
|
||||
// Found the given row.
|
||||
S32 line_length = li.mDocIndexEnd - li.mDocIndexStart;;
|
||||
if (column >= line_length)
|
||||
{
|
||||
column -= line_length;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Found the given column.
|
||||
S32 doc_pos = mLineInfoList[row].mDocIndexStart;
|
||||
column = llclamp(column, 0, mLineInfoList[row].mDocIndexEnd - mLineInfoList[row].mDocIndexStart - 1);
|
||||
doc_pos += column;
|
||||
updateCursorXPos();
|
||||
S32 doc_pos = li.mDocIndexStart + column;
|
||||
|
||||
return setCursorPos(doc_pos);
|
||||
}
|
||||
|
||||
return false; // invalid row or column specified
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -35,22 +35,10 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu");
|
|||
LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p)
|
||||
: LLMenuGL(p),
|
||||
mButtonRect(),
|
||||
mVisibilityChangeSignal(NULL),
|
||||
mClosedByButtonClick(false)
|
||||
{
|
||||
}
|
||||
|
||||
LLToggleableMenu::~LLToggleableMenu()
|
||||
{
|
||||
delete mVisibilityChangeSignal;
|
||||
}
|
||||
|
||||
boost::signals2::connection LLToggleableMenu::setVisibilityChangeCallback(const commit_signal_t::slot_type& cb)
|
||||
{
|
||||
if (!mVisibilityChangeSignal) mVisibilityChangeSignal = new commit_signal_t();
|
||||
return mVisibilityChangeSignal->connect(cb);
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
|
||||
{
|
||||
|
|
@ -61,12 +49,6 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
|
|||
{
|
||||
mClosedByButtonClick = true;
|
||||
}
|
||||
|
||||
if (mVisibilityChangeSignal)
|
||||
{
|
||||
(*mVisibilityChangeSignal)(this,
|
||||
LLSD().with("visibility", curVisibilityIn).with("closed_by_button_click", mClosedByButtonClick));
|
||||
}
|
||||
}
|
||||
|
||||
void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view)
|
||||
|
|
|
|||
|
|
@ -41,10 +41,6 @@ protected:
|
|||
LLToggleableMenu(const Params&);
|
||||
friend class LLUICtrlFactory;
|
||||
public:
|
||||
~LLToggleableMenu();
|
||||
|
||||
boost::signals2::connection setVisibilityChangeCallback( const commit_signal_t::slot_type& cb );
|
||||
|
||||
virtual void handleVisibilityChange (BOOL curVisibilityIn);
|
||||
|
||||
const LLRect& getButtonRect() const { return mButtonRect; }
|
||||
|
|
@ -61,7 +57,6 @@ public:
|
|||
protected:
|
||||
bool mClosedByButtonClick;
|
||||
LLRect mButtonRect;
|
||||
commit_signal_t* mVisibilityChangeSignal;
|
||||
};
|
||||
|
||||
#endif // LL_LLTOGGLEABLEMENU_H
|
||||
|
|
|
|||
|
|
@ -58,12 +58,10 @@ class LLUIString
|
|||
public:
|
||||
// These methods all perform appropriate argument substitution
|
||||
// and modify mOrig where appropriate
|
||||
LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {}
|
||||
LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {}
|
||||
LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args);
|
||||
LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); }
|
||||
|
||||
~LLUIString() { delete mArgs; }
|
||||
|
||||
void assign(const std::string& instring);
|
||||
LLUIString& operator=(const std::string& s) { assign(s); return *this; }
|
||||
|
||||
|
|
@ -83,14 +81,14 @@ public:
|
|||
|
||||
void clear();
|
||||
void clearArgs() { if (mArgs) mArgs->clear(); }
|
||||
|
||||
|
||||
// These utility functions are included for text editing.
|
||||
// They do not affect mOrig and do not perform argument substitution
|
||||
void truncate(S32 maxchars);
|
||||
void erase(S32 charidx, S32 len);
|
||||
void insert(S32 charidx, const LLWString& wchars);
|
||||
void replace(S32 charidx, llwchar wc);
|
||||
|
||||
|
||||
private:
|
||||
// something changed, requiring reformatting of strings
|
||||
void dirty();
|
||||
|
|
@ -102,7 +100,7 @@ private:
|
|||
void updateResult() const;
|
||||
void updateWResult() const;
|
||||
LLStringUtil::format_map_t& getArgs();
|
||||
|
||||
|
||||
std::string mOrig;
|
||||
mutable std::string mResult;
|
||||
mutable LLWString mWResult; // for displaying
|
||||
|
|
|
|||
|
|
@ -605,6 +605,27 @@ std::string LLUrlEntryAgentUserName::getName(const LLAvatarName& avatar_name)
|
|||
return avatar_name.mUsername.empty() ? avatar_name.getLegacyName() : avatar_name.mUsername;
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
|
||||
// Defined in rlvcommon.cpp - redirects to RlvStrings::getAnonym() since we can't really get to that class from here
|
||||
extern const std::string& rlvGetAnonym(const LLAvatarName& avName);
|
||||
|
||||
//
|
||||
// LLUrlEntryAgentRLVAnonymizedName Describes an RLV anonymized agent name Url, e.g.,
|
||||
// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/rlvanonym
|
||||
// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/rlvanonym
|
||||
//
|
||||
LLUrlEntryAgentRLVAnonymizedName::LLUrlEntryAgentRLVAnonymizedName()
|
||||
{
|
||||
mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/rlvanonym", boost::regex::perl|boost::regex::icase);
|
||||
}
|
||||
|
||||
std::string LLUrlEntryAgentRLVAnonymizedName::getName(const LLAvatarName& avatar_name)
|
||||
{
|
||||
return rlvGetAnonym(avatar_name);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
//
|
||||
// LLUrlEntryGroup Describes a Second Life group Url, e.g.,
|
||||
// secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about
|
||||
|
|
@ -978,7 +999,7 @@ std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const
|
|||
//
|
||||
LLUrlEntryNoLink::LLUrlEntryNoLink()
|
||||
{
|
||||
mPattern = boost::regex("<nolink>.*</nolink>",
|
||||
mPattern = boost::regex("<nolink>[^<]*</nolink>",
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
}
|
||||
|
||||
|
|
@ -995,8 +1016,7 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC
|
|||
|
||||
LLStyle::Params LLUrlEntryNoLink::getStyle() const
|
||||
{
|
||||
// Don't render as URL (i.e. no context menu or hand cursor).
|
||||
return LLStyle::Params().is_link(false);
|
||||
return LLStyle::Params();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -236,6 +236,21 @@ private:
|
|||
/*virtual*/ std::string getName(const LLAvatarName& avatar_name);
|
||||
};
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
///
|
||||
/// LLUrlEntryAgentRLVAnonymizedName Describes an RLV anonymized agent name Url, e.g.,
|
||||
/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/rlvanonym
|
||||
/// that diplays an anonym (based on the display name) for an avatar
|
||||
/// such as "An individual"
|
||||
class LLUrlEntryAgentRLVAnonymizedName : public LLUrlEntryAgentName
|
||||
{
|
||||
public:
|
||||
LLUrlEntryAgentRLVAnonymizedName();
|
||||
private:
|
||||
/*virtual*/ std::string getName(const LLAvatarName& avatar_name);
|
||||
};
|
||||
// [/RLVa:KB]
|
||||
|
||||
///
|
||||
/// LLUrlEntryGroup Describes a Second Life group Url, e.g.,
|
||||
/// secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about
|
||||
|
|
|
|||
|
|
@ -37,7 +37,10 @@ void LLUrlRegistryNullCallback(const std::string &url, const std::string &label,
|
|||
|
||||
LLUrlRegistry::LLUrlRegistry()
|
||||
{
|
||||
mUrlEntry.reserve(20);
|
||||
// mUrlEntry.reserve(20);
|
||||
// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
mUrlEntry.reserve(21);
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Urls are matched in the order that they were registered
|
||||
registerUrl(new LLUrlEntryNoLink());
|
||||
|
|
@ -48,6 +51,9 @@ LLUrlRegistry::LLUrlRegistry()
|
|||
registerUrl(new LLUrlEntryAgentCompleteName());
|
||||
registerUrl(new LLUrlEntryAgentDisplayName());
|
||||
registerUrl(new LLUrlEntryAgentUserName());
|
||||
// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
registerUrl(new LLUrlEntryAgentRLVAnonymizedName());
|
||||
// [/RLVa:KB]
|
||||
// LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since
|
||||
// LLUrlEntryAgent is a less specific (catchall for agent urls)
|
||||
registerUrl(new LLUrlEntryAgent());
|
||||
|
|
|
|||
|
|
@ -30,9 +30,14 @@
|
|||
#include "llavatarnamecache.h"
|
||||
#include "llcachename.h"
|
||||
#include "lluuid.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
// stub for RLVa
|
||||
std::string rlvGetAnonym(const LLAvatarName& avName)
|
||||
{
|
||||
return "someone";
|
||||
}
|
||||
|
||||
// Stub for LLAvatarNameCache
|
||||
bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ std::string LLDir::buildSLOSCacheDir() const
|
|||
}
|
||||
else
|
||||
{
|
||||
res = getOSCacheDir() + mDirDelimiter + "SecondLife";
|
||||
res = getOSCacheDir() + mDirDelimiter + "Firestorm";
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ LLDir_Mac::LLDir_Mac()
|
|||
CFStringRef stringRef = NULL;
|
||||
OSStatus error = noErr;
|
||||
FSRef fileRef;
|
||||
CFStringRef secondLifeString = CFSTR("SecondLife");
|
||||
CFStringRef secondLifeString = CFSTR("Firestorm");
|
||||
|
||||
mainBundleRef = CFBundleGetMainBundle();
|
||||
|
||||
|
|
@ -193,7 +193,7 @@ LLDir_Mac::LLDir_Mac()
|
|||
if (error == noErr)
|
||||
{
|
||||
FSRefToLLString(&cacheDirRef, mOSCacheDir);
|
||||
(void)CFCreateDirectory(&cacheDirRef, CFSTR("SecondLife"),NULL);
|
||||
(void)CFCreateDirectory(&cacheDirRef, CFSTR("Firestorm"),NULL);
|
||||
}
|
||||
|
||||
// mOSUserAppDir
|
||||
|
|
|
|||
|
|
@ -263,7 +263,7 @@ namespace tut
|
|||
std::string path = dir + delim + file;
|
||||
LLFILE* handle = LLFile::fopen( path, "w" );
|
||||
ensure("failed to open test file '"+path+"'", handle != NULL );
|
||||
ensure("failed to write to test file '"+path+"'", !fputs("test file", handle) );
|
||||
//ensure("failed to write to test file '"+path+"'", !fputs("test file", handle) );
|
||||
fclose(handle);
|
||||
return path;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ Boolean gCancelled = false;
|
|||
|
||||
const char *gUpdateURL;
|
||||
const char *gProductName;
|
||||
const char *gBundleID;
|
||||
|
||||
void *updatethreadproc(void*);
|
||||
|
||||
|
|
@ -330,10 +329,6 @@ int parse_args(int argc, char **argv)
|
|||
{
|
||||
gProductName = argv[j];
|
||||
}
|
||||
else if ((!strcmp(argv[j], "-bundleid")) && (++j < argc))
|
||||
{
|
||||
gBundleID = argv[j];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -360,7 +355,6 @@ int main(int argc, char **argv)
|
|||
//
|
||||
gUpdateURL = NULL;
|
||||
gProductName = NULL;
|
||||
gBundleID = NULL;
|
||||
parse_args(argc, argv);
|
||||
if (!gUpdateURL)
|
||||
{
|
||||
|
|
@ -378,14 +372,6 @@ int main(int argc, char **argv)
|
|||
{
|
||||
gProductName = "Second Life";
|
||||
}
|
||||
if (gBundleID)
|
||||
{
|
||||
llinfos << "Bundle ID is: " << gBundleID << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
gBundleID = "com.secondlife.indra.viewer";
|
||||
}
|
||||
}
|
||||
|
||||
llinfos << "Starting " << gProductName << " Updater" << llendl;
|
||||
|
|
@ -606,8 +592,7 @@ static bool isFSRefViewerBundle(FSRef *targetRef)
|
|||
CFURLRef targetURL = NULL;
|
||||
CFBundleRef targetBundle = NULL;
|
||||
CFStringRef targetBundleID = NULL;
|
||||
CFStringRef sourceBundleID = NULL;
|
||||
|
||||
|
||||
targetURL = CFURLCreateFromFSRef(NULL, targetRef);
|
||||
|
||||
if(targetURL == NULL)
|
||||
|
|
@ -634,8 +619,7 @@ static bool isFSRefViewerBundle(FSRef *targetRef)
|
|||
}
|
||||
else
|
||||
{
|
||||
sourceBundleID = CFStringCreateWithCString(NULL, gBundleID, kCFStringEncodingUTF8);
|
||||
if(CFStringCompare(sourceBundleID, targetBundleID, 0) == kCFCompareEqualTo)
|
||||
if(CFStringCompare(targetBundleID, CFSTR("com.secondlife.indra.viewer"), 0) == kCFCompareEqualTo)
|
||||
{
|
||||
// This is the bundle we're looking for.
|
||||
result = true;
|
||||
|
|
|
|||
|
|
@ -574,9 +574,17 @@ set(viewer_SOURCE_FILES
|
|||
llxmlrpctransaction.cpp
|
||||
noise.cpp
|
||||
pipeline.cpp
|
||||
rlvhandler.cpp
|
||||
rlvhelper.cpp
|
||||
rlvcommon.cpp
|
||||
rlvlocks.cpp
|
||||
rlvinventory.cpp
|
||||
rlvextensions.cpp
|
||||
rlvfloaters.cpp
|
||||
rlvui.cpp
|
||||
)
|
||||
|
||||
set(VIEWER_BINARY_NAME "secondlife-bin" CACHE STRING
|
||||
set(VIEWER_BINARY_NAME "firestorm-bin" CACHE STRING
|
||||
"The name of the viewer executable to create.")
|
||||
|
||||
if (LINUX)
|
||||
|
|
@ -1102,6 +1110,15 @@ set(viewer_HEADER_FILES
|
|||
macmain.h
|
||||
noise.h
|
||||
pipeline.h
|
||||
rlvdefines.h
|
||||
rlvhandler.h
|
||||
rlvhelper.h
|
||||
rlvcommon.h
|
||||
rlvlocks.h
|
||||
rlvinventory.h
|
||||
rlvextensions.h
|
||||
rlvfloaters.h
|
||||
rlvui.h
|
||||
VertexCache.h
|
||||
VorbisFramework.h
|
||||
)
|
||||
|
|
@ -1743,16 +1760,16 @@ if (LINUX)
|
|||
endif (LINUX)
|
||||
|
||||
if (DARWIN)
|
||||
set(product "Second Life")
|
||||
set(product "Firestorm")
|
||||
set_target_properties(
|
||||
${VIEWER_BINARY_NAME}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${product}"
|
||||
MACOSX_BUNDLE_INFO_STRING "info string - localize me"
|
||||
MACOSX_BUNDLE_ICON_FILE "secondlife.icns"
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER "Second Life"
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER "Firestorm"
|
||||
MACOSX_BUNDLE_LONG_VERSION_STRING "ververver"
|
||||
MACOSX_BUNDLE_BUNDLE_NAME "Second Life"
|
||||
MACOSX_BUNDLE_BUNDLE_NAME "Firestorm"
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "asdf"
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION "asdf"
|
||||
MACOSX_BUNDLE_COPYRIGHT "copyright linden lab 2007 - localize me and run me through a legal wringer"
|
||||
|
|
@ -1816,13 +1833,13 @@ if (PACKAGE)
|
|||
if (DARWIN)
|
||||
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
|
||||
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
|
||||
set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin")
|
||||
set(VIEWER_EXE_GLOBS "'Firestorm' SLPlugin")
|
||||
set(VIEWER_LIB_GLOB "*.dylib")
|
||||
endif (DARWIN)
|
||||
if (LINUX)
|
||||
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged")
|
||||
set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
|
||||
set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
|
||||
set(VIEWER_EXE_GLOBS "do-not-directly-run-firestorm-bin SLPlugin")
|
||||
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
|
||||
set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)
|
||||
endif (LINUX)
|
||||
|
|
@ -1918,11 +1935,11 @@ if (LL_TESTS)
|
|||
llviewernetwork.cpp
|
||||
)
|
||||
|
||||
|
||||
LL_ADD_INTEGRATION_TEST(llslurl
|
||||
"${llslurl_test_sources}"
|
||||
"${test_libs}"
|
||||
)
|
||||
# RLVa - incompatible
|
||||
# LL_ADD_INTEGRATION_TEST(llslurl
|
||||
# "${llslurl_test_sources}"
|
||||
# "${test_libs}"
|
||||
# )
|
||||
|
||||
LL_ADD_INTEGRATION_TEST(llviewernetwork
|
||||
llviewernetwork.cpp
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Second Life</string>
|
||||
<string>Firestorm</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>secondlife.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Second Life</string>
|
||||
<string>Firestorm</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleSignature</key>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,171 @@
|
|||
<?xml version="1.0" ?>
|
||||
<llsd>
|
||||
<map>
|
||||
<key>RestrainedLove</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Toggles the RestrainedLove features (BDSM lockable toys support). Needs a restart of the viewer.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RestrainedLoveDebug</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Toggles the RestrainedLove debug mode (displays the commands when in debug mode).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RestrainedLoveNoSetEnv</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When TRUE, forbids to set the environment (time of day and Windlight settings) via RestrainedLove. Needs a restart of the viewer.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RestrainedLoveForbidGiveToRLV</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When TRUE, forbids to give sub-folders to the #RLV RestrainedLove folder.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RestrainedLoveReplaceWhenFolderBeginsWith</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If a folder name begins with this string, its attach behavior will always be "replace", never "stack". Default is blank (disabled).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>RestrainedLoveStackWhenFolderBeginsWith</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If a folder name begins with this string, its attach behavior will always be "stack", never "replace". Default is "+".</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>+</string>
|
||||
</map>
|
||||
<key>RLVaDebugHideUnsetDuplicate</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Suppresses reporting "unset" or "duplicate" command restrictions when RestrainedLoveDebug is TRUE</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RLVaEnableCompositeFolders</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enables composite folders for shared inventory</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RLVaEnableLegacyNaming</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enables legacy naming convention for folders</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RLVaEnableSharedWear</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Attachments in the shared #RLV folder can be force-attached without needing to specify an attachment point</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RLVaHideLockedLayers</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Hides "remove outfit" restricted worn clothing layers from @getoufit</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RLVaHideLockedAttachments</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Hides non-detachable worn attachments from @getattach</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RLVaSharedInvAutoRename</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Automatically renames shared inventory items when worn</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>RLVaShowNameTags</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Display of names above avatars is subject to the general "Show Names" setting when @shownames=n restricted</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>WarnFirstRLVGiveToRLV</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enables FirstRLVGiveToRLV warning dialog</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>CrashHostUrl</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -2589,28 +2754,6 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableGroupChatPopups</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable Incoming Group Chat Popups</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableIMChatPopups</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable Incoming IM Chat Popups</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>DisplayAvatarAgentTarget</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -3907,7 +4050,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
<string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
</map>
|
||||
<key>HighResSnapshot</key>
|
||||
<map>
|
||||
|
|
@ -4504,6 +4647,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LegacyMultiAttachmentSupport</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Converts legacy "secondary attachment points" to multi-attachments for other avatars</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LimitDragDistance</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -12255,16 +12409,5 @@
|
|||
<key>Value</key>
|
||||
<real>300.0</real>
|
||||
</map>
|
||||
<key>GroupMembersSortOrder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The order by which group members will be sorted (name|donated|online)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>name</string>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,17 @@
|
|||
<llsd>
|
||||
<map>
|
||||
<key>BusyResponseChanged</key>
|
||||
<key>RLVaLoginLastLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Determines whether the next login will be forced to the last logoff location (set by the viewer)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>BusyResponseChanged</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Does user's busy mode message differ from default?</string>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 25
|
||||
version 23
|
||||
|
||||
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
|
||||
// Should be combined into one table
|
||||
|
|
@ -144,7 +144,7 @@ WLSkyDetail 1 48
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 0
|
||||
RenderUseFBO 1 1
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -171,7 +171,7 @@ WLSkyDetail 1 128
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 0
|
||||
RenderUseFBO 1 1
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 25
|
||||
version 23
|
||||
|
||||
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
|
||||
// Should be combined into one table
|
||||
|
|
@ -144,7 +144,7 @@ WLSkyDetail 1 48
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 0
|
||||
RenderUseFBO 1 1
|
||||
|
||||
//
|
||||
// Ultra graphics (REALLY PURTY!)
|
||||
|
|
@ -171,7 +171,7 @@ WLSkyDetail 1 128
|
|||
RenderDeferred 1 0
|
||||
RenderDeferredSSAO 1 0
|
||||
RenderShadowDetail 1 0
|
||||
RenderUseFBO 1 0
|
||||
RenderUseFBO 1 1
|
||||
|
||||
//
|
||||
// Class Unknown Hardware (unknown)
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ LangString LanguageCode ${LANG_JAPANESE} "ja"
|
|||
LangString LanguageCode ${LANG_ITALIAN} "it"
|
||||
LangString LanguageCode ${LANG_KOREAN} "ko"
|
||||
LangString LanguageCode ${LANG_DUTCH} "nl"
|
||||
LangString LanguageCode ${LANG_POLISH} "pl"
|
||||
LangString LanguageCode ${LANG_POLISH} "da"
|
||||
LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
|
||||
LangString LanguageCode ${LANG_SIMPCHINESE} "zh"
|
||||
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ if [ -n "$LL_TCMALLOC" ]; then
|
|||
fi
|
||||
|
||||
export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
|
||||
export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
|
||||
export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-firestorm-bin'
|
||||
export SL_OPT="`cat etc/gridargs.dat` $@"
|
||||
|
||||
# Run the program
|
||||
|
|
@ -128,7 +128,7 @@ if [ -n "$LL_RUN_ERR" ]; then
|
|||
cat << EOFMARKER
|
||||
You are running the Second Life Viewer on a x86_64 platform. The
|
||||
most common problems when launching the Viewer (particularly
|
||||
'bin/do-not-directly-run-secondlife-bin: not found' and 'error while
|
||||
'bin/do-not-directly-run-firestorm-bin: not found' and 'error while
|
||||
loading shared libraries') may be solved by installing your Linux
|
||||
distribution's 32-bit compatibility packages.
|
||||
For example, on Ubuntu and other Debian-based Linuxes you might run:
|
||||
|
|
|
|||
|
|
@ -76,6 +76,10 @@
|
|||
#include "llwindow.h"
|
||||
#include "llworld.h"
|
||||
#include "llworldmap.h"
|
||||
// [RLVa:KB] - Checked: 2010-03-07 (RLVa-1.2.0c)
|
||||
#include "rlvhandler.h"
|
||||
#include "rlvui.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
using namespace LLVOAvatarDefines;
|
||||
|
||||
|
|
@ -469,6 +473,9 @@ void LLAgent::movePitch(F32 mag)
|
|||
// Does this parcel allow you to fly?
|
||||
BOOL LLAgent::canFly()
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-03-02 (RLVa-1.2.0d) | Modified: RLVa-1.0.0c
|
||||
if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) return FALSE;
|
||||
// [/RLVa:KB]
|
||||
if (isGodlike()) return TRUE;
|
||||
|
||||
LLViewerRegion* regionp = getRegion();
|
||||
|
|
@ -517,6 +524,13 @@ void LLAgent::setFlying(BOOL fly)
|
|||
|
||||
if (fly)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-03-02 (RLVa-1.2.0d) | Modified: RLVa-1.0.0c
|
||||
if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY))
|
||||
{
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
BOOL was_flying = getFlying();
|
||||
if (!canFly() && !was_flying)
|
||||
{
|
||||
|
|
@ -574,7 +588,14 @@ bool LLAgent::enableFlying()
|
|||
|
||||
void LLAgent::standUp()
|
||||
{
|
||||
setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
// setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
// [RLVa:KB] - Checked: 2010-03-07 (RLVa-1.2.0c) | Added: RLVa-1.2.0a
|
||||
// RELEASE-RLVa: [SL-2.0.0] Check this function's callers since usually they require explicit blocking
|
||||
if ( (!rlv_handler_t::isEnabled()) || (gRlvHandler.canStand()) )
|
||||
{
|
||||
setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -850,7 +871,14 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const
|
|||
|
||||
void LLAgent::sitDown()
|
||||
{
|
||||
setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
|
||||
// setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
|
||||
// [RLVa:KB] - Checked: 2010-08-28 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
|
||||
// RELEASE-RLVa: [SL-2.0.0] Check this function's callers since usually they require explicit blocking
|
||||
if ( (!rlv_handler_t::isEnabled()) || ((gRlvHandler.canStand()) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SIT))) )
|
||||
{
|
||||
setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2102,7 +2130,15 @@ void LLAgent::onAnimStop(const LLUUID& id)
|
|||
}
|
||||
else if (id == ANIM_AGENT_AWAY)
|
||||
{
|
||||
// clearAFK();
|
||||
// [RLVa:KB] - Checked: 2010-05-03 (RLVa-1.2.0g) | Added: RLVa-1.1.0g
|
||||
#ifdef RLV_EXTENSION_CMD_ALLOWIDLE
|
||||
if (!gRlvHandler.hasBehaviour(RLV_BHVR_ALLOWIDLE))
|
||||
clearAFK();
|
||||
#else
|
||||
clearAFK();
|
||||
#endif // RLV_EXTENSION_CMD_ALLOWIDLE
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
else if (id == ANIM_AGENT_STANDUP)
|
||||
{
|
||||
|
|
@ -3322,6 +3358,18 @@ void LLAgent::teleportRequest(
|
|||
// Landmark ID = LLUUID::null means teleport home
|
||||
void LLAgent::teleportViaLandmark(const LLUUID& landmark_asset_id)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-08-22 (RLVa-1.2.1a) | Modified: RLVa-1.2.1a
|
||||
// NOTE: we'll allow teleporting home unless both @tplm=n *and* @tploc=n restricted
|
||||
if ( (rlv_handler_t::isEnabled()) &&
|
||||
( ( (landmark_asset_id.notNull()) ? gRlvHandler.hasBehaviour(RLV_BHVR_TPLM)
|
||||
: gRlvHandler.hasBehaviour(RLV_BHVR_TPLM) && gRlvHandler.hasBehaviour(RLV_BHVR_TPLOC) ) ||
|
||||
((gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) && (isAgentAvatarValid()) && (gAgentAvatarp->isSitting())) ))
|
||||
{
|
||||
RlvUIEnabler::notifyBlockedTeleport();
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLViewerRegion *regionp = getRegion();
|
||||
if(regionp && teleportCore())
|
||||
{
|
||||
|
|
@ -3386,6 +3434,25 @@ void LLAgent::teleportCancel()
|
|||
|
||||
void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-03-02 (RLVa-1.2.0c) | Modified: RLVa-1.2.0a
|
||||
if ( (rlv_handler_t::isEnabled()) && (!RlvUtil::isForceTp()) )
|
||||
{
|
||||
// If we're getting teleported due to @tpto we should disregard any @tploc=n or @unsit=n restrictions from the same object
|
||||
if ( (gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOC, gRlvHandler.getCurrentObject())) ||
|
||||
( (isAgentAvatarValid()) && (gAgentAvatarp->isSitting()) &&
|
||||
(gRlvHandler.hasBehaviourExcept(RLV_BHVR_UNSIT, gRlvHandler.getCurrentObject()))) )
|
||||
{
|
||||
RlvUIEnabler::notifyBlockedTeleport();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (gRlvHandler.getCurrentCommand()) && (RLV_BHVR_TPTO == gRlvHandler.getCurrentCommand()->getBehaviourType()) )
|
||||
{
|
||||
gRlvHandler.setCanCancelTp(false);
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLViewerRegion* regionp = getRegion();
|
||||
U64 handle = to_region_handle(pos_global);
|
||||
LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
|
||||
|
|
@ -3428,6 +3495,16 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
|
|||
// Teleport to global position, but keep facing in the same direction
|
||||
void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-10-07 (RLVa-1.2.1f) | Added: RLVa-1.2.1f
|
||||
// RELEASE-RLVa: [SL-2.2.0] Make sure this isn't used for anything except double-click teleporting
|
||||
if ( (rlv_handler_t::isEnabled()) && (!RlvUtil::isForceTp()) &&
|
||||
((gRlvHandler.hasBehaviour(RLV_BHVR_SITTP)) || (!gRlvHandler.canStand())) )
|
||||
{
|
||||
RlvUIEnabler::notifyBlockedTeleport();
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
mbTeleportKeepsLookAt = true;
|
||||
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction
|
||||
U64 region_handle = to_region_handle(pos_global);
|
||||
|
|
|
|||
|
|
@ -48,6 +48,9 @@
|
|||
#include "llvoavatarself.h"
|
||||
#include "llwindow.h"
|
||||
#include "llworld.h"
|
||||
// [RLVa:KB] - Checked: 2010-05-10 (RLVa-1.2.0g)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
using namespace LLVOAvatarDefines;
|
||||
|
||||
|
|
@ -296,11 +299,8 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
|
|||
LLSelectMgr::getInstance()->deselectAll();
|
||||
}
|
||||
|
||||
if (gMenuHolder != NULL)
|
||||
{
|
||||
// Hide all popup menus
|
||||
gMenuHolder->hideMenus();
|
||||
}
|
||||
// Hide all popup menus
|
||||
gMenuHolder->hideMenus();
|
||||
}
|
||||
|
||||
if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
|
||||
|
|
@ -2256,6 +2256,13 @@ void LLAgentCamera::changeCameraToCustomizeAvatar()
|
|||
return;
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-03-07 (RLVa-1.2.0c) | Modified: RLVa-1.0.0g
|
||||
if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canStand()) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
gAgent.standUp(); // force stand up
|
||||
gViewerWindow->getWindow()->resetBusyCount();
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@
|
|||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerregion.h"
|
||||
// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLAgentListener::LLAgentListener(LLAgent &agent)
|
||||
: LLEventAPI("LLAgent",
|
||||
|
|
@ -85,8 +88,28 @@ void LLAgentListener::requestSit(LLSD const & event_data) const
|
|||
// *TODO - find a permanent place to share this code properly.
|
||||
LLViewerObject *object = gObjectList.findObject(event_data["obj_uuid"]);
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.1.0j
|
||||
// TODO-RLVa: [RLVa-1.2.1] Figure out how to call this?
|
||||
if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canSit(object)) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
if (object && object->getPCode() == LL_PCODE_VOLUME)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-08-29 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
|
||||
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_STANDTP)) && (isAgentAvatarValid()) )
|
||||
{
|
||||
if (gAgentAvatarp->isSitting())
|
||||
{
|
||||
gAgent.standUp();
|
||||
return;
|
||||
}
|
||||
gRlvHandler.setSitSource(gAgent.getPositionGlobal());
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
|
||||
|
|
@ -101,6 +124,14 @@ void LLAgentListener::requestSit(LLSD const & event_data) const
|
|||
|
||||
void LLAgentListener::requestStand(LLSD const & event_data) const
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-03-07 (RLVa-1.2.0c) | Added: RLVa-1.2.0a
|
||||
// TODO-RLVa: [RLVa-1.2.1] Figure out how to call this?
|
||||
if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canStand()) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,9 @@
|
|||
#include "llviewerparcelmgr.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llslurl.h"
|
||||
// [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.0d)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
//static
|
||||
void LLAgentUI::buildFullname(std::string& name)
|
||||
|
|
@ -99,6 +102,18 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
|
|||
// create a default name and description for the landmark
|
||||
std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
|
||||
std::string region_name = region->getName();
|
||||
// [RLVa:KB] - Checked: 2010-04-04 (RLVa-1.2.0d) | Modified: RLVa-1.2.0d
|
||||
// RELEASE-RLVa: [SL-2.0.0] Check ELocationFormat to make sure our switch still makes sense
|
||||
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
|
||||
{
|
||||
parcel_name = RlvStrings::getString(RLV_STRING_HIDDEN_PARCEL);
|
||||
region_name = RlvStrings::getString(RLV_STRING_HIDDEN_REGION);
|
||||
if (LOCATION_FORMAT_NO_MATURITY == fmt)
|
||||
fmt = LOCATION_FORMAT_LANDMARK;
|
||||
else if (LOCATION_FORMAT_FULL == fmt)
|
||||
fmt = LOCATION_FORMAT_NO_COORDS;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
std::string sim_access_string = region->getSimAccessString();
|
||||
std::string buffer;
|
||||
if( parcel_name.empty() )
|
||||
|
|
|
|||
|
|
@ -49,12 +49,18 @@
|
|||
#include "llvoavatarself.h"
|
||||
#include "llwearable.h"
|
||||
#include "llwearablelist.h"
|
||||
// [RLVa:KB] - Checked: RLVa-1.2.0a (2010-03-04)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
|
||||
LLAgentWearables gAgentWearables;
|
||||
|
||||
BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
bool LLAgentWearables::mInitialWearablesLoaded = false;
|
||||
// [/SL:KB]
|
||||
|
||||
using namespace LLVOAvatarDefines;
|
||||
|
||||
|
|
@ -760,12 +766,28 @@ U32 LLAgentWearables::pushWearable(const LLWearableType::EType type, LLWearable
|
|||
llwarns << "Null wearable sent for type " << type << llendl;
|
||||
return MAX_CLOTHING_PER_TYPE;
|
||||
}
|
||||
if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE)
|
||||
// if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE)
|
||||
// {
|
||||
// mWearableDatas[type].push_back(wearable);
|
||||
// wearableUpdated(wearable);
|
||||
// checkWearableAgainstInventory(wearable);
|
||||
// return mWearableDatas[type].size()-1;
|
||||
// }
|
||||
// [RLVa:KB] - Checked: 2010-06-08 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
|
||||
if ( (type < LLWearableType::WT_COUNT) && (mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE) )
|
||||
{
|
||||
mWearableDatas[type].push_back(wearable);
|
||||
// Don't add the same wearable twice
|
||||
U32 idxWearable = getWearableIndex(wearable);
|
||||
RLV_ASSERT(MAX_CLOTHING_PER_TYPE == idxWearable); // pushWearable() on an already added wearable is a bug *somewhere*
|
||||
if (MAX_CLOTHING_PER_TYPE == idxWearable)
|
||||
{
|
||||
mWearableDatas[type].push_back(wearable);
|
||||
idxWearable = mWearableDatas[type].size() - 1;
|
||||
}
|
||||
wearableUpdated(wearable);
|
||||
checkWearableAgainstInventory(wearable);
|
||||
return mWearableDatas[type].size()-1;
|
||||
return idxWearable;
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
return MAX_CLOTHING_PER_TYPE;
|
||||
}
|
||||
|
|
@ -1299,7 +1321,11 @@ void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_
|
|||
{
|
||||
LLWearable* old_wearable = getWearable(type,index);
|
||||
|
||||
if (old_wearable)
|
||||
// if (old_wearable)
|
||||
// [RLVa:KB] - Checked: 2010-05-11 (RLVa-1.2.0c) | Modified: RLVa-1.2.0g
|
||||
// NOTE: we block actual removal in removeWearableFinal(); all we really want here is to avoid showing the save notice
|
||||
if ( (old_wearable) && ((!rlv_handler_t::isEnabled()) || (!gRlvWearableLocks.isLockedWearable(old_wearable))) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
if (old_wearable->isDirty())
|
||||
{
|
||||
|
|
@ -1357,20 +1383,30 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo
|
|||
{
|
||||
LLWearable* old_wearable = getWearable(type,i);
|
||||
//queryWearableCache(); // moved below
|
||||
if (old_wearable)
|
||||
// if (old_wearable)
|
||||
// [RLVa:KB] - Checked: 2010-05-14 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
|
||||
if ( (old_wearable) && ((!rlv_handler_t::isEnabled()) || (!gRlvWearableLocks.isLockedWearable(old_wearable))) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
popWearable(old_wearable);
|
||||
old_wearable->removeFromAvatar(TRUE);
|
||||
}
|
||||
}
|
||||
mWearableDatas[type].clear();
|
||||
// mWearableDatas[type].clear();
|
||||
// [RLVa:KB] - Checked: 2010-05-14 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
|
||||
// The line above shouldn't be needed and would cause issues if we block removing one of the wearables
|
||||
RLV_VERIFY( ((!rlv_handler_t::isEnabled()) || (!gRlvWearableLocks.hasLockedWearable(type))) ? mWearableDatas[type].empty() : true );
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
else
|
||||
{
|
||||
LLWearable* old_wearable = getWearable(type, index);
|
||||
//queryWearableCache(); // moved below
|
||||
|
||||
if (old_wearable)
|
||||
// if (old_wearable)
|
||||
// [RLVa:KB] - Checked: 2010-05-14 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
|
||||
if ( (old_wearable) && ((!rlv_handler_t::isEnabled()) || (!gRlvWearableLocks.isLockedWearable(old_wearable))) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
popWearable(old_wearable);
|
||||
old_wearable->removeFromAvatar(TRUE);
|
||||
|
|
@ -1408,6 +1444,12 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
|
|||
S32 count = wearables.count();
|
||||
llassert(items.count() == count);
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-06-08 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
|
||||
// If the user is @add/remoutfit restricted in any way then this function won't just work as-is, so instead of removing and re-adding
|
||||
// we're stuck with any wearable type potentially having left-over (remove locked) clothing that we'll need to reorder in-place
|
||||
S32 idxCurPerType[LLWearableType::WT_COUNT] = { 0 };
|
||||
// [/RLVa:KB]
|
||||
|
||||
S32 i;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
|
|
@ -1427,10 +1469,51 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
|
|||
// exactly one wearable per body part
|
||||
setWearable(type,0,new_wearable);
|
||||
}
|
||||
else
|
||||
// else
|
||||
// {
|
||||
// pushWearable(type,new_wearable);
|
||||
// }
|
||||
// [RLVa:KB] - Checked: 2010-06-08 (RLVa-1.2.0g) | Added: RLVa-1.2.0g
|
||||
else if ( (!rlv_handler_t::isEnabled()) || (!gRlvWearableLocks.hasLockedWearable(type)) || (!remove) )
|
||||
{
|
||||
// Sanity check: there shouldn't be any worn wearables for this type the first time we encounter it
|
||||
RLV_ASSERT( (!remove) || (0 != idxCurPerType[type]) || (0 == getWearableCount(type)) );
|
||||
pushWearable(type,new_wearable);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get the current index of the wearable (or add it if doesn't exist yet)
|
||||
S32 idxCur = getWearableIndex(new_wearable);
|
||||
if (MAX_CLOTHING_PER_TYPE == idxCur)
|
||||
{
|
||||
// Skip adding if @addoutfit=n restricted *unless* the wearable made it into COF [see LLAppMgr::updateAgentWearables()]
|
||||
if ( (RLV_WEAR_LOCKED == gRlvWearableLocks.canWear(type)) &&
|
||||
(!gInventory.isObjectDescendentOf(new_item->getUUID(), LLAppearanceMgr::instance().getCOF())) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
idxCur = pushWearable(type,new_wearable);
|
||||
}
|
||||
|
||||
// Since we're moving up from index 0 we just swap the two wearables and things will work out in the end (hopefully)
|
||||
if (idxCurPerType[type] != idxCur)
|
||||
{
|
||||
wearableentry_map_t::iterator itWearable = mWearableDatas.find(type);
|
||||
RLV_ASSERT(itWearable != mWearableDatas.end());
|
||||
if (itWearable == mWearableDatas.end()) continue;
|
||||
wearableentry_vec_t& typeWearable = itWearable->second;
|
||||
RLV_ASSERT(typeWearable.size() >= 2);
|
||||
if (typeWearable.size() < 2) continue;
|
||||
|
||||
typeWearable[idxCur] = typeWearable[idxCurPerType[type]];
|
||||
typeWearable[idxCurPerType[type]] = new_wearable;
|
||||
//wearableUpdated(new_wearable);
|
||||
//checkWearableAgainstInventory(new_wearable);
|
||||
}
|
||||
}
|
||||
idxCurPerType[type]++;
|
||||
// [/RLVa:KB]
|
||||
|
||||
wearableUpdated(new_wearable);
|
||||
checkWearableAgainstInventory(new_wearable);
|
||||
}
|
||||
|
|
@ -1448,6 +1531,13 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
|
|||
// Start rendering & update the server
|
||||
mWearablesLoaded = TRUE;
|
||||
checkWearablesLoaded();
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-09-22 (Catznip-2.2.0a) | Modified: Catznip-2.2.0a
|
||||
if (!mInitialWearablesLoaded)
|
||||
{
|
||||
mInitialWearablesLoaded = true;
|
||||
mInitialWearablesLoadedSignal();
|
||||
}
|
||||
// [/SL:KB]
|
||||
notifyLoadingFinished();
|
||||
queryWearableCache();
|
||||
updateServer();
|
||||
|
|
@ -1470,6 +1560,16 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
|
|||
|
||||
const LLWearableType::EType type = new_wearable->getType();
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0a) | Modified: RLVa-1.2.0g
|
||||
// TODO-RLVa: [RLVa-1.2.1] This looks like dead code in SL-2.0.2 so we can't really check to see if it works :|
|
||||
if (rlv_handler_t::isEnabled())
|
||||
{
|
||||
ERlvWearMask eWear = gRlvWearableLocks.canWear(type);
|
||||
if ( (RLV_WEAR_LOCKED == eWear) || ((!do_append) && (!(eWear & RLV_WEAR_REPLACE))) )
|
||||
return;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
if (!do_append)
|
||||
{
|
||||
// Remove old wearable, if any
|
||||
|
|
@ -1725,7 +1825,10 @@ void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
|
|||
|
||||
// Combines userRemoveAllAttachments() and userAttachMultipleAttachments() logic to
|
||||
// get attachments into desired state with minimal number of adds/removes.
|
||||
void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array)
|
||||
//void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array)
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array, bool fAttachOnly)
|
||||
// [/SL:KB]
|
||||
{
|
||||
// Possible cases:
|
||||
// already wearing but not in request set -> take off.
|
||||
|
|
@ -1790,7 +1893,13 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj
|
|||
// llinfos << "remove " << remove_count << " add " << add_count << llendl;
|
||||
|
||||
// Remove everything in objects_to_remove
|
||||
userRemoveMultipleAttachments(objects_to_remove);
|
||||
// userRemoveMultipleAttachments(objects_to_remove);
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
if (!fAttachOnly)
|
||||
{
|
||||
userRemoveMultipleAttachments(objects_to_remove);
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
// Add everything in items_to_add
|
||||
userAttachMultipleAttachments(items_to_add);
|
||||
|
|
@ -1800,6 +1909,34 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo
|
|||
{
|
||||
if (!isAgentAvatarValid()) return;
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-03-04 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
|
||||
// RELEASE-RLVa: [SL-2.0.0] Check our callers and verify that erasing elements from the passed vector won't break random things
|
||||
if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) )
|
||||
{
|
||||
llvo_vec_t::iterator itObj = objects_to_remove.begin();
|
||||
while (itObj != objects_to_remove.end())
|
||||
{
|
||||
const LLViewerObject* pAttachObj = *itObj;
|
||||
if (gRlvAttachmentLocks.isLockedAttachment(pAttachObj))
|
||||
{
|
||||
itObj = objects_to_remove.erase(itObj);
|
||||
|
||||
// Fall-back code: re-add the attachment if it got removed from COF somehow (compensates for possible bugs elsewhere)
|
||||
LLInventoryModel::cat_array_t folders; LLInventoryModel::item_array_t items;
|
||||
LLLinkedItemIDMatches f(pAttachObj->getAttachmentItemID());
|
||||
gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), folders, items, LLInventoryModel::EXCLUDE_TRASH, f);
|
||||
RLV_ASSERT( 0 != items.count() );
|
||||
if (0 == items.count())
|
||||
LLAppearanceMgr::instance().registerAttachment(pAttachObj->getAttachmentItemID());
|
||||
}
|
||||
else
|
||||
{
|
||||
++itObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
if (objects_to_remove.empty())
|
||||
return;
|
||||
|
||||
|
|
@ -1846,6 +1983,23 @@ void LLAgentWearables::userRemoveAllAttachments()
|
|||
|
||||
void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-03-04 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
|
||||
// RELEASE-RLVa: [SL-2.0.0] Check our callers and verify that erasing elements from the passed vector won't break random things
|
||||
if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) )
|
||||
{
|
||||
// Fall-back code: everything should really already have been pruned before we get this far
|
||||
for (S32 idxItem = obj_item_array.count() - 1; idxItem >= 0; idxItem--)
|
||||
{
|
||||
const LLInventoryItem* pItem = obj_item_array.get(idxItem).get();
|
||||
if (!gRlvAttachmentLocks.canAttach(pItem))
|
||||
{
|
||||
obj_item_array.remove(idxItem);
|
||||
RLV_ASSERT(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Build a compound message to send all the objects that need to be rezzed.
|
||||
S32 obj_count = obj_item_array.count();
|
||||
|
||||
|
|
@ -1883,6 +2037,12 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra
|
|||
msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
|
||||
msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
|
||||
msg->addU8Fast(_PREHASH_AttachmentPt, 0 | ATTACHMENT_ADD); // Wear at the previous or default attachment point
|
||||
// [RLVa:KB] - Checked: 2010-07-28 (RLVa-1.2.0i) | Added: RLVa-1.2.0i
|
||||
if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) )
|
||||
{
|
||||
RlvAttachmentLockWatchdog::instance().onWearAttachment(item, RLV_WEAR_ADD);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
|
||||
msg->addStringFast(_PREHASH_Name, item->getName());
|
||||
msg->addStringFast(_PREHASH_Description, item->getDescription());
|
||||
|
|
@ -2100,6 +2260,13 @@ boost::signals2::connection LLAgentWearables::addLoadedCallback(loaded_callback_
|
|||
return mLoadedSignal.connect(cb);
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
boost::signals2::connection LLAgentWearables::addInitialWearablesLoadedCallback(loaded_callback_t cb)
|
||||
{
|
||||
return mInitialWearablesLoadedSignal.connect(cb);
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
void LLAgentWearables::notifyLoadingStarted()
|
||||
{
|
||||
mCOFChangeInProgress = true;
|
||||
|
|
|
|||
|
|
@ -76,6 +76,9 @@ public:
|
|||
|
||||
BOOL isWearableCopyable(LLWearableType::EType type, U32 index /*= 0*/) const;
|
||||
BOOL areWearablesLoaded() const;
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
bool areInitalWearablesLoaded() const { return mInitialWearablesLoaded; }
|
||||
// [/SL:KB]
|
||||
bool isCOFChangeInProgress() const { return mCOFChangeInProgress; }
|
||||
void updateWearablesLoaded();
|
||||
void checkWearablesLoaded() const;
|
||||
|
|
@ -215,7 +218,11 @@ public:
|
|||
|
||||
typedef std::vector<LLViewerObject*> llvo_vec_t;
|
||||
|
||||
static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);
|
||||
// static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
// Not the best way to go about this but other attempts changed far too much LL code to be a viable solution
|
||||
static void userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array, bool fAttachOnly = false);
|
||||
// [/SL:KB]
|
||||
static void userRemoveMultipleAttachments(llvo_vec_t& llvo_array);
|
||||
static void userRemoveAllAttachments();
|
||||
static void userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array);
|
||||
|
|
@ -234,6 +241,9 @@ public:
|
|||
typedef boost::function<void()> loaded_callback_t;
|
||||
typedef boost::signals2::signal<void()> loaded_signal_t;
|
||||
boost::signals2::connection addLoadedCallback(loaded_callback_t cb);
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
boost::signals2::connection addInitialWearablesLoadedCallback(loaded_callback_t cb);
|
||||
// [/SL:KB]
|
||||
|
||||
void notifyLoadingStarted();
|
||||
void notifyLoadingFinished();
|
||||
|
|
@ -241,6 +251,9 @@ public:
|
|||
private:
|
||||
loading_started_signal_t mLoadingStartedSignal; // should be called before wearables are changed
|
||||
loaded_signal_t mLoadedSignal; // emitted when all agent wearables get loaded
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
loaded_signal_t mInitialWearablesLoadedSignal; // emitted once when the initial wearables are loaded
|
||||
// [/SL:KB]
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Member variables
|
||||
|
|
@ -251,6 +264,9 @@ private:
|
|||
wearableentry_map_t mWearableDatas;
|
||||
|
||||
static BOOL mInitialWearablesUpdateReceived;
|
||||
// [SL:KB] - Patch: Appearance-InitialWearablesLoadedCallback | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
static bool mInitialWearablesLoaded;
|
||||
// [/SL:KB]
|
||||
BOOL mWearablesLoaded;
|
||||
std::set<LLUUID> mItemsAwaitingWearableUpdate;
|
||||
|
||||
|
|
|
|||
|
|
@ -119,8 +119,42 @@ void LLInitialWearablesFetch::processContents()
|
|||
gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array,
|
||||
LLInventoryModel::EXCLUDE_TRASH, is_wearable);
|
||||
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-05-18 (Catznip-2.2.0a) | Modified: Catznip-2.0.0h
|
||||
// NOTE: don't use the current COF contents if 'wearable_array' is empty (ie first logon with 2.0 or some other problem)
|
||||
bool fUpdateFromCOF = !wearable_array.empty();
|
||||
if (fUpdateFromCOF)
|
||||
{
|
||||
LLAppearanceMgr::wearables_by_type_t items_by_type(LLWearableType::WT_COUNT);
|
||||
LLAppearanceMgr::sortItemsByActualDescription(wearable_array);
|
||||
LLAppearanceMgr::divvyWearablesByType(wearable_array, items_by_type);
|
||||
|
||||
// Compare the COF wearables against the initial wearables
|
||||
for (initial_wearable_data_vec_t::const_iterator itWearableData = mAgentInitialWearables.begin();
|
||||
(itWearableData != mAgentInitialWearables.end()) && (fUpdateFromCOF); ++itWearableData)
|
||||
{
|
||||
const LLUUID& idItem = itWearableData->mItemID; bool fFound = false;
|
||||
|
||||
// TODO-Catznip: [SL-2.2.0] Bit of a hack until LL supports changing the descriptions of links
|
||||
for (S32 idxItem = 0, cntItem = items_by_type[itWearableData->mType].size(); idxItem < cntItem; idxItem++)
|
||||
{
|
||||
const LLViewerInventoryItem* pCOFItem = items_by_type[itWearableData->mType].get(idxItem);
|
||||
if (idItem == pCOFItem->getLinkedUUID())
|
||||
{
|
||||
fFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!fFound)
|
||||
fUpdateFromCOF = false;
|
||||
}
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
|
||||
if (wearable_array.count() > 0)
|
||||
// if (wearable_array.count() > 0)
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-28 (Catznip-2.2.0a) | Modified: Catznip-2.0.0e
|
||||
if (fUpdateFromCOF)
|
||||
// [/SL:KB]
|
||||
{
|
||||
gAgentWearables.notifyLoadingStarted();
|
||||
LLAppearanceMgr::instance().updateAppearanceFromCOF();
|
||||
|
|
@ -147,7 +181,7 @@ public:
|
|||
virtual void done()
|
||||
{
|
||||
gInventory.removeObserver(this);
|
||||
|
||||
/*
|
||||
// Link to all fetched items in COF.
|
||||
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
|
||||
for (uuid_vec_t::iterator it = mIDs.begin();
|
||||
|
|
@ -170,7 +204,33 @@ public:
|
|||
LLAssetType::AT_LINK,
|
||||
link_waiter);
|
||||
}
|
||||
*/
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-08-14 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
doOnIdleOneTime(boost::bind(&LLFetchAndLinkObserver::doneIdle, this));
|
||||
// [/SL:KB]
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
void doneIdle()
|
||||
{
|
||||
// NOTE: the code above makes the assumption that COF is empty which won't be the case the way it's used now
|
||||
LLInventoryModel::item_array_t initial_items;
|
||||
for (uuid_vec_t::iterator itItem = mIDs.begin(); itItem != mIDs.end(); ++itItem)
|
||||
{
|
||||
LLViewerInventoryItem* pItem = gInventory.getItem(*itItem);
|
||||
if (!pItem)
|
||||
{
|
||||
llwarns << "fetch failed!" << llendl;
|
||||
continue;
|
||||
}
|
||||
initial_items.push_back(pItem);
|
||||
}
|
||||
|
||||
LLAppearanceMgr::instance().updateAppearanceFromInitialWearables(initial_items);
|
||||
|
||||
delete this;
|
||||
}
|
||||
// [/SL:KB]
|
||||
};
|
||||
|
||||
void LLInitialWearablesFetch::processWearablesMessage()
|
||||
|
|
@ -182,7 +242,11 @@ void LLInitialWearablesFetch::processWearablesMessage()
|
|||
for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)
|
||||
{
|
||||
// Populate the current outfit folder with links to the wearables passed in the message
|
||||
InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback.
|
||||
// InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback.
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-05-02 (Catznip-2.2.0a) | Added: Catznip-2.0.0f
|
||||
// Fixes minor leak: since COF is used onInitialWearableAssetArrived() will never get called and "wearable_data" leaks
|
||||
InitialWearableData* wearable_data = &mAgentInitialWearables[i];
|
||||
// [/SL:KB]
|
||||
|
||||
if (wearable_data->mAssetID.notNull())
|
||||
{
|
||||
|
|
@ -192,7 +256,7 @@ void LLInitialWearablesFetch::processWearablesMessage()
|
|||
{
|
||||
llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID "
|
||||
<< wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl;
|
||||
delete wearable_data;
|
||||
// delete wearable_data;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,9 @@
|
|||
#include "llvoavatarself.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llwearablelist.h"
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0b)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
// RAII thingy to guarantee that a variable gets reset when the Setter
|
||||
// goes out of scope. More general utility would be handy - TODO:
|
||||
|
|
@ -280,11 +283,15 @@ public:
|
|||
void onWearableAssetFetch(LLWearable *wearable);
|
||||
void onAllComplete();
|
||||
|
||||
// [SL:KB] - Patch: Appearance-COFCorruption | Checked: 2010-04-14 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
bool pollStopped();
|
||||
// [/SL:KB]
|
||||
|
||||
typedef std::list<LLFoundData> found_list_t;
|
||||
found_list_t& getFoundList();
|
||||
void eraseTypeToLink(LLWearableType::EType type);
|
||||
void eraseTypeToRecover(LLWearableType::EType type);
|
||||
void setObjItems(const LLInventoryModel::item_array_t& items);
|
||||
// void setObjItems(const LLInventoryModel::item_array_t& items);
|
||||
void setGestItems(const LLInventoryModel::item_array_t& items);
|
||||
bool isMostRecent();
|
||||
void handleLateArrivals();
|
||||
|
|
@ -292,7 +299,7 @@ public:
|
|||
|
||||
private:
|
||||
found_list_t mFoundList;
|
||||
LLInventoryModel::item_array_t mObjItems;
|
||||
// LLInventoryModel::item_array_t mObjItems;
|
||||
LLInventoryModel::item_array_t mGestItems;
|
||||
typedef std::set<S32> type_set_t;
|
||||
type_set_t mTypesToRecover;
|
||||
|
|
@ -358,10 +365,15 @@ void LLWearableHoldingPattern::eraseTypeToRecover(LLWearableType::EType type)
|
|||
mTypesToRecover.erase(type);
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-06-19 (Catznip-2.2.0a) | Added: Catznip-2.1.2a
|
||||
// Fix for http://jira.secondlife.com/browse/VWR-18512
|
||||
/*
|
||||
void LLWearableHoldingPattern::setObjItems(const LLInventoryModel::item_array_t& items)
|
||||
{
|
||||
mObjItems = items;
|
||||
}
|
||||
*/
|
||||
// [/SL:KB]
|
||||
|
||||
void LLWearableHoldingPattern::setGestItems(const LLInventoryModel::item_array_t& items)
|
||||
{
|
||||
|
|
@ -458,12 +470,17 @@ void LLWearableHoldingPattern::onAllComplete()
|
|||
llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
|
||||
LLAppearanceMgr::instance().updateAgentWearables(this, false);
|
||||
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-03-22 (Catznip-2.2.0a) | Added: Catznip-2.1.2a
|
||||
// Fix for http://jira.secondlife.com/browse/VWR-18512
|
||||
/*
|
||||
// Update attachments to match those requested.
|
||||
if (isAgentAvatarValid())
|
||||
{
|
||||
llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
|
||||
LLAgentWearables::userUpdateAttachments(mObjItems);
|
||||
}
|
||||
*/
|
||||
// [/SL:KB]
|
||||
|
||||
if (isFetchCompleted() && isMissingCompleted())
|
||||
{
|
||||
|
|
@ -493,6 +510,12 @@ bool LLWearableHoldingPattern::pollFetchCompletion()
|
|||
if (!isMostRecent())
|
||||
{
|
||||
llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
|
||||
|
||||
// [SL:KB] - Patch: Appearance-COFCorruption | Checked: 2010-04-14 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
// If we were signalled to stop then we shouldn't do anything else except poll for when it's safe to delete ourselves
|
||||
doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollStopped, this));
|
||||
return true;
|
||||
// [/SL:KB]
|
||||
}
|
||||
|
||||
bool completed = isFetchCompleted();
|
||||
|
|
@ -584,6 +607,11 @@ public:
|
|||
if (!mHolder->isMostRecent())
|
||||
{
|
||||
llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
|
||||
|
||||
// [SL:KB] - Patch: Appearance-COFCorruption | Checked: 2010-04-14 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
// If we were signalled to stop then we shouldn't do anything else except poll for when it's safe to delete ourselves
|
||||
return;
|
||||
// [/SL:KB]
|
||||
}
|
||||
|
||||
llinfos << "Recovered item for type " << mType << llendl;
|
||||
|
|
@ -658,11 +686,30 @@ void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()
|
|||
}
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Appearance-COFCorruption | Checked: 2010-04-14 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
bool LLWearableHoldingPattern::pollStopped()
|
||||
{
|
||||
// We have to keep on polling until we're sure that all callbacks have completed or they'll cause a crash
|
||||
if ( (isFetchCompleted()) && (isMissingCompleted()) )
|
||||
{
|
||||
delete this;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
bool LLWearableHoldingPattern::pollMissingWearables()
|
||||
{
|
||||
if (!isMostRecent())
|
||||
{
|
||||
llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
|
||||
|
||||
// [SL:KB] - Patch: Appearance-COFCorruption | Checked: 2010-04-14 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
// If we were signalled to stop then we shouldn't do anything else except poll for when it's safe to delete ourselves
|
||||
doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollStopped, this));
|
||||
return true;
|
||||
// [/SL:KB]
|
||||
}
|
||||
|
||||
bool timed_out = isTimedOut();
|
||||
|
|
@ -983,6 +1030,33 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up
|
|||
return false;
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1a) | Modified: RLVa-1.2.1a
|
||||
if ( (rlv_handler_t::isEnabled()) &&
|
||||
((gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) || (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY))) )
|
||||
{
|
||||
switch (item_to_wear->getType())
|
||||
{
|
||||
case LLAssetType::AT_BODYPART:
|
||||
case LLAssetType::AT_CLOTHING:
|
||||
{
|
||||
ERlvWearMask eWear = gRlvWearableLocks.canWear(item_to_wear);
|
||||
if ( (RLV_WEAR_LOCKED == eWear) || ((replace) && ((RLV_WEAR_REPLACE & eWear) == 0)) )
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case LLAssetType::AT_OBJECT:
|
||||
{
|
||||
ERlvWearMask eWear = gRlvAttachmentLocks.canAttach(item_to_wear);
|
||||
if ( (RLV_WEAR_LOCKED == eWear) || ((replace) && ((RLV_WEAR_REPLACE & eWear) == 0)) )
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
switch (item_to_wear->getType())
|
||||
{
|
||||
case LLAssetType::AT_CLOTHING:
|
||||
|
|
@ -1295,7 +1369,10 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)
|
|||
}
|
||||
|
||||
// Check whether it's the base outfit.
|
||||
if (outfit_cat_id.isNull() || outfit_cat_id == getBaseOutfitUUID())
|
||||
// if (outfit_cat_id.isNull() || outfit_cat_id == getBaseOutfitUUID())
|
||||
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-09-21 (Catznip-2.2.0a) | Added: Catznip-2.1.2d
|
||||
if ( (outfit_cat_id.isNull()) || ((outfit_cat_id == getBaseOutfitUUID()) && (!isOutfitDirty())) )
|
||||
// [/SL:KB]
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1344,6 +1421,45 @@ void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_lin
|
|||
}
|
||||
}
|
||||
|
||||
// [SL:KB] - Checked: 2010-04-24 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
void LLAppearanceMgr::syncCOF(const LLInventoryModel::item_array_t& items, LLAssetType::EType type, LLPointer<LLInventoryCallback> cb)
|
||||
{
|
||||
const LLUUID idCOF = getCOF();
|
||||
LLInventoryModel::item_array_t cur_cof_items, new_cof_items = items;
|
||||
|
||||
// Grab the current COF contents
|
||||
LLIsType f(type);
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
gInventory.collectDescendentsIf(getCOF(), cats, cur_cof_items, LLInventoryModel::EXCLUDE_TRASH, f);
|
||||
|
||||
// Purge everything in cur_cof_items that isn't part of new_cof_items
|
||||
for (S32 idxCurItem = 0, cntCurItem = cur_cof_items.count(); idxCurItem < cntCurItem; idxCurItem++)
|
||||
{
|
||||
const LLViewerInventoryItem* pItem = cur_cof_items.get(idxCurItem);
|
||||
if (std::find_if(new_cof_items.begin(), new_cof_items.end(), RlvPredIsEqualOrLinkedItem(pItem)) == new_cof_items.end())
|
||||
{
|
||||
// Item doesn't exist in new_cof_items => purge (if it's a link)
|
||||
if (pItem->getIsLinkType())
|
||||
gInventory.purgeObject(pItem->getUUID());
|
||||
}
|
||||
else
|
||||
{
|
||||
// Item exists in new_cof_items => remove *all* occurances in new_cof_items (removes duplicate COF links to this item as well)
|
||||
new_cof_items.erase(
|
||||
std::remove_if(new_cof_items.begin(), new_cof_items.end(), RlvPredIsEqualOrLinkedItem(pItem)), new_cof_items.end());
|
||||
}
|
||||
}
|
||||
|
||||
// Link to whatever remains in new_cof_items
|
||||
for (S32 idxNewItem = 0, cntNewItem = new_cof_items.count(); idxNewItem < cntNewItem; idxNewItem++)
|
||||
{
|
||||
const LLInventoryItem* pItem = new_cof_items.get(idxNewItem);
|
||||
link_inventory_item(
|
||||
gAgent.getID(), pItem->getLinkedUUID(), idCOF, pItem->getName(), pItem->LLInventoryItem::getDescription(), LLAssetType::AT_LINK, cb);
|
||||
}
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
// Keep the last N wearables of each type. For viewer 2.0, N is 1 for
|
||||
// both body parts and clothing items.
|
||||
void LLAppearanceMgr::filterWearableItems(
|
||||
|
|
@ -1360,7 +1476,11 @@ void LLAppearanceMgr::filterWearableItems(
|
|||
S32 size = items_by_type[i].size();
|
||||
if (size <= 0)
|
||||
continue;
|
||||
S32 start_index = llmax(0,size-max_per_type);
|
||||
// S32 start_index = llmax(0,size-max_per_type);
|
||||
// [SL:KB] - Patch: Appearance-Misc | Checked: 2010-05-11 (Catznip-2.2.0a) | Added: Catznip-2.0.0h
|
||||
S32 start_index =
|
||||
llmax(0, size - ((LLAssetType::AT_BODYPART == LLWearableType::getAssetType((LLWearableType::EType)i)) ? 1 : max_per_type));
|
||||
// [/SL:KB[
|
||||
for (S32 j = start_index; j<size; j++)
|
||||
{
|
||||
items.push_back(items_by_type[i][j]);
|
||||
|
|
@ -1392,10 +1512,31 @@ void LLAppearanceMgr::linkAll(const LLUUID& cat_uuid,
|
|||
}
|
||||
}
|
||||
|
||||
//void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0b) | Added: RLVa-1.2.0b
|
||||
void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
|
||||
{
|
||||
LLViewerInventoryCategory *pcat = gInventory.getCategory(category);
|
||||
llinfos << "starting, cat " << (pcat ? pcat->getName() : "[UNKNOWN]") << llendl;
|
||||
LLInventoryModel::item_array_t body_items_new, wear_items_new, obj_items_new, gest_items_new;
|
||||
getDescendentsOfAssetType(category, body_items_new, LLAssetType::AT_BODYPART, false);
|
||||
getDescendentsOfAssetType(category, wear_items_new, LLAssetType::AT_CLOTHING, false);
|
||||
getDescendentsOfAssetType(category, obj_items_new, LLAssetType::AT_OBJECT, false);
|
||||
getDescendentsOfAssetType(category, gest_items_new, LLAssetType::AT_GESTURE, false);
|
||||
updateCOF(body_items_new, wear_items_new, obj_items_new, gest_items_new, append, category);
|
||||
}
|
||||
|
||||
void LLAppearanceMgr::updateCOF(LLInventoryModel::item_array_t& body_items_new,
|
||||
LLInventoryModel::item_array_t& wear_items_new,
|
||||
LLInventoryModel::item_array_t& obj_items_new,
|
||||
LLInventoryModel::item_array_t& gest_items_new,
|
||||
bool append /*=false*/, const LLUUID& idOutfit /*=LLUUID::null*/)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
// LLViewerInventoryCategory *pcat = gInventory.getCategory(category);
|
||||
// llinfos << "starting, cat " << (pcat ? pcat->getName() : "[UNKNOWN]") << llendl;
|
||||
// [RLVa:KB] - Checked: 2010-03-26 (RLVa-1.2.0b) | Added: RLVa-1.2.0b
|
||||
// RELEASE-RLVa: [SL-2.0.0] If pcat ever gets used for anything further down the beta we'll know about it
|
||||
llinfos << "starting" << llendl;
|
||||
// [/RLVa:KB]
|
||||
|
||||
const LLUUID cof = getCOF();
|
||||
|
||||
|
|
@ -1416,75 +1557,143 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
|
|||
|
||||
// Collect and filter descendents to determine new COF contents.
|
||||
|
||||
// - Body parts: always include COF contents as a fallback in case any
|
||||
// required parts are missing.
|
||||
//
|
||||
// - Body parts: always include COF contents as a fallback in case any required parts are missing.
|
||||
//
|
||||
// Preserve body parts from COF if appending.
|
||||
LLInventoryModel::item_array_t body_items;
|
||||
getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART, false);
|
||||
getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false);
|
||||
if (append)
|
||||
reverse(body_items.begin(), body_items.end());
|
||||
// getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false);
|
||||
// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0b
|
||||
// Filter out any new body parts that can't be worn before adding them
|
||||
if ( (rlv_handler_t::isEnabled()) && (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY)) )
|
||||
body_items_new.erase(std::remove_if(body_items_new.begin(), body_items_new.end(), rlvPredIsNotWearableItem), body_items_new.end());
|
||||
body_items.insert(body_items.end(), body_items_new.begin(), body_items_new.end());
|
||||
// [/RLVa:KB]
|
||||
// NOTE-RLVa: we don't actually want to favour COF body parts over the folder's body parts (if only because it breaks force wear)
|
||||
// if (append)
|
||||
// reverse(body_items.begin(), body_items.end());
|
||||
// Reduce body items to max of one per type.
|
||||
removeDuplicateItems(body_items);
|
||||
filterWearableItems(body_items, 1);
|
||||
|
||||
//
|
||||
// - Wearables: include COF contents only if appending.
|
||||
//
|
||||
LLInventoryModel::item_array_t wear_items;
|
||||
if (append)
|
||||
getDescendentsOfAssetType(cof, wear_items, LLAssetType::AT_CLOTHING, false);
|
||||
getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false);
|
||||
// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0b
|
||||
else if ( (rlv_handler_t::isEnabled()) && (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY)) )
|
||||
{
|
||||
// Make sure that all currently locked clothing layers remain in COF when replacing
|
||||
getDescendentsOfAssetType(cof, wear_items, LLAssetType::AT_CLOTHING, false);
|
||||
wear_items.erase(std::remove_if(wear_items.begin(), wear_items.end(), rlvPredIsRemovableItem), wear_items.end());
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
// getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false);
|
||||
// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0c) | Modified: RLVa-1.2.0b
|
||||
// Filter out any new wearables that can't be worn before adding them
|
||||
if ( (rlv_handler_t::isEnabled()) && (gRlvWearableLocks.hasLockedWearableType(RLV_LOCK_ANY)) )
|
||||
wear_items_new.erase(std::remove_if(wear_items_new.begin(), wear_items_new.end(), rlvPredIsNotWearableItem), wear_items_new.end());
|
||||
wear_items.insert(wear_items.end(), wear_items_new.begin(), wear_items_new.end());
|
||||
// [/RLVa:KB]
|
||||
// Reduce wearables to max of one per type.
|
||||
removeDuplicateItems(wear_items);
|
||||
filterWearableItems(wear_items, LLAgentWearables::MAX_CLOTHING_PER_TYPE);
|
||||
|
||||
//
|
||||
// - Attachments: include COF contents only if appending.
|
||||
//
|
||||
LLInventoryModel::item_array_t obj_items;
|
||||
if (append)
|
||||
getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT, false);
|
||||
getDescendentsOfAssetType(category, obj_items, LLAssetType::AT_OBJECT, false);
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0z) | Modified: RLVa-1.2.0b
|
||||
else if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) )
|
||||
{
|
||||
// Make sure that all currently locked attachments remain in COF when replacing
|
||||
getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT, false);
|
||||
obj_items.erase(std::remove_if(obj_items.begin(), obj_items.end(), rlvPredIsRemovableItem), obj_items.end());
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
// getDescendentsOfAssetType(category, obj_items, LLAssetType::AT_OBJECT, false);
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0z) | Modified: RLVa-1.2.0b
|
||||
// Filter out any new attachments that can't be worn before adding them
|
||||
if ( (rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) )
|
||||
obj_items_new.erase(std::remove_if(obj_items_new.begin(), obj_items_new.end(), rlvPredIsNotWearableItem), obj_items_new.end());
|
||||
obj_items.insert(obj_items.end(), obj_items_new.begin(), obj_items_new.end());
|
||||
// [/RLVa:KB]
|
||||
removeDuplicateItems(obj_items);
|
||||
|
||||
//
|
||||
// - Gestures: include COF contents only if appending.
|
||||
//
|
||||
LLInventoryModel::item_array_t gest_items;
|
||||
if (append)
|
||||
getDescendentsOfAssetType(cof, gest_items, LLAssetType::AT_GESTURE, false);
|
||||
getDescendentsOfAssetType(category, gest_items, LLAssetType::AT_GESTURE, false);
|
||||
// getDescendentsOfAssetType(category, gest_items, LLAssetType::AT_GESTURE, false);
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0z) | Added: RLVa-1.2.0b
|
||||
gest_items.insert(gest_items.end(), gest_items_new.begin(), gest_items_new.end());
|
||||
// [/RLVa:KB]
|
||||
removeDuplicateItems(gest_items);
|
||||
|
||||
// Remove current COF contents.
|
||||
bool keep_outfit_links = append;
|
||||
purgeCategory(cof, keep_outfit_links);
|
||||
gInventory.notifyObservers();
|
||||
|
||||
// Create links to new COF contents.
|
||||
llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;
|
||||
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy(!append);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking body items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, body_items, link_waiter);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking wear items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, wear_items, link_waiter);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking obj items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, obj_items, link_waiter);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking gesture items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, gest_items, link_waiter);
|
||||
|
||||
// Add link to outfit if category is an outfit.
|
||||
// [SL:KB] - Checked: 2010-04-24 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
if (!append)
|
||||
{
|
||||
createBaseOutfitLink(category, link_waiter);
|
||||
// [/SL:KB]
|
||||
// Remove current COF contents.
|
||||
bool keep_outfit_links = append;
|
||||
purgeCategory(cof, keep_outfit_links);
|
||||
gInventory.notifyObservers();
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking body items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, body_items, link_waiter);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking wear items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, wear_items, link_waiter);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking obj items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, obj_items, link_waiter);
|
||||
|
||||
#ifndef LL_RELEASE_FOR_DOWNLOAD
|
||||
llinfos << "Linking gesture items" << llendl;
|
||||
#endif
|
||||
linkAll(cof, gest_items, link_waiter);
|
||||
// [SL:KB] - Checked: 2010-04-24 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
}
|
||||
else
|
||||
{
|
||||
// Synchronize COF
|
||||
// -> it's possible that we don't link to any new items in which case 'link_waiter' fires when it goes out of scope below
|
||||
syncCOF(body_items, LLAssetType::AT_BODYPART, link_waiter);
|
||||
syncCOF(wear_items, LLAssetType::AT_CLOTHING, link_waiter);
|
||||
syncCOF(obj_items, LLAssetType::AT_OBJECT, link_waiter);
|
||||
syncCOF(gest_items, LLAssetType::AT_GESTURE, link_waiter);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
// Add link to outfit if category is an outfit.
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0z) | Added: RLVa-1.2.0b
|
||||
if ( (!append) && (idOutfit.notNull()) )
|
||||
{
|
||||
createBaseOutfitLink(idOutfit, link_waiter);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
// if (!append)
|
||||
// {
|
||||
// createBaseOutfitLink(category, link_waiter);
|
||||
// }
|
||||
|
||||
llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl;
|
||||
}
|
||||
|
||||
|
|
@ -1535,6 +1744,25 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo
|
|||
LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID);
|
||||
if( item && (item->getAssetUUID() == wearable->getAssetID()) )
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-03-19 (RLVa-1.2.0g) | Modified: RLVa-1.2.0g
|
||||
// TODO-RLVa: [RLVa-1.2.1] This is fall-back code so if we don't ever trigger this code it can just be removed
|
||||
// -> one way to trigger the assertion:
|
||||
// 1) "Replace Outfit" on a folder with clothing and an attachment that goes @addoutfit=n
|
||||
// 2) updateCOF will add/link the items into COF => no @addoutfit=n present yet => allowed
|
||||
// 3) llOwnerSay("@addoutfit=n") executes
|
||||
// 4) code below runs => @addoutfit=n conflicts with adding new wearables
|
||||
// => if it's left as-is then the wearables won't get worn (but remain in COF which causes issues of its own)
|
||||
// => if it's changed to debug-only then we make tge assumption that anything that makes it into COF is always OK
|
||||
#ifdef RLV_DEBUG
|
||||
// NOTE: make sure we don't accidentally block setting the initial wearables
|
||||
if ( (rlv_handler_t::isEnabled()) && (RLV_WEAR_LOCKED == gRlvWearableLocks.canWear(wearable->getType())) &&
|
||||
(!gAgentWearables.getWearableFromItemID(item->getUUID())) && (gAgentWearables.areWearablesLoaded()) )
|
||||
{
|
||||
RLV_VERIFY(RLV_WEAR_LOCKED == gRlvWearableLocks.canWear(wearable->getType()));
|
||||
continue;
|
||||
}
|
||||
#endif // RLV_DEBUG
|
||||
// [/RLVa:KB]
|
||||
items.put(item);
|
||||
wearables.put(wearable);
|
||||
}
|
||||
|
|
@ -1692,6 +1920,34 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
|
|||
dumpItemArray(wear_items,"asset_dump: wear_item");
|
||||
dumpItemArray(obj_items,"asset_dump: obj_item");
|
||||
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
// Update attachments to match those requested.
|
||||
if (isAgentAvatarValid())
|
||||
{
|
||||
// Include attachments which should be in COF but don't have their link created yet
|
||||
uuid_vec_t::iterator itPendingAttachLink = mPendingAttachLinks.begin();
|
||||
while (itPendingAttachLink != mPendingAttachLinks.end())
|
||||
{
|
||||
const LLUUID& idItem = *itPendingAttachLink;
|
||||
if ( (!gAgentAvatarp->isWearingAttachment(idItem)) || (isLinkInCOF(idItem)) )
|
||||
{
|
||||
itPendingAttachLink = mPendingAttachLinks.erase(itPendingAttachLink);
|
||||
continue;
|
||||
}
|
||||
|
||||
LLViewerInventoryItem* pItem = gInventory.getItem(idItem);
|
||||
if (pItem)
|
||||
obj_items.push_back(pItem);
|
||||
|
||||
++itPendingAttachLink;
|
||||
}
|
||||
|
||||
// Don't remove attachments until avatar is fully loaded (should reduce random attaching/detaching/reattaching at log-on)
|
||||
llinfos << "Updating " << obj_items.count() << " attachments" << llendl;
|
||||
LLAgentWearables::userUpdateAttachments(obj_items, !gAgentAvatarp->isFullyLoaded());
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
if(!wear_items.count())
|
||||
{
|
||||
LLNotificationsUtil::add("CouldNotPutOnOutfit");
|
||||
|
|
@ -1704,7 +1960,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
|
|||
|
||||
LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
|
||||
|
||||
holder->setObjItems(obj_items);
|
||||
// holder->setObjItems(obj_items);
|
||||
holder->setGestItems(gest_items);
|
||||
|
||||
// Note: can't do normal iteration, because if all the
|
||||
|
|
@ -1774,6 +2030,21 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)
|
|||
}
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
void LLAppearanceMgr::updateAppearanceFromInitialWearables(LLInventoryModel::item_array_t& initial_items)
|
||||
{
|
||||
const LLUUID& idCOF = getCOF();
|
||||
|
||||
// Remove current COF contents
|
||||
purgeCategory(idCOF, false);
|
||||
gInventory.notifyObservers();
|
||||
|
||||
// Create links to new COF contents
|
||||
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy();
|
||||
linkAll(idCOF, initial_items, link_waiter);
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
void LLAppearanceMgr::getDescendentsOfAssetType(const LLUUID& category,
|
||||
LLInventoryModel::item_array_t& items,
|
||||
LLAssetType::EType type,
|
||||
|
|
@ -2204,11 +2475,12 @@ void LLAppearanceMgr::updateIsDirty()
|
|||
base_outfit = catp->getUUID();
|
||||
}
|
||||
|
||||
// Set dirty to "false" if no base outfit found to disable "Save"
|
||||
// and leave only "Save As" enabled in My Outfits.
|
||||
mOutfitIsDirty = false;
|
||||
|
||||
if (base_outfit.notNull())
|
||||
if(base_outfit.isNull())
|
||||
{
|
||||
// no outfit link found, display "unsaved outfit"
|
||||
mOutfitIsDirty = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLIsOfAssetType collector = LLIsOfAssetType(LLAssetType::AT_LINK);
|
||||
|
||||
|
|
@ -2247,6 +2519,8 @@ void LLAppearanceMgr::updateIsDirty()
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
mOutfitIsDirty = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2511,11 +2785,30 @@ void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)
|
|||
switch (item_to_remove->getType())
|
||||
{
|
||||
case LLAssetType::AT_CLOTHING:
|
||||
if (get_is_item_worn(id_to_remove))
|
||||
// if (get_is_item_worn(id_to_remove))
|
||||
// {
|
||||
// //*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future
|
||||
// LLWearableBridge::removeItemFromAvatar(item_to_remove);
|
||||
// }
|
||||
// [SL:KB] - Patch: Appearance-RemoveWearableFromAvatar | Checked: 2010-08-13 (Catznip-2.2.0a) | Added: Catznip-2.1.1d
|
||||
// [RLVa:KB] - Checked: 2010-09-04 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
|
||||
if ( (!rlv_handler_t::isEnabled()) || (gRlvWearableLocks.canRemove(item_to_remove)) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
//*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future
|
||||
LLWearableBridge::removeItemFromAvatar(item_to_remove);
|
||||
/*const*/ LLWearable* pWearable = gAgentWearables.getWearableFromItemID(item_to_remove->getLinkedUUID());
|
||||
if ( (pWearable) && (LLAssetType::AT_BODYPART != pWearable->getAssetType()) )
|
||||
{
|
||||
U32 idxWearable = gAgentWearables.getWearableIndex(pWearable);
|
||||
if (idxWearable < LLAgentWearables::MAX_CLOTHING_PER_TYPE)
|
||||
{
|
||||
gAgentWearables.removeWearable(pWearable->getType(), false, idxWearable);
|
||||
|
||||
LLAppearanceMgr::instance().removeCOFItemLinks(item_to_remove->getLinkedUUID(), false);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
}
|
||||
}
|
||||
// [/SL:KB]
|
||||
break;
|
||||
case LLAssetType::AT_OBJECT:
|
||||
LLVOAvatarSelf::detachAttachmentIntoInventory(item_to_remove->getLinkedUUID());
|
||||
|
|
@ -2638,7 +2931,6 @@ void LLAppearanceMgr::dumpItemArray(const LLInventoryModel::item_array_t& items,
|
|||
LLAppearanceMgr::LLAppearanceMgr():
|
||||
mAttachmentInvLinkEnabled(false),
|
||||
mOutfitIsDirty(false),
|
||||
mOutfitLocked(false),
|
||||
mIsInUpdateAppearanceFromCOF(false)
|
||||
{
|
||||
LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
|
||||
|
|
@ -2661,6 +2953,12 @@ void LLAppearanceMgr::setAttachmentInvLinkEnable(bool val)
|
|||
{
|
||||
llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl;
|
||||
mAttachmentInvLinkEnabled = val;
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-10-05 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
if (mAttachmentInvLinkEnabled)
|
||||
{
|
||||
linkPendingAttachments();
|
||||
}
|
||||
// [/SL:KB]
|
||||
}
|
||||
|
||||
void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
|
||||
|
|
@ -2683,13 +2981,24 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
|
|||
void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
|
||||
{
|
||||
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-10-05 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
if (isLinkInCOF(item_id))
|
||||
{
|
||||
return;
|
||||
}
|
||||
mPendingAttachLinks.push_back(item_id);
|
||||
// [/SL:KB]
|
||||
|
||||
if (mAttachmentInvLinkEnabled)
|
||||
{
|
||||
// we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF.
|
||||
// it will trigger gAgentWariables.notifyLoadingFinished()
|
||||
// But it is not acceptable solution. See EXT-7777
|
||||
LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item.
|
||||
// LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item.
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-10-05 (Catznip-2.2.0a) | Modified: Catznip-2.2.0a
|
||||
LLPointer<LLInventoryCallback> cb = new LLRegisterAttachmentCallback();
|
||||
LLAppearanceMgr::addCOFItemLink(item_id, false, cb); // Add COF link for item.
|
||||
// [/SL:KB]
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2700,6 +3009,13 @@ void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
|
|||
void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)
|
||||
{
|
||||
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-10-05 (Catznip-2.2.0a) | Added: Catznip-2.2.0a
|
||||
uuid_vec_t::iterator itPendingAttachLink = std::find(mPendingAttachLinks.begin(), mPendingAttachLinks.end(), item_id);
|
||||
if (itPendingAttachLink != mPendingAttachLinks.end())
|
||||
{
|
||||
mPendingAttachLinks.erase(itPendingAttachLink);
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
if (mAttachmentInvLinkEnabled)
|
||||
{
|
||||
|
|
@ -2711,6 +3027,38 @@ void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)
|
|||
}
|
||||
}
|
||||
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-18 (Catznip-2.2.0a) | Modified: Catznip-2.2.0a
|
||||
void LLAppearanceMgr::linkPendingAttachments()
|
||||
{
|
||||
LLPointer<LLInventoryCallback> cb = NULL;
|
||||
for (uuid_vec_t::const_iterator itPendingAttachLink = mPendingAttachLinks.begin();
|
||||
itPendingAttachLink != mPendingAttachLinks.end(); ++itPendingAttachLink)
|
||||
{
|
||||
const LLUUID& idAttachItem = *itPendingAttachLink;
|
||||
if ( (gAgentAvatarp->isWearingAttachment(idAttachItem)) && (!isLinkInCOF(idAttachItem)) )
|
||||
{
|
||||
if (!cb)
|
||||
cb = new LLRegisterAttachmentCallback();
|
||||
LLAppearanceMgr::addCOFItemLink(idAttachItem, false, cb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLAppearanceMgr::onRegisterAttachmentComplete(const LLUUID& idItem)
|
||||
{
|
||||
const LLUUID& idItemBase = gInventory.getLinkedItemID(idItem);
|
||||
|
||||
// Remove the attachment from the pending list
|
||||
uuid_vec_t::iterator itPendingAttachLink = std::find(mPendingAttachLinks.begin(), mPendingAttachLinks.end(), idItemBase);
|
||||
if (itPendingAttachLink != mPendingAttachLinks.end())
|
||||
mPendingAttachLinks.erase(itPendingAttachLink);
|
||||
|
||||
// It may have been detached already in which case we should remove the COF link
|
||||
if ( (isAgentAvatarValid()) && (!gAgentAvatarp->isWearingAttachment(idItemBase)) )
|
||||
removeCOFItemLinks(idItemBase, false);
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
||||
BOOL LLAppearanceMgr::getIsInCOF(const LLUUID& obj_id) const
|
||||
{
|
||||
return gInventory.isObjectDescendentOf(obj_id, getCOF());
|
||||
|
|
|
|||
|
|
@ -51,8 +51,16 @@ public:
|
|||
typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t;
|
||||
|
||||
void updateAppearanceFromCOF(bool update_base_outfit_ordering = false);
|
||||
// [SL:KB] - Patch: Appearance-MixedViewers | Checked: 2010-04-02 (Catznip-2.2.0a) | Added: Catznip-2.0.0a
|
||||
void updateAppearanceFromInitialWearables(LLInventoryModel::item_array_t& initial_items);
|
||||
// [/SL:KB]
|
||||
bool needToSaveCOF();
|
||||
void updateCOF(const LLUUID& category, bool append = false);
|
||||
// [RLVa:KB] - Checked: 2010-03-05 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
|
||||
void updateCOF(LLInventoryModel::item_array_t& body_items_new, LLInventoryModel::item_array_t& wear_items_new,
|
||||
LLInventoryModel::item_array_t& obj_items_new, LLInventoryModel::item_array_t& gest_items_new,
|
||||
bool append = false, const LLUUID& idOutfit = LLUUID::null);
|
||||
// [/RLVa:KB]
|
||||
void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
|
||||
void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
|
||||
void wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append);
|
||||
|
|
@ -205,6 +213,10 @@ private:
|
|||
|
||||
void setOutfitLocked(bool locked);
|
||||
|
||||
// [SL:KB] - Checked: 2010-04-24 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
void syncCOF(const LLInventoryModel::item_array_t& items, LLAssetType::EType type, LLPointer<LLInventoryCallback> cb);
|
||||
// [/SL:KB]
|
||||
|
||||
bool mAttachmentInvLinkEnabled;
|
||||
bool mOutfitIsDirty;
|
||||
bool mIsInUpdateAppearanceFromCOF; // to detect recursive calls.
|
||||
|
|
@ -217,6 +229,14 @@ private:
|
|||
|
||||
std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
|
||||
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-18 (Catznip-2.2.0a) | Modified: Catznip-2.1.2e
|
||||
public:
|
||||
void linkPendingAttachments();
|
||||
void onRegisterAttachmentComplete(const LLUUID& idItem);
|
||||
private:
|
||||
uuid_vec_t mPendingAttachLinks;
|
||||
// [/SL:KB]
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// Item-specific convenience functions
|
||||
public:
|
||||
|
|
@ -243,6 +263,19 @@ private:
|
|||
bool mUpdateBaseOrder;
|
||||
};
|
||||
|
||||
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-08-31 (Catznip-2.2.0a) | Added: Catznip-2.1.2a
|
||||
class LLRegisterAttachmentCallback : public LLInventoryCallback
|
||||
{
|
||||
public:
|
||||
LLRegisterAttachmentCallback() {}
|
||||
/*virtual*/ ~LLRegisterAttachmentCallback() {}
|
||||
|
||||
/*virtual*/ void fire(const LLUUID& idItem)
|
||||
{
|
||||
LLAppearanceMgr::instance().onRegisterAttachmentComplete(idItem);
|
||||
}
|
||||
};
|
||||
// [/SL:KB]
|
||||
|
||||
#define SUPPORT_ENSEMBLES 0
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
|
||||
// Viewer includes
|
||||
#include "llversioninfo.h"
|
||||
#include "llversionviewer.h"
|
||||
#include "llfeaturemanager.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "lltexteditor.h"
|
||||
|
|
@ -81,6 +80,10 @@
|
|||
#include "llurlmatch.h"
|
||||
#include "lltextutil.h"
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-05-03 (RLVa-1.2.0g)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
#include "llweb.h"
|
||||
#include "llsecondlifeurls.h"
|
||||
|
||||
|
|
@ -309,6 +312,7 @@ static BOOL gDoDisconnect = FALSE;
|
|||
static std::string gLaunchFileOnQuit;
|
||||
|
||||
// Used on Win32 for other apps to identify our window (eg, win_setup)
|
||||
// Note: Changing this breaks compatibility with SLURL handling, try to avoid it.
|
||||
const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
|
@ -336,7 +340,16 @@ LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
|
|||
void idle_afk_check()
|
||||
{
|
||||
// check idle timers
|
||||
// if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout")))
|
||||
// [RLVa:KB] - Checked: 2010-05-03 (RLVa-1.2.0g) | Modified: RLVa-1.2.0g
|
||||
#ifdef RLV_EXTENSION_CMD_ALLOWIDLE
|
||||
// Enforce an idle time of 30 minutes if @allowidle=n restricted
|
||||
S32 nAFKTimeout = (gRlvHandler.hasBehaviour(RLV_BHVR_ALLOWIDLE)) ? gSavedSettings.getS32("AFKTimeout") : 60 * 30;
|
||||
if ( (nAFKTimeout) && (gAwayTriggerTimer.getElapsedTimeF32() > nAFKTimeout) )
|
||||
#else
|
||||
if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout")))
|
||||
#endif // RLV_EXTENSION_CMD_ALLOWIDLE
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
gAgent.setAFK();
|
||||
}
|
||||
|
|
@ -609,7 +622,7 @@ bool LLAppViewer::init()
|
|||
|
||||
// Need to do this initialization before we do anything else, since anything
|
||||
// that touches files should really go through the lldir API
|
||||
gDirUtilp->initAppDirs("SecondLife");
|
||||
gDirUtilp->initAppDirs("Firestorm");
|
||||
// set skin search path to default, will be overridden later
|
||||
// this allows simple skinned file lookups to work
|
||||
gDirUtilp->setSkinFolder("default");
|
||||
|
|
@ -4559,8 +4572,6 @@ void LLAppViewer::launchUpdater()
|
|||
LLAppViewer::sUpdaterInfo->mUpdateExePath += update_url.asString();
|
||||
LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -name \"";
|
||||
LLAppViewer::sUpdaterInfo->mUpdateExePath += LLAppViewer::instance()->getSecondLifeTitle();
|
||||
LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -bundleid \"";
|
||||
LLAppViewer::sUpdaterInfo->mUpdateExePath += LL_VERSION_BUNDLE_ID;
|
||||
LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" &";
|
||||
|
||||
LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -33,7 +33,9 @@
|
|||
#include "llviewerinventory.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "message.h"
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-09-13 (RLVa-1.2.1c)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLAttachmentsMgr::LLAttachmentsMgr()
|
||||
{
|
||||
|
|
@ -45,12 +47,35 @@ LLAttachmentsMgr::~LLAttachmentsMgr()
|
|||
|
||||
void LLAttachmentsMgr::addAttachment(const LLUUID& item_id,
|
||||
const U8 attachment_pt,
|
||||
const BOOL add)
|
||||
// const BOOL add)
|
||||
// [RLVa:KB] - Checked: 2010-09-13 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
|
||||
const BOOL add, const BOOL fRlvForce /*=FALSE*/)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
AttachmentsInfo attachment;
|
||||
attachment.mItemID = item_id;
|
||||
attachment.mAttachmentPt = attachment_pt;
|
||||
attachment.mAdd = add;
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-09-23 (RLVa-1.2.1d) | Modified: RLVa-1.2.1d
|
||||
if ( (rlv_handler_t::isEnabled()) && (!fRlvForce) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_ANY)) )
|
||||
{
|
||||
const LLInventoryItem* pItem = gInventory.getItem(item_id);
|
||||
if (!pItem)
|
||||
return;
|
||||
|
||||
LLViewerJointAttachment* pAttachPt = NULL;
|
||||
ERlvWearMask eWearMask = gRlvAttachmentLocks.canAttach(pItem, &pAttachPt);
|
||||
if ( ((add) && ((RLV_WEAR_ADD & eWearMask) == 0)) || ((!add) && ((RLV_WEAR_REPLACE & eWearMask) == 0)) )
|
||||
return;
|
||||
|
||||
if ( (0 == attachment_pt) && (NULL != pAttachPt) )
|
||||
attachment.mAttachmentPt = RlvAttachPtLookup::getAttachPointIndex(pAttachPt);
|
||||
RlvAttachmentLockWatchdog::instance().onWearAttachment(pItem, (add) ? RLV_WEAR_ADD : RLV_WEAR_REPLACE);
|
||||
attachment.mAdd = true;
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
mPendingAttachments.push_back(attachment);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,10 @@ public:
|
|||
|
||||
void addAttachment(const LLUUID& item_id,
|
||||
const U8 attachment_pt,
|
||||
const BOOL add);
|
||||
// const BOOL add);
|
||||
// [RLVa:KB] - Checked: 2010-09-13 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
|
||||
const BOOL add, const BOOL fRlvForce = FALSE);
|
||||
// [/RLVa:KB]
|
||||
static void onIdle(void *);
|
||||
protected:
|
||||
void onIdle();
|
||||
|
|
|
|||
|
|
@ -306,3 +306,13 @@ void LLAvatarIconCtrl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarN
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// [SL:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
BOOL LLAvatarIconCtrl::handleToolTip(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
// Don't show our tooltip if we were asked not to
|
||||
if (!mDrawTooltip)
|
||||
return FALSE;
|
||||
return LLIconCtrl::handleToolTip(x, y, mask);
|
||||
}
|
||||
// [/SL:KB]
|
||||
|
|
|
|||
|
|
@ -81,6 +81,10 @@ protected:
|
|||
public:
|
||||
virtual ~LLAvatarIconCtrl();
|
||||
|
||||
// [SL:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
|
||||
// [/SL:KB]
|
||||
|
||||
virtual void setValue(const LLSD& value);
|
||||
|
||||
// LLAvatarPropertiesProcessor observer trigger
|
||||
|
|
|
|||
|
|
@ -46,6 +46,9 @@
|
|||
#include "lluuid.h"
|
||||
#include "llvoiceclient.h"
|
||||
#include "llviewercontrol.h" // for gSavedSettings
|
||||
// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list");
|
||||
|
||||
|
|
@ -139,6 +142,9 @@ LLAvatarList::LLAvatarList(const Params& p)
|
|||
, mShowProfileBtn(p.show_profile_btn)
|
||||
, mShowSpeakingIndicator(p.show_speaking_indicator)
|
||||
, mShowPermissions(p.show_permissions_granted)
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
, mRlvCheckShowNames(false)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
setCommitOnSelectionChange(true);
|
||||
|
||||
|
|
@ -420,6 +426,9 @@ S32 LLAvatarList::notifyParent(const LLSD& info)
|
|||
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
|
||||
{
|
||||
LLAvatarListItem* item = new LLAvatarListItem();
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
item->setRlvCheckShowNames(mRlvCheckShowNames);
|
||||
// [/RLVa:KB]
|
||||
// This sets the name as a side effect
|
||||
item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);
|
||||
item->setOnline(mIgnoreOnlineStatus ? true : is_online);
|
||||
|
|
@ -440,7 +449,10 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
|
|||
BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
|
||||
if ( mContextMenu )
|
||||
// if ( mContextMenu )
|
||||
// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a) | Modified: RLVa-1.2.0d
|
||||
if ( (mContextMenu) && ((!mRlvCheckShowNames) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
uuid_vec_t selected_uuids;
|
||||
getSelectedUUIDs(selected_uuids);
|
||||
|
|
@ -496,7 +508,11 @@ void LLAvatarList::updateLastInteractionTimes()
|
|||
|
||||
void LLAvatarList::onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
|
||||
{
|
||||
mItemDoubleClickSignal(ctrl, x, y, mask);
|
||||
// mItemDoubleClickSignal(ctrl, x, y, mask);
|
||||
// [RLVa:KB] - Checked: 2010-06-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
if ( (!mRlvCheckShowNames) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) )
|
||||
mItemDoubleClickSignal(ctrl, x, y, mask);
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
|
||||
bool LLAvatarItemComparator::compare(const LLPanel* item1, const LLPanel* item2) const
|
||||
|
|
|
|||
|
|
@ -88,6 +88,12 @@ public:
|
|||
// Return true if filter has at least one match.
|
||||
bool filterHasMatches();
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
void setRlvCheckShowNames(bool fRlvCheckShowNames) { mRlvCheckShowNames = fRlvCheckShowNames; }
|
||||
// We need this to be public since we call it from RlvUIEnabler::onToggleShowNames()
|
||||
void updateAvatarNames();
|
||||
// [/RLVa:KB]
|
||||
|
||||
boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
|
||||
|
||||
boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb);
|
||||
|
|
@ -108,7 +114,7 @@ protected:
|
|||
void updateLastInteractionTimes();
|
||||
void rebuildNames();
|
||||
void onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);
|
||||
void updateAvatarNames();
|
||||
// void updateAvatarNames();
|
||||
|
||||
private:
|
||||
|
||||
|
|
@ -121,6 +127,9 @@ private:
|
|||
bool mShowProfileBtn;
|
||||
bool mShowSpeakingIndicator;
|
||||
bool mShowPermissions;
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
bool mRlvCheckShowNames;
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLTimer* mLITUpdateTimer; // last interaction time update timer
|
||||
std::string mIconParamName;
|
||||
|
|
|
|||
|
|
@ -38,10 +38,13 @@
|
|||
#include "llavatarnamecache.h"
|
||||
#include "llavatariconctrl.h"
|
||||
#include "lloutputmonitorctrl.h"
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
bool LLAvatarListItem::sStaticInitialized = false;
|
||||
S32 LLAvatarListItem::sLeftPadding = 0;
|
||||
S32 LLAvatarListItem::sNameRightPadding = 0;
|
||||
S32 LLAvatarListItem::sRightNamePadding = 0;
|
||||
S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];
|
||||
|
||||
static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item");
|
||||
|
|
@ -52,8 +55,7 @@ LLAvatarListItem::Params::Params()
|
|||
voice_call_joined_style("voice_call_joined_style"),
|
||||
voice_call_left_style("voice_call_left_style"),
|
||||
online_style("online_style"),
|
||||
offline_style("offline_style"),
|
||||
name_right_pad("name_right_pad", 0)
|
||||
offline_style("offline_style")
|
||||
{};
|
||||
|
||||
|
||||
|
|
@ -72,6 +74,9 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
|
|||
mOnlineStatus(E_UNKNOWN),
|
||||
mShowInfoBtn(true),
|
||||
mShowProfileBtn(true),
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
mRlvCheckShowNames(false),
|
||||
// [/RLVa:KB]
|
||||
mShowPermissions(false),
|
||||
mHovered(false)
|
||||
{
|
||||
|
|
@ -120,9 +125,6 @@ BOOL LLAvatarListItem::postBuild()
|
|||
// so that we can hide and show them again later.
|
||||
initChildrenWidths(this);
|
||||
|
||||
// Right padding between avatar name text box and nearest visible child.
|
||||
sNameRightPadding = LLUICtrlFactory::getDefaultParams<LLAvatarListItem>().name_right_pad;
|
||||
|
||||
sStaticInitialized = true;
|
||||
}
|
||||
|
||||
|
|
@ -142,8 +144,12 @@ S32 LLAvatarListItem::notifyParent(const LLSD& info)
|
|||
void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
getChildView("hovered_icon")->setVisible( true);
|
||||
mInfoBtn->setVisible(mShowInfoBtn);
|
||||
mProfileBtn->setVisible(mShowProfileBtn);
|
||||
// mInfoBtn->setVisible(mShowInfoBtn);
|
||||
// mProfileBtn->setVisible(mShowProfileBtn);
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
mInfoBtn->setVisible( (mShowInfoBtn) && ((!mRlvCheckShowNames) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))) );
|
||||
mProfileBtn->setVisible( (mShowProfileBtn) && ((!mRlvCheckShowNames) || (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))) );
|
||||
// [/RLVa:KB]
|
||||
|
||||
mHovered = true;
|
||||
LLPanel::onMouseEnter(x, y, mask);
|
||||
|
|
@ -321,12 +327,18 @@ void LLAvatarListItem::onProfileBtnClick()
|
|||
|
||||
BOOL LLAvatarListItem::handleDoubleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(mInfoBtn->getRect().pointInRect(x, y))
|
||||
// if(mInfoBtn->getRect().pointInRect(x, y))
|
||||
// [SL:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
if ( (mInfoBtn->getVisible()) && (mInfoBtn->getEnabled()) && (mInfoBtn->getRect().pointInRect(x, y)) )
|
||||
// [/SL:KB]
|
||||
{
|
||||
onInfoBtnClick();
|
||||
return TRUE;
|
||||
}
|
||||
if(mProfileBtn->getRect().pointInRect(x, y))
|
||||
// if(mProfileBtn->getRect().pointInRect(x, y))
|
||||
// [SL:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
if ( (mProfileBtn->getVisible()) && (mProfileBtn->getEnabled()) && (mProfileBtn->getRect().pointInRect(x, y)) )
|
||||
// [/SL:KB]
|
||||
{
|
||||
onProfileBtnClick();
|
||||
return TRUE;
|
||||
|
|
@ -371,8 +383,15 @@ void LLAvatarListItem::setNameInternal(const std::string& name, const std::strin
|
|||
|
||||
void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)
|
||||
{
|
||||
setAvatarName(av_name.mDisplayName);
|
||||
setAvatarToolTip(av_name.mUsername);
|
||||
// setAvatarName(av_name.mDisplayName);
|
||||
// setAvatarToolTip(av_name.mUsername);
|
||||
// [RLVa:KB] - Checked: 2010-10-31 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
|
||||
bool fRlvFilter = (mRlvCheckShowNames) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES));
|
||||
setAvatarName( (!fRlvFilter) ? av_name.mDisplayName : RlvStrings::getAnonym(av_name) );
|
||||
setAvatarToolTip( (!fRlvFilter) ? av_name.mUsername : RlvStrings::getAnonym(av_name) );
|
||||
// TODO-RLVa: bit of a hack putting this here. Maybe find a better way?
|
||||
mAvatarIcon->setDrawTooltip(!fRlvFilter);
|
||||
// [/RLVa:KB]
|
||||
|
||||
//requesting the list to resort
|
||||
notifyParent(LLSD().with("sort", LLSD()));
|
||||
|
|
@ -490,6 +509,7 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
|
|||
S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
|
||||
|
||||
sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft;
|
||||
sRightNamePadding = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarName->getRect().mRight;
|
||||
|
||||
S32 index = ALIC_COUNT;
|
||||
sChildrenWidths[--index] = icon_width;
|
||||
|
|
@ -568,7 +588,7 @@ void LLAvatarListItem::updateChildren()
|
|||
|
||||
// apply paddings
|
||||
name_new_width -= sLeftPadding;
|
||||
name_new_width -= sNameRightPadding;
|
||||
name_new_width -= sRightNamePadding;
|
||||
|
||||
name_view_rect.setLeftTopAndSize(
|
||||
name_new_left,
|
||||
|
|
|
|||
|
|
@ -51,8 +51,6 @@ public:
|
|||
online_style,
|
||||
offline_style;
|
||||
|
||||
Optional<S32> name_right_pad;
|
||||
|
||||
Params();
|
||||
};
|
||||
|
||||
|
|
@ -103,6 +101,9 @@ public:
|
|||
void setShowPermissions(bool show) { mShowPermissions = show; };
|
||||
void showLastInteractionTime(bool show);
|
||||
void setAvatarIconVisible(bool visible);
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
void setRlvCheckShowNames(bool fRlvCheckShowNames) { mRlvCheckShowNames = fRlvCheckShowNames; }
|
||||
// [/RLVa:KB]
|
||||
|
||||
const LLUUID& getAvatarId() const;
|
||||
std::string getAvatarName() const;
|
||||
|
|
@ -208,6 +209,9 @@ private:
|
|||
//Speaker indicator and avatar name coords are translated accordingly
|
||||
bool mShowInfoBtn;
|
||||
bool mShowProfileBtn;
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.2a) | Added: RLVa-1.2.0d
|
||||
bool mRlvCheckShowNames;
|
||||
// [/RLVa:KB]
|
||||
|
||||
/// indicates whether to show icons representing permissions granted
|
||||
bool mShowPermissions;
|
||||
|
|
@ -217,7 +221,7 @@ private:
|
|||
|
||||
static bool sStaticInitialized; // this variable is introduced to improve code readability
|
||||
static S32 sLeftPadding; // padding to first left visible child (icon or name)
|
||||
static S32 sNameRightPadding; // right padding from name to next visible child
|
||||
static S32 sRightNamePadding; // right padding from name to next visible child
|
||||
|
||||
/**
|
||||
* Contains widths of each child specified by EAvatarListItemChildIndex
|
||||
|
|
|
|||
|
|
@ -53,6 +53,11 @@
|
|||
#include "llviewerwindow.h"
|
||||
#include "llsdserialize.h"
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-09-11 (RLVa-1.2.1d)
|
||||
#include "rlvhandler.h"
|
||||
#include "rlvui.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Distance from mouse down on which drag'n'drop should be started.
|
||||
#define DRAG_START_DISTANCE 3
|
||||
|
||||
|
|
@ -94,7 +99,10 @@ BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
static void update_build_button_enable_state()
|
||||
{
|
||||
bool can_edit = LLToolMgr::getInstance()->canEdit();
|
||||
// bool can_edit = LLToolMgr::getInstance()->canEdit();
|
||||
// [RLVa:KB] - Checked: 2010-09-11 (RLVa-1.2.1d) | Added: RLVa-1.2.1d
|
||||
bool can_edit = RlvUIEnabler::isBuildEnabled();
|
||||
// [/RLVa:KB]
|
||||
|
||||
LLBottomTray::getInstance()->getChildView("build_btn")->setEnabled(can_edit);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -316,6 +316,10 @@ void LLCallFloater::updateSession()
|
|||
setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-06-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
|
||||
mAvatarList->setRlvCheckShowNames(is_local_chat);
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
|
||||
void LLCallFloater::refreshParticipantList()
|
||||
|
|
|
|||
|
|
@ -74,6 +74,10 @@ public:
|
|||
|
||||
static void sOnCurrentChannelChanged(const LLUUID& session_id);
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
|
||||
LLAvatarList* getAvatarCallerList() { return mAvatarList; }
|
||||
// [/RLVa:KB]
|
||||
|
||||
private:
|
||||
typedef enum e_voice_controls_type
|
||||
{
|
||||
|
|
|
|||
|
|
@ -61,6 +61,9 @@
|
|||
#include "llviewermenu.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llbottomtray.h"
|
||||
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0b)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
//
|
||||
// Globals
|
||||
|
|
@ -80,7 +83,10 @@ private:
|
|||
};
|
||||
|
||||
|
||||
extern void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
|
||||
//extern void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
|
||||
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0b) | Modified: RLVa-0.2.2a
|
||||
extern void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel);
|
||||
// [/RLVa:KB]
|
||||
|
||||
//
|
||||
// Functions
|
||||
|
|
@ -473,7 +479,11 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )
|
|||
|
||||
S32 length = raw_text.length();
|
||||
|
||||
if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
|
||||
// if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
|
||||
// [RLVa:KB] - Checked: 2010-03-26 (RLVa-1.2.0b) | Modified: RLVa-1.0.0d
|
||||
// RELEASE-RLVa: [SL-2.0.0] This entire class appears to be dead/non-functional?
|
||||
if ( (length > 0) && (raw_text[0] != '/') && (!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT)) )
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
gAgent.startTyping();
|
||||
}
|
||||
|
|
@ -585,6 +595,22 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
|
|||
utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1);
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-03-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0b
|
||||
// RELEASE-RLVa: [SL-2.0.0] This entire class appears to be dead/non-functional?
|
||||
if ( (0 == channel) && (rlv_handler_t::isEnabled()) )
|
||||
{
|
||||
// Adjust the (public) chat "volume" on chat and gestures (also takes care of playing the proper animation)
|
||||
if ( ((CHAT_TYPE_SHOUT == type) || (CHAT_TYPE_NORMAL == type)) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
|
||||
type = CHAT_TYPE_WHISPER;
|
||||
else if ( (CHAT_TYPE_SHOUT == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATSHOUT)) )
|
||||
type = CHAT_TYPE_NORMAL;
|
||||
else if ( (CHAT_TYPE_WHISPER == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATWHISPER)) )
|
||||
type = CHAT_TYPE_NORMAL;
|
||||
|
||||
animate &= !gRlvHandler.hasBehaviour( (!RlvUtil::isEmote(utf8_text)) ? RLV_BHVR_REDIRCHAT : RLV_BHVR_REDIREMOTE );
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Don't animate for chats people can't hear (chat to scripts)
|
||||
if (animate && (channel == 0))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -55,8 +55,10 @@
|
|||
#include "llworld.h"
|
||||
#include "lluiconstants.h"
|
||||
#include "llstring.h"
|
||||
|
||||
#include "llviewercontrol.h"
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f)
|
||||
#include "rlvcommon.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
#include "llsidetray.h"//for blocked objects panel
|
||||
|
||||
|
|
@ -90,6 +92,10 @@ public:
|
|||
LLSD payload;
|
||||
payload["object_id"] = object_id;
|
||||
payload["owner_id"] = query_map["owner"];
|
||||
// [RLVa:KB] - Checked: 2010-11-02 (RLVa-1.2.2a) | Modified: RLVa-1.2.2a
|
||||
if (query_map.has("rlv_shownames"))
|
||||
payload["rlv_shownames"] = query_map["rlv_shownames"];
|
||||
// [/RLVa:KB]
|
||||
payload["name"] = query_map["name"];
|
||||
payload["slurl"] = LLWeb::escapeURL(query_map["slurl"]);
|
||||
payload["group_owned"] = query_map["groupowned"];
|
||||
|
|
@ -104,6 +110,10 @@ class LLChatHistoryHeader: public LLPanel
|
|||
public:
|
||||
LLChatHistoryHeader()
|
||||
: LLPanel(),
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
|
||||
mShowContextMenu(true),
|
||||
mShowInfoCtrl(true),
|
||||
// [/RLVa:KB]
|
||||
mPopupMenuHandleAvatar(),
|
||||
mPopupMenuHandleObject(),
|
||||
mAvatarID(),
|
||||
|
|
@ -225,7 +235,11 @@ public:
|
|||
|
||||
void showInspector()
|
||||
{
|
||||
if (mAvatarID.isNull() && CHAT_SOURCE_SYSTEM != mSourceType) return;
|
||||
// if (mAvatarID.isNull() && CHAT_SOURCE_SYSTEM != mSourceType) return;
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
|
||||
// Don't double-click show the inspector if we're not showing the info control
|
||||
if ( (!mShowInfoCtrl) || (mAvatarID.isNull() && CHAT_SOURCE_SYSTEM != mSourceType) ) return;
|
||||
// [/RLVa:KB]
|
||||
|
||||
if (mSourceType == CHAT_SOURCE_OBJECT)
|
||||
{
|
||||
|
|
@ -261,7 +275,7 @@ public:
|
|||
if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull())
|
||||
{
|
||||
mSourceType = CHAT_SOURCE_SYSTEM;
|
||||
}
|
||||
}
|
||||
|
||||
mUserNameFont = style_params.font();
|
||||
LLTextBox* user_name = getChild<LLTextBox>("user_name");
|
||||
|
|
@ -269,14 +283,14 @@ public:
|
|||
user_name->setColor(style_params.color());
|
||||
|
||||
if (chat.mFromName.empty()
|
||||
|| mSourceType == CHAT_SOURCE_SYSTEM)
|
||||
|| mSourceType == CHAT_SOURCE_SYSTEM
|
||||
|| mAvatarID.isNull())
|
||||
{
|
||||
mFrom = LLTrans::getString("SECOND_LIFE");
|
||||
user_name->setValue(mFrom);
|
||||
updateMinUserNameWidth();
|
||||
}
|
||||
else if (mSourceType == CHAT_SOURCE_AGENT
|
||||
&& !mAvatarID.isNull()
|
||||
&& chat.mChatStyle != CHAT_STYLE_HISTORY)
|
||||
{
|
||||
// ...from a normal user, lookup the name and fill in later.
|
||||
|
|
@ -285,45 +299,28 @@ public:
|
|||
|
||||
// Start with blank so sample data from XUI XML doesn't
|
||||
// flash on the screen
|
||||
user_name->setValue( LLSD() );
|
||||
LLAvatarNameCache::get(mAvatarID,
|
||||
boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2));
|
||||
}
|
||||
else if (chat.mChatStyle == CHAT_STYLE_HISTORY ||
|
||||
mSourceType == CHAT_SOURCE_AGENT)
|
||||
{
|
||||
//if it's an avatar name with a username add formatting
|
||||
S32 username_start = chat.mFromName.rfind(" (");
|
||||
S32 username_end = chat.mFromName.rfind(')');
|
||||
|
||||
if (username_start != std::string::npos &&
|
||||
username_end == (chat.mFromName.length() - 1))
|
||||
// user_name->setValue( LLSD() );
|
||||
// LLAvatarNameCache::get(mAvatarID,
|
||||
// boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2));
|
||||
// [RLVa:KB] - Checked: 2010-11-01 (RLVa-1.2.2a) | Added: RLVa-1.2.2a
|
||||
if (!chat.mRlvNamesFiltered)
|
||||
{
|
||||
mFrom = chat.mFromName.substr(0, username_start);
|
||||
user_name->setValue(mFrom);
|
||||
|
||||
if (gSavedSettings.getBOOL("NameTagShowUsernames"))
|
||||
{
|
||||
std::string username = chat.mFromName.substr(username_start + 2);
|
||||
username = username.substr(0, username.length() - 1);
|
||||
LLStyle::Params style_params_name;
|
||||
LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
|
||||
style_params_name.color(userNameColor);
|
||||
style_params_name.font.name("SansSerifSmall");
|
||||
style_params_name.font.style("NORMAL");
|
||||
style_params_name.readonly_color(userNameColor);
|
||||
user_name->appendText(" - " + username, FALSE, style_params_name);
|
||||
}
|
||||
user_name->setValue( LLSD() );
|
||||
LLAvatarNameCache::get(mAvatarID,
|
||||
boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2));
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the agent's chat was subject to @shownames=n we should display their anonimized name
|
||||
mFrom = chat.mFromName;
|
||||
user_name->setValue(mFrom);
|
||||
user_name->setToolTip(mFrom);
|
||||
setToolTip(mFrom);
|
||||
updateMinUserNameWidth();
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
// ...from an object, just use name as given
|
||||
mFrom = chat.mFromName;
|
||||
user_name->setValue(mFrom);
|
||||
|
|
@ -338,6 +335,15 @@ public:
|
|||
if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull())
|
||||
icon->setDrawTooltip(false);
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
|
||||
// Don't show the context menu, info control or avatar icon tooltip if this chat was subject to @shownames=n
|
||||
if ( (chat.mRlvNamesFiltered) && ((CHAT_SOURCE_AGENT == mSourceType) || (CHAT_SOURCE_OBJECT == mSourceType)) )
|
||||
{
|
||||
mShowInfoCtrl = mShowContextMenu = false;
|
||||
icon->setDrawTooltip(false);
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
switch (mSourceType)
|
||||
{
|
||||
case CHAT_SOURCE_AGENT:
|
||||
|
|
@ -402,9 +408,7 @@ public:
|
|||
user_name->setValue( LLSD(av_name.mDisplayName ) );
|
||||
user_name->setToolTip( av_name.mUsername );
|
||||
|
||||
if (gSavedSettings.getBOOL("NameTagShowUsernames") &&
|
||||
LLAvatarNameCache::useDisplayNames() &&
|
||||
!av_name.mIsDisplayNameDefault)
|
||||
if (gSavedSettings.getBOOL("NameTagShowUsernames") && LLAvatarNameCache::useDisplayNames())
|
||||
{
|
||||
LLStyle::Params style_params_name;
|
||||
LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor");
|
||||
|
|
@ -424,6 +428,10 @@ protected:
|
|||
|
||||
void showContextMenu(S32 x,S32 y)
|
||||
{
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
|
||||
if (!mShowContextMenu)
|
||||
return;
|
||||
// [/RLVa:KB]
|
||||
if(mSourceType == CHAT_SOURCE_SYSTEM)
|
||||
showSystemContextMenu(x,y);
|
||||
if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_AGENT)
|
||||
|
|
@ -474,7 +482,10 @@ protected:
|
|||
|
||||
void showInfoCtrl()
|
||||
{
|
||||
if (mAvatarID.isNull() || mFrom.empty() || SYSTEM_FROM == mFrom) return;
|
||||
// if (mAvatarID.isNull() || mFrom.empty() || SYSTEM_FROM == mFrom) return;
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
|
||||
if ( (!mShowInfoCtrl) || (mAvatarID.isNull() || mFrom.empty() || SYSTEM_FROM == mFrom) ) return;
|
||||
// [/RLVa:KB]
|
||||
|
||||
if (!sInfoCtrl)
|
||||
{
|
||||
|
|
@ -543,6 +554,10 @@ protected:
|
|||
EChatSourceType mSourceType;
|
||||
std::string mFrom;
|
||||
LLUUID mSessionID;
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.2a) | Added: RLVa-1.2.0f
|
||||
bool mShowContextMenu;
|
||||
bool mShowInfoCtrl;
|
||||
// [/RLVa:KB]
|
||||
|
||||
S32 mMinUserNameWidth;
|
||||
const LLFontGL* mUserNameFont;
|
||||
|
|
@ -769,33 +784,45 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
// Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text.
|
||||
if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull())
|
||||
{
|
||||
// for object IMs, create a secondlife:///app/objectim SLapp
|
||||
std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
|
||||
url += "?name=" + chat.mFromName;
|
||||
url += "&owner=" + chat.mOwnerID.asString();
|
||||
|
||||
std::string slurl = args["slurl"].asString();
|
||||
if (slurl.empty())
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
// NOTE-RLVa: we don't need to do any @shownames or @showloc filtering here because we'll already have an existing URL
|
||||
std::string url = chat.mURL;
|
||||
RLV_ASSERT( (url.empty()) || (std::string::npos != url.find("objectim")) );
|
||||
if ( (url.empty()) || (std::string::npos == url.find("objectim")) )
|
||||
{
|
||||
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
|
||||
if(region)
|
||||
{
|
||||
LLSLURL region_slurl(region->getName(), chat.mPosAgent);
|
||||
slurl = region_slurl.getLocationString();
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
// for object IMs, create a secondlife:///app/objectim SLapp
|
||||
/*std::string*/ url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
|
||||
url += "?name=" + chat.mFromName;
|
||||
url += "&owner=" + chat.mOwnerID.asString();
|
||||
|
||||
std::string slurl = args["slurl"].asString();
|
||||
if (slurl.empty())
|
||||
{
|
||||
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
|
||||
if(region)
|
||||
{
|
||||
LLSLURL region_slurl(region->getName(), chat.mPosAgent);
|
||||
slurl = region_slurl.getLocationString();
|
||||
}
|
||||
}
|
||||
url += "&slurl=" + LLURI::escape(slurl);
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
}
|
||||
url += "&slurl=" + LLURI::escape(slurl);
|
||||
// [/RLVa:KB]
|
||||
|
||||
// set the link for the object name to be the objectim SLapp
|
||||
// (don't let object names with hyperlinks override our objectim Url)
|
||||
LLStyle::Params link_params(style_params);
|
||||
link_params.color.control = "HTMLLinkColor";
|
||||
link_params.is_link = true;
|
||||
link_params.link_href = url;
|
||||
mEditor->appendText(chat.mFromName + delimiter,
|
||||
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
|
||||
false, link_params);
|
||||
}
|
||||
else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
|
||||
// else if (chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
else if (chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log && !chat.mRlvNamesFiltered)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
LLStyle::Params link_params(style_params);
|
||||
link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
|
||||
|
|
@ -805,7 +832,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
}
|
||||
else
|
||||
{
|
||||
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, false, style_params);
|
||||
mEditor->appendText(chat.mFromName + delimiter, false, style_params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include "llchatmsgbox.h"
|
||||
#include "llavatariconctrl.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "lllocalcliprect.h"
|
||||
#include "lltrans.h"
|
||||
|
|
@ -41,44 +40,14 @@
|
|||
|
||||
#include "llslurl.h"
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-04-21 (RLVa-1.2.0f)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
static const S32 msg_left_offset = 10;
|
||||
static const S32 msg_right_offset = 10;
|
||||
static const S32 msg_height_pad = 5;
|
||||
|
||||
//*******************************************************************************************************************
|
||||
// LLObjectHandler
|
||||
//*******************************************************************************************************************
|
||||
|
||||
// handle secondlife:///app/object/<ID>/inspect SLURLs
|
||||
class LLObjectHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
LLObjectHandler() : LLCommandHandler("object", UNTRUSTED_BLOCK) { }
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (params.size() < 2) return false;
|
||||
|
||||
LLUUID object_id;
|
||||
if (!object_id.set(params[0], FALSE))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const std::string verb = params[1].asString();
|
||||
|
||||
if (verb == "inspect")
|
||||
{
|
||||
LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", object_id));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
LLObjectHandler gObjectHandler;
|
||||
|
||||
//*******************************************************************************************************************
|
||||
//LLNearbyChatToastPanel
|
||||
//*******************************************************************************************************************
|
||||
|
|
@ -176,7 +145,11 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
|
|||
std::string fromName = notification["from"].asString(); // agent or object name
|
||||
mFromID = notification["from_id"].asUUID(); // agent id or object id
|
||||
mFromName = fromName;
|
||||
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-04-22 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
mShowIconTooltip = notification.has("show_icon_tooltip") ? notification["show_icon_tooltip"].asBoolean() : true;
|
||||
// [/RLVa:KB]
|
||||
|
||||
int sType = notification["source"].asInteger();
|
||||
mSourceType = (EChatSourceType)sType;
|
||||
|
||||
|
|
@ -204,26 +177,17 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
|
|||
{
|
||||
std::string str_sender;
|
||||
|
||||
str_sender = fromName;
|
||||
str_sender = "<nolink>"; // disable parsing URLs in object names (STORM-358)
|
||||
str_sender += fromName;
|
||||
str_sender += "</nolink>";
|
||||
|
||||
str_sender+=" ";
|
||||
|
||||
//append sender name
|
||||
if (mSourceType == CHAT_SOURCE_AGENT || mSourceType == CHAT_SOURCE_OBJECT)
|
||||
//append user name
|
||||
{
|
||||
LLStyle::Params style_params_name;
|
||||
|
||||
LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor");
|
||||
std::string href;
|
||||
|
||||
if (mSourceType == CHAT_SOURCE_AGENT)
|
||||
{
|
||||
href = LLSLURL("agent", mFromID, "about").getSLURLString();
|
||||
}
|
||||
else
|
||||
{
|
||||
href = LLSLURL("object", mFromID, "inspect").getSLURLString();
|
||||
}
|
||||
|
||||
style_params_name.color(userNameColor);
|
||||
|
||||
|
|
@ -232,16 +196,11 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
|
|||
style_params_name.font.name(font_name);
|
||||
style_params_name.font.size(font_style_size);
|
||||
|
||||
style_params_name.link_href = href;
|
||||
style_params_name.is_link = true;
|
||||
style_params_name.link_href = LLSLURL("agent",mFromID,"about").getSLURLString();
|
||||
|
||||
msg_text->appendText(str_sender, FALSE, style_params_name);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
msg_text->appendText(str_sender, false);
|
||||
}
|
||||
}
|
||||
|
||||
//append text
|
||||
|
|
@ -370,7 +329,10 @@ void LLNearbyChatToastPanel::draw()
|
|||
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
|
||||
if(icon)
|
||||
{
|
||||
icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
|
||||
// icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
|
||||
// [RLVa:KB] - Checked: 2010-04-200 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
icon->setDrawTooltip( (mShowIconTooltip) && (mSourceType == CHAT_SOURCE_AGENT) );
|
||||
// [/RLVa:KB]
|
||||
if(mSourceType == CHAT_SOURCE_OBJECT)
|
||||
icon->setValue(LLSD("OBJECT_Icon"));
|
||||
else if(mSourceType == CHAT_SOURCE_SYSTEM)
|
||||
|
|
|
|||
|
|
@ -46,6 +46,9 @@ protected:
|
|||
LLNearbyChatToastPanel()
|
||||
:
|
||||
mIsDirty(false),
|
||||
// [RLVa:KB] - Checked: 2010-04-200 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
mShowIconTooltip(true),
|
||||
// [/RLVa:KB]
|
||||
mSourceType(CHAT_SOURCE_OBJECT)
|
||||
{};
|
||||
public:
|
||||
|
|
@ -89,6 +92,9 @@ private:
|
|||
|
||||
|
||||
bool mIsDirty;
|
||||
// [RLVa:KB] - Checked: 2010-04-200 (RLVa-1.2.0f) | Added: RLVa-1.2.0f
|
||||
bool mShowIconTooltip;
|
||||
// [/RLVa:KB]
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -267,11 +267,7 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp)
|
|||
{
|
||||
clp.options(gOptionsDesc);
|
||||
clp.positional(gPositionalOptions);
|
||||
// SNOW-626: Boost 1.42 erroneously added allow_guessing to the default style
|
||||
// (see http://groups.google.com/group/boost-list/browse_thread/thread/545d7bf98ff9bb16?fwc=2&pli=1)
|
||||
// Remove allow_guessing from the default style, because that is not allowed
|
||||
// when we have options that are a prefix of other options (aka, --help and --helperuri).
|
||||
clp.style((po::command_line_style::default_style & ~po::command_line_style::allow_guessing)
|
||||
clp.style(po::command_line_style::default_style
|
||||
| po::command_line_style::allow_long_disguise);
|
||||
if(mExtraParser)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -358,7 +358,6 @@ void LLDrawable::makeActive()
|
|||
{
|
||||
U32 pcode = mVObjp->getPCode();
|
||||
if (pcode == LLViewerObject::LL_VO_WATER ||
|
||||
pcode == LLViewerObject::LL_VO_VOID_WATER ||
|
||||
pcode == LLViewerObject::LL_VO_SURFACE_PATCH ||
|
||||
pcode == LLViewerObject::LL_VO_PART_GROUP ||
|
||||
pcode == LLViewerObject::LL_VO_HUD_PART_GROUP ||
|
||||
|
|
|
|||
|
|
@ -89,7 +89,6 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0)
|
|||
case POOL_SKY:
|
||||
poolp = new LLDrawPoolSky();
|
||||
break;
|
||||
case POOL_VOIDWATER:
|
||||
case POOL_WATER:
|
||||
poolp = new LLDrawPoolWater();
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -57,7 +57,6 @@ public:
|
|||
POOL_BUMP,
|
||||
POOL_INVISIBLE, // see below *
|
||||
POOL_AVATAR,
|
||||
POOL_VOIDWATER,
|
||||
POOL_WATER,
|
||||
POOL_GLOW,
|
||||
POOL_ALPHA,
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ void LLDrawPoolGround::render(S32 pass)
|
|||
|
||||
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
|
||||
|
||||
LLGLSquashToFarClip far_clip(glh_get_current_projection());
|
||||
LLGLClampToFarClip far_clip(glh_get_current_projection());
|
||||
|
||||
F32 water_height = gAgent.getRegion()->getWaterHeight();
|
||||
glPushMatrix();
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ void LLDrawPoolSky::render(S32 pass)
|
|||
|
||||
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
|
||||
|
||||
LLGLSquashToFarClip far_clip(glh_get_current_projection());
|
||||
LLGLClampToFarClip far_clip(glh_get_current_projection());
|
||||
|
||||
LLGLEnable fog_enable( (mVertexShaderLevel < 1 && LLViewerCamera::getInstance()->cameraUnderWater()) ? GL_FOG : 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -532,7 +532,6 @@ void LLDrawPoolWater::shade()
|
|||
glColor4fv(water_color.mV);
|
||||
|
||||
{
|
||||
LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0);
|
||||
LLGLDisable cullface(GL_CULL_FACE);
|
||||
for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
|
||||
iter != mDrawFace.end(); iter++)
|
||||
|
|
@ -549,19 +548,30 @@ void LLDrawPoolWater::shade()
|
|||
|
||||
sNeedsReflectionUpdate = TRUE;
|
||||
|
||||
if (water->getUseTexture() || !water->getIsEdgePatch())
|
||||
if (water->getUseTexture())
|
||||
{
|
||||
sNeedsDistortionUpdate = TRUE;
|
||||
face->renderIndexed();
|
||||
}
|
||||
else if (gGLManager.mHasDepthClamp || deferred_render)
|
||||
{
|
||||
face->renderIndexed();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLGLSquashToFarClip far_clip(glh_get_current_projection());
|
||||
face->renderIndexed();
|
||||
{ //smash background faces to far clip plane
|
||||
if (water->getIsEdgePatch())
|
||||
{
|
||||
if (deferred_render)
|
||||
{
|
||||
face->renderIndexed();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLGLClampToFarClip far_clip(glh_get_current_projection());
|
||||
face->renderIndexed();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sNeedsDistortionUpdate = TRUE;
|
||||
face->renderIndexed();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ void LLDrawPoolWLSky::render(S32 pass)
|
|||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
LLGLDisable clip(GL_CLIP_PLANE0);
|
||||
|
||||
LLGLSquashToFarClip far_clip(glh_get_current_projection());
|
||||
LLGLClampToFarClip far_clip(glh_get_current_projection());
|
||||
|
||||
renderSkyHaze(camHeightLocal);
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@
|
|||
#include "llviewerregion.h"
|
||||
#include "llversioninfo.h"
|
||||
#include "llweb.h"
|
||||
// [RLVa:KB] - Checked: 2010-04-18 (RLVa-1.2.0e)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Linden library includes
|
||||
#include "llaudioengine.h"
|
||||
|
|
@ -254,6 +257,12 @@ LLSD LLFloaterAbout::getInfo()
|
|||
}
|
||||
#endif
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-04-18 (RLVa-1.2.0e) | Added: RLVa-1.2.0e
|
||||
if (rlv_handler_t::isEnabled())
|
||||
info["RLV_VERSION"] = RlvStrings::getVersionAbout();
|
||||
else
|
||||
info["RLV_VERSION"] = "(disabled)";
|
||||
// [/RLVa:KB]
|
||||
info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
|
||||
info["LIBCURL_VERSION"] = LLCurl::getVersionString();
|
||||
info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@
|
|||
#include "llviewercontrol.h"
|
||||
#include "llviewerregion.h" // getCapability()
|
||||
#include "llworld.h"
|
||||
// [RLVa:KB] - Checked: 2010-06-04 (RLVa-1.2.2a)
|
||||
#include "rlvhandler.h"
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Linden libraries
|
||||
#include "llavatarnamecache.h" // IDEVO
|
||||
|
|
@ -255,6 +258,22 @@ void LLFloaterAvatarPicker::onRangeAdjust()
|
|||
void LLFloaterAvatarPicker::onList()
|
||||
{
|
||||
getChildView("ok_btn")->setEnabled(isSelectBtnEnabled());
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-06-05 (RLVa-1.2.2a) | Modified: RLVa-1.2.0d
|
||||
if (rlv_handler_t::isEnabled())
|
||||
{
|
||||
LLTabContainer* pTabs = getChild<LLTabContainer>("ResidentChooserTabs");
|
||||
LLPanel* pNearMePanel = getChild<LLPanel>("NearMePanel");
|
||||
RLV_ASSERT( (pTabs) && (pNearMePanel) );
|
||||
if ( (pTabs) && (pNearMePanel) )
|
||||
{
|
||||
bool fRlvEnable = !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES);
|
||||
pTabs->enableTabButton(pTabs->getIndexForPanel(pNearMePanel), fRlvEnable);
|
||||
if ( (!fRlvEnable) && (pTabs->getCurrentPanel() == pNearMePanel) )
|
||||
pTabs->selectTabByName("SearchPanel");
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
}
|
||||
|
||||
void LLFloaterAvatarPicker::populateNearMe()
|
||||
|
|
|
|||
|
|
@ -209,6 +209,13 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
|
|||
llassert(msg);
|
||||
if (!msg) return;
|
||||
|
||||
LLHost host = msg->getSender();
|
||||
if (host != gAgent.getRegionHost())
|
||||
{
|
||||
// update is for a different region than the one we're in
|
||||
return;
|
||||
}
|
||||
|
||||
//const S32 SIM_NAME_BUF = 256;
|
||||
U32 region_flags;
|
||||
U8 sim_access;
|
||||
|
|
@ -226,8 +233,6 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
|
|||
S32 redirect_grid_y;
|
||||
LLUUID cache_id;
|
||||
|
||||
LLHost host = msg->getSender();
|
||||
|
||||
msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, sim_name);
|
||||
msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, estate_id);
|
||||
msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, parent_estate_id);
|
||||
|
|
@ -237,15 +242,6 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
|
|||
msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, object_bonus_factor);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, billable_factor);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height);
|
||||
|
||||
if (host != gAgent.getRegionHost())
|
||||
{
|
||||
// Update is for a different region than the one we're in.
|
||||
// Just check for a waterheight change.
|
||||
LLWorld::getInstance()->waterHeightRegionInfo(sim_name, water_height);
|
||||
return;
|
||||
}
|
||||
|
||||
msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, terrain_raise_limit);
|
||||
msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, terrain_lower_limit);
|
||||
msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_PricePerMeter, price_per_meter);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue