Merge Firestorm LGPL

master
Ansariel 2018-05-30 22:43:01 +02:00
commit 02f6ce9964
67 changed files with 1559 additions and 731 deletions

View File

View File

@ -1 +0,0 @@
4ef383e7a5cdbf1dedd7458a56a9d13ebb7fddf2

View File

@ -1,21 +0,0 @@
[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 : 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
- fixed : LLViewerObject::getAttachmentItemID() sometimes returns the NULL UUID for the avatar's own attachments
- fixed : LLAppearanceMgr::updateAppearanceFromCOF() doesn't properly filter items collected from folder links
-> create an outfit with a folder link + "Replace Outfit" == wearables that exist in both COF and the linked folder will end up worn multiple times
- 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

View File

@ -1 +0,0 @@
23a6fee23f1d6a2432201906d41e80f3471e8700

View File

@ -1,5 +0,0 @@
[Appearance/MixedViewers]
- fixed : "Worn items in Viewer 2 and Viewer 1.x aren't synchronized" [see http://jira.secondlife.com/browse/VWR-17594]
-> current fix compares *only* the wearables in COF with the wearables specified by AgentWearablesUpdate
-> controlled by "VerifyInitialWearables" (defaults to FALSE with SL-3.0)
- fixed : minor memory leak in LLInitialWearablesFetch::processWearablesMessage()

View File

@ -1 +0,0 @@
d370e6c8ece17733128371a4d0eeaff9ebb52c7f

View File

@ -1,7 +0,0 @@
[Chat/NearbyChat]
- added : (user-resizable) multi-line chat bar to the nearby chat floater
- added : "NearbyChatFloaterBarType" setting to control the appearance of the chat bar in the nearby chat floater
-> 0 - legacy, now single line; 1 - single line (default); 2 - multi line (can be toggled at run-time)
- added : Shift+Enter to whisper from the chatbar(s)
- added : "NearbyChatFloaterWindow" setting to optionally embed the nearby chat floater in the tabbed conversations floater
- added : "save_tearoff_state" for floaters to track the torn off state of LLMultiFloater hosted floaters across viewer sessions

View File

@ -1 +0,0 @@
5697118601ade0f70f851639661ba637174b3024

View File

@ -1 +0,0 @@
a2a692a4b575df65deec805e8eae2a9c84985855

View File

@ -1 +0,0 @@
ea427b73d98383faebb9d0209b753dc71b846676

View File

@ -1,6 +0,0 @@
[UI/Base]
- added : static registration of an LLPanel derived class with a custom class creator
-> used in the UI-SidepanelOutfits patch branch
- added : registration of an LLFloater derived class with a callback for the XML filename
-> used in the Chat-Misc patch branch
-> used in the Chat-NearbyChat patch branch

View File

@ -1 +0,0 @@
43f5dc9c781eb7528a08abd58b2e4fea6ff1838e

View File

@ -1,10 +0,0 @@
[Viewer/Build]
* Changed compiler options for "Release with Debug" builds
* Changed compiler and linker options for "Release" builds
* Removed LL's changeset tags and added new (consistent) SL-X.Y.Z tags for releases
* Break into the debugger rather than forcing the process into an unrecoverable state for "llerrs" on non-release builds
-> Windows only
* CATZ-234: Updated FMOD Ex library to v4.44.61 (Windows)
* CATZ-232: Updated OpenJPEG library to v1.5.2 (Windows)
* [FIXED] Viewer fails to compile with only the Windows 8 SDK installed
* [FIXED] JpegLib is built with "Whole Program Optimization" and causing slow linker performance

View File

@ -1,21 +0,0 @@
[World/Minimap]
- added : "MiniMapObjects" setting to control the rendering of objects on the minimap
-> enabled by default
- added : property line overlay on the minimap
- added : "Property Lines" context menu option on the mini-map to toggle showing property lines
-> controls 'MiniMapPropertyLines' setting, defaults to on
- added : (optionally) use world map tile texture for the mini-map region texture
- added : "Terrain Textures" as an option to the mini-map "Show" context menu
-> with "Terrain Textures" and "World Map Textures" as separated options it will hopefully become clearer what the texture option entails
- added : (optionally) show for-sale parcels with a yellow highlight on the mini-map
-> controlled by 'MiniMapForSaleParcels', defaults to off
- added : colour collision parcels a transparent red
-> controlled by 'MiniMapCollisionParcels', defaults to on
- added : user-configurable "MiniMapParcelOverylay" color for the property lines on the mini-map
- added : "Place Profile" menu item to the mini-map context menu
- added : "View Profile" context menu item for singular and context sub-menu for multiple dots on the mini-map
- changed : removed title bar from the mini-map + fixed vertical centering of directions
- changed : moved mini-map zoom options into a "Zoom" sub-menu
- changed : mini-map zoom levels for "Close", "Medium" and "Far" options
-> removed dead code in LLFloaterMap::handleZoom()
- changed : only show the "Stop Tracking" mini-map context menu item if we're actually tracking something

View File

@ -3,6 +3,36 @@
<map>
<key>installables</key>
<map>
<key>dullahan-gcc5</key>
<map>
<key>copyright</key>
<string>Copyright (c) 2017, Linden Research, Inc.</string>
<key>description</key>
<string>A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies.</string>
<key>license</key>
<string>MPL</string>
<key>license_file</key>
<string>LICENSES/LICENSE.txt</string>
<key>name</key>
<string>dullahan-gcc5</string>
<key>platforms</key>
<map>
<key>linux64</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>cffd8a7f9d8e55ecd50c72cc39b41f3d</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/dullahan_gcc5-1.1.1080_3.3325.1750.gaabe4c4-linux64-181420123.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
</map>
</map>
<key>version</key>
<string>1.1.1080_3.3325.1750.gaabe4c4</string>
</map>
<key>ndPhysicsStub</key>
<map>
<key>license</key>
@ -156,9 +186,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>2dd97d8bd012be4cdc58f550395feb7d</string>
<string>ff2e4df5bffe0203dc654b111347e617</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/SDL-1.2.15-linux-180871815.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/SDL-1.2.15-linux-181412059.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -168,9 +198,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>608dfd27f7aed9d57cf1f581c995b680</string>
<string>64c1dff0e19792acec7fd32556bf4d7b</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/SDL-1.2.15-linux64-180841947.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/SDL-1.2.15-linux64-181411635.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -882,11 +912,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>9f69c9fa0932d54d17c159fc33faea87</string>
<string>5946db540ecd6da093d15c7f793359f9</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-1.10.04-darwin-180681405.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-1.10.05-darwin-181440931.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -896,11 +926,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>a379240b46b13b2b9e858baa79d1a6ab</string>
<string>32c7ddbc7a5134c849c8c58323dac1cd</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-1.10.04-linux-180891813.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-1.10.05-linux-181440917.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -910,11 +940,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>e0b59ec3b5549b9a0f9caf8c7116af4e</string>
<string>eb04055057a549ac778c7f1391963dfe</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///opt/firestorm/fmodstudio-1.10.04-linux64-180891838.tar.bz2</string>
<string>file:///opt/firestorm/fmodstudio-1.10.05-linux64-181440918.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
@ -924,11 +954,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>7cf0785fa38889c9028fe776eda060f6</string>
<string>79dca4b585181c18f983cb3adc4f9633</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.04-windows-180672209.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.05-windows-181432216.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -938,11 +968,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>fe0951c7fffbf1cd0154bcdb5bcaa5c9</string>
<string>9e2a8fa5e4bdb0a1eba8be3717029c31</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.04-windows64-180672211.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-1.10.05-windows64-181432218.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
@ -2828,9 +2858,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>86cb59b79ce0aafe28d4055a17d1f748</string>
<string>c5404596040e5f6e66a09a6de5edeefa</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/open_libndofdev-0.3.180871824-linux-180871824.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/open_libndofdev-0.3.181412109-linux-181412109.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -2840,9 +2870,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
<string>4df349abfc942fb8e674244d1bd0a515</string>
<string>774e6a85deb149309f1ccf59d2f5c5a4</string>
<key>url</key>
<string>http://downloads.phoenixviewer.com/open_libndofdev-0.3.180841957-linux64-180841957.tar.bz2</string>
<string>http://downloads.phoenixviewer.com/open_libndofdev-0.3.181411657-linux64-181411657.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>

View File

@ -6,7 +6,12 @@ if (USESYSTEMLIBS)
set(CEFPLUGIN OFF CACHE BOOL
"CEFPLUGIN support for the llplugin/llmedia test apps.")
else (USESYSTEMLIBS)
if (LINUX AND ( CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9.4 ) )
message( "Using dullahan for GCC >= 5 " )
use_prebuilt_binary(dullahan-gcc5)
else()
use_prebuilt_binary(dullahan)
endif()
set(CEFPLUGIN ON CACHE BOOL
"CEFPLUGIN support for the llplugin/llmedia test apps.")
set(CEF_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/cef)

View File

@ -440,7 +440,13 @@ LLWearable::EImportResult LLWearable::importStream( std::istream& input_stream,
LL_WARNS() << "Bad Wearable asset: bad texture, #" << i << LL_ENDL;
return LLWearable::FAILURE;
}
if (te >= ETextureIndex::TEX_NUM_INDICES) //createLayers() converts to ETextureIndex
{
LL_WARNS() << "Bad Wearable asset: bad texture index: " << te << LL_ENDL;
return LLWearable::FAILURE;
}
if( !LLUUID::validate( uuid_buffer ) )
{
LL_WARNS() << "Bad Wearable asset: bad texture uuid: "

View File

@ -611,6 +611,41 @@ std::string utf8str_substr(const std::string& utf8str, const S32 index, const S3
return utf8str.substr(index, cur_char);
}
}
void utf8str_split(std::list<std::string>& split_list, const std::string& utf8str, size_t maxlen, char split_token)
{
split_list.clear();
std::string::size_type lenMsg = utf8str.length(), lenIt = 0;
const char* pstrIt = utf8str.c_str(); std::string strTemp;
while (lenIt < lenMsg)
{
if (lenIt + maxlen < lenMsg)
{
// Find the last split character
const char* pstrTemp = pstrIt + maxlen;
while ( (pstrTemp > pstrIt) && (*pstrTemp != split_token) )
pstrTemp--;
if (pstrTemp > pstrIt)
strTemp = utf8str.substr(lenIt, pstrTemp - pstrIt);
else
strTemp = utf8str_substr(utf8str, lenIt, maxlen);
}
else
{
strTemp = utf8str.substr(lenIt, std::string::npos);
}
split_list.push_back(strTemp);
lenIt += strTemp.length();
pstrIt = utf8str.c_str() + lenIt;
if (*pstrIt == split_token)
lenIt++;
}
}
// [/RLVa:KB]
std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len)

View File

@ -36,6 +36,9 @@
#include <map>
#include "llformat.h"
#include "llsd.h"
// [RLVa:KB] - Checked: RLVa-2.1.0
#include <list>
// [/RLVa:KB]
#if LL_LINUX || LL_SOLARIS
#include <wctype.h>
@ -564,6 +567,7 @@ LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32
// [RLVa:KB] - Checked: RLVa-2.1.0
LL_COMMON_API std::string utf8str_substr(const std::string& utf8str, const S32 index, const S32 max_len);
LL_COMMON_API void utf8str_split(std::list<std::string>& split_list, const std::string& utf8str, size_t maxlen, char split_token);
// [/RLVa:KB]
LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);

View File

@ -316,7 +316,10 @@ BOOL LLGLTexture::getIsAlphaMask() const
return mGLTexturep->getIsAlphaMask() ;
}
BOOL LLGLTexture::getMask(const LLVector2 &tc)
//BOOL LLGLTexture::getMask(const LLVector2 &tc)
// [RLVa:KB] - Checked: RLVa-2.3 (@setoverlay)
bool LLGLTexture::getMask(const LLVector2 &tc) const
// [/RLVa:KB]
{
llassert(mGLTexturep.notNull()) ;

View File

@ -143,7 +143,10 @@ public:
LLGLenum getPrimaryFormat() const;
BOOL getIsAlphaMask() const ;
LLTexUnit::eTextureType getTarget(void) const ;
BOOL getMask(const LLVector2 &tc);
// [RLVa:KB] - Checked: RLVa-2.3 (@setoverlay)
bool getMask(const LLVector2 &tc) const;
// [/RLVa:KB]
// BOOL getMask(const LLVector2 &tc);
F32 getTimePassedSinceLastBound();
BOOL getMissed() const ;
BOOL isJustBound()const ;

View File

@ -2001,7 +2001,10 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
}
}
BOOL LLImageGL::getMask(const LLVector2 &tc)
//BOOL LLImageGL::getMask(const LLVector2 &tc)
// [RLVa:KB] - Checked: RLVa-2.3 (@setoverlay)
BOOL LLImageGL::getMask(const LLVector2 &tc) const
// [/RLVa:KB]
{
BOOL res = TRUE;

View File

@ -153,7 +153,10 @@ public:
void setUseMipMaps(BOOL usemips) { mUseMipMaps = usemips; }
void updatePickMask(S32 width, S32 height, const U8* data_in);
BOOL getMask(const LLVector2 &tc);
// [RLVa:KB] - Checked: RLVa-2.3 (@setoverlay)
BOOL getMask(const LLVector2 &tc) const;
// [/RLVa:KB]
// BOOL getMask(const LLVector2 &tc);
void checkTexSize(bool forced = false) const ;

View File

@ -843,6 +843,7 @@ set(viewer_SOURCE_FILES
rlvinventory.cpp
rlvextensions.cpp
rlvfloaters.cpp
rlvmodifiers.cpp
rlvui.cpp
sanitycheck.cpp
streamtitledisplay.cpp
@ -1594,6 +1595,7 @@ set(viewer_HEADER_FILES
rlvinventory.h
rlvextensions.h
rlvfloaters.h
rlvmodifiers.h
rlvui.h
roles_constants.h
qtoolalign.h

View File

@ -189,7 +189,7 @@
<key>grid.avatarconnection.com:8002/</key>
<map>
<key>DEPRECATED</key>
<string>TRUE</string>
<string>TRUE</string>
<key>name</key>
<string>grid.avatarconnection.com:8002/</string>
</map>
@ -468,7 +468,7 @@
<key>login.osgrid.org</key>
<map>
<key>LastModified</key>
<date>2012-08-03T15:36:22.93Z</date>
<date>2019-04-19T21:15:00.00Z</date>
<key>about</key>
<string>http://www.osgrid.org/</string>
<key>gatekeeper</key>
@ -591,7 +591,7 @@
<key>util.aditi.lindenlab.com</key>
<map>
<key>LastModified</key>
<date>2018-04-15T11:25:00Z</date>
<date>2019-04-19T21:15:00Z</date>
<key>app_slurl_base</key>
<string>secondlife:///app</string>
<key>gridname</key>
@ -622,7 +622,7 @@
<key>util.agni.lindenlab.com</key>
<map>
<key>LastModified</key>
<date>2018-04-15T11:25:00Z</date>
<date>2019-04-19T21:15:00Z</date>
<key>app_slurl_base</key>
<string>secondlife:///app</string>
<key>favorite</key>

View File

@ -12601,6 +12601,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Backup</key>
<integer>0</integer>
</map>
<key>RenderResolutionMultiplier</key>
<map>
<key>Comment</key>
<string>Multiplier for rendering 3D scene at reduced resolution.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>RenderShaderLightingMaxLevel</key>
<map>
<key>Comment</key>

File diff suppressed because it is too large Load Diff

View File

@ -422,14 +422,8 @@ void FSNearbyChat::sendChatFromViewer(const LLWString& wtext, const LLWString& o
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 );
type = RlvActions::checkChatVolume(type);
animate &= !RlvActions::hasBehaviour( (!RlvUtil::isEmote(utf8_text)) ? RLV_BHVR_REDIRCHAT : RLV_BHVR_REDIREMOTE );
}
// [/RLVa:KB]

View File

@ -5647,7 +5647,7 @@ void LLTeleportRequestViaLocationLookAt::startTeleport()
// [RLVa:KB] - Checked: RLVa-2.0.0
gAgent.doTeleportViaLocationLookAt(getPosGlobal(), getLookAt());
// [/RLVa:KB]
// gAgent.doTeleportViaLocationLookAt(getPosGlobal());
// gAgent.doTeleportViaLocationLookAt(getPosGlobal());
}
void LLTeleportRequestViaLocationLookAt::restartTeleport()
@ -5656,7 +5656,7 @@ void LLTeleportRequestViaLocationLookAt::restartTeleport()
// [RLVa:KB] - Checked: RLVa-2.0.0
gAgent.doTeleportViaLocationLookAt(getPosGlobal(), getLookAt());
// [/RLVa:KB]
// gAgent.doTeleportViaLocationLookAt(getPosGlobal());
// gAgent.doTeleportViaLocationLookAt(getPosGlobal());
}

View File

@ -3779,7 +3779,7 @@ LLSD LLAppViewer::getViewerInfo() const
#endif
// [RLVa:KB] - Checked: 2010-04-18 (RLVa-1.2.0)
info["RLV_VERSION"] = (rlv_handler_t::isEnabled()) ? RlvStrings::getVersionAbout() : "(disabled)";
info["RLV_VERSION"] = (rlv_handler_t::isEnabled()) ? RlvStrings::getVersionAbout() : LLTrans::getString("RLVaStatusDisabled");
// [/RLVa:KB]
info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
info["LIBCURL_VERSION"] = LLCore::LLHttp::getCURLVersion();

View File

@ -478,7 +478,10 @@ void LLFloaterIMNearbyChat::onChatBoxKeystroke()
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
if ( (length > 0) && (raw_text[0] != '/') && (!RlvActions::hasBehaviour(RLV_BHVR_REDIRCHAT)) )
// [/RLVa:KB]
{
gAgent.startTyping();
}
@ -719,6 +722,15 @@ void LLFloaterIMNearbyChat::sendChatFromViewer(const LLWString &wtext, EChatType
utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1);
}
// [RLVa:KB] - Checked: 2010-03-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0b
if ( (0 == channel) && (RlvActions::isRlvEnabled()) )
{
// Adjust the (public) chat "volume" on chat and gestures (also takes care of playing the proper animation)
type = RlvActions::checkChatVolume(type);
animate &= !RlvActions::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))
{

View File

@ -66,7 +66,7 @@
// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e)
#include "rlvactions.h"
#include "rlvhandler.h"
#include "rlvhelper.h"
#include "rlvmodifiers.h"
// [/RLVa:KB]
#include <vector>

View File

@ -1533,7 +1533,11 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
if(obs_it == mParticularObservers.end())
return;
observer_set_t& obs = obs_it->second;
// observer_set_t& obs = obs_it->second;
// [RLVa:KB] - Checked: RLVa-2.3 (General bugfix)
// Iterate over a *copy* of the observer list
observer_set_t obs = obs_it->second;
// [/RLVa:KB]
for (observer_set_t::iterator ob_it = obs.begin(); ob_it != obs.end(); ++ob_it)
{
(*ob_it)->changed(group_id, gc);

View File

@ -1521,8 +1521,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
mColorSwatch->setValid(FALSE);
}
getChildView("color trans")->setEnabled(FALSE);
mCtrlRpt->setEnabled(FALSE);
// <FS:Ansariel> Doesn't exist as of 2016-11-16
//getChildView("rpt")->setEnabled(FALSE);
//getChildView("tex offset")->setEnabled(FALSE);
// </FS:Ansariel>
getChildView("tex gen")->setEnabled(FALSE);
@ -1634,6 +1634,12 @@ void LLPanelFace::updateVisibility()
getChildView("radio_material_type")->setVisible(!show_media);
// <FS:CR> FIRE-11407 - Be consistant and hide this with the other controls
getChildView("rptctrl")->setVisible(combo_matmedia->getEnabled());
getChildView("tex gen")->setVisible(combo_matmedia->getEnabled());
getChildView("combobox texgen")->setVisible(combo_matmedia->getEnabled());
getChildView("checkbox planar align")->setVisible(combo_matmedia->getEnabled());
getChildView("checkbox_sync_settings")->setVisible(combo_matmedia->getEnabled());
getChildView("copytextures")->setVisible(combo_matmedia->getEnabled());
getChildView("pastetextures")->setVisible(combo_matmedia->getEnabled());
// and other additions...
getChildView("flipTextureScaleU")->setVisible(combo_matmedia->getEnabled());
getChildView("flipTextureScaleV")->setVisible(combo_matmedia->getEnabled());

View File

@ -176,7 +176,7 @@ protected:
attachments_selected = true;
}
// [RLVa:KB] - Checked: 2012-07-28 (RLVa-1.4.7)
if ( (rlv_handler_t::isEnabled()) && (!rlvPredCanRemoveItem(item)) )
if ( (rlv_handler_t::isEnabled()) && (!rlvPredCanRemoveItem(*it)) )
{
rlv_locked_count++;
}

View File

@ -101,7 +101,7 @@
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
#include "rlvactions.h"
#include "rlvhandler.h"
#include "rlvhelper.h"
#include "rlvmodifiers.h"
// [/RLVa:KB]
// <FS:CR> Aurora Sim
#include "llviewernetwork.h"
@ -2594,7 +2594,8 @@ void LLSelectMgr::logNoOp(LLSelectNode* node, void *)
// static
void LLSelectMgr::logAttachmentRequest(LLSelectNode* node, void *)
{
LLAttachmentsMgr::instance().onAttachmentRequested(node->mItemID);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: Catznip-3.7
// LLAttachmentsMgr::instance().onAttachmentRequested(node->mItemID);
}
// static

View File

@ -45,7 +45,7 @@
#include "llui.h"
// [RLVa:KB] - Checked: 2010-03-23 (RLVa-1.2.0a)
#include "rlvhandler.h"
#include "rlvhelper.h"
#include "rlvmodifiers.h"
// [/RLVa:KB]
//Headers added for functions moved from viewer.cpp

View File

@ -49,7 +49,7 @@
#include "llworld.h"
// [RLVa:KB] - Checked: RLVa-2.0.0
#include "rlvactions.h"
#include "rlvhelper.h"
#include "rlvmodifiers.h"
#include "llfloaterreg.h"
// [/RLVa:KB]

View File

@ -199,18 +199,7 @@ static bool handleAvatarHoverOffsetChanged(const LLSD& newvalue)
{
if (isAgentAvatarValid())
{
// <FS:Ansariel> [Legacy bake]
//gAgentAvatarp->setHoverIfRegionEnabled();
if (gAgent.getRegion()->avatarHoverHeightEnabled())
{
LLVector3 avOffset(0.0f, 0.0f, llclamp<F32>(newvalue.asReal(), MIN_HOVER_Z, MAX_HOVER_Z));
gAgentAvatarp->setHoverOffset(avOffset, true);
}
else if (!gAgentAvatarp->isUsingServerBakes())
{
gAgentAvatarp->computeBodySize();
}
// </FS:Ansariel> [Legacy bake]
gAgentAvatarp->setHoverIfRegionEnabled();
}
return true;
}
@ -1013,6 +1002,9 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2));
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
gSavedSettings.getControl("RenderResolutionMultiplier")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
// [/SL:KB]
gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));

View File

@ -79,6 +79,7 @@
#include "llpostprocess.h"
#include "llscenemonitor.h"
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
#include "rlvhandler.h"
#include "rlvlocks.h"
// [/RLVa:KB]
#include "llpresetsmanager.h"
@ -1427,6 +1428,12 @@ void render_ui(F32 zoom_factor, int subfield)
}
render_hud_elements();
// [RLVa:KB] - Checked: RLVa-2.3 (@setoverlay)
if (gRlvHandler.isEnabled())
{
gRlvHandler.renderOverlay();
}
// [/RLVa:KB]
render_hud_attachments();
}

View File

@ -10237,7 +10237,14 @@ void handle_rebake_textures(void*)
if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion())
{
// [SL:KB] - Patch: Appearance-Misc | Checked: 2015-06-27 (Catznip-3.7)
LLAppearanceMgr::instance().syncCofVersionAndRefresh();
if (!gAgent.getRegionCapability("IncrementCOFVersion").empty())
{
LLAppearanceMgr::instance().syncCofVersionAndRefresh();
}
else
{
LLAppearanceMgr::instance().requestServerAppearanceUpdate();
}
// [/SL:KB]
// LLAppearanceMgr::instance().requestServerAppearanceUpdate();
avatar_tex_refresh(gAgentAvatarp); // <FS:CR> FIRE-11800 - Refresh the textures too

View File

@ -5293,7 +5293,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
}
// [RLVa:KB] - Checked: RLVa-1.2.0
if ( (found) && ((gTeleportDisplay) || ((rlv_handler_t::isEnabled()) && (found) && (gRlvHandler.hasBehaviour(RLV_BHVR_INTERACT)))) )
if ( (found) && ((gTeleportDisplay) || ((rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_INTERACT)))) )
{
// Allow picking if:
// - the drag-and-drop tool is active (allows inventory offers)
@ -6950,6 +6950,16 @@ void LLPickInfo::fetchResults()
mPickPt = mMousePt;
// [RLVa:KB] - Checked: RLVa-2.3 (@setoverlay)
if ( (gRlvHandler.isEnabled()) && (hit_object) && (!hit_object->isHUDAttachment()) )
{
if (gRlvHandler.hitTestOverlay(mMousePt))
{
hit_object = nullptr;
}
}
// [/RLVa:KB]
U32 te_offset = face_hit > -1 ? face_hit : 0;
if (mPickParticle)

View File

@ -8459,11 +8459,11 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
BOOL LLVOAvatar::isFullyLoaded() const
{
// return (mRenderUnloadedAvatar || mFullyLoaded);
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-22 (Catznip-2.2)
// [SL:KB] - Patch: Appearance-SyncAttach | Checked: Catznip-2.2
// Changes to LLAppearanceMgr::updateAppearanceFromCOF() expect this function to actually return mFullyLoaded for gAgentAvatarp
return (mRenderUnloadedAvatar && !isSelf()) ||(mFullyLoaded);
// [/SL:KB]
// return (mRenderUnloadedAvatar || mFullyLoaded);
}
bool LLVOAvatar::isTooComplex() const

View File

@ -296,6 +296,12 @@ void LLVOAvatarSelf::setHoverIfRegionEnabled()
setHoverOffset(LLVector3(0.0, 0.0, llclamp(hover_z,MIN_HOVER_Z,MAX_HOVER_Z)));
LL_INFOS("Avatar") << avString() << " set hover height from debug setting " << hover_z << LL_ENDL;
}
// <FS:Ansariel> [Legacy bake]
else if (!isUsingServerBakes())
{
computeBodySize();
}
// </FS:Ansariel> [Legacy bake]
else
{
setHoverOffset(LLVector3(0.0, 0.0, 0.0));

View File

@ -142,6 +142,9 @@ bool LLPipeline::RenderDeferred;
F32 LLPipeline::RenderDeferredSunWash;
U32 LLPipeline::RenderFSAASamples;
U32 LLPipeline::RenderResolutionDivisor;
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
F32 LLPipeline::RenderResolutionMultiplier;
// [/SL:KB]
bool LLPipeline::RenderUIBuffer;
S32 LLPipeline::RenderShadowDetail;
bool LLPipeline::RenderDeferredSSAO;
@ -615,6 +618,9 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderDeferredSunWash");
connectRefreshCachedSettingsSafe("RenderFSAASamples");
connectRefreshCachedSettingsSafe("RenderResolutionDivisor");
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
connectRefreshCachedSettingsSafe("RenderResolutionMultiplier");
// [/SL:KB]
connectRefreshCachedSettingsSafe("RenderUIBuffer");
connectRefreshCachedSettingsSafe("RenderShadowDetail");
connectRefreshCachedSettingsSafe("RenderDeferredSSAO");
@ -834,17 +840,20 @@ void LLPipeline::resizeScreenTexture()
GLuint resX = gViewerWindow->getWorldViewWidthRaw();
GLuint resY = gViewerWindow->getWorldViewHeightRaw();
// [RLVa:KB] - Checked: 2014-02-23 (RLVa-1.4.10)
U32 resMod = RenderResolutionDivisor, resAdjustedX = resX, resAdjustedY = resY;
if ( (resMod > 1) && (resMod < resX) && (resMod < resY) )
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
if ( (RenderResolutionDivisor > 1) && (RenderResolutionDivisor < resX) && (RenderResolutionDivisor < resY) )
{
resAdjustedX /= resMod;
resAdjustedY /= resMod;
resX /= RenderResolutionDivisor;
resY /= RenderResolutionDivisor;
}
else if (RenderResolutionMultiplier != 1.f)
{
resX *= RenderResolutionMultiplier;
resY *= RenderResolutionMultiplier;
}
// [/SL:KB]
if ( (resAdjustedX != mScreen.getWidth()) || (resAdjustedY != mScreen.getHeight()) )
// [/RLVa:KB]
// if ((resX != mScreen.getWidth()) || (resY != mScreen.getHeight()))
if ((resX != mScreen.getWidth()) || (resY != mScreen.getHeight()))
{
releaseScreenBuffers();
if (!allocateScreenBuffer(resX,resY))
@ -1001,6 +1010,13 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
resX /= res_mod;
resY /= res_mod;
}
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
else if (RenderResolutionMultiplier != 1.f)
{
resX *= RenderResolutionMultiplier;
resY *= RenderResolutionMultiplier;
}
// [/SL:KB]
if (RenderUIBuffer)
{
@ -1184,6 +1200,9 @@ void LLPipeline::refreshCachedSettings()
RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
RenderFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
RenderResolutionMultiplier = gSavedSettings.getF32("RenderResolutionMultiplier");
// [/SL:KB]
RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");
RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");

View File

@ -908,6 +908,9 @@ public:
static F32 RenderDeferredSunWash;
static U32 RenderFSAASamples;
static U32 RenderResolutionDivisor;
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
static F32 RenderResolutionMultiplier;
// [/SL:KB]
static bool RenderUIBuffer;
static S32 RenderShadowDetail;
static bool RenderDeferredSSAO;

View File

@ -20,10 +20,12 @@
#include "llviewercamera.h"
#include "llvoavatarself.h"
#include "llworld.h"
#include "rlvactions.h"
#include "rlvhelper.h"
#include "rlvhandler.h"
#include "rlvinventory.h"
#include "rlvmodifiers.h"
// ============================================================================
// Camera
@ -308,12 +310,12 @@ bool RlvActions::canTeleportToLocal(const LLVector3d& posGlobal)
// NOTE: if we're teleporting due to an active command we should disregard any restrictions from the same object
const LLUUID& idRlvObjExcept = gRlvHandler.getCurrentObject();
bool fCanStand = RlvActions::canStand(idRlvObjExcept);
if ( (fCanStand) && ((gRlvHandler.hasBehaviourExcept(RLV_BHVR_SITTP, gRlvHandler.getCurrentObject())) || (gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOCAL, gRlvHandler.getCurrentObject()))) )
if ( (fCanStand) && ((gRlvHandler.hasBehaviourExcept(RLV_BHVR_SITTP, idRlvObjExcept)) || (gRlvHandler.hasBehaviourExcept(RLV_BHVR_TPLOCAL, idRlvObjExcept))) )
{
// User can stand up but is either @sittp or @tplocal restricted so we need to distance check
const F32 nDistSq = (LLVector2(posGlobal.mdV[0], posGlobal.mdV[1]) - LLVector2(gAgent.getPositionGlobal().mdV[0], gAgent.getPositionGlobal().mdV[1])).lengthSquared();
F32 nMaxDist = llmin(RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_TPLOCALDIST)->getValue<float>(), RLV_MODIFIER_TPLOCAL_DEFAULT);
if (gRlvHandler.hasBehaviour(RLV_BHVR_SITTP))
if (gRlvHandler.hasBehaviourExcept(RLV_BHVR_SITTP, idRlvObjExcept))
nMaxDist = llmin(nMaxDist, RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SITTPDIST)->getValue<F32>());
return (nDistSq < nMaxDist * nMaxDist);
}

View File

@ -374,6 +374,8 @@ const char* RlvStrings::getStringFromReturnCode(ERlvCmdRet eRet)
return "missing #RLV";
case RLV_RET_FAILED_DEPRECATED:
return "deprecated and disabled";
case RLV_RET_FAILED_NOBEHAVIOUR:
return "no active behaviours";
// The following are identified by the chat verb
case RLV_RET_RETAINED:
case RLV_RET_SUCCESS:
@ -624,28 +626,10 @@ void RlvUtil::sendIMMessage(const LLUUID& idRecipient, const std::string& strMsg
std::string strAgentName;
LLAgentUI::buildFullname(strAgentName);
std::string::size_type lenMsg = strMsg.length(), lenIt = 0;
const char* pstrIt = strMsg.c_str(); std::string strTemp;
while (lenIt < lenMsg)
std::list<std::string> msgList;
utf8str_split(msgList, strMsg, MAX_MSG_STR_LEN, chSplit);
for (const std::string& strMsg : msgList)
{
if (lenIt + MAX_MSG_STR_LEN < lenMsg)
{
// Find the last split character
const char* pstrTemp = pstrIt + MAX_MSG_STR_LEN;
while ( (pstrTemp > pstrIt) && (*pstrTemp != chSplit) )
pstrTemp--;
if (pstrTemp > pstrIt)
strTemp = strMsg.substr(lenIt, pstrTemp - pstrIt);
else
strTemp = utf8str_substr(strMsg, lenIt, MAX_MSG_STR_LEN);
}
else
{
strTemp = strMsg.substr(lenIt, std::string::npos);
}
pack_instant_message(
gMessageSystem,
gAgent.getID(),
@ -653,28 +637,11 @@ void RlvUtil::sendIMMessage(const LLUUID& idRecipient, const std::string& strMsg
gAgent.getSessionID(),
idRecipient,
strAgentName.c_str(),
strTemp.c_str(),
( (!pBuddyInfo) || (pBuddyInfo->isOnline()) ) ? IM_ONLINE : IM_OFFLINE,
strMsg.c_str(),
((!pBuddyInfo) || (pBuddyInfo->isOnline())) ? IM_ONLINE : IM_OFFLINE,
IM_NOTHING_SPECIAL,
idSession);
gAgent.sendReliableMessage();
lenIt += strTemp.length();
pstrIt = strMsg.c_str() + lenIt;
if (*pstrIt == chSplit)
lenIt++;
}
}
void RlvUtil::teleportCallback(U64 hRegion, const LLVector3& posRegion, const LLVector3& vecLookAt)
{
if (hRegion)
{
const LLVector3d posGlobal = from_region_handle(hRegion) + (LLVector3d)posRegion;
if (vecLookAt.isExactlyZero())
gAgent.teleportViaLocation(posGlobal);
else
gAgent.teleportViaLocationLookAt(posGlobal, vecLookAt);
}
}

View File

@ -57,7 +57,7 @@ class RlvObject;
struct RlvException;
typedef boost::variant<std::string, LLUUID, S32, ERlvBehaviour> RlvExceptionOption;
typedef boost::variant<int, float, LLVector3, LLUUID> RlvBehaviourModifierValue;
typedef boost::variant<int, float, bool, LLVector3, LLUUID> RlvBehaviourModifierValue;
class RlvGCTimer;
@ -186,7 +186,6 @@ public:
static bool sendChatReply(S32 nChannel, const std::string& strUTF8Text);
static bool sendChatReply(const std::string& strChannel, const std::string& strUTF8Text);
static void sendIMMessage(const LLUUID& idTo, const std::string& strMsg, char chSplit);
static void teleportCallback(U64 hRegion, const LLVector3& posRegion, const LLVector3& vecLookAt);
protected:
static bool m_fForceTp; // @standtp
};

View File

@ -23,8 +23,8 @@
// Version of the specifcation we report
const S32 RLV_VERSION_MAJOR = 3;
const S32 RLV_VERSION_MINOR = 1;
const S32 RLV_VERSION_PATCH = 4;
const S32 RLV_VERSION_MINOR = 2;
const S32 RLV_VERSION_PATCH = 1;
const S32 RLV_VERSION_BUILD = 0;
// Version of the specifcation we report (in compatibility mode)
@ -35,7 +35,7 @@ const S32 RLV_VERSION_BUILD_COMPAT = 0;
// Implementation version
const S32 RLVa_VERSION_MAJOR = 2;
const S32 RLVa_VERSION_MINOR = 1;
const S32 RLVa_VERSION_MINOR = 2;
const S32 RLVa_VERSION_PATCH = 0;
// Uncomment before a final release
@ -71,6 +71,7 @@ const S32 RLVa_VERSION_PATCH = 0;
#define RLV_ROOT_FOLDER "#RLV"
#define RLV_CMD_PREFIX '@'
#define RLV_MODIFIER_ANIMATION_FREQUENCY 10
#define RLV_MODIFIER_TPLOCAL_DEFAULT 256.f // Any teleport that's more than a region away is non-local
#define RLV_MODIFIER_FARTOUCH_DEFAULT 1.5f // Specifies the default @fartouch distance
#define RLV_MODIFIER_SITTP_DEFAULT 1.5f // Specifies the default @sittp distance
@ -231,6 +232,14 @@ enum ERlvBehaviour {
// Camera (force)
RLV_BHVR_SETCAM_MODE, // Switch the user's camera into the specified mode (e.g. mouselook or thirdview)
// Overlay
RLV_BHVR_SETOVERLAY, // Gives an object exclusive control of the overlay
RLV_BHVR_SETOVERLAY_ALPHA, // Changes the overlay texture's transparency level
RLV_BHVR_SETOVERLAY_TEXTURE, // Changes the overlay texture
RLV_BHVR_SETOVERLAY_TINT, // Changes the tint that's applied to the overlay texture
RLV_BHVR_SETOVERLAY_TOUCH, // Block world interaction (=touching) based on the alpha channel of the overlay texture
RLV_BHVR_SETOVERLAY_TWEEN, // Animate between the current overlay settings and the supplied values
RLV_BHVR_COUNT,
RLV_BHVR_UNKNOWN
};
@ -238,6 +247,10 @@ enum ERlvBehaviour {
enum ERlvBehaviourModifier
{
RLV_MODIFIER_FARTOUCHDIST, // Radius of a sphere around the user in which they can interact with the world
RLV_MODIFIER_OVERLAY_ALPHA, // Transparency level of the overlay texture (in addition to the texture's own alpha channel)
RLV_MODIFIER_OVERLAY_TEXTURE, // Specifies the UUID of the overlay texture
RLV_MODIFIER_OVERLAY_TINT, // The tint that's applied to the overlay texture
RLV_MODIFIER_OVERLAY_TOUCH, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction
RLV_MODIFIER_RECVIMDISTMIN, // Minimum distance to receive an IM from an otherwise restricted sender (squared value)
RLV_MODIFIER_RECVIMDISTMAX, // Maximum distance to receive an IM from an otherwise restricted sender (squared value)
RLV_MODIFIER_SENDIMDISTMIN, // Minimum distance to send an IM to an otherwise restricted recipient (squared value)
@ -296,6 +309,7 @@ enum ERlvCmdRet {
RLV_RET_FAILED_UNKNOWN, // Command failed (unknown command)
RLV_RET_FAILED_NOSHAREDROOT, // Command failed (missing #RLV)
RLV_RET_FAILED_DEPRECATED, // Command failed (deprecated and no longer supported)
RLV_RET_FAILED_NOBEHAVIOUR, // Command failed (force modifier on an object with no active restrictions)
RLV_RET_NO_PROCESSOR // Command doesn't have a template processor define (legacy code)
};
#define RLV_RET_SUCCEEDED(eCmdRet) (((eCmdRet) & RLV_RET_SUCCESS) == RLV_RET_SUCCESS)

View File

@ -158,7 +158,6 @@ bool RlvWindLightControl::setFloat(F32 nValue)
class RlvWindLight : public LLSingleton<RlvWindLight>
{
LLSINGLETON(RlvWindLight);
public:
std::string getValue(const std::string& strSetting, bool& fError);
bool setValue(const std::string& strRlvName, const std::string& strValue);

View File

@ -384,6 +384,10 @@ void RlvFloaterBehaviours::refreshAll()
sdModifierColumns[1]["value"] = llformat("%f", boost::get<float>(modValue));
else if (typeid(int) == modValue.type())
sdModifierColumns[1]["value"] = llformat("%d", boost::get<int>(modValue));
else if (typeid(bool) == modValue.type())
sdModifierColumns[1]["value"] = (boost::get<bool>(modValue)) ? "true" : "false";
else if (typeid(LLUUID) == modValue.type())
sdModifierColumns[1]["value"] = boost::get<LLUUID>(modValue).asString();
}
else
{
@ -746,6 +750,7 @@ BOOL RlvFloaterConsole::postBuild()
void RlvFloaterConsole::onClose(bool fQuitting)
{
RlvBehaviourDictionary::instance().clearModifiers(gAgent.getID());
gRlvHandler.processCommand(gAgent.getID(), "clear", true);
}

View File

@ -1,6 +1,6 @@
/**
*
* Copyright (c) 2009-2016, Kitty Barnett
* Copyright (c) 2009-2018, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
@ -43,12 +43,14 @@
#include "llpaneloutfitsinventory.h" // @showinv - "Appearance" floater
#include "llpanelpeople.h" // @shownames
#include "llpanelwearing.h" // @showinv - "Appearance / Current Outfit" panel
#include "llregionhandle.h" // @tpto
#include "llsidepanelappearance.h" // @showinv - "Appearance / Edit appearance" panel
#include "lltabcontainer.h" // @showinv - Tab container control for inventory tabs
#include "lltoolmgr.h" // @edit
#include "llviewercamera.h" // @setcam and related
#include "llworldmapmessage.h" // @tpto
#include "llviewertexturelist.h" // @setcam_texture
#include "llviewerwindow.h" // @setoverlay
// RLVa includes
#include "rlvactions.h"
@ -58,6 +60,7 @@
#include "rlvhelper.h"
#include "rlvinventory.h"
#include "rlvlocks.h"
#include "rlvmodifiers.h"
#include "rlvui.h"
#include "rlvextensions.h"
@ -144,10 +147,14 @@ RlvHandler::RlvHandler() : m_fCanCancelTp(true), m_posSitSource(), m_pGCTimer(NU
memset(m_Behaviours, 0, sizeof(S16) * RLV_BHVR_COUNT);
}
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.0.1d
RlvHandler::~RlvHandler()
{
gAgent.removeListener(this);
if (m_PendingGroupChange.first.notNull())
{
LLGroupMgr::instance().removeObserver(m_PendingGroupChange.first, this);
m_PendingGroupChange = std::make_pair(LLUUID::null, LLStringUtil::null);
}
//delete m_pGCTimer; // <- deletes itself
}
@ -387,6 +394,7 @@ ERlvCmdRet RlvHandler::processCommand(const RlvCommand& rlvCmd, bool fFromObj)
if (0 == itObj->second.m_Commands.size())
{
RLV_DEBUGS << "\t- command list empty => removing " << idCurObj << RLV_ENDL;
RlvBehaviourDictionary::instance().clearModifiers(idCurObj);
m_Objects.erase(itObj);
}
}
@ -546,9 +554,21 @@ void RlvHandler::onIMQueryListResponse(const LLSD& sdNotification, const LLSD sd
}
// ============================================================================
// Externally invoked event handlers
// Command specific helper functions - @setgroup
//
void RlvHandler::changed(const LLUUID& idGroup, LLGroupChange change)
{
// If we're receiving information about a group we're not interested in, we forgot a removeObserver somewhere
RLV_ASSERT(idGroup == m_PendingGroupChange.first);
if ( ((GC_ALL == change) || (GC_ROLE_DATA == change)) && (m_PendingGroupChange.first == idGroup) )
{
LLGroupMgr::instance().removeObserver(m_PendingGroupChange.first, this);
setActiveGroupRole(m_PendingGroupChange.first, m_PendingGroupChange.second);
}
}
bool RlvHandler::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& sdUserdata)
{
// Ansariel: We really only want to handle "new group" events here. Registering for this event
@ -561,48 +581,123 @@ bool RlvHandler::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD&
// NOTE: we'll fire once for every group the user belongs to so we need to manually keep track of pending changes
static LLUUID s_idLastAgentGroup = LLUUID::null;
static bool s_fGroupChanging = false;
if (s_idLastAgentGroup != gAgent.getGroupID())
{
s_idLastAgentGroup = gAgent.getGroupID();
s_fGroupChanging = false;
onActiveGroupChanged();
}
return false;
}
void RlvHandler::onActiveGroupChanged()
{
// If the user managed to change their active group (= newly joined or created group) we need to reactivate the previous one
if ( (!RlvActions::canChangeActiveGroup()) /*&& ("new group" == event->desc())*/ && (m_idAgentGroup != gAgent.getGroupID()) )
if ( (!RlvActions::canChangeActiveGroup()) && (m_idAgentGroup != gAgent.getGroupID()) )
{
// Make sure they still belong to the group
if ( (m_idAgentGroup.notNull()) && (!gAgent.isInGroup(m_idAgentGroup)) )
{
m_idAgentGroup.setNull();
s_fGroupChanging = false;
}
if (!s_fGroupChanging)
{
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_GROUPCHANGE,
LLSD().with("GROUP_SLURL", (m_idAgentGroup.notNull()) ? LLSLURL("group", m_idAgentGroup, "about").getSLURLString() : LLTrans::getString("GroupNameNone")));
// Notify them about the change
const LLSD sdArgs = LLSD().with("GROUP_SLURL", (m_idAgentGroup.notNull()) ? llformat("secondlife:///app/group/%s/about", m_idAgentGroup.asString().c_str()) : "(none)");
RlvUtil::notifyBlocked(RLV_STRING_BLOCKED_GROUPCHANGE, sdArgs);
// [Copy/paste from LLGroupActions::activate()]
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ActivateGroup);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addUUIDFast(_PREHASH_GroupID, m_idAgentGroup);
gAgent.sendReliableMessage();
s_fGroupChanging = true;
return true;
}
setActiveGroup(m_idAgentGroup);
}
else
{
m_idAgentGroup = gAgent.getGroupID();
// Allowed change - check if we still need to activate a role
if ( (m_PendingGroupChange.first.notNull()) && (m_PendingGroupChange.first == m_idAgentGroup) )
{
setActiveGroupRole(m_PendingGroupChange.first, m_PendingGroupChange.second);
}
}
return false;
}
void RlvHandler::setActiveGroup(const LLUUID& idGroup)
{
// If we have an existing observer fpr a different group, remove it
if ( (m_PendingGroupChange.first.notNull()) && (m_PendingGroupChange.first != idGroup) )
{
LLGroupMgr::instance().removeObserver(m_PendingGroupChange.first, this);
m_PendingGroupChange = std::make_pair(LLUUID::null, LLStringUtil::null);
}
if (gAgent.getGroupID() != idGroup)
{
// [Copy/paste from LLGroupActions::activate()]
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ActivateGroup);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addUUIDFast(_PREHASH_GroupID, idGroup);
gAgent.sendReliableMessage();
}
m_idAgentGroup = idGroup;
}
void RlvHandler::setActiveGroupRole(const LLUUID& idGroup, const std::string& strRole)
{
// Check if we need a group change first
if (gAgent.getGroupID() != idGroup)
{
setActiveGroup(idGroup);
m_PendingGroupChange = std::make_pair(idGroup, strRole);
return;
}
// Now that we have the correct group, check if we need to request the role information
/*const*/ auto* pGroupData = LLGroupMgr::instance().getGroupData(idGroup);
if ( ((!pGroupData) && (gAgent.isInGroup(idGroup))) || (!pGroupData->isRoleDataComplete()) )
{
if (m_PendingGroupChange.first.notNull())
LLGroupMgr::instance().removeObserver(m_PendingGroupChange.first, this);
m_PendingGroupChange = std::make_pair(idGroup, strRole);
LLGroupMgr::instance().addObserver(idGroup, this);
LLGroupMgr::instance().sendGroupRoleDataRequest(idGroup);
return;
}
// We have everything - activate the requested role (if we can find it)
if (pGroupData)
{
enum class EMatch { NoMatch, Partial, Exact } eMatch = EMatch::NoMatch; LLUUID idRole;
for (const auto& roleData : pGroupData->mRoles)
{
// NOTE: exact matches take precedence over partial matches; in case of partial matches the last match wins
const std::string& strRoleName = roleData.second->getRoleData().mRoleName;
if (boost::istarts_with(strRoleName, strRole))
{
idRole = roleData.first;
eMatch = (strRoleName.length() == strRole.length()) ? EMatch::Exact : EMatch::Partial;
if (eMatch == EMatch::Exact)
break;
}
}
if (eMatch != EMatch::NoMatch)
{
RLV_INFOS << "Activating role '" << strRole << "' for group '" << pGroupData->mName << "'" << RLV_ENDL;
LLGroupMgr::getInstance()->sendGroupTitleUpdate(idGroup, idRole);
}
else
{
RLV_INFOS << "Couldn't find role '" << strRole << "' in group '" << pGroupData->mName << "'" << RLV_ENDL;
}
}
m_PendingGroupChange = std::make_pair(LLUUID::null, LLStringUtil::null);
}
// ============================================================================
// Externally invoked event handlers
//
// Checked: 2010-08-29 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
void RlvHandler::onSitOrStand(bool fSitting)
{
@ -806,6 +901,22 @@ void RlvHandler::onLoginComplete()
processRetainedCommands();
}
void RlvHandler::onTeleportCallback(U64 hRegion, const LLVector3& posRegion, const LLVector3& vecLookAt, const LLUUID& idRlvObj)
{
if (hRegion)
{
m_CurObjectStack.push(idRlvObj);
const LLVector3d posGlobal = from_region_handle(hRegion) + (LLVector3d)posRegion;
if (vecLookAt.isExactlyZero())
gAgent.teleportViaLocation(posGlobal);
else
gAgent.teleportViaLocationLookAt(posGlobal, vecLookAt);
m_CurObjectStack.pop();
}
}
// Checked: 2010-04-05 (RLVa-1.2.0d) | Added: RLVa-1.2.0d
void RlvHandler::onTeleportFailed()
{
@ -1429,13 +1540,13 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_MODIFIER>::onCommand(const RlvC
if (RLV_TYPE_ADD == rlvCmd.getParamType())
{
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]++;
pBhvrModifier->addValue(modValue, rlvCmd.getObjectID());
pBhvrModifier->addValue(modValue, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]--;
}
else
{
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]--;
pBhvrModifier->removeValue(modValue, rlvCmd.getObjectID());
pBhvrModifier->removeValue(modValue, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]++;
}
@ -1459,13 +1570,13 @@ ERlvCmdRet RlvBehaviourGenericHandler<RLV_OPTION_NONE_OR_MODIFIER>::onCommand(co
if (RLV_TYPE_ADD == rlvCmd.getParamType())
{
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]++;
pBhvrModifier->addValue(pBhvrModifier->getDefaultValue(), rlvCmd.getObjectID());
pBhvrModifier->addValue(pBhvrModifier->getDefaultValue(), rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]--;
}
else
{
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]--;
pBhvrModifier->removeValue(pBhvrModifier->getDefaultValue(), rlvCmd.getObjectID());
pBhvrModifier->removeValue(pBhvrModifier->getDefaultValue(), rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
gRlvHandler.m_Behaviours[rlvCmd.getBehaviourType()]++;
}
}
@ -1645,6 +1756,42 @@ void RlvBehaviourToggleHandler<RLV_BHVR_EDIT>::onCommandToggle(ERlvBehaviour eBh
RlvUIEnabler::instance().removeGenericFloaterFilter("beacons");
}
// Handles: @setoverlay=n|y toggles
template<> template<>
void RlvBehaviourToggleHandler<RLV_BHVR_SETOVERLAY>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
// Once an object has exclusive control over the overlay only its behaviours should be active. This affects:
// - behaviour modifiers => handled for us once we set the primary object
LLUUID idRlvObject;
if (fHasBhvr)
{
// Get the UUID of the primary object (there should only be one)
std::list<const RlvObject*> lObjects;
gRlvHandler.findBehaviour(RLV_BHVR_SETOVERLAY, lObjects);
RLV_ASSERT(lObjects.size() == 1);
idRlvObject = lObjects.front()->getObjectID();
}
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_ALPHA)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TINT)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TEXTURE)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TOUCH)->setPrimaryObject(idRlvObject);
}
// Handles: @setoverlay_texture:<uuid>=n|y changes
template<>
void RlvBehaviourModifierHandler<RLV_MODIFIER_OVERLAY_TEXTURE>::onValueChange() const
{
if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TEXTURE))
{
if (pBhvrModifier->hasValue())
gRlvHandler.setOverlayImage(pBhvrModifier->getValue<LLUUID>());
else
gRlvHandler.clearOverlayImage();
}
}
// Handles: @sendchannel[:<channel>]=n|y and @sendchannel_except[:<channel>]=n|y
template<> template<>
ERlvCmdRet RlvBehaviourSendChannelHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount)
@ -1704,15 +1851,15 @@ ERlvCmdRet RlvBehaviourRecvSendStartIMHandler::onCommand(const RlvCommand& rlvCm
RlvBehaviourModifier *pBhvrModDistMin = RlvBehaviourDictionary::instance().getModifier(eModDistMin), *pBhvrModDistMax = RlvBehaviourDictionary::instance().getModifier(eModDistMax);
if (RLV_TYPE_ADD == rlvCmd.getParamType())
{
pBhvrModDistMin->addValue(nDistMin * nDistMin, rlvCmd.getObjectID());
pBhvrModDistMin->addValue(nDistMin * nDistMin, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
if (optionList.size() >= 2)
pBhvrModDistMax->addValue(nDistMax * nDistMax, rlvCmd.getObjectID());
pBhvrModDistMax->addValue(nDistMax * nDistMax, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
}
else
{
pBhvrModDistMin->removeValue(nDistMin * nDistMin, rlvCmd.getObjectID());
pBhvrModDistMin->removeValue(nDistMin * nDistMin, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
if (optionList.size() >= 2)
pBhvrModDistMax->removeValue(nDistMax * nDistMax, rlvCmd.getObjectID());
pBhvrModDistMax->removeValue(nDistMax * nDistMax, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
}
fRefCount = true;
@ -2202,6 +2349,24 @@ ERlvCmdRet RlvCommandHandlerBaseImpl<RLV_TYPE_FORCE>::processCommand(const RlvCo
return (*pHandler)(rlvCmd);
}
// Handles: @bhvr:<modifier>=force
template<>
ERlvCmdRet RlvForceGenericHandler<RLV_OPTION_MODIFIER>::onCommand(const RlvCommand& rlvCmd)
{
// The object should be holding at least one active behaviour
if (!gRlvHandler.hasBehaviour(rlvCmd.getObjectID()))
return RLV_RET_FAILED_NOBEHAVIOUR;
// There should be an option and it should specify a valid modifier (RlvBehaviourModifier performs the appropriate type checks)
RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifierFromBehaviour(rlvCmd.getBehaviourType());
RlvBehaviourModifierValue modValue;
if ( (!rlvCmd.hasOption()) || (!pBhvrModifier) || (!pBhvrModifier->convertOptionValue(rlvCmd.getOption(), modValue)) )
return RLV_RET_FAILED_OPTION;
pBhvrModifier->setValue(modValue, rlvCmd.getObjectID());
return RLV_RET_SUCCESS;
}
// Checked: 2010-04-07 (RLVa-1.2.0d) | Modified: RLVa-1.1.0j
ERlvCmdRet RlvHandler::processForceCommand(const RlvCommand& rlvCmd) const
{
@ -2497,6 +2662,32 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SETCAM_MODE>::onCommand(const RlvCommand& rl
return RLV_RET_SUCCESS;
}
// Handles: @setoverlay_tween:[<alpha>];[<tint>];<duration>=force
template<> template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_SETOVERLAY_TWEEN>::onCommand(const RlvCommand& rlvCmd)
{
std::vector<std::string> optionList;
if ( (!RlvCommandOptionHelper::parseStringList(rlvCmd.getOption(), optionList)) || (3 != optionList.size()) )
return RLV_RET_FAILED_OPTION;
// Parse the duration first (required param)
float tweenDuration = .0f;
if (!RlvCommandOptionHelper::parseOption(optionList[2], tweenDuration))
return RLV_RET_FAILED_OPTION;
// Process the overlay alpha tween (if there is one and it is a valid value)
float overlayAlpha = .0f;
if (RlvCommandOptionHelper::parseOption(optionList[0], overlayAlpha))
RlvBehaviourModifierAnimator::instance().addTween(rlvCmd.getObjectID(), RLV_MODIFIER_OVERLAY_ALPHA, RlvBehaviourModifierAnimationType::Lerp, overlayAlpha, tweenDuration);
// Process the overlay tint tween (if there is one and it is a valid value)
LLVector3 overlayColor;
if (RlvCommandOptionHelper::parseOption(optionList[1], overlayColor))
RlvBehaviourModifierAnimator::instance().addTween(rlvCmd.getObjectID(), RLV_MODIFIER_OVERLAY_TINT, RlvBehaviourModifierAnimationType::Lerp, overlayColor, tweenDuration);
return RLV_RET_SUCCESS;
}
// Checked: 2010-08-30 (RLVa-1.2.1c) | Modified: RLVa-1.2.1c
ERlvCmdRet RlvHandler::onForceWear(const LLViewerInventoryCategory* pFolder, U32 nFlags) const
{
@ -2526,20 +2717,24 @@ void RlvHandler::onForceWearCallback(const uuid_vec_t& idItems, U32 nFlags) cons
}
}
// Handles: @setgroup:<uuid|name>=force
// Handles: @setgroup:<uuid|name>[;<role>]=force
template<> template<>
ERlvCmdRet RlvForceHandler<RLV_BHVR_SETGROUP>::onCommand(const RlvCommand& rlvCmd)
{
if (!RlvActions::canChangeActiveGroup(rlvCmd.getObjectID()))
return RLV_RET_FAILED_LOCK;
std::vector<std::string> optionList;
if ( (!RlvCommandOptionHelper::parseStringList(rlvCmd.getOption(), optionList)) || (optionList.size() < 1) || (optionList.size() > 2) )
return RLV_RET_FAILED_OPTION;
LLUUID idGroup; bool fValid = false;
if ("none" == rlvCmd.getOption())
if ("none" == optionList[0])
{
idGroup.setNull();
fValid = true;
}
else if (idGroup.set(rlvCmd.getOption()))
else if (idGroup.set(optionList[0]))
{
fValid = (idGroup.isNull()) || (gAgent.isInGroup(idGroup, true));
}
@ -2549,10 +2744,10 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SETGROUP>::onCommand(const RlvCommand& rlvCm
for (const auto& groupData : gAgent.mGroups)
{
// NOTE: exact matches take precedence over partial matches; in case of partial matches the last match wins
if (boost::istarts_with(groupData.mName, rlvCmd.getOption()))
if (boost::istarts_with(groupData.mName, optionList[0]))
{
idGroup = groupData.mID;
fExactMatch = groupData.mName.length() == rlvCmd.getOption().length();
fExactMatch = groupData.mName.length() == optionList[0].length();
if (fExactMatch)
break;
}
@ -2562,8 +2757,10 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_SETGROUP>::onCommand(const RlvCommand& rlvCm
if (fValid)
{
gRlvHandler.m_idAgentGroup = idGroup;
LLGroupActions::activate(idGroup);
if (optionList.size() == 1)
gRlvHandler.setActiveGroup(idGroup);
else if (optionList.size() == 2)
gRlvHandler.setActiveGroupRole(idGroup, optionList[1]);
}
return (fValid) ? RLV_RET_SUCCESS : RLV_RET_FAILED_OPTION;
@ -2653,7 +2850,7 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_TPTO>::onCommand(const RlvCommand& rlvCmd)
return RLV_RET_FAILED_OPTION;
}
LLWorldMapMessage::url_callback_t cb = boost::bind(&RlvUtil::teleportCallback, _1, posRegion, vecLookAt);
LLWorldMapMessage::url_callback_t cb = boost::bind(&RlvHandler::onTeleportCallback, &gRlvHandler, _1, posRegion, vecLookAt, rlvCmd.getObjectID());
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(posList[0], cb, std::string(""), true);
}
@ -2971,12 +3168,12 @@ ERlvCmdRet RlvBehaviourCamZoomMinMaxHandler::onCommand(const RlvCommand& rlvCmd,
if (RLV_TYPE_ADD == rlvCmd.getParamType())
{
gRlvHandler.m_Behaviours[(RLV_BHVR_CAMZOOMMIN == rlvCmd.getBehaviourType()) ? RLV_BHVR_SETCAM_FOVMIN : RLV_BHVR_SETCAM_FOVMAX]++;
pBhvrModifier->addValue(DEFAULT_FIELD_OF_VIEW / nMult, rlvCmd.getObjectID());
pBhvrModifier->addValue(DEFAULT_FIELD_OF_VIEW / nMult, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
}
else
{
gRlvHandler.m_Behaviours[(RLV_BHVR_CAMZOOMMIN == rlvCmd.getBehaviourType()) ? RLV_BHVR_SETCAM_FOVMIN : RLV_BHVR_SETCAM_FOVMAX]--;
pBhvrModifier->removeValue(DEFAULT_FIELD_OF_VIEW / nMult, rlvCmd.getObjectID());
pBhvrModifier->removeValue(DEFAULT_FIELD_OF_VIEW / nMult, rlvCmd.getObjectID(), rlvCmd.getBehaviourType());
}
}
@ -3251,3 +3448,92 @@ ERlvCmdRet RlvHandler::onGetPath(const RlvCommand& rlvCmd, std::string& strReply
}
// ============================================================================
// Command specific helper functions - @setoverlay
//
void RlvHandler::clearOverlayImage()
{
if (m_pOverlayImage)
{
m_pOverlayImage->setBoostLevel(m_nOverlayOrigBoost);
m_pOverlayImage = nullptr;
}
}
bool RlvHandler::hitTestOverlay(const LLCoordGL& ptMouse) const
{
if (!m_pOverlayImage)
return false;
RlvBehaviourModifier* pTouchModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TOUCH);
return (pTouchModifier) && (pTouchModifier->hasValue()) && (pTouchModifier->getValue<bool>()) &&
(m_pOverlayImage->getMask(LLVector2((float)ptMouse.mX / gViewerWindow->getWorldViewWidthScaled(), (float)ptMouse.mY / gViewerWindow->getWorldViewHeightScaled())));
}
void RlvHandler::renderOverlay()
{
if ( (hasBehaviour(RLV_BHVR_SETOVERLAY)) && (m_pOverlayImage) )
{
if (LLGLSLShader::sNoFixedFunction)
{
gUIProgram.bind();
}
int nWidth = gViewerWindow->getWorldViewWidthScaled();
int nHeight = gViewerWindow->getWorldViewHeightScaled();
m_pOverlayImage->addTextureStats(nWidth * nHeight);
m_pOverlayImage->setKnownDrawSize(nWidth, nHeight);
LLGLSUIDefault glsUI;
gViewerWindow->setup2DRender();
gGL.pushMatrix();
const LLVector2& displayScale = gViewerWindow->getDisplayScale();
gGL.scalef(displayScale.mV[VX], displayScale.mV[VY], 1.f);
gGL.getTexUnit(0)->bind(m_pOverlayImage);
const LLVector3 overlayTint = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TINT)->getValue<LLVector3>();
gGL.color4f(overlayTint.mV[0], overlayTint.mV[1], overlayTint.mV[2], llclamp(RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_ALPHA)->getValue<float>(), 0.0f, 1.0f));
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex2i(nWidth, nHeight);
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2i(0, nHeight);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2i(0, 0);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex2i(nWidth, nHeight);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2i(0, 0);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2i(nWidth, 0);
gGL.end();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.popMatrix();
gGL.flush();
if (LLGLSLShader::sNoFixedFunction)
{
gUIProgram.unbind();
}
}
}
void RlvHandler::setOverlayImage(const LLUUID& idTexture)
{
if ( (m_pOverlayImage) && (m_pOverlayImage->getID() == idTexture) )
return;
clearOverlayImage();
m_pOverlayImage = LLViewerTextureManager::getFetchedTexture(idTexture, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
m_nOverlayOrigBoost = m_pOverlayImage->getBoostLevel();
m_pOverlayImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
m_pOverlayImage->forceToSaveRawImage(0);
}
// ============================================================================

View File

@ -1,6 +1,6 @@
/**
*
* Copyright (c) 2009-2016, Kitty Barnett
* Copyright (c) 2009-2018, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
@ -17,14 +17,21 @@
#ifndef RLV_HANDLER_H
#define RLV_HANDLER_H
#include "llgroupmgr.h"
#include <stack>
#include "rlvcommon.h"
#include "rlvhelper.h"
// ============================================================================
// Forward declarations
//
class LLViewerFetchedTexture;
// ============================================================================
class RlvHandler : public LLOldEvents::LLSimpleListener
class RlvHandler : public LLOldEvents::LLSimpleListener, public LLParticularGroupObserver
{
// Temporary LLSingleton look-alike
public:
@ -52,6 +59,8 @@ public:
// Returns TRUE is at least one object contains the specified behaviour (and optional option)
bool hasBehaviour(ERlvBehaviour eBhvr) const { return (eBhvr < RLV_BHVR_COUNT) ? (0 != m_Behaviours[eBhvr]) : false; }
bool hasBehaviour(ERlvBehaviour eBhvr, const std::string& strOption) const;
// Returns TRUE if the specified object has at least one active behaviour
bool hasBehaviour(const LLUUID& idObj) { return m_Objects.end() != m_Objects.find(idObj); }
// Returns TRUE if the specified object contains the specified behaviour (and optional option)
bool hasBehaviour(const LLUUID& idObj, ERlvBehaviour eBhvr, const std::string& strOption = LLStringUtil::null) const;
// Returns TRUE if at least one object (except the specified one) contains the specified behaviour (and optional option)
@ -93,7 +102,7 @@ public:
* Helper functions
*/
public:
// Accessors
// Accessors/Mutators
const LLUUID& getAgentGroup() const { return m_idAgentGroup; } // @setgroup
bool getCanCancelTp() const { return m_fCanCancelTp; } // @accepttp and @tpto
void setCanCancelTp(bool fAllow) { m_fCanCancelTp = fAllow; } // @accepttp and @tpto
@ -102,7 +111,9 @@ public:
// Command specific helper functions
bool filterChat(std::string& strUTF8Text, bool fFilterEmote) const; // @sendchat, @recvchat and @redirchat
bool hitTestOverlay(const LLCoordGL& ptMouse) const; // @setoverlay
bool redirectChatOrEmote(const std::string& strUTF8Test) const; // @redirchat and @rediremote
void renderOverlay(); // @setoverlay
// Command processing helper functions
ERlvCmdRet processCommand(const LLUUID& idObj, const std::string& strCommand, bool fFromObj);
@ -119,6 +130,12 @@ public:
static bool isEnabled() { return m_fEnabled; }
static bool setEnabled(bool fEnable);
protected:
// Command specific helper functions (NOTE: these generally do not perform safety checks)
void clearOverlayImage(); // @setoverlay=n
void setActiveGroup(const LLUUID& idGroup); // @setgroup=force
void setActiveGroupRole(const LLUUID& idGroup, const std::string& strRole); // @setgroup=force
void setOverlayImage(const LLUUID& idTexture); // @setoverlay=n
void onIMQueryListResponse(const LLSD& sdNotification, const LLSD sdResponse);
// --------------------------------
@ -143,7 +160,7 @@ protected:
// Externally invoked event handlers
public:
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& sdUserdata); // Implementation of public LLSimpleListener
void onActiveGroupChanged();
void onAttach(const LLViewerObject* pAttachObj, const LLViewerJointAttachment* pAttachPt);
void onDetach(const LLViewerObject* pAttachObj, const LLViewerJointAttachment* pAttachPt);
bool onGC();
@ -152,6 +169,17 @@ public:
void onTeleportFailed();
void onTeleportFinished(const LLVector3d& posArrival);
static void onIdleStartup(void* pParam);
protected:
void onTeleportCallback(U64 hRegion, const LLVector3& posRegion, const LLVector3& vecLookAt, const LLUUID& idRlvObj);
/*
* Base class overrides
*/
public:
// LLParticularGroupObserver implementation
void changed(const LLUUID& group_id, LLGroupChange gc) override;
// LLOldEvents::LLSimpleListener implementation
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& sdUserdata) override;
/*
* Command processing
@ -205,15 +233,19 @@ protected:
static bool m_fEnabled; // Use setEnabled() to toggle this
bool m_fCanCancelTp; // @accepttp=n and @tpto=force
mutable LLVector3d m_posSitSource; // @standtp=n (mutable because onForceXXX handles are all declared as const)
mutable LLUUID m_idAgentGroup; // @setgroup=n
bool m_fCanCancelTp; // @accepttp=n and @tpto=force
mutable LLVector3d m_posSitSource; // @standtp=n (mutable because onForceXXX handles are all declared as const)
mutable LLUUID m_idAgentGroup; // @setgroup=n
std::pair<LLUUID, std::string> m_PendingGroupChange; // @setgroup=force
LLPointer<LLViewerFetchedTexture> m_pOverlayImage = nullptr; // @setoverlay=n
int m_nOverlayOrigBoost = 0; // @setoverlay=n
friend class RlvSharedRootFetcher; // Fetcher needs access to m_fFetchComplete
friend class RlvGCTimer; // Timer clear its own point at destruction
template<ERlvBehaviourOptionType optionType> friend struct RlvBehaviourGenericHandler;
template<ERlvBehaviourOptionType> friend struct RlvBehaviourGenericHandler;
template<ERlvParamType> friend struct RlvCommandHandlerBaseImpl;
template<ERlvParamType, ERlvBehaviour> friend struct RlvCommandHandler;
template<ERlvBehaviourModifier> friend class RlvBehaviourModifierHandler;
// --------------------------------

View File

@ -29,6 +29,7 @@
#include "rlvhelper.h"
#include "rlvhandler.h"
#include "rlvinventory.h"
#include "rlvmodifiers.h"
#include <boost/algorithm/string.hpp>
@ -104,7 +105,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("editobj", RLV_BHVR_EDITOBJ));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("emote", RLV_BHVR_EMOTE));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("fartouch", RLV_BHVR_FARTOUCH));
addModifier(RLV_BHVR_FARTOUCH, RLV_MODIFIER_FARTOUCHDIST, new RlvBehaviourModifier("Fartouch Distance", RLV_MODIFIER_FARTOUCH_DEFAULT, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_FARTOUCH, RLV_MODIFIER_FARTOUCHDIST, new RlvBehaviourModifier("Fartouch Distance", RLV_MODIFIER_FARTOUCH_DEFAULT, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("fly", RLV_BHVR_FLY));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("interact", RLV_BHVR_INTERACT, RlvBehaviourInfo::BHVR_EXTENDED));
addEntry(new RlvBehaviourInfo("notify", RLV_BHVR_NOTIFY, RLV_TYPE_ADDREM));
@ -114,8 +115,8 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("recvemote", RLV_BHVR_RECVEMOTE, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("recvemotefrom", RLV_BHVR_RECVEMOTEFROM, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourProcessor<RLV_BHVR_RECVIM, RlvBehaviourRecvSendStartIMHandler>("recvim", RlvBehaviourInfo::BHVR_STRICT));
addModifier(RLV_BHVR_RECVIM, RLV_MODIFIER_RECVIMDISTMIN, new RlvBehaviourModifier("RecvIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifier_CompMax));
addModifier(RLV_BHVR_RECVIM, RLV_MODIFIER_RECVIMDISTMAX, new RlvBehaviourModifier("RecvIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_RECVIM, RLV_MODIFIER_RECVIMDISTMIN, new RlvBehaviourModifier("RecvIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifierCompMax));
addModifier(RLV_BHVR_RECVIM, RLV_MODIFIER_RECVIMDISTMAX, new RlvBehaviourModifier("RecvIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("recvimfrom", RLV_BHVR_RECVIMFROM, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourInfo("redirchat", RLV_BHVR_REDIRCHAT, RLV_TYPE_ADDREM));
addEntry(new RlvBehaviourInfo("rediremote", RLV_BHVR_REDIREMOTE, RLV_TYPE_ADDREM));
@ -126,8 +127,8 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourProcessor<RLV_BHVR_SENDCHANNELEXCEPT, RlvBehaviourSendChannelHandler>("sendchannel_except", RlvBehaviourInfo::BHVR_STRICT | RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sendchat", RLV_BHVR_SENDCHAT));
addEntry(new RlvBehaviourToggleProcessor<RLV_BHVR_SENDIM, RlvBehaviourRecvSendStartIMHandler>("sendim", RlvBehaviourInfo::BHVR_STRICT));
addModifier(RLV_BHVR_SENDIM, RLV_MODIFIER_SENDIMDISTMIN, new RlvBehaviourModifier("SendIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifier_CompMax));
addModifier(RLV_BHVR_SENDIM, RLV_MODIFIER_SENDIMDISTMAX, new RlvBehaviourModifier("SendIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_SENDIM, RLV_MODIFIER_SENDIMDISTMIN, new RlvBehaviourModifier("SendIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifierCompMax));
addModifier(RLV_BHVR_SENDIM, RLV_MODIFIER_SENDIMDISTMAX, new RlvBehaviourModifier("SendIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("sendimto", RLV_BHVR_SENDIMTO, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sendgesture", RLV_BHVR_SENDGESTURE, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETDEBUG, RLV_OPTION_NONE>("setdebug"));
@ -150,11 +151,11 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("showworldmap", RLV_BHVR_SHOWWORLDMAP));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("sit", RLV_BHVR_SIT));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("sittp", RLV_BHVR_SITTP));
addModifier(RLV_BHVR_SITTP, RLV_MODIFIER_SITTPDIST, new RlvBehaviourModifier("SitTp Distance", RLV_MODIFIER_SITTP_DEFAULT, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_SITTP, RLV_MODIFIER_SITTPDIST, new RlvBehaviourModifier("SitTp Distance", RLV_MODIFIER_SITTP_DEFAULT, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("standtp", RLV_BHVR_STANDTP));
addEntry(new RlvBehaviourProcessor<RLV_BHVR_STARTIM, RlvBehaviourRecvSendStartIMHandler>("startim", RlvBehaviourInfo::BHVR_STRICT));
addModifier(RLV_BHVR_STARTIM, RLV_MODIFIER_STARTIMDISTMIN, new RlvBehaviourModifier("StartIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifier_CompMax));
addModifier(RLV_BHVR_STARTIM, RLV_MODIFIER_STARTIMDISTMAX, new RlvBehaviourModifier("StartIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_STARTIM, RLV_MODIFIER_STARTIMDISTMIN, new RlvBehaviourModifier("StartIM Distance (Min)", F32_MAX, true, new RlvBehaviourModifierCompMax));
addModifier(RLV_BHVR_STARTIM, RLV_MODIFIER_STARTIMDISTMAX, new RlvBehaviourModifier("StartIM Distance (Max)", F32_MAX, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_EXCEPTION>("startimto", RLV_BHVR_STARTIMTO, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("temprun", RLV_BHVR_TEMPRUN));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("touchall", RLV_BHVR_TOUCHALL));
@ -169,7 +170,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("tplm", RLV_BHVR_TPLM));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("tploc", RLV_BHVR_TPLOC));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("tplocal", RLV_BHVR_TPLOCAL, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_TPLOCAL, RLV_MODIFIER_TPLOCALDIST, new RlvBehaviourModifier("Local Teleport Distance", RLV_MODIFIER_TPLOCAL_DEFAULT, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_TPLOCAL, RLV_MODIFIER_TPLOCALDIST, new RlvBehaviourModifier("Local Teleport Distance", RLV_MODIFIER_TPLOCAL_DEFAULT, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("tplure", RLV_BHVR_TPLURE, RlvBehaviourInfo::BHVR_STRICT));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_EXCEPTION>("tprequest", RLV_BHVR_TPREQUEST, RlvBehaviourInfo::BHVR_STRICT | RlvBehaviourInfo::BHVR_EXTENDED));
addEntry(new RlvBehaviourInfo("unsharedunwear", RLV_BHVR_UNSHAREDUNWEAR, RLV_TYPE_ADDREM));
@ -178,24 +179,25 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("viewnote", RLV_BHVR_VIEWNOTE));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("viewscript", RLV_BHVR_VIEWSCRIPT));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE>("viewtexture", RLV_BHVR_VIEWTEXTURE));
// Camera
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM, RLV_OPTION_NONE>("setcam"));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_avdistmin", RLV_BHVR_SETCAM_AVDISTMIN, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_AVDISTMIN, RLV_MODIFIER_SETCAM_AVDISTMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_AVDISTMIN>("Camera - Avatar Distance (Min)", 0.0f, false, new RlvBehaviourModifier_CompMax()));
addModifier(RLV_BHVR_SETCAM_AVDISTMIN, RLV_MODIFIER_SETCAM_AVDISTMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_AVDISTMIN>("Camera - Avatar Distance (Min)", 0.0f, false, new RlvBehaviourModifierCompMax()));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_avdistmax", RLV_BHVR_SETCAM_AVDISTMAX, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_AVDISTMAX, RLV_MODIFIER_SETCAM_AVDISTMAX, new RlvBehaviourModifier("Camera - Avatar Distance (Max)", F32_MAX, false, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_SETCAM_AVDISTMAX, RLV_MODIFIER_SETCAM_AVDISTMAX, new RlvBehaviourModifier("Camera - Avatar Distance (Max)", F32_MAX, false, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_origindistmin", RLV_BHVR_SETCAM_ORIGINDISTMIN, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_ORIGINDISTMIN, RLV_MODIFIER_SETCAM_ORIGINDISTMIN, new RlvBehaviourModifier("Camera - Focus Distance (Min)", 0.0f, true, new RlvBehaviourModifier_CompMax));
addModifier(RLV_BHVR_SETCAM_ORIGINDISTMIN, RLV_MODIFIER_SETCAM_ORIGINDISTMIN, new RlvBehaviourModifier("Camera - Focus Distance (Min)", 0.0f, true, new RlvBehaviourModifierCompMax));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_origindistmax", RLV_BHVR_SETCAM_ORIGINDISTMAX, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_ORIGINDISTMAX, RLV_MODIFIER_SETCAM_ORIGINDISTMAX, new RlvBehaviourModifier("Camera - Focus Distance (Max)", F32_MAX, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_SETCAM_ORIGINDISTMAX, RLV_MODIFIER_SETCAM_ORIGINDISTMAX, new RlvBehaviourModifier("Camera - Focus Distance (Max)", F32_MAX, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_eyeoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_EYEOFFSET, RLV_MODIFIER_SETCAM_EYEOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSET>("Camera - Eye Offset", LLVector3::zero, true, nullptr));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_focusoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_MODIFIER_SETCAM_FOCUSOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>("Camera - Focus Offset", LLVector3::zero, true, nullptr));
addEntry(new RlvBehaviourProcessor<RLV_BHVR_SETCAM_FOVMIN, RlvBehaviourSetCamFovHandler>("setcam_fovmin"));
addModifier(RLV_BHVR_SETCAM_FOVMIN, RLV_MODIFIER_SETCAM_FOVMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMIN>("Camera - FOV (Min)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifier_CompMax));
addModifier(RLV_BHVR_SETCAM_FOVMIN, RLV_MODIFIER_SETCAM_FOVMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMIN>("Camera - FOV (Min)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifierCompMax));
addEntry(new RlvBehaviourProcessor<RLV_BHVR_SETCAM_FOVMAX, RlvBehaviourSetCamFovHandler>("setcam_fovmax"));
addModifier(RLV_BHVR_SETCAM_FOVMAX, RLV_MODIFIER_SETCAM_FOVMAX, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMAX>("Camera - FOV (Max)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifier_CompMin));
addModifier(RLV_BHVR_SETCAM_FOVMAX, RLV_MODIFIER_SETCAM_FOVMAX, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMAX>("Camera - FOV (Max)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_MOUSELOOK, RLV_OPTION_NONE>("setcam_mouselook"));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("setcam_textures", RLV_BHVR_SETCAM_TEXTURES));
addModifier(RLV_BHVR_SETCAM_TEXTURES, RLV_MODIFIER_SETCAM_TEXTURE, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_TEXTURE>("Camera - Forced Texture", IMG_DEFAULT, true, nullptr));
@ -208,6 +210,18 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvBehaviourProcessor<RLV_BHVR_CAMZOOMMAX, RlvBehaviourCamZoomMinMaxHandler>("camzoommax", RlvBehaviourInfo::BHVR_DEPRECATED));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_UNLOCK, RLV_OPTION_NONE>("camunlock", RlvBehaviourInfo::BHVR_SYNONYM | RlvBehaviourInfo::BHVR_DEPRECATED));
// Overlay
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETOVERLAY, RLV_OPTION_NONE>("setoverlay", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(new RlvForceGenericProcessor<RLV_OPTION_MODIFIER>("setoverlay_alpha", RLV_BHVR_SETOVERLAY_ALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL),
RLV_MODIFIER_OVERLAY_ALPHA, new RlvBehaviourModifier("Overlay - Alpha", 1.0f, false, new RlvBehaviourModifierComp()));
addModifier(new RlvForceGenericProcessor<RLV_OPTION_MODIFIER>("setoverlay_texture", RLV_BHVR_SETOVERLAY_TEXTURE, RlvBehaviourInfo::BHVR_EXPERIMENTAL),
RLV_MODIFIER_OVERLAY_TEXTURE, new RlvBehaviourModifierHandler<RLV_MODIFIER_OVERLAY_TEXTURE>("Overlay - Texture", LLUUID::null, false, new RlvBehaviourModifierComp()));
addModifier(new RlvForceGenericProcessor<RLV_OPTION_MODIFIER>("setoverlay_tint", RLV_BHVR_SETOVERLAY_TINT, RlvBehaviourInfo::BHVR_EXPERIMENTAL),
RLV_MODIFIER_OVERLAY_TINT, new RlvBehaviourModifier("Overlay - Tint", LLVector3(1.0f, 1.0f, 1.0f), false, new RlvBehaviourModifierComp()));
addModifier(new RlvBehaviourGenericProcessor<RLV_OPTION_NONE_OR_MODIFIER>("setoverlay_touch", RLV_BHVR_SETOVERLAY_TOUCH, RlvBehaviourInfo::BHVR_EXPERIMENTAL),
RLV_MODIFIER_OVERLAY_TOUCH, new RlvBehaviourModifier("Overlay - Touch", true, true, new RlvBehaviourModifierComp()));
addEntry(new RlvForceProcessor<RLV_BHVR_SETOVERLAY_TWEEN>("setoverlay_tween", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
//
// Force-wear
//
@ -356,6 +370,23 @@ void RlvBehaviourDictionary::addModifier(ERlvBehaviour eBhvr, ERlvBehaviourModif
}
}
// Convenience function to add both the behaviour entry as well as the corresponding modifier entry
void RlvBehaviourDictionary::addModifier(const RlvBehaviourInfo* pBhvrEntry, ERlvBehaviourModifier eModifier, RlvBehaviourModifier* pModifierEntry)
{
addEntry(pBhvrEntry);
addModifier(pBhvrEntry->getBehaviourType(), eModifier, pModifierEntry);
}
// TODO: this shouldn't be in this class - find a better spot for it
void RlvBehaviourDictionary::clearModifiers(const LLUUID& idRlvObj)
{
for (int idxModifier = 0; idxModifier < RLV_MODIFIER_COUNT; idxModifier++)
{
if (m_BehaviourModifiers[idxModifier])
m_BehaviourModifiers[idxModifier]->clearValues(idRlvObj);
}
}
const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict) const
{
bool fStrict = boost::algorithm::ends_with(strBhvr, "_sec");
@ -422,10 +453,10 @@ void RlvBehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, ERl
// RlvBehaviourModifier
//
RlvBehaviourModifier::RlvBehaviourModifier(std::string strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator)
RlvBehaviourModifier::RlvBehaviourModifier(std::string strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifierComp* pValueComparator)
: m_strName(strName), m_DefaultValue(defaultValue), m_fAddDefaultOnEmpty(fAddDefaultOnEmpty), m_pValueComparator(pValueComparator)
{
m_pValueComparator = (pValueComparator) ? pValueComparator : new RlvBehaviourModifier_Comp();
m_pValueComparator = (pValueComparator) ? pValueComparator : new RlvBehaviourModifierComp();
}
RlvBehaviourModifier::~RlvBehaviourModifier()
@ -437,11 +468,11 @@ RlvBehaviourModifier::~RlvBehaviourModifier()
}
}
bool RlvBehaviourModifier::addValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idObject)
bool RlvBehaviourModifier::addValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj, ERlvBehaviour eBhvr)
{
if (modValue.which() == m_DefaultValue.which())
{
m_Values.insert((m_pValueComparator) ? std::lower_bound(m_Values.begin(), m_Values.end(), std::make_pair(modValue, idObject), boost::bind(&RlvBehaviourModifier_Comp::operator(), m_pValueComparator, _1, _2)) : m_Values.end(), std::make_pair(modValue, idObject));
m_Values.insert((m_pValueComparator) ? std::lower_bound(m_Values.begin(), m_Values.end(), std::make_tuple(modValue, idRlvObj, eBhvr), boost::bind(&RlvBehaviourModifierComp::operator(), m_pValueComparator, _1, _2)) : m_Values.end(), std::make_tuple(modValue, idRlvObj, eBhvr));
// NOTE: change signal needs to trigger before modifier handlers so cached values have a chance to update properly
m_ChangeSignal(getValue());
onValueChange();
@ -450,6 +481,21 @@ bool RlvBehaviourModifier::addValue(const RlvBehaviourModifierValue& modValue, c
return false;
}
void RlvBehaviourModifier::clearValues(const LLUUID& idRlvObj)
{
size_t origCount = m_Values.size();
m_Values.erase(std::remove_if(m_Values.begin(), m_Values.end(),
[&idRlvObj](const RlvBehaviourModifierValueTuple& modValue) {
return (std::get<1>(modValue) == idRlvObj) && (std::get<2>(modValue) == RLV_BHVR_UNKNOWN);
}), m_Values.end());
RlvBehaviourModifierAnimator::instance().clearTweens(idRlvObj);
if (origCount != m_Values.size())
{
onValueChange();
m_ChangeSignal(getValue());
}
}
const LLUUID& RlvBehaviourModifier::getPrimaryObject() const
{
return (m_pValueComparator) ? m_pValueComparator->m_idPrimaryObject : LLUUID::null;
@ -459,14 +505,19 @@ bool RlvBehaviourModifier::hasValue() const {
// If no primary object is set this returns "any value set"; otherwise it returns "any value set by the primary object"
if ( (!m_pValueComparator) || (m_pValueComparator->m_idPrimaryObject.isNull()) )
return !m_Values.empty();
return (!m_Values.empty()) ? m_Values.front().second == m_pValueComparator->m_idPrimaryObject : false;
return (!m_Values.empty()) ? std::get<1>(m_Values.front()) == m_pValueComparator->m_idPrimaryObject : false;
}
void RlvBehaviourModifier::removeValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idObject)
bool RlvBehaviourModifier::hasValue(const LLUUID& idRlvObj) const
{
return m_Values.end() != std::find_if(m_Values.begin(), m_Values.end(), [&idRlvObj](const RlvBehaviourModifierValueTuple& cmpValue) { return std::get<1>(cmpValue) == idRlvObj; });
}
void RlvBehaviourModifier::removeValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj, ERlvBehaviour eBhvr)
{
if ( (modValue.which() == m_DefaultValue.which()) )
{
auto itValue = std::find(m_Values.begin(), m_Values.end(), std::make_pair(modValue, idObject));
auto itValue = std::find(m_Values.begin(), m_Values.end(), std::make_tuple(modValue, idRlvObj, eBhvr));
if (m_Values.end() != itValue)
{
m_Values.erase(itValue);
@ -481,12 +532,37 @@ void RlvBehaviourModifier::setPrimaryObject(const LLUUID& idPrimaryObject)
if (m_pValueComparator)
{
m_pValueComparator->m_idPrimaryObject = idPrimaryObject;
m_Values.sort(boost::bind(&RlvBehaviourModifier_Comp::operator(), m_pValueComparator, _1, _2));
m_Values.sort(boost::bind(&RlvBehaviourModifierComp::operator(), m_pValueComparator, _1, _2));
onValueChange();
m_ChangeSignal(getValue());
}
}
void RlvBehaviourModifier::setValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj)
{
if ( (modValue.which() == m_DefaultValue.which()) )
{
auto itValue = std::find_if(m_Values.begin(), m_Values.end(),
[&idRlvObj](const RlvBehaviourModifierValueTuple& cmpValue) {
return (std::get<1>(cmpValue) == idRlvObj) && (std::get<2>(cmpValue) == RLV_BHVR_UNKNOWN);
});
if (m_Values.end() != itValue)
{
// The object already has a modifier value set => change it
std::get<0>(*itValue) = modValue;
if (m_pValueComparator)
m_Values.sort(boost::bind(&RlvBehaviourModifierComp::operator(), m_pValueComparator, _1, _2));
onValueChange();
m_ChangeSignal(getValue());
}
else
{
// The command doesn't have a modifier value yet => add it
addValue(modValue, idRlvObj, RLV_BHVR_UNKNOWN);
}
}
}
bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, RlvBehaviourModifierValue& modValue) const
{
try

View File

@ -30,6 +30,7 @@
//
class RlvBehaviourModifier;
struct RlvBehaviourModifierComp;
// ============================================================================
// RlvBehaviourInfo class - Generic behaviour descriptor (used by restrictions, reply and force commands)
@ -95,13 +96,15 @@ class RlvBehaviourDictionary : public LLSingleton<RlvBehaviourDictionary>
LLSINGLETON(RlvBehaviourDictionary);
~RlvBehaviourDictionary();
public:
void addEntry(const RlvBehaviourInfo* pEntry);
void addEntry(const RlvBehaviourInfo* pBhvrEntry);
void addModifier(ERlvBehaviour eBhvr, ERlvBehaviourModifier eModifier, RlvBehaviourModifier* pModifierEntry);
void addModifier(const RlvBehaviourInfo* pBhvrEntry, ERlvBehaviourModifier eModifier, RlvBehaviourModifier* pModifierEntry);
/*
* General helper functions
*/
public:
void clearModifiers(const LLUUID& idRlvObj);
ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const;
bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list<std::string>& cmdList) const;
@ -206,6 +209,8 @@ template<ERlvBehaviour templBhvr, typename handlerImpl = RlvCommandHandler<RLV_T
// Provides pre-defined generic implementations of basic behaviours (template voodoo - see original commit for something that still made sense)
template<ERlvBehaviourOptionType templOptionType> struct RlvBehaviourGenericHandler { static ERlvCmdRet onCommand(const RlvCommand& rlvCmd, bool& fRefCount); };
template<ERlvBehaviourOptionType templOptionType> using RlvBehaviourGenericProcessor = RlvBehaviourProcessor<RLV_BHVR_UNKNOWN, RlvBehaviourGenericHandler<templOptionType>>;
template<ERlvBehaviourOptionType templOptionType> struct RlvForceGenericHandler { static ERlvCmdRet onCommand(const RlvCommand& rlvCmd); };
template<ERlvBehaviourOptionType templOptionType> using RlvForceGenericProcessor = RlvForceProcessor<RLV_BHVR_UNKNOWN, RlvForceGenericHandler<templOptionType>>;
// ============================================================================
// RlvBehaviourProcessor and related classes - Handles add/rem comamnds aka "restrictions)
@ -224,44 +229,12 @@ template <ERlvBehaviour eBhvr, ERlvBehaviourOptionType optionType, typename togg
// RlvBehaviourModifier - stores behaviour modifiers in an - optionally - sorted list and returns the first element (or default value if there are no modifiers)
//
typedef std::pair<RlvBehaviourModifierValue, LLUUID> RlvBehaviourModifierValueTuple;
struct RlvBehaviourModifier_Comp
{
virtual ~RlvBehaviourModifier_Comp() {}
virtual bool operator()(const RlvBehaviourModifierValueTuple& lhs, const RlvBehaviourModifierValueTuple& rhs)
{
// Values that match the primary object take precedence (otherwise maintain relative ordering)
if ( (rhs.second == m_idPrimaryObject) && (lhs.second != m_idPrimaryObject) )
return false;
return true;
}
LLUUID m_idPrimaryObject;
};
struct RlvBehaviourModifier_CompMin : public RlvBehaviourModifier_Comp
{
bool operator()(const RlvBehaviourModifierValueTuple& lhs, const RlvBehaviourModifierValueTuple& rhs) override
{
if ( (m_idPrimaryObject.isNull()) || ((lhs.second == m_idPrimaryObject) && (rhs.second == m_idPrimaryObject)) )
return lhs.first < rhs.first;
return RlvBehaviourModifier_Comp::operator()(lhs, rhs);
}
};
struct RlvBehaviourModifier_CompMax : public RlvBehaviourModifier_Comp
{
bool operator()(const RlvBehaviourModifierValueTuple& lhs, const RlvBehaviourModifierValueTuple& rhs) override
{
if ( (m_idPrimaryObject.isNull()) || ((lhs.second == m_idPrimaryObject) && (rhs.second == m_idPrimaryObject)) )
return rhs.first < lhs.first;
return RlvBehaviourModifier_Comp::operator()(lhs, rhs);
}
};
typedef std::tuple<RlvBehaviourModifierValue, LLUUID, ERlvBehaviour> RlvBehaviourModifierValueTuple;
class RlvBehaviourModifier
{
public:
RlvBehaviourModifier(const std::string strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator = nullptr);
RlvBehaviourModifier(const std::string strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifierComp* pValueComparator = nullptr);
virtual ~RlvBehaviourModifier();
/*
@ -270,16 +243,19 @@ public:
protected:
virtual void onValueChange() const {}
public:
bool addValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idObject);
bool addValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj, ERlvBehaviour eBhvr = RLV_BHVR_UNKNOWN);
bool convertOptionValue(const std::string& optionValue, RlvBehaviourModifierValue& modValue) const;
void clearValues(const LLUUID& idRlvObj);
bool getAddDefault() const { return m_fAddDefaultOnEmpty; }
const RlvBehaviourModifierValue& getDefaultValue() const { return m_DefaultValue; }
const LLUUID& getPrimaryObject() const;
const std::string& getName() const { return m_strName; }
const RlvBehaviourModifierValue& getValue() const { return (hasValue()) ? m_Values.front().first : m_DefaultValue; }
const RlvBehaviourModifierValue& getValue() const { return (hasValue()) ? std::get<0>(m_Values.front()) : m_DefaultValue; }
template<typename T> const T& getValue() const { return boost::get<T>(getValue()); }
bool hasValue() const;
void removeValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idObject);
bool hasValue(const LLUUID& idRlvObj) const;
void removeValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj, ERlvBehaviour eBhvr = RLV_BHVR_UNKNOWN);
void setValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj);
void setPrimaryObject(const LLUUID& idPrimaryObject);
typedef boost::signals2::signal<void(const RlvBehaviourModifierValue& newValue)> change_signal_t;
@ -294,80 +270,7 @@ protected:
bool m_fAddDefaultOnEmpty;
std::list<RlvBehaviourModifierValueTuple> m_Values;
change_signal_t m_ChangeSignal;
RlvBehaviourModifier_Comp* m_pValueComparator;
};
template<ERlvBehaviourModifier eBhvrMod>
class RlvBehaviourModifierHandler : public RlvBehaviourModifier
{
public:
//using RlvBehaviourModifier::RlvBehaviourModifier; // Needs VS2015 and up
RlvBehaviourModifierHandler(const std::string& strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifier_Comp* pValueComparator)
: RlvBehaviourModifier(strName, defaultValue, fAddDefaultOnEmpty, pValueComparator) {}
protected:
void onValueChange() const override;
};
// Inspired by LLControlCache<T>
template<typename T>
class RlvBehaviourModifierCache : public LLRefCount, public LLInstanceTracker<RlvBehaviourModifierCache<T>, ERlvBehaviourModifier>
{
public:
RlvBehaviourModifierCache(ERlvBehaviourModifier eModifier)
: LLInstanceTracker<RlvBehaviourModifierCache<T>, ERlvBehaviourModifier>(eModifier)
{
RlvBehaviourModifier* pBhvrModifier = (eModifier < RLV_MODIFIER_COUNT) ? RlvBehaviourDictionary::instance().getModifier(eModifier) : nullptr;
if (pBhvrModifier)
{
mConnection = pBhvrModifier->getSignal().connect(boost::bind(&RlvBehaviourModifierCache<T>::handleValueChange, this, _1));
mCachedValue = pBhvrModifier->getValue<T>();
}
else
{
mCachedValue = {};
}
}
~RlvBehaviourModifierCache() {}
/*
* Member functions
*/
public:
const T& getValue() const { return mCachedValue; }
protected:
void handleValueChange(const RlvBehaviourModifierValue& newValue) { mCachedValue = boost::get<T>(newValue); }
/*
* Member variables
*/
protected:
T mCachedValue;
boost::signals2::scoped_connection mConnection;
};
// Inspired by LLCachedControl<T>
template <typename T>
class RlvCachedBehaviourModifier
{
public:
RlvCachedBehaviourModifier(ERlvBehaviourModifier eModifier)
{
if ((mCachedModifierPtr = RlvBehaviourModifierCache<T>::getInstance(eModifier)) == nullptr)
mCachedModifierPtr = new RlvBehaviourModifierCache<T>(eModifier);
}
/*
* Operators
*/
public:
operator const T&() const { return mCachedModifierPtr->getValue(); }
const T& operator()() { return mCachedModifierPtr->getValue(); }
/*
* Member variables
*/
protected:
LLPointer<RlvBehaviourModifierCache<T>> mCachedModifierPtr;
RlvBehaviourModifierComp* m_pValueComparator;
};
// ============================================================================

View File

@ -140,7 +140,8 @@ extern RlvAttachmentLocks gRlvAttachmentLocks;
// TODO-RLVa: [RLVa-1.2.1] This class really looks rather cluttered so look into cleaning it up/simplifying it a bit
class RlvAttachmentLockWatchdog : public LLSingleton<RlvAttachmentLockWatchdog>
{
LLSINGLETON(RlvAttachmentLockWatchdog);
LLSINGLETON_EMPTY_CTOR(RlvAttachmentLockWatchdog);
protected:
~RlvAttachmentLockWatchdog() { delete m_pTimer; }
/*
@ -212,11 +213,9 @@ protected:
virtual ~RlvAttachmentLockWatchdogTimer() { m_pWatchdog->m_pTimer = NULL; }
virtual BOOL tick() { return m_pWatchdog->onTimer(); }
RlvAttachmentLockWatchdog* m_pWatchdog;
} *m_pTimer;
} *m_pTimer = nullptr;
};
inline RlvAttachmentLockWatchdog::RlvAttachmentLockWatchdog() : m_pTimer(NULL) {}
// ============================================================================
// RlvWearableLocks class declaration - modelled on RlvAttachmentLocks (attach pt = wearable type - attachment = wearable)
//
@ -283,13 +282,11 @@ extern RlvWearableLocks gRlvWearableLocks;
class RlvFolderLocks : public LLSingleton<RlvFolderLocks>
{
friend class RlvLockedDescendentsCollector;
LLSINGLETON(RlvFolderLocks);
public:
// Specifies the source of a folder lock
enum ELockSourceType
{
{
ST_ATTACHMENT = 0x01, ST_ATTACHMENTPOINT = 0x02, ST_FOLDER = 0x04, ST_ROOTFOLDER = 0x08,
ST_SHAREDPATH = 0x10, ST_WEARABLETYPE = 0x20, ST_NONE= 0x00, ST_MASK_ANY = 0xFF
};

View File

@ -0,0 +1,115 @@
/**
*
* Copyright (c) 2009-2018, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
*
* 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.
*
*/
#include "llviewerprecompiledheaders.h"
#include "rlvmodifiers.h"
// ====================================================================================
// RlvBehaviourModifierAnimator
//
RlvBehaviourModifierAnimator::~RlvBehaviourModifierAnimator()
{
if (!m_TimerHandle.isDead())
m_TimerHandle.markDead();
}
void RlvBehaviourModifierAnimator::addTween(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod, RlvBehaviourModifierAnimationType eAnimType, const RlvBehaviourModifierValue& endValue, float nDuration)
{
// Make sure we don't run two animations on the same modifier for the same object
const auto itTween = std::find_if(m_Tweens.begin(), m_Tweens.end(), [&idObject, eBhvrMod](const RlvBehaviourModifierTween& t) { return t.idObject == idObject && t.eBhvrMod == eBhvrMod; });
if (m_Tweens.end() != itTween)
m_Tweens.erase(itTween);
if (const RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(eBhvrMod))
{
RlvBehaviourModifierTween newTween;
newTween.idObject = idObject;
newTween.eBhvrMod = eBhvrMod;
newTween.eAnimType = RlvBehaviourModifierAnimationType::Lerp;
newTween.nStartTime = LLTimer::getElapsedSeconds();
newTween.nDuration = nDuration;
newTween.startValue = pBhvrModifier->getValue();
newTween.endValue = endValue;
if (newTween.startValue.which() == newTween.endValue.which())
{
if (m_TimerHandle.isDead())
m_TimerHandle = (new AnimationTimer())->getHandle();
m_Tweens.emplace_back(std::move(newTween));
}
}
}
void RlvBehaviourModifierAnimator::clearTweens(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod)
{
m_Tweens.erase(std::remove_if(m_Tweens.begin(), m_Tweens.end(),
[&idObject, eBhvrMod](const RlvBehaviourModifierTween& cmpTween)
{
return cmpTween.idObject == idObject && ((cmpTween.eBhvrMod == eBhvrMod) || (RLV_MODIFIER_UNKNOWN == eBhvrMod));
}), m_Tweens.end());
}
// ====================================================================================
// RlvBehaviourModifierAnimator timer
//
RlvBehaviourModifierAnimator::AnimationTimer::AnimationTimer()
: LLEventTimer(1.f / RLV_MODIFIER_ANIMATION_FREQUENCY)
{
}
BOOL RlvBehaviourModifierAnimator::AnimationTimer::tick()
{
RlvBehaviourModifierAnimator& modAnimatior = RlvBehaviourModifierAnimator::instance();
const double curTime = LLTimer::getElapsedSeconds();
const auto activeTweens = modAnimatior.m_Tweens;
for (const auto& curTween : activeTweens)
{
if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(curTween.eBhvrMod))
{
// Update the modifier's value
float curFactor = (curTime - curTween.nStartTime) / curTween.nDuration;
if (curFactor < 1.0)
{
const auto& valueType = curTween.startValue.type();
if (typeid(float) == valueType)
pBhvrModifier->setValue(lerp(boost::get<float>(curTween.startValue), boost::get<float>(curTween.endValue), curFactor), curTween.idObject);
else if (typeid(int) == valueType)
pBhvrModifier->setValue(lerp(boost::get<int>(curTween.startValue), boost::get<int>(curTween.endValue), curFactor), curTween.idObject);
else if (typeid(LLVector3) == valueType)
pBhvrModifier->setValue(lerp(boost::get<LLVector3>(curTween.startValue), boost::get<LLVector3>(curTween.endValue), curFactor), curTween.idObject);
}
else
{
pBhvrModifier->setValue(curTween.endValue, curTween.idObject);
auto itTween = std::find_if(modAnimatior.m_Tweens.begin(), modAnimatior.m_Tweens.end(),
[&curTween](const RlvBehaviourModifierTween& t)
{
// NOTE: implementation leak - taking advantage of the fact that we know there can only be one active tween per object/modifier/type combination
return t.idObject == curTween.idObject && t.eBhvrMod == curTween.eBhvrMod && t.eAnimType == curTween.eAnimType;
});
modAnimatior.m_Tweens.erase(itTween);
}
}
}
return modAnimatior.m_Tweens.empty();
}
// ====================================================================================

View File

@ -0,0 +1,192 @@
/**
*
* Copyright (c) 2009-2018, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
*
* 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.
*
*/
#pragma once
#include "llhandle.h"
#include "llsingleton.h"
#include "rlvhelper.h"
// ====================================================================================
// RlvBehaviourModifierHandler - Behaviour modifiers change handler class (use this if changes require code to be processed)
//
template<ERlvBehaviourModifier eBhvrMod>
class RlvBehaviourModifierHandler : public RlvBehaviourModifier
{
public:
//using RlvBehaviourModifier::RlvBehaviourModifier; // Needs VS2015 and up
RlvBehaviourModifierHandler(const std::string& strName, const RlvBehaviourModifierValue& defaultValue, bool fAddDefaultOnEmpty, RlvBehaviourModifierComp* pValueComparator)
: RlvBehaviourModifier(strName, defaultValue, fAddDefaultOnEmpty, pValueComparator) {}
protected:
void onValueChange() const override;
};
// ====================================================================================
// RlvBehaviourModifierComp - Behaviour modifiers comparers (used for sorting)
//
struct RlvBehaviourModifierComp
{
virtual ~RlvBehaviourModifierComp() {}
virtual bool operator()(const RlvBehaviourModifierValueTuple& lhs, const RlvBehaviourModifierValueTuple& rhs)
{
// Values that match the primary object take precedence (otherwise maintain relative ordering)
if ( (std::get<1>(rhs) == m_idPrimaryObject) && (std::get<1>(lhs) != m_idPrimaryObject) )
return false;
return true;
}
LLUUID m_idPrimaryObject;
};
struct RlvBehaviourModifierCompMin : public RlvBehaviourModifierComp
{
bool operator()(const RlvBehaviourModifierValueTuple& lhs, const RlvBehaviourModifierValueTuple& rhs) override
{
if ( (m_idPrimaryObject.isNull()) || ((std::get<1>(lhs) == m_idPrimaryObject) && (std::get<1>(rhs) == m_idPrimaryObject)) )
return std::get<0>(lhs) < std::get<0>(rhs);
return RlvBehaviourModifierComp::operator()(lhs, rhs);
}
};
struct RlvBehaviourModifierCompMax : public RlvBehaviourModifierComp
{
bool operator()(const RlvBehaviourModifierValueTuple& lhs, const RlvBehaviourModifierValueTuple& rhs) override
{
if ( (m_idPrimaryObject.isNull()) || ((std::get<1>(lhs) == m_idPrimaryObject) && (std::get<1>(rhs) == m_idPrimaryObject)) )
return std::get<0>(rhs) < std::get<0>(lhs);
return RlvBehaviourModifierComp::operator()(lhs, rhs);
}
};
// ====================================================================================
// RlvBehaviourModifierAnimator - A class to animate behaviour modifiers
//
enum class RlvBehaviourModifierAnimationType { Lerp };
struct RlvBehaviourModifierTween
{
LLUUID idObject;
ERlvBehaviourModifier eBhvrMod;
RlvBehaviourModifierAnimationType eAnimType;
double nStartTime;
float nDuration;
RlvBehaviourModifierValue startValue;
RlvBehaviourModifierValue endValue;
};
class RlvBehaviourModifierAnimator : public LLSingleton<RlvBehaviourModifierAnimator>
{
LLSINGLETON_EMPTY_CTOR(RlvBehaviourModifierAnimator);
public:
~RlvBehaviourModifierAnimator();
/*
* Member functions
*/
public:
void addTween(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod, RlvBehaviourModifierAnimationType eAnimType, const RlvBehaviourModifierValue& endValue, float nDuration);
void clearTweens(const LLUUID& idObject) { clearTweens(idObject, RLV_MODIFIER_UNKNOWN); }
void clearTweens(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod);
/*
* Animation timer
*/
protected:
class AnimationTimer : public LLEventTimer, public LLHandleProvider<AnimationTimer>
{
public:
AnimationTimer();
BOOL tick() override;
};
/*
* Member variables
*/
protected:
LLHandle<AnimationTimer> m_TimerHandle;
std::list< RlvBehaviourModifierTween> m_Tweens;
};
// ====================================================================================
// RlvCachedBehaviourModifier - Provides an optimized way to access a modifier that's frequently accessed and rarely updated
//
// Inspired by LLControlCache<T>
template<typename T>
class RlvBehaviourModifierCache : public LLRefCount, public LLInstanceTracker<RlvBehaviourModifierCache<T>, ERlvBehaviourModifier>
{
public:
RlvBehaviourModifierCache(ERlvBehaviourModifier eModifier)
: LLInstanceTracker<RlvBehaviourModifierCache<T>, ERlvBehaviourModifier>(eModifier)
{
if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(eModifier))
{
mConnection = pBhvrModifier->getSignal().connect(boost::bind(&RlvBehaviourModifierCache<T>::handleValueChange, this, _1));
mCachedValue = pBhvrModifier->getValue<T>();
}
else
{
mCachedValue = {};
RLV_ASSERT(false);
}
}
~RlvBehaviourModifierCache() {}
/*
* Member functions
*/
public:
const T& getValue() const { return mCachedValue; }
protected:
void handleValueChange(const RlvBehaviourModifierValue& newValue) { mCachedValue = boost::get<T>(newValue); }
/*
* Member variables
*/
protected:
T mCachedValue;
boost::signals2::scoped_connection mConnection;
};
// Inspired by LLCachedControl<T>
template <typename T>
class RlvCachedBehaviourModifier
{
public:
RlvCachedBehaviourModifier(ERlvBehaviourModifier eModifier)
{
if ((mCachedModifierPtr = RlvBehaviourModifierCache<T>::getInstance(eModifier)) == nullptr)
mCachedModifierPtr = new RlvBehaviourModifierCache<T>(eModifier);
}
/*
* Operators
*/
public:
operator const T&() const { return mCachedModifierPtr->getValue(); }
const T& operator()() { return mCachedModifierPtr->getValue(); }
/*
* Member variables
*/
protected:
LLPointer<RlvBehaviourModifierCache<T>> mCachedModifierPtr;
};
// ====================================================================================

View File

@ -6102,6 +6102,9 @@ Setzen Sie den Editorpfad in Anführungszeichen
<string name="RLVaToggleDisabled">
deaktiviert
</string>
<string name="RLVaStatusDisabled">
(deaktiviert)
</string>
<string name="experience_tools_experience">
Erlebnis
</string>

View File

@ -2791,6 +2791,7 @@ Try enclosing path to the editor with double quotes.
<string name="RLVaToggleMessageRestart">RLVa will be [STATE] after you restart</string>
<string name="RLVaToggleEnabled">enabled</string>
<string name="RLVaToggleDisabled">disabled</string>
<string name="RLVaStatusDisabled">(disabled)</string>
<!-- Experience Tools strings -->
<string name="experience_tools_experience">Experience</string>

View File

@ -5869,6 +5869,9 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="loading_chat_logs">
Cargando...
</string>
<string name="RLVaStatusDisabled">
(deshabilitado)
</string>
<string name="experience_tools_experience">
Experiencia
</string>

View File

@ -210,7 +210,7 @@ Działka ta zawiera 512 m² ziemi.
<text name="currency_balance">
Masz 2,100 L$.
</text>
<check_box label="Usuń [AMOUNT] m² z kontrybucji w grupie." name="remove_contribution"/>
<button label="Zakup" name="buy_btn"/>
<check_box label="Usuń [AMOUNT] m² z kontrybucji w grupie." name="remove_contribution"/>
<button label="Anuluj" name="cancel_btn"/>
</floater>

View File

@ -390,7 +390,6 @@
<menu_item_check label="Pokaż macierze" name="Show Matrices"/>
<menu_item_check label="Pokaż kolor pod kursorem" name="Show Color Under Cursor"/>
<menu_item_check label="Pokaż pamięć" name="Show Memory"/>
<menu_item_check label="Pokaż informacje o pamięci prywatnej" name="Show Private Mem Info"/>
<menu_item_check label="Pokaż aktualizacje obiektów" name="Show Updates"/>
</menu>
<menu label="Wymuś błąd" name="Force Errors">

View File

@ -3437,14 +3437,10 @@ Wyłącz wszelkie funkcjonalności SIP ALG (Application Layer Gateway) w swoim r
<usetemplate name="okignore" ignoretext="Ostrzegaj mnie, gdy przeglądarka nie może połączyć się z serwerem głosu" />
</notification>
<notification name="NoVoiceConnect-GIAB">
Nie możemy połączyć się z serwerem głosowym.
Porty, które muszą być otwarte dla połączeń głosowych, to:
:TCP: 80, 443
:UDP: 3478, 3479, 5060, 5062, 6250, 12000-32000
Występuje problem z Twoim połączeniem głosowym.
Komunikacja głosowa nie będzie dostępna.
Proszę sprawdź swoją sieć i ustawienia firewall.
Wyłącz wszelkie funkcjonalności SIP ALG (Application Layer Gateway) w swoim routerze.
[http://wiki.phoenixviewer.com/fs_voice Więcej wskazówek można znaleźć tutaj]
</notification>

View File

@ -269,8 +269,7 @@ Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
</string>
<string name="LoginFailedPendingLogout">
System w tej chwili Cię wylogowywuje.
Twoje konto będzie niedostępne do
[TIME] czasu pacyficznego.
Poczekaj chwilę, zanim spróbujesz zalogować się ponownie.
</string>
<string name="LoginFailedUnableToCreateSession">
Nie można utworzyć poprawnej sesji.

View File

@ -2039,7 +2039,7 @@ class LinuxManifest(ViewerManifest):
self.path("featuretable_linux.txt")
with self.prefix(src=pkgdir,dst=""):
with self.prefix(src=pkgdir,dst="bin"):
self.path("ca-bundle.crt")
if self.is_packaging_viewer():