Compare commits

..

45 Commits

Author SHA1 Message Date
Liru Færs
8163448a6c [RLVa] Always show your own hover tip 2020-01-15 23:55:42 -05:00
Liru Færs
ac0e93dcad People don't seem to know what an ARC is... it's Complexity 2020-01-15 23:55:13 -05:00
Liru Færs
ed420c3645 Add Edit and Add to Selection to Object UI menus 2020-01-15 19:46:49 -05:00
Liru Færs
b872860443 Fix crash in land floater init when null region (disconnected?)
Fixes crash 2E
Cleans up code
2020-01-15 14:00:00 -05:00
Liru Færs
992f4c7b5d Modernize/sync LLSpeakers code 2020-01-15 12:57:58 -05:00
Liru Færs
8f15478ba4 Condense code~ 2020-01-15 12:56:56 -05:00
Liru Færs
1c371e7be6 Allow touching multiple objects in succession 2020-01-14 19:37:53 -05:00
Liru Færs
937c80f694 Fix an oopsie in Debug Settings, Thanks for the heads up, Yuriko 2020-01-14 15:53:42 -05:00
Liru Færs
15bd41bd71 Add Touch to object ui menus 2020-01-14 15:52:58 -05:00
Liru Færs
b9156b7955 Combine send_ObjectDeGrab and send_ObjectGrab repetitive code 2020-01-14 10:49:46 -05:00
Liru Færs
623a484ae3 Woops, gotta do a char array for that, also set errno to 0 2020-01-13 18:35:08 -05:00
Liru Færs
2ace698101 [Follow] Automatically accept Teleport Requests/Offers from the leader 2020-01-13 02:20:33 -05:00
Liru Færs
34e0c722e7 Don't cancel autopilot when escaping out of customize appearance 2020-01-13 01:34:06 -05:00
Liru Færs
82ee06a6bd Add Find on Map to avatar UI menus 2020-01-13 01:33:26 -05:00
Liru Færs
584ee8fffe const byref autopilot accessors 2020-01-13 00:29:51 -05:00
Liru Færs
d80d232ee5 Don't cancel follow if the target disappears, wait for them 2020-01-12 23:57:20 -05:00
Liru Færs
de47736038 Ignore object kills if our region is null
Fixes crash 1R
2020-01-12 20:06:01 -05:00
Liru Færs
0da16e6034 Some days, I scream in the faces of cats 2020-01-12 16:27:19 -05:00
Liru Færs
6c9a156610 Maybe fix pusssycat's issue with clicking for group profile being broken 2020-01-12 14:47:52 -05:00
Liru Færs
1726c27078 Fix for Linux file rename failures, thanks Taya and Router! 2020-01-12 13:23:02 -05:00
Liru Færs
64b43a47b5 Clean up ScriptCounter code more 2020-01-12 12:33:10 -05:00
Liru Færs
8005a58ed5 Script Counting on an avatar now shows their SLURL, instead of just a name 2020-01-11 21:53:29 -05:00
Liru Færs
d1d42701f5 Fix taya's linux crash, thanks to taya and router!
Crash was due to invalidated iterator
2020-01-11 21:00:16 -05:00
Liru Færs
c57fceff17 Modernizing scriptcounter code 2020-01-11 20:23:31 -05:00
Liru Færs
265336463d Add FMOD Logo to login screen to comply with licensing
Adds code to hide the new UI when compiled without FMOD Studio
2020-01-11 04:32:42 -05:00
Liru Færs
3ba1c88672 Remove reference to dead control 2020-01-11 03:01:28 -05:00
Liru Færs
90e6afe159 Merge branch 'master' of git://github.com/Shyotl/SingularityViewer 2020-01-10 17:14:39 -05:00
Liru Færs
3209507b6c [Follow] Sit if target is sitting, stand when they stand
Does object and ground sitting.
May fly to sitting target if they're in air
Ground sits as close as it can get if cannot reach ground sitting target

Optimizes following when within desired range of target

Moves sitting/standing autopilot cancels to more proper places
2020-01-10 17:13:28 -05:00
Liru Færs
fa97d8497a [Follow] If the user decides to sit/stand, that should cancel following 2020-01-10 16:47:52 -05:00
Liru Færs
a687273d57 Default column sorting to list sort_ascending attribute value 2020-01-10 16:07:37 -05:00
Liru Færs
28f13b806c Some harmless reorganization 2020-01-10 16:06:44 -05:00
Liru Færs
f1342d7bb8 Fix Name List xml processing (and typing into them to +find names!)
LLNameListCtrl::fromXML was ancient,
and LLScrollListCtrl::fromXML had been getting updated
but that processing should be done in a common virtual function so we have
a valid hierarchy! This fixes that!
Now all of the modern amenities added to scroll lists are in name lists.
2020-01-10 15:49:12 -05:00
Liru Færs
c3428c6d57 When chat scrolls, IDBearer URL menus shouldn't lead to the wrong place
Optimizes away multiple iterations over scroll lists and
multiple parsings of urls to determine the target(s)
At the cost of the last selection being stored statically in a vector

Removes virtual LFIDBearer::getNumSelected
2020-01-10 14:46:54 -05:00
Liru Færs
0efddbd9ff Add Pay to Object UI Menus 2020-01-10 13:12:13 -05:00
Liru Færs
be0aba4bfa Woops, fix this 2020-01-10 03:34:57 -05:00
Liru Færs
c3f03b6bbf [Follow] Specify that Follow has been cancelled, with Cancelled notice 2020-01-10 03:11:19 -05:00
Liru Færs
e15839a2cb Move autoPilot Agent Avatar Valid check to beginning 2020-01-10 02:42:48 -05:00
Shyotl
e0efbd7d26 Fix two race conditions in meshrepo. 2020-01-10 00:09:35 -06:00
Liru Færs
8e57288819 Stand Up by user should cancel autopilot 2020-01-10 01:01:38 -05:00
Liru Færs
107f512545 Teleport notifications now use avatar slurls 2020-01-09 22:53:16 -05:00
Liru Færs
14dc348179 Add Sit On to Object UI Menus
Breaks handle_object_sit out of handle_object_sit_or_stand,
parameterizes offset so that one doesn't need to select a side
still respects RLV, yay~
2020-01-09 22:14:06 -05:00
Liru Færs
eccbd98d79 Change some enables to visibles 2020-01-09 21:18:31 -05:00
Liru Færs
a5115aa69e Fix Crash T, someone broke their install, but we should gracefully exit 2020-01-09 12:41:43 -05:00
Liru Færs
327574db7c Cancel autopilot when user initiates a goto 2020-01-08 22:32:17 -05:00
Liru Færs
8b4a29cbd3 Break simulator autopilot out into its own function 2020-01-08 22:31:18 -05:00
55 changed files with 638 additions and 449 deletions

View File

@@ -281,6 +281,11 @@ int LLFile::rename_nowarn(const std::string& filename, const std::string& newnam
int rc = _wrename(utf16filename.c_str(),utf16newname.c_str());
#else
int rc = ::rename(filename.c_str(),newname.c_str());
if (rc == -1 && errno == EXDEV)
{
rc = std::system(("mv '" + filename + "' '" + newname + '\'').data());
errno = 0;
}
#endif
return rc;
}

View File

@@ -26,12 +26,13 @@ const std::array<const std::string, LFIDBearer::COUNT> LFIDBearer::sMenuStrings
{
"menu_avs_list.xml" // 0
, "menu_groups_list.xml" // 1
, "menu_objects_list.xml" // 2 // Singu TODO
, "menu_objects_list.xml" // 2
};
std::array<LLMenuGL*, LFIDBearer::COUNT> LFIDBearer::sMenus {};
const LFIDBearer* LFIDBearer::sActive = nullptr;
LFIDBearer::Type LFIDBearer::sActiveType = LFIDBearer::AVATAR;
uuid_vec_t LFIDBearer::sActiveIDs {};
void LFIDBearer::buildMenus()
{

View File

@@ -40,19 +40,19 @@ struct LFIDBearer
virtual ~LFIDBearer() { if (sActive == this) sActive = nullptr; }
virtual LLUUID getStringUUIDSelectedItem() const = 0;
virtual uuid_vec_t getSelectedIDs() const { return { getStringUUIDSelectedItem() }; }
virtual S32 getNumSelected() const { return getStringUUIDSelectedItem().notNull(); }
virtual Type getSelectedType() const { return AVATAR; }
template<typename T> static const T* getActive() { return static_cast<const T*>(sActive); }
static LLUUID getActiveSelectedID() { return sActive->getStringUUIDSelectedItem(); }
static uuid_vec_t getActiveSelectedIDs() { return sActive->getSelectedIDs(); }
static S32 getActiveNumSelected() { return sActive->getNumSelected(); }
static const LLUUID& getActiveSelectedID() { return sActiveIDs.empty() ? LLUUID::null : sActiveIDs[0]; }
static const uuid_vec_t& getActiveSelectedIDs() { return sActiveIDs; }
static size_t getActiveNumSelected() { return sActiveIDs.size(); }
static const Type& getActiveType() { return sActiveType; }
void setActive() const
{
sActive = this;
sActiveType = getSelectedType();
sActiveIDs = getSelectedIDs();
//sActiveIDs or even some kinda hybrid map, if Type is MULTIPLE fill the vals? and remove a buncha virtual functions?
}
@@ -68,4 +68,5 @@ protected:
private:
static const LFIDBearer* sActive;
static Type sActiveType;
static uuid_vec_t sActiveIDs;
};

View File

@@ -2712,39 +2712,20 @@ void LLScrollListCtrl::setScrollListParameters(LLXMLNodePtr node)
node->getAttributeString("menu_file", menu);
if (!menu.empty()) setContextMenu(menu);
}
}
// static
LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory)
{
LLRect rect;
createRect(node, rect, parent, LLRect());
BOOL multi_select = false;
node->getAttributeBOOL("multi_select", multi_select);
BOOL draw_border = true;
node->getAttributeBOOL("draw_border", draw_border);
BOOL draw_heading = false;
node->getAttributeBOOL("draw_heading", draw_heading);
S32 search_column = 0;
node->getAttributeS32("search_column", search_column);
S32 sort_column = -1;
node->getAttributeS32("sort_column", sort_column);
BOOL sort_ascending = true;
node->getAttributeBOOL("sort_ascending", sort_ascending);
LLScrollListCtrl* scroll_list = new LLScrollListCtrl("scroll_list", rect, NULL, multi_select, draw_border, draw_heading);
if (node->hasAttribute("heading_height"))
{
S32 heading_height;
node->getAttributeS32("heading_height", heading_height);
scroll_list->setHeadingHeight(heading_height);
setHeadingHeight(heading_height);
}
scroll_list->setScrollListParameters(node);
scroll_list->initFromXML(node, parent);
scroll_list->setSearchColumn(search_column);
S32 search_column = 0;
node->getAttributeS32("search_column", search_column);
BOOL sort_ascending = true;
node->getAttributeBOOL("sort_ascending", sort_ascending);
setSearchColumn(search_column);
LLSD columns;
S32 index = 0;
@@ -2755,7 +2736,7 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
{
if (child->hasName("column") || child->hasName("columns") || child->hasName(kidcolumn) || child->hasName(kidcolumns))
{
std::string labelname("");
std::string labelname;
if (child->getAttributeString("label", labelname))
columns[index]["label"] = labelname;
else if (child->getAttributeString("image", labelname))
@@ -2778,9 +2759,9 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
}
else // Singu Note: if a scroll list does not provide sort_direction, provide sort_ascending to sort as expected
{
bool sort_ascending = true;
child->getAttribute_bool("sort_ascending", sort_ascending);
columns[index]["sort_ascending"] = sort_ascending;
bool col_sort_ascending = sort_ascending;
child->getAttribute_bool("sort_ascending", col_sort_ascending);
columns[index]["sort_ascending"] = col_sort_ascending;
}
S32 columnwidth = -1;
@@ -2806,12 +2787,7 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
++index;
}
}
scroll_list->setColumnHeadings(columns);
if (sort_column >= 0)
{
scroll_list->sortByColumnIndex(sort_column, sort_ascending);
}
setColumnHeadings(columns);
const std::string kidrow(nodename + "row");
const std::string kidrows(nodename + "rows");
@@ -2856,18 +2832,46 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac
}
}
if(explicit_column)
scroll_list->addElement(row);
addElement(row);
else
{
LLSD entry_id;
if(id_found)
entry_id = id;
scroll_list->addSimpleElement(value,ADD_BOTTOM,entry_id);
addSimpleElement(value,ADD_BOTTOM,entry_id);
}
}
}
scroll_list->setCommentText(node->getTextContents());
S32 sort_column = -1;
node->getAttributeS32("sort_column", sort_column);
if (sort_column >= 0)
{
sortByColumnIndex(sort_column, sort_ascending);
}
setCommentText(node->getTextContents());
}
// static
LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory)
{
LLRect rect;
createRect(node, rect, parent, LLRect());
BOOL multi_select = false;
node->getAttributeBOOL("multi_select", multi_select);
BOOL draw_border = true;
node->getAttributeBOOL("draw_border", draw_border);
BOOL draw_heading = false;
node->getAttributeBOOL("draw_heading", draw_heading);
LLScrollListCtrl* scroll_list = new LLScrollListCtrl("scroll_list", rect, NULL, multi_select, draw_border, draw_heading);
scroll_list->setScrollListParameters(node);
scroll_list->initFromXML(node, parent);
return scroll_list;
}

View File

@@ -202,7 +202,7 @@ public:
virtual S32 getFirstSelectedIndex() const;
std::vector<LLScrollListItem*> getAllSelected() const;
uuid_vec_t getSelectedIDs() const override final; //Helper. Much like getAllSelected, but just provides a LLUUID vec
S32 getNumSelected() const override final;
S32 getNumSelected() const;
LLScrollListItem* getLastSelectedItem() const { return mLastSelected; }
// iterate over all items

View File

@@ -1433,6 +1433,7 @@ endif (OPENAL)
if (USE_FMODSTUDIO)
list(APPEND LLSTARTUP_COMPILE_DEFINITIONS "LL_FMODSTUDIO=1")
set_source_files_properties(llpanellogin.cpp PROPERTIES COMPILE_DEFINITIONS "LL_FMODSTUDIO=1")
endif (USE_FMODSTUDIO)
set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_DEFINITIONS "${LLSTARTUP_COMPILE_DEFINITIONS}")

View File

@@ -1730,6 +1730,15 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData);
mAutoPilotFinishedCallback = NULL;
}
// Sit response during follow pilot, now complete, resume follow
if (!user_cancel && mAutoPilotBehaviorName == "Sit" && mLeaderID.notNull())
{
mAutoPilotBehaviorName = "Follow";
mAutoPilot = true;
return;
}
mLeaderID = LLUUID::null;
mAutoPilotNoProgressFrameCount = 0;
@@ -1741,6 +1750,8 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
LLNotificationsUtil::add("CancelledSit");
else if (mAutoPilotBehaviorName == "Attach")
LLNotificationsUtil::add("CancelledAttach");
else if (mAutoPilotBehaviorName == "Follow")
LLNotificationsUtil::add("CancelledFollow");
else
LLNotificationsUtil::add("Cancelled");
}
@@ -1754,16 +1765,56 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
//-----------------------------------------------------------------------------
void LLAgent::autoPilot(F32 *delta_yaw)
{
if (mAutoPilot)
if (mAutoPilot && isAgentAvatarValid())
{
bool follow = !mLeaderID.isNull(); //mAutoPilotBehaviorName == "Follow";
U8 follow = mLeaderID.notNull(); //mAutoPilotBehaviorName == "Follow";
if (follow)
{
if (auto object = gObjectList.findObject(mLeaderID))
{
mAutoPilotTargetGlobal = object->getPositionGlobal();
if (const auto& av = object->asAvatar()) // Fly if avatar target is flying
{
setFlying(av->mInAir);
if (av->isSitting())
{
if (!rlv_handler_t::isEnabled() || !gRlvHandler.hasBehaviour(RLV_BHVR_SIT))
{
if (auto seat = av->getParent())
{
mAutoPilotNoProgressFrameCount = 0; // Ground Sit may have incremented this, reset it
if (gAgentAvatarp->getParent() != seat)
{
void handle_object_sit(LLViewerObject*, const LLVector3&);
handle_object_sit(static_cast<LLViewerObject*>(seat), LLVector3::zero);
}
return; // If sitting, we won't be moving, exit here
}
else // Ground sit, but only if near enough
{
if (dist_vec(av->getPositionAgent(), getPositionAgent()) <= mAutoPilotStopDistance) // We're close enough, sit.
{
if (!gAgentAvatarp->isSittingAvatarOnGround())
setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
mAutoPilotNoProgressFrameCount = 0; // Ground Sit may have incremented this, reset it now
return; // We're already sitting on the ground, we have nothing to do
}
else // We're not close enough yet
{
if (/*!gAgentAvatarp->isSitting() && */ // RLV takes care of sitting check for us inside standUp
mAutoPilotNoProgressFrameCount <= AUTOPILOT_MAX_TIME_NO_PROGRESS * gFPSClamped) // Only stand up if we haven't exhausted our no progress frames
standUp(); // Unsit if need be, so we can move
follow = 2; // Indicate we want to groundsit
}
}
}
}
else if (gAgentAvatarp->isSitting()) // Leader isn't sitting, standUp if needed
{
standUp();
mAutoPilotNoProgressFrameCount = 0; // Ground Sit may have incremented this, reset it
}
}
}
else // We might still have a valid avatar pos
{
@@ -1771,18 +1822,22 @@ void LLAgent::autoPilot(F32 *delta_yaw)
auto pos = get_av_pos(mLeaderID);
if (pos.isExactlyZero()) // Default constructed or invalid from server
{
mAutoPilotBehaviorName.clear(); // Nothing left to follow pilot
stopAutoPilot();
// Wait for them for more follow pilot
return;
}
standUp(); // Leader not rendered, we mustn't be sitting
mAutoPilotNoProgressFrameCount = 0; // Ground Sit may have incremented this, reset it
mAutoPilotTargetGlobal = pos;
// Should we fly if the height difference is great enough here? Altitude is often invalid...
}
}
if (!isAgentAvatarValid()) return;
if (!follow && gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
if (dist_vec(mAutoPilotTargetGlobal, getPositionGlobal()) <= mAutoPilotStopDistance)
{
follow = 3; // We're close enough, indicate no walking
}
}
if (follow % 2 == 0 && gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
@@ -1794,12 +1849,15 @@ void LLAgent::autoPilot(F32 *delta_yaw)
F32 target_dist = direction.magVec();
if (!follow && target_dist >= mAutoPilotTargetDist)
if (follow % 2 == 0 && target_dist >= mAutoPilotTargetDist)
{
mAutoPilotNoProgressFrameCount++;
if (mAutoPilotNoProgressFrameCount > AUTOPILOT_MAX_TIME_NO_PROGRESS * gFPSClamped)
{
stopAutoPilot();
if (follow) // Well, we tried to reach them, let's just ground sit for now.
setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
else
stopAutoPilot();
return;
}
}
@@ -1841,6 +1899,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
}
*delta_yaw = yaw;
if (follow == 3) return; // We're close enough, all we need to do is turn
// Compute when to start slowing down
F32 slow_distance;

View File

@@ -593,13 +593,13 @@ public:
public:
BOOL getAutoPilot() const { return mAutoPilot; }
LLVector3d getAutoPilotTargetGlobal() const { return mAutoPilotTargetGlobal; }
LLUUID getAutoPilotLeaderID() const { return mLeaderID; }
const LLUUID& getAutoPilotLeaderID() const { return mLeaderID; }
F32 getAutoPilotStopDistance() const { return mAutoPilotStopDistance; }
F32 getAutoPilotTargetDist() const { return mAutoPilotTargetDist; }
BOOL getAutoPilotUseRotation() const { return mAutoPilotUseRotation; }
LLVector3 getAutoPilotTargetFacing() const { return mAutoPilotTargetFacing; }
F32 getAutoPilotRotationThreshold() const { return mAutoPilotRotationThreshold; }
std::string getAutoPilotBehaviorName() const { return mAutoPilotBehaviorName; }
const std::string& getAutoPilotBehaviorName() const { return mAutoPilotBehaviorName; }
void startAutoPilotGlobal(const LLVector3d &pos_global,
const std::string& behavior_name = std::string(),

View File

@@ -289,11 +289,6 @@ LLAgentCamera::~LLAgentCamera()
//-----------------------------------------------------------------------------
void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
{
if (gAgent.getAutoPilot())
{
gAgent.stopAutoPilot(TRUE);
}
LLSelectMgr::getInstance()->unhighlightAll();
// By popular request, keep land selection while walking around. JC

View File

@@ -2287,7 +2287,9 @@ bool LLAppViewer::initConfiguration()
LL_INFOS() << "Loading settings file list" << settings_file_list << LL_ENDL;
if (0 == settings_control.loadFromFile(settings_file_list))
{
LL_ERRS() << "Cannot load default configuration file " << settings_file_list << LL_ENDL;
OSMessageBox("Cannot load default configuration file " + settings_file_list + " The installation may be corrupted.",
LLStringUtil::null,OSMB_OK);
return false;
}
mSettingsLocationList = settings_control.getLLSD("Locations");

View File

@@ -1872,10 +1872,13 @@ BOOL LLPanelLandOptions::postBuild()
mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
childSetCommitCallback("MatureCheck", onCommitAny, this);
mGamingCtrl = getChild<LLCheckBoxCtrl>( "GamingCheck");
childSetCommitCallback("GamingCheck", onCommitAny, this);
mGamingCtrl->setVisible((gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_PARCEL));
mGamingCtrl->setEnabled(false);
if (mGamingCtrl = getChild<LLCheckBoxCtrl>( "GamingCheck"))
{
auto region = gAgent.getRegion();
mGamingCtrl->setCommitCallback(boost::bind(&LLPanelLandOptions::onCommitAny, _1, this));
mGamingCtrl->setVisible(region && (region->getGamingFlags() & REGION_GAMING_PRESENT) && !(region->getGamingFlags() & REGION_GAMING_HIDE_PARCEL));
mGamingCtrl->setEnabled(false);
}
mPublishHelpButton = getChild<LLButton>("?");
mPublishHelpButton->setClickedCallback(onClickPublishHelp, this);

View File

@@ -339,10 +339,10 @@ void LLFloaterSettingsDebug::updateControl()
mValSpinner2->setMaxValue(F32_MAX);
mValSpinner3->setMaxValue(F32_MAX);
mValSpinner4->setMaxValue(F32_MAX);
mValSpinner1->setMinValue(F32_MIN);
mValSpinner2->setMinValue(F32_MIN);
mValSpinner3->setMinValue(F32_MIN);
mValSpinner4->setMinValue(F32_MIN);
mValSpinner1->setMinValue(-F32_MAX);
mValSpinner2->setMinValue(-F32_MAX);
mValSpinner3->setMinValue(-F32_MAX);
mValSpinner4->setMinValue(-F32_MAX);
if (!mValSpinner1->hasFocus())
{
mValSpinner1->setIncrement(0.1f);

View File

@@ -66,6 +66,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llglheaders.h"
#include "llviewertexturelist.h"
//#include "lltoolobjpicker.h"
@@ -271,7 +272,7 @@ void LLHoverView::updateText()
line.clear();
if (hit_object->isAvatar())
{
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMETAGS))
if (gAgentAvatarp != hit_object && gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMETAGS))
return; // No tag, no tip.
LLNameValue* title = hit_object->getNVPair("Title");
LLNameValue* firstname = hit_object->getNVPair("FirstName");
@@ -307,7 +308,7 @@ void LLHoverView::updateText()
}
mText.push_back(line);
mText.push_back(llformat("ARC: %d", hit_object->asAvatar()->getVisualComplexity()));
mText.push_back(LLTrans::getString("Complexity", LLSD().with("NUM", static_cast<LLSD::Integer>(hit_object->asAvatar()->getVisualComplexity()))));
}
else
{

View File

@@ -569,6 +569,8 @@ LLMeshRepoThread::LLMeshRepoThread()
mMutex = new LLMutex();
mHeaderMutex = new LLMutex();
mSignal = new LLCondition();
mSkinInfoQMutex = new LLMutex();
mDecompositionQMutex = new LLMutex();
}
LLMeshRepoThread::~LLMeshRepoThread()
@@ -579,6 +581,10 @@ LLMeshRepoThread::~LLMeshRepoThread()
mHeaderMutex = NULL;
delete mSignal;
mSignal = NULL;
delete mSkinInfoQMutex;
mSkinInfoQMutex = NULL;
delete mDecompositionQMutex;
mDecompositionQMutex = NULL;
}
bool LLMeshRepoThread::HeaderRequest::fetch(U32& count)
@@ -1167,7 +1173,9 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat
info.mMeshID = mesh_id;
//LL_INFOS() <<"info pelvis offset"<<info.mPelvisOffset<<LL_ENDL;
mSkinInfoQMutex->lock();
mSkinInfoQ.push(info);
mSkinInfoQMutex->unlock();
}
return true;
@@ -1193,7 +1201,9 @@ bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S3
{
LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
d->mMeshID = mesh_id;
mDecompositionQMutex->lock();
mDecompositionQ.push(d);
mDecompositionQMutex->unlock();
}
return true;
@@ -1252,7 +1262,9 @@ bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32
}
}
mDecompositionQMutex->lock();
mDecompositionQ.push(d);
mDecompositionQMutex->unlock();
return true;
}
@@ -1862,14 +1874,22 @@ void LLMeshRepoThread::notifyLoadedMeshes()
while (!mSkinInfoQ.empty())
{
gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
mSkinInfoQMutex->lock();
auto req = mSkinInfoQ.front();
mSkinInfoQ.pop();
mSkinInfoQMutex->unlock();
gMeshRepo.notifySkinInfoReceived(req);
}
while (!mDecompositionQ.empty())
{
gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
mDecompositionQMutex->lock();
auto req = mDecompositionQ.front();
mDecompositionQ.pop();
mDecompositionQMutex->unlock();
gMeshRepo.notifyDecompositionReceived(req);
}
}

View File

@@ -265,6 +265,7 @@ public:
//queue of completed skin info requests
std::queue<LLMeshSkinInfo> mSkinInfoQ;
LLMutex* mSkinInfoQMutex;
//set of requested decompositions
uuid_set_t mDecompositionRequests;
@@ -274,6 +275,7 @@ public:
//queue of completed Decomposition info requests
std::queue<LLModel::Decomposition*> mDecompositionQ;
LLMutex* mDecompositionQMutex;
//queue of requested headers
std::deque<std::pair<std::shared_ptr<MeshRequest>, F32> > mHeaderReqQ;

View File

@@ -461,13 +461,13 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
LLRect rect;
createRect(node, rect, parent, LLRect());
BOOL multi_select = FALSE;
BOOL multi_select = false;
node->getAttributeBOOL("multi_select", multi_select);
BOOL draw_border = TRUE;
BOOL draw_border = true;
node->getAttributeBOOL("draw_border", draw_border);
BOOL draw_heading = FALSE;
BOOL draw_heading = false;
node->getAttributeBOOL("draw_heading", draw_heading);
S32 name_column_index = 0;
@@ -494,108 +494,5 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
name_list->initFromXML(node, parent);
LLSD columns;
S32 index = 0;
LLXMLNodePtr child;
for (child = node->getFirstChild(); child.notNull(); child = child->getNextSibling())
{
if (child->hasName("column"))
{
std::string labelname("");
child->getAttributeString("label", labelname);
std::string columnname(labelname);
child->getAttributeString("name", columnname);
std::string sortname(columnname);
child->getAttributeString("sort", sortname);
if (child->hasAttribute("relative_width"))
{
F32 columnrelwidth = 0.f;
child->getAttributeF32("relative_width", columnrelwidth);
columns[index]["relative_width"] = columnrelwidth;
}
else if (child->hasAttribute("relwidth"))
{
F32 columnrelwidth = 0.f;
child->getAttributeF32("relwidth", columnrelwidth);
columns[index]["relative_width"] = columnrelwidth;
}
else if (child->hasAttribute("dynamic_width"))
{
BOOL columndynamicwidth = FALSE;
child->getAttributeBOOL("dynamic_width", columndynamicwidth);
columns[index]["dynamic_width"] = columndynamicwidth;
}
else if (child->hasAttribute("dynamicwidth"))
{
BOOL columndynamicwidth = FALSE;
child->getAttributeBOOL("dynamicwidth", columndynamicwidth);
columns[index]["dynamic_width"] = columndynamicwidth;
}
else
{
S32 columnwidth = -1;
child->getAttributeS32("width", columnwidth);
columns[index]["width"] = columnwidth;
}
LLFontGL::HAlign h_align = LLFontGL::LEFT;
h_align = LLView::selectFontHAlign(child);
columns[index]["name"] = columnname;
columns[index]["label"] = labelname;
columns[index]["halign"] = (S32)h_align;
columns[index]["sort"] = sortname;
index++;
}
}
name_list->setColumnHeadings(columns);
for (child = node->getFirstChild(); child.notNull(); child = child->getNextSibling())
{
if (child->hasName("row"))
{
LLUUID id;
child->getAttributeUUID("id", id);
LLSD row;
row["id"] = id;
S32 column_idx = 0;
LLXMLNodePtr row_child;
for (row_child = node->getFirstChild(); row_child.notNull(); row_child = row_child->getNextSibling())
{
if (row_child->hasName("column"))
{
std::string value = row_child->getTextContents();
std::string columnname("");
row_child->getAttributeString("name", columnname);
std::string font("");
row_child->getAttributeString("font", font);
std::string font_style("");
row_child->getAttributeString("font-style", font_style);
row["columns"][column_idx]["column"] = columnname;
row["columns"][column_idx]["value"] = value;
row["columns"][column_idx]["font"] = font;
row["columns"][column_idx]["font-style"] = font_style;
column_idx++;
}
}
name_list->addElement(row);
}
}
std::string contents = node->getTextContents();
name_list->setCommentText(contents);
return name_list;
}

View File

@@ -144,7 +144,7 @@ void LLNameUI::showProfile()
{
if (!mAllowInteract) return;
switch (LFIDBearer::getActiveType())
switch (mType)
{
case LFIDBearer::GROUP: LLGroupActions::show(mNameID); break;
case LFIDBearer::AVATAR: LLAvatarActions::showProfile(mNameID); break;

View File

@@ -47,7 +47,6 @@ struct LLNameUI : public LFIDBearer
}
LLUUID getStringUUIDSelectedItem() const override final { return mNameID; }
S32 getNumSelected() const override final { return 1; }
Type getSelectedType() const override final { return mType; }
void setType(const Type& type);

View File

@@ -70,7 +70,6 @@ public:
LLUUID getStringUUIDSelectedItem() const override final { return mClosestAgentAtLastRightClick; }
uuid_vec_t getSelectedIDs() const override final { return mClosestAgentsAtLastClick; }
S32 getNumSelected() const override final { return mClosestAgentsAtLastClick.size(); }
// [SL:KB] - Patch: World-MinimapOverlay | Checked: 2012-06-20 (Catznip-3.3.0)
void refreshParcelOverlay() { mUpdateParcelImage = true; }

View File

@@ -237,6 +237,10 @@ LLPanelLogin::LLPanelLogin(const LLRect& rect)
reshape(rect.getWidth(), rect.getHeight());
#ifndef LL_FMODSTUDIO
getChildView("fmod_logo")->setVisible(false);
#endif
LLComboBox* username_combo(getChild<LLComboBox>("username_combo"));
username_combo->setCommitCallback(boost::bind(LLPanelLogin::onSelectLoginEntry, _2));
username_combo->setFocusLostCallback(boost::bind(&LLPanelLogin::onLoginComboLostFocus, this, username_combo));

View File

@@ -193,10 +193,10 @@ void LLPanelPermissions::disableAll()
}
getChildView("Group:")->setEnabled(FALSE);
if (auto view = getChildView("Group Name Proxy"))
if (mLabelGroupName)
{
view->setValue(LLUUID::null);
view->setEnabled(FALSE);
mLabelGroupName->setNameID(LLUUID::null, LFIDBearer::GROUP);
mLabelGroupName->setEnabled(FALSE);
}
getChildView("button set group")->setEnabled(FALSE);
@@ -454,7 +454,7 @@ void LLPanelPermissions::refresh()
if(mLabelGroupName)
{
mLabelGroupName->setNameID(LLUUID::null, LFIDBearer::GROUP);
mLabelGroupName->refresh(LLUUID::null, std::string());
mLabelGroupName->setNameText();
mLabelGroupName->setEnabled(FALSE);
}
}

View File

@@ -240,7 +240,7 @@ LLSpeakersDelayActionsStorage::~LLSpeakersDelayActionsStorage()
void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
{
bool not_found = true;
if (mActionTimersMap.size() > 0)
if (!mActionTimersMap.empty())
{
not_found = mActionTimersMap.find(speaker_id) == mActionTimersMap.end();
}
@@ -258,7 +258,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
{
if (mActionTimersMap.size() == 0) return;
if (mActionTimersMap.empty()) return;
LLSpeakerActionTimer::action_timer_iter_t it_speaker = mActionTimersMap.find(speaker_id);
@@ -434,8 +434,8 @@ void LLSpeakerMgr::update(BOOL resort_ok)
return;
}
LLColor4 speaking_color = gSavedSettings.getColor4("SpeakingColor");
LLColor4 overdriven_color = gSavedSettings.getColor4("OverdrivenColor");
static const LLCachedControl<LLColor4> speaking_color(gSavedSettings, "SpeakingColor");
static const LLCachedControl<LLColor4> overdriven_color(gSavedSettings, "OverdrivenColor");
if(resort_ok) // only allow list changes when user is not interacting with it
{
@@ -445,10 +445,10 @@ void LLSpeakerMgr::update(BOOL resort_ok)
// update status of all current speakers
BOOL voice_channel_active = (!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
bool re_sort = false;
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
for (auto& speaker : mSpeakers)
{
LLUUID speaker_id = speaker_it->first;
LLSpeaker* speakerp = speaker_it->second;
LLUUID speaker_id = speaker.first;
LLSpeaker* speakerp = speaker.second;
if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id))
{
@@ -532,12 +532,8 @@ void LLSpeakerMgr::update(BOOL resort_ok)
bool index_changed = false;
S32 recent_speaker_count = 0;
S32 sort_index = 0;
for (speaker_list_t::iterator sorted_speaker_it = mSpeakersSorted.begin();
sorted_speaker_it != mSpeakersSorted.end();
++sorted_speaker_it)
for (auto speakerp : mSpeakersSorted)
{
LLPointer<LLSpeaker> speakerp = *sorted_speaker_it;
// color code recent speakers who are not currently speaking
if (speakerp->mStatus == LLSpeaker::STATUS_HAS_SPOKEN)
{
@@ -561,9 +557,6 @@ void LLSpeakerMgr::update(BOOL resort_ok)
void LLSpeakerMgr::updateSpeakerList()
{
// Always add the current agent (it has to be there...). Will do nothing if already there.
setSpeaker({ gAgentID, LLSpeaker::SPEAKER_AGENT, LLSpeaker::STATUS_VOICE_ACTIVE });
// Are we bound to the currently active voice channel?
if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
{
@@ -572,22 +565,21 @@ void LLSpeakerMgr::updateSpeakerList()
// If we are, add all voice client participants to our list of known speakers
std::vector<speaker_entry_t> speakers;
speakers.reserve(participants.size());
for (auto participant_it = participants.begin(); participant_it != participants.end(); ++participant_it)
for (auto participant : participants)
{
speakers.emplace_back(
*participant_it,
(LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it) ? LLSpeaker::SPEAKER_AGENT : LLSpeaker::SPEAKER_EXTERNAL),
speakers.emplace_back(participant,
(LLVoiceClient::getInstance()->isParticipantAvatar(participant) ? LLSpeaker::SPEAKER_AGENT : LLSpeaker::SPEAKER_EXTERNAL),
LLSpeaker::STATUS_VOICE_ACTIVE,
boost::none,
boost::none,
LLVoiceClient::getInstance()->getDisplayName(*participant_it));
LLVoiceClient::getInstance()->getDisplayName(participant));
}
setSpeakers(speakers);
}
else
{
// If not, check if the list is empty, except if it's Nearby Chat (session_id NULL).
LLUUID session_id = getSessionID();
LLUUID const& session_id = getSessionID();
if (!session_id.isNull() && !mSpeakerListUpdated)
{
// If the list is empty, we update it with whatever we have locally so that it doesn't stay empty too long.
@@ -636,15 +628,16 @@ void LLSpeakerMgr::updateSpeakerList()
mSpeakerListUpdated = true;
}
}
else if (floater && mSpeakers.size() == 0)
else if (floater && mSpeakers.empty())
{
// For all other session type (ad-hoc, P2P, avaline), we use the initial participants targets list
for (const auto& id : floater->mInitialTargetIDs)
for (const auto& target_id : floater->mInitialTargetIDs)
{
// Add buddies if they are on line, add any other avatar.
if (!LLAvatarTracker::instance().isBuddy(id) || LLAvatarTracker::instance().isBuddyOnline(id))
if (!LLAvatarTracker::instance().isBuddy(target_id) || LLAvatarTracker::instance().isBuddyOnline(
target_id))
{
setSpeaker({ id, LLSpeaker::SPEAKER_AGENT, LLSpeaker::STATUS_VOICE_ACTIVE });
setSpeaker({target_id, LLSpeaker::SPEAKER_AGENT, LLSpeaker::STATUS_VOICE_ACTIVE });
}
}
mSpeakerListUpdated = true;
@@ -656,13 +649,18 @@ void LLSpeakerMgr::updateSpeakerList()
}
}
}
// Always add the current agent (it has to be there...). Will do nothing if already there.
setSpeaker({ gAgentID, LLSpeaker::SPEAKER_AGENT, LLSpeaker::STATUS_VOICE_ACTIVE });
}
void LLSpeakerMgr::setSpeakerNotInChannel(LLSpeaker* speakerp)
void LLSpeakerMgr::setSpeakerNotInChannel(LLPointer<LLSpeaker> speakerp)
{
speakerp->setStatus(LLSpeaker::STATUS_NOT_IN_CHANNEL);
speakerp->mDotColor = INACTIVE_COLOR;
mSpeakerDelayRemover->setActionTimer(speakerp->mID);
if (speakerp.notNull())
{
speakerp->setStatus(LLSpeaker::STATUS_NOT_IN_CHANNEL);
speakerp->mDotColor = INACTIVE_COLOR;
mSpeakerDelayRemover->setActionTimer(speakerp->mID);
}
}
bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)
@@ -691,12 +689,12 @@ bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id)
LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
{
//In some conditions map causes crash if it is empty(Windows only), adding check (EK)
if (mSpeakers.size() == 0)
return NULL;
if (mSpeakers.empty())
return nullptr;
speaker_map_t::iterator found_it = mSpeakers.find(speaker_id);
if (found_it == mSpeakers.end())
{
return NULL;
return nullptr;
}
return found_it->second;
}
@@ -704,9 +702,9 @@ LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
void LLSpeakerMgr::getSpeakerList(speaker_list_t* speaker_list, BOOL include_text)
{
speaker_list->clear();
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
for (auto& speaker : mSpeakers)
{
LLPointer<LLSpeaker> speakerp = speaker_it->second;
LLPointer<LLSpeaker> speakerp = speaker.second;
// what about text only muted or inactive?
if (include_text || speakerp->mStatus != LLSpeaker::STATUS_TEXT_ONLY)
{
@@ -715,12 +713,12 @@ void LLSpeakerMgr::getSpeakerList(speaker_list_t* speaker_list, BOOL include_tex
}
}
const LLUUID LLSpeakerMgr::getSessionID()
const LLUUID LLSpeakerMgr::getSessionID() const
{
return mVoiceChannel->getSessionID();
}
bool LLSpeakerMgr::isSpeakerToBeRemoved(const LLUUID& speaker_id)
bool LLSpeakerMgr::isSpeakerToBeRemoved(const LLUUID& speaker_id) const
{
return mSpeakerDelayRemover && mSpeakerDelayRemover->isTimerStarted(speaker_id);
}
@@ -746,7 +744,7 @@ void LLSpeakerMgr::speakerChatted(const LLUUID& speaker_id)
}
}
BOOL LLSpeakerMgr::isVoiceActive()
BOOL LLSpeakerMgr::isVoiceActive() const
{
// mVoiceChannel = NULL means current voice channel, whatever it is
return LLVoiceClient::getInstance()->voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive();
@@ -778,8 +776,7 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)
std::vector<speaker_entry_t> speakerentries;
if ( speakers.has("agent_info") && speakers["agent_info"].isMap() )
{
LLSD::map_const_iterator speaker_it;
for(speaker_it = speakers["agent_info"].beginMap();
for(LLSD::map_const_iterator speaker_it = speakers["agent_info"].beginMap();
speaker_it != speakers["agent_info"].endMap();
++speaker_it)
{
@@ -803,8 +800,7 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers)
{
//older, more decprecated way. Need here for
//using older version of servers
LLSD::array_const_iterator speaker_it;
for(speaker_it = speakers["agents"].beginArray();
for(LLSD::array_const_iterator speaker_it = speakers["agents"].beginArray();
speaker_it != speakers["agents"].endArray();
++speaker_it)
{
@@ -821,10 +817,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
std::vector<speaker_entry_t> speakerentries;
if ( update.has("agent_updates") && update["agent_updates"].isMap() )
{
LLSD::map_const_iterator update_it;
for(
update_it = update["agent_updates"].beginMap();
for(LLSD::map_const_iterator update_it = update["agent_updates"].beginMap();
update_it != update["agent_updates"].endMap();
++update_it)
{
@@ -838,7 +831,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
LLSD agent_data = update_it->second;
if (agent_data.isMap() && agent_data.has("transition"))
{
if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull())
if (agent_data["transition"].asString() == "LEAVE")
{
setSpeakerNotInChannel(speakerp);
}
@@ -882,9 +875,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
}
else if ( update.has("updates") && update["updates"].isMap() )
{
LLSD::map_const_iterator update_it;
for (
update_it = update["updates"].beginMap();
for (LLSD::map_const_iterator update_it = update["updates"].beginMap();
update_it != update["updates"].endMap();
++update_it)
{
@@ -892,7 +883,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);
std::string agent_transition = update_it->second.asString();
if (agent_transition == "LEAVE" && speakerp.notNull())
if (agent_transition == "LEAVE")
{
setSpeakerNotInChannel(speakerp);
}
@@ -915,7 +906,7 @@ void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)
LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id);
if (!speakerp) return;
std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
std::string url = gAgent.getRegionCapability("ChatSessionRequest");
LLSD data;
data["method"] = "mute update";
data["session-id"] = getSessionID();
@@ -940,7 +931,7 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu
// do not send voice moderation changes for avatars not in voice channel
if (!is_in_voice) return;
std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
std::string url = gAgent.getRegionCapability("ChatSessionRequest");
LLSD data;
data["method"] = "mute update";
data["session-id"] = getSessionID();
@@ -980,7 +971,7 @@ void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)
{
std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
std::string url = gAgent.getRegionCapability("ChatSessionRequest");
LLSD data;
data["method"] = "session update";
data["session-id"] = session_id;
@@ -996,13 +987,13 @@ void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallo
void LLIMSpeakerMgr::forceVoiceModeratedMode(bool should_be_muted)
{
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
for (auto& speaker : mSpeakers)
{
LLUUID speaker_id = speaker_it->first;
LLSpeaker* speakerp = speaker_it->second;
LLUUID speaker_id = speaker.first;
LLSpeaker* speakerp = speaker.second;
// participant does not match requested state
if (should_be_muted != (bool)speakerp->mModeratorMutedVoice)
if (should_be_muted != static_cast<bool>(speakerp->mModeratorMutedVoice))
{
moderateVoiceParticipant(speaker_id, !should_be_muted);
}
@@ -1036,10 +1027,9 @@ void LLActiveSpeakerMgr::updateSpeakerList()
LLSpeakerMgr::updateSpeakerList();
// clean up text only speakers
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
for (auto& speaker : mSpeakers)
{
LLUUID speaker_id = speaker_it->first;
LLSpeaker* speakerp = speaker_it->second;
LLSpeaker* speakerp = speaker.second;
if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
{
// automatically flag text only speakers for removal
@@ -1085,10 +1075,10 @@ void LLLocalSpeakerMgr::updateSpeakerList()
setSpeakers(speakers);
// check if text only speakers have moved out of chat range
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
for (auto& speaker : mSpeakers)
{
LLUUID speaker_id = speaker_it->first;
LLPointer<LLSpeaker> speakerp = speaker_it->second;
LLUUID speaker_id = speaker.first;
LLPointer<LLSpeaker> speakerp = speaker.second;
if (speakerp.notNull() && speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)
{
LLVOAvatar* avatarp = gObjectList.findAvatar(speaker_id);

View File

@@ -36,7 +36,7 @@ class LLSpeakerMgr;
class LLVoiceChannel;
// data for a given participant in a voice channel
class LLSpeaker : public LLRefCount, public LLOldEvents::LLObservable, public LLHandleProvider<LLSpeaker>, public boost::signals2::trackable
class LLSpeaker final : public LLRefCount, public LLOldEvents::LLObservable, public LLHandleProvider<LLSpeaker>, public boost::signals2::trackable
{
public:
typedef enum e_speaker_type
@@ -80,7 +80,7 @@ public:
};
LLSpeaker(const speaker_entry_t& entry);
~LLSpeaker() {};
~LLSpeaker() = default;
void update(const speaker_entry_t& entry);
void lookupName();
@@ -130,44 +130,44 @@ public:
S32 mSortIndex;
};
class LLSpeakerUpdateSpeakerEvent : public LLOldEvents::LLEvent
class LLSpeakerUpdateSpeakerEvent final : public LLOldEvents::LLEvent
{
public:
LLSpeakerUpdateSpeakerEvent(LLSpeaker* source);
/*virtual*/ LLSD getValue();
/*virtual*/ LLSD getValue() override;
private:
const LLUUID& mSpeakerID;
};
class LLSpeakerUpdateModeratorEvent : public LLOldEvents::LLEvent
class LLSpeakerUpdateModeratorEvent final : public LLOldEvents::LLEvent
{
public:
LLSpeakerUpdateModeratorEvent(LLSpeaker* source);
/*virtual*/ LLSD getValue();
/*virtual*/ LLSD getValue() override;
private:
const LLUUID& mSpeakerID;
BOOL mIsModerator;
};
class LLSpeakerTextModerationEvent : public LLOldEvents::LLEvent
class LLSpeakerTextModerationEvent final : public LLOldEvents::LLEvent
{
public:
LLSpeakerTextModerationEvent(LLSpeaker* source);
/*virtual*/ LLSD getValue();
/*virtual*/ LLSD getValue() override;
};
class LLSpeakerVoiceModerationEvent : public LLOldEvents::LLEvent
class LLSpeakerVoiceModerationEvent final : public LLOldEvents::LLEvent
{
public:
LLSpeakerVoiceModerationEvent(LLSpeaker* source);
/*virtual*/ LLSD getValue();
/*virtual*/ LLSD getValue() override;
};
class LLSpeakerListChangeEvent : public LLOldEvents::LLEvent
class LLSpeakerListChangeEvent final : public LLOldEvents::LLEvent
{
public:
LLSpeakerListChangeEvent(LLSpeakerMgr* source, const LLUUID& speaker_id);
/*virtual*/ LLSD getValue();
/*virtual*/ LLSD getValue() override;
private:
const LLUUID& mSpeakerID;
@@ -183,7 +183,7 @@ private:
* Otherwise it should be deleted manually in place where it is used.
* If action callback is not set timer will tick only once and deleted.
*/
class LLSpeakerActionTimer : public LLEventTimer
class LLSpeakerActionTimer final : public LLEventTimer
{
public:
typedef std::function<bool(const LLUUID&)> action_callback_t;
@@ -200,14 +200,14 @@ public:
* @param speaker_id - LLUUID of speaker which will be passed into action callback.
*/
LLSpeakerActionTimer(action_callback_t action_cb, F32 action_period, const LLUUID& speaker_id);
virtual ~LLSpeakerActionTimer() {};
virtual ~LLSpeakerActionTimer() = default;
/**
* Implements timer "tick".
*
* If action callback is not specified returns true. Instance will be deleted by LLEventTimer::updateClass().
*/
virtual BOOL tick();
BOOL tick() override;
/**
* Clears the callback.
@@ -285,13 +285,13 @@ public:
void setSpeakers(const std::vector<speaker_entry_t>& speakers);
LLPointer<LLSpeaker> setSpeaker(const speaker_entry_t& speakers);
BOOL isVoiceActive();
BOOL isVoiceActive() const;
typedef std::vector<LLPointer<LLSpeaker> > speaker_list_t;
void getSpeakerList(speaker_list_t* speaker_list, BOOL include_text);
LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }
const LLUUID getSessionID();
bool isSpeakerToBeRemoved(const LLUUID& speaker_id);
const LLUUID getSessionID() const;
bool isSpeakerToBeRemoved(const LLUUID& speaker_id) const;
/**
* Removes avaline speaker.
@@ -310,7 +310,7 @@ public:
protected:
virtual void updateSpeakerList();
void setSpeakerNotInChannel(LLSpeaker* speackerp);
void setSpeakerNotInChannel(LLPointer<LLSpeaker> speackerp);
bool removeSpeaker(const LLUUID& speaker_id);
typedef std::map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t;
@@ -336,7 +336,7 @@ protected:
bool mModerateModeHandledFirstTime;
};
class LLIMSpeakerMgr : public LLSpeakerMgr
class LLIMSpeakerMgr final : public LLSpeakerMgr
{
LOG_CLASS(LLIMSpeakerMgr);
@@ -376,7 +376,7 @@ public:
void processSessionUpdate(const LLSD& session_update);
protected:
virtual void updateSpeakerList();
void updateSpeakerList() override;
void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
@@ -387,24 +387,24 @@ protected:
};
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
class LLActiveSpeakerMgr final : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
{
LOG_CLASS(LLActiveSpeakerMgr);
public:
LLActiveSpeakerMgr();
protected:
virtual void updateSpeakerList();
void updateSpeakerList() override;
};
class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>
class LLLocalSpeakerMgr final : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>
{
LOG_CLASS(LLLocalSpeakerMgr);
public:
LLLocalSpeakerMgr();
~LLLocalSpeakerMgr ();
protected:
virtual void updateSpeakerList();
void updateSpeakerList() override;
};
#endif // LL_LLSPEAKERS_H

View File

@@ -3019,17 +3019,7 @@ void pass_processObjectPropertiesFamily(LLMessageSystem *msg, void**)
void process_script_running_reply(LLMessageSystem* msg, void** v)
{
LLLiveLSLEditor::processScriptRunningReply(msg, v);
if (ScriptCounter::sCheckMap.size())
{
LLUUID item_id;
msg->getUUIDFast(_PREHASH_Script, _PREHASH_ItemID, item_id);
std::map<LLUUID,ScriptCounter*>::iterator it = ScriptCounter::sCheckMap.find(item_id);
if (it != ScriptCounter::sCheckMap.end())
{
it->second->processRunningReply(msg);
ScriptCounter::sCheckMap.erase(it);
}
}
ScriptCounter::processScriptRunningReply(msg);
}
void register_viewer_callbacks(LLMessageSystem* msg)

View File

@@ -403,7 +403,7 @@ void LLToolGrab::startGrab()
mDragStartPointGlobal = grab_start_global;
mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal();
send_ObjectGrab_message(objectp, mGrabPick, grab_offset);
send_ObjectGrab_message(objectp, true, &mGrabPick, grab_offset);
mGrabOffsetFromCenterInitial = grab_offset;
mGrabHiddenOffsetFromCamera = mDragStartFromCamera;
@@ -1079,7 +1079,7 @@ void LLToolGrab::stopGrab()
case GRAB_ACTIVE_CENTER:
case GRAB_NONPHYSICAL:
case GRAB_LOCKED:
send_ObjectDeGrab_message(objectp, pick);
send_ObjectGrab_message(objectp, false, &pick);
mVerticalDragging = FALSE;
break;
@@ -1133,64 +1133,45 @@ LLVector3d LLToolGrab::getGrabPointGlobal()
}
void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset)
void send_ObjectGrab_message(LLViewerObject* object, bool grab, const LLPickInfo* const pick, const LLVector3 &grab_offset)
{
if (!object) return;
LLMessageSystem *msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ObjectGrab);
msg->newMessageFast(grab ? _PREHASH_ObjectGrab : _PREHASH_ObjectDeGrab);
msg->nextBlockFast( _PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->nextBlockFast( _PREHASH_ObjectData);
msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset);
msg->nextBlock("SurfaceInfo");
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
msg->addVector3("Position", pick.mIntersection);
msg->addVector3("Normal", pick.mNormal);
msg->addVector3("Binormal", pick.mBinormal);
if (grab) msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset);
if (pick)
{
msg->nextBlock("SurfaceInfo");
msg->addVector3("UVCoord", LLVector3(pick->mUVCoords));
msg->addVector3("STCoord", LLVector3(pick->mSTCoords));
msg->addS32Fast(_PREHASH_FaceIndex, pick->mObjectFace);
msg->addVector3("Position", pick->mIntersection);
msg->addVector3("Normal", pick->mNormal);
msg->addVector3("Binormal", pick->mBinormal);
}
msg->sendMessage( object->getRegion()->getHost());
/* Diagnostic code
LL_INFOS() << "mUVCoords: " << pick.mUVCoords
<< ", mSTCoords: " << pick.mSTCoords
<< ", mObjectFace: " << pick.mObjectFace
<< ", mIntersection: " << pick.mIntersection
<< ", mNormal: " << pick.mNormal
<< ", mBinormal: " << pick.mBinormal
if (pick)
{
LL_INFOS() << "mUVCoords: " << pick->mUVCoords
<< ", mSTCoords: " << pick->mSTCoords
<< ", mObjectFace: " << pick->mObjectFace
<< ", mIntersection: " << pick->mIntersection
<< ", mNormal: " << pick->mNormal
<< ", mBinormal: " << pick->mBinormal
<< LL_ENDL;
}
LL_INFOS() << "Avatar pos: " << gAgent.getPositionAgent() << LL_ENDL;
LL_INFOS() << "Object pos: " << object->getPosition() << LL_ENDL;
*/
}
void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick)
{
if (!object) return;
LLMessageSystem *msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ObjectDeGrab);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
msg->nextBlock("SurfaceInfo");
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
msg->addVector3("Position", pick.mIntersection);
msg->addVector3("Normal", pick.mNormal);
msg->addVector3("Binormal", pick.mBinormal);
msg->sendMessage(object->getRegion()->getHost());
}

View File

@@ -41,9 +41,7 @@ class LLPickInfo;
// Message utilities
void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset);
void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
void send_ObjectGrab_message(LLViewerObject* object, bool grab, const LLPickInfo* const pick = nullptr, const LLVector3& grab_offset = LLVector3::zero);
class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>

View File

@@ -569,7 +569,7 @@ void LLToolPie::selectionPropertiesReceived()
case CLICK_ACTION_PAY:
if ( LLToolPie::getInstance()->mClickActionPayEnabled )
{
handle_give_money_dialog();
handle_give_money_dialog(selected_object);
}
break;
case CLICK_ACTION_OPEN:

View File

@@ -1792,21 +1792,18 @@ class LLObjectTouch : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
handle_object_touch();
handle_object_touch(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(), &LLToolPie::getInstance()->getPick());
return true;
}
};
void handle_object_touch()
void handle_object_touch(LLViewerObject* object, const LLPickInfo* const pick)
{
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
if (!object) return;
LLPickInfo pick = LLToolPie::getInstance()->getPick();
// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-1.1.0l
// NOTE: fallback code since we really shouldn't be getting an active selection if we can't touch this
if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canTouch(object, pick.mObjectOffset)) )
if ( (rlv_handler_t::isEnabled()) && (!gRlvHandler.canTouch(object, pick ? pick->mObjectOffset : LLVector3::zero)) )
{
RLV_ASSERT(false);
return;
@@ -1816,28 +1813,30 @@ void handle_object_touch()
// *NOTE: Hope the packets arrive safely and in order or else
// there will be some problems.
// *TODO: Just fix this bad assumption.
send_ObjectGrab_message(object, pick, LLVector3::zero);
send_ObjectDeGrab_message(object, pick);
send_ObjectGrab_message(object, true, pick);
send_ObjectGrab_message(object, false, pick);
}
bool enable_object_touch(LLViewerObject* obj, const LLVector3& offset = LLVector3::zero)
{
bool new_value = obj && obj->flagHandleTouch();
// [RLVa:KB] - Checked: 2010-11-12 (RLVa-1.2.1g) | Added: RLVa-1.2.1g
if (new_value && rlv_handler_t::isEnabled())
{
// RELEASE-RLVa: [RLVa-1.2.1] Make sure this stays in sync with handle_object_touch()
new_value = gRlvHandler.canTouch(obj, offset);
}
// [/RLVa:KB]
return new_value;
}
bool enable_object_touch(const LLSD& userdata)
{
LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
bool new_value = obj && obj->flagHandleTouch();
// [RLVa:KB] - Checked: 2010-11-12 (RLVa-1.2.1g) | Added: RLVa-1.2.1g
if ( (rlv_handler_t::isEnabled()) && (new_value) )
{
// RELEASE-RLVa: [RLVa-1.2.1] Make sure this stays in sync with handle_object_touch()
new_value = gRlvHandler.canTouch(obj, LLToolPie::getInstance()->getPick().mObjectOffset);
}
// [/RLVa:KB]
std::string touch_text;
// Update label based on the node touch name if available.
LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
auto selection = LLSelectMgr::getInstance()->getSelection();
LLSelectNode* node = selection->getFirstRootNode();
if (node && node->mValid && !node->mTouchName.empty())
{
touch_text = node->mTouchName;
@@ -1849,7 +1848,8 @@ bool enable_object_touch(const LLSD& userdata)
gMenuHolder->childSetText("Object Touch", touch_text);
gMenuHolder->childSetText("Attachment Object Touch", touch_text);
return new_value;
return enable_object_touch(selection->getPrimaryObject(), LLToolPie::getInstance()->getPick().mObjectOffset);
};
// One object must have touch sensor
@@ -2845,9 +2845,8 @@ class LLObjectPFLinksetsSelected : public view_listener_t
// </edit>
void handle_go_to(const LLVector3d& pos)
void simulator_autopilot(const LLVector3d& pos)
{
// try simulator autopilot
std::vector<std::string> strings;
std::string val;
val = llformat("%.9g", pos.mdV[VX]);
@@ -2857,6 +2856,14 @@ void handle_go_to(const LLVector3d& pos)
val = llformat("%.9g", pos.mdV[VZ]);
strings.push_back(val);
send_generic_message("autopilot", strings);
}
void handle_go_to(const LLVector3d& pos)
{
gAgent.stopAutoPilot(true); // Go To cancels viewer autopilot
// try simulator autopilot
simulator_autopilot(pos);
LLViewerParcelMgr::getInstance()->deselectLand();
@@ -3565,6 +3572,7 @@ class LLSelfSitOrStand : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
gAgent.stopAutoPilot(true);
if (gAgentAvatarp && gAgentAvatarp->isSitting())
{
gAgent.standUp();
@@ -3867,28 +3875,14 @@ bool is_object_sittable()
}
// only works on pie menu
void handle_object_sit_or_stand()
void handle_object_sit(LLViewerObject* object, const LLVector3& offset = LLVector3::zero)
{
LLPickInfo pick = LLToolPie::getInstance()->getPick();
LLViewerObject *object = pick.getObject();;
if (!object || pick.mPickType == LLPickInfo::PICK_FLORA)
{
return;
}
if (sitting_on_selection())
{
gAgent.standUp();
return;
}
// get object selection offset
// if (object && object->getPCode() == LL_PCODE_VOLUME)
// [RLVa:KB] - Checked: 2010-03-06 (RLVa-1.2.0c) | Modified: RLVa-1.2.0c
if ( (object && object->getPCode() == LL_PCODE_VOLUME) &&
((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(object, pick.mObjectOffset))) )
((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(object, offset))) )
// [/RLVa:KB]
{
// [RLVa:KB] - Checked: 2010-08-29 (RLVa-1.2.1c) | Added: RLVa-1.2.1c
@@ -3909,12 +3903,33 @@ void handle_object_sit_or_stand()
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
gMessageSystem->addVector3Fast(_PREHASH_Offset, pick.mObjectOffset);
gMessageSystem->addVector3Fast(_PREHASH_Offset, offset);
object->getRegion()->sendReliableMessage();
}
}
// only works on pie menu
void handle_object_sit_or_stand()
{
LLPickInfo pick = LLToolPie::getInstance()->getPick();
LLViewerObject *object = pick.getObject();;
if (!object || pick.mPickType == LLPickInfo::PICK_FLORA)
{
return;
}
gAgent.stopAutoPilot(true);
if (sitting_on_selection())
{
gAgent.standUp();
return;
}
handle_object_sit(object, pick.mObjectOffset);
}
class LLObjectSitOrStand : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -4069,6 +4084,11 @@ void handle_reset_view()
}
else
{
if (gAgent.getAutoPilot())
{
gAgent.stopAutoPilot(true);
}
reset_view_final( true );
}
}
@@ -6112,7 +6132,7 @@ class LLAvatarResetSkeletonAndAnimations : public view_listener_t
};
bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle selection)
bool complete_give_money(const LLSD& notification, const LLSD& response, LLViewerObject* objectp)
{
S32 option = LLNotification::getSelectedOption(notification, response);
if (option == 0)
@@ -6120,8 +6140,6 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec
gAgent.setDoNotDisturb(false);
}
LLViewerObject* objectp = selection->getPrimaryObject();
// Show avatar's name if paying attachment
if (objectp && objectp->isAttachment())
{
@@ -6148,10 +6166,10 @@ bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjec
return false;
}
void handle_give_money_dialog()
void handle_give_money_dialog(LLViewerObject* obj)
{
LLNotification::Params params("BusyModePay");
params.functor(boost::bind(complete_give_money, _1, _2, LLSelectMgr::getInstance()->getSelection()));
params.functor(boost::bind(complete_give_money, _1, _2, obj));
if (gAgent.isDoNotDisturb())
{
@@ -6168,7 +6186,7 @@ class LLPayObject : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
handle_give_money_dialog();
handle_give_money_dialog(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
return true;
}
};
@@ -6183,9 +6201,8 @@ bool enable_pay_avatar()
// [/RLVa:KB]
}
bool enable_pay_object()
bool enable_pay_object(LLViewerObject* object)
{
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
if( object )
{
LLViewerObject *parent = (LLViewerObject *)object->getParent();
@@ -6291,7 +6308,7 @@ class LLEnablePayObject : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_pay_avatar() || enable_pay_object());
gMenuHolder->findControl(userdata["control"].asString())->setValue(enable_pay_avatar() || enable_pay_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject()));
return true;
}
};
@@ -9090,7 +9107,7 @@ class ListEnableAnySelected : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
gMenuHolder->findControl(userdata["control"].asString())->setValue(LFIDBearer::getActiveNumSelected());
gMenuHolder->findControl(userdata["control"].asString())->setValue(LFIDBearer::getActiveNumSelected() != 0);
return true;
}
};
@@ -9404,12 +9421,32 @@ class ListTeleportTo : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
const auto&& id = LFIDBearer::getActiveSelectedID();
const auto& id = LFIDBearer::getActiveSelectedID();
gAgent.teleportViaLocation(LFIDBearer::getActiveType() == LFIDBearer::OBJECT ? gObjectList.findObject(id)->getPositionGlobal() : get_av_pos(id));
return true;
}
};
class ListStalk : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
LLAvatarActions::showOnMap(LFIDBearer::getActiveSelectedID());
return true;
}
};
class ListStalkable : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
BOOL is_agent_mappable(const LLUUID& agent_id);
const auto& ids = LFIDBearer::getActiveSelectedIDs();
gMenuHolder->findControl(userdata["control"].asString())->setValue(ids.size() == 1 && is_agent_mappable(ids[0]));
return true;
}
};
class ListAbuseReport : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -9442,7 +9479,7 @@ class ListIsNearby : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
const auto&& id = LFIDBearer::getActiveSelectedID();
const auto& id = LFIDBearer::getActiveSelectedID();
gMenuHolder->findControl(userdata["control"].asString())->setValue(LFIDBearer::getActiveType() == LFIDBearer::OBJECT ? !!gObjectList.findObject(id) : is_nearby(id));
return true;
}
@@ -9632,6 +9669,111 @@ class ListObjectCamTo : public view_listener_t
}
};
class ListObjectSit : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
gAgent.stopAutoPilot(true);
handle_object_sit(gObjectList.findObject(LFIDBearer::getActiveSelectedID()));
return true;
}
};
class ListObjectPay : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
handle_give_money_dialog(gObjectList.findObject(LFIDBearer::getActiveSelectedID()));
return true;
}
};
class ListObjectEnablePay : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
const auto& ids = LFIDBearer::getActiveSelectedIDs();
gMenuHolder->findControl(userdata["control"].asString())->setValue(ids.size() == 1 && enable_pay_object(gObjectList.findObject(ids[0])));
return true;
}
};
void list_for_each_object(std::function<void(LLViewerObject*)> func)
{
for (const auto& id : LFIDBearer::getActiveSelectedIDs())
if (auto obj = gObjectList.findObject(id))
func(obj);
}
class ListObjectTouch : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
list_for_each_object([](LLViewerObject* obj) { if (enable_object_touch(obj)) handle_object_touch(obj); });
return true;
}
};
bool list_has_valid_object(std::function<bool(LLViewerObject*)> func)
{
for (const auto& id : LFIDBearer::getActiveSelectedIDs())
if (func(gObjectList.findObject(id)))
return true; // First is fine enough, we'll use all we can
return false;
}
// One object must have touch sensor
class ListObjectEnableTouch : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
gMenuHolder->findControl(userdata["control"].asString())->setValue(list_has_valid_object([](LLViewerObject* obj){ return enable_object_touch(obj); }));
return true;
}
};
class ListObjectEdit : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
std::vector<LLViewerObject*> objs;
auto func = rlv_handler_t::isEnabled() ? static_cast<std::function<void(LLViewerObject* obj)>>([&objs](LLViewerObject* obj) { if (gRlvHandler.canEdit(obj)) objs.push_back(obj); }) : [&objs](LLViewerObject* obj) { if (obj) objs.push_back(obj); };
list_for_each_object(func);
if (objs.empty()) return true;
bool new_selection = userdata.asBoolean();
auto& selmgr = LLSelectMgr::instance();
if (new_selection) selmgr.deselectAll();
auto selection = new_selection ? nullptr : selmgr.getSelection();
auto old_primary = selection ? selection->getPrimaryObject() : nullptr;
for (const auto& obj : objs)
selmgr.selectObjectAndFamily(obj, true);
if (old_primary) selmgr.selectObjectAndFamily(old_primary);
if (new_selection) handle_object_edit();
return true;
}
};
class ListObjectCanEdit : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
bool new_selection = userdata["data"].asBoolean();
auto& selmgr = LLSelectMgr::instance();
auto selection = new_selection ? nullptr : selmgr.getSelection();
bool has_old_selection = selection && !selection->isEmpty() && !selection->isAttachment();
auto func = rlv_handler_t::isEnabled() ? static_cast<std::function<bool(LLViewerObject* obj)>>([](LLViewerObject* obj) { return !!gRlvHandler.canEdit(obj); }) : [](LLViewerObject* obj) { return !!obj; };
gMenuHolder->findControl(userdata["control"].asString())
->setValue((new_selection || has_old_selection) && list_has_valid_object(func));
return true;
}
};
class MediaCtrlCopyURL : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -10008,6 +10150,8 @@ void initialize_menus()
addMenu(new ListStartCall(), "List.StartCall");
addMenu(new ListStartConference(), "List.StartConference");
addMenu(new ListStartIM(), "List.StartIM");
addMenu(new ListStalk, "List.Stalk");
addMenu(new ListStalkable, "List.Stalkable");
addMenu(new ListTeleportTo, "List.TeleportTo");
addMenu(new ListAbuseReport(), "List.AbuseReport");
addMenu(new ListIsNearby, "List.IsNearby");
@@ -10025,6 +10169,13 @@ void initialize_menus()
addMenu(new ListJoin, "List.Join");
addMenu(new ListActivate, "List.Activate");
addMenu(new ListObjectCamTo, "List.Object.CamTo");
addMenu(new ListObjectSit, "List.Object.Sit");
addMenu(new ListObjectPay, "List.Object.Pay");
addMenu(new ListObjectEnablePay, "List.Object.EnablePay");
addMenu(new ListObjectTouch, "List.Object.Touch");
addMenu(new ListObjectEnableTouch, "List.Object.EnableTouch");
addMenu(new ListObjectEdit, "List.Object.Edit");
addMenu(new ListObjectCanEdit, "List.Object.CanEdit");
add_radar_listeners();

View File

@@ -38,8 +38,10 @@
class LLUICtrl;
class LLView;
class LLParcelSelection;
class LLPickInfo;
class LLObjectSelection;
class LLSelectNode;
class LLViewerObject;
void pre_init_menus();
void init_menus();
@@ -95,7 +97,7 @@ void exchange_callingcard(const LLUUID& dest_id);
void handle_gestures(void*);
void handle_sit_down(void*);
void handle_object_build(void*);
void handle_object_touch();
void handle_object_touch(LLViewerObject*, const LLPickInfo* const = nullptr);
bool enable_object_open();
void handle_object_open();
@@ -133,8 +135,8 @@ void handle_toggle_flycam();
void handle_fake_away_status(void*);
void handle_object_sit_or_stand();
void handle_give_money_dialog();
bool enable_pay_object();
void handle_give_money_dialog(LLViewerObject*);
bool enable_pay_object(LLViewerObject*);
bool enable_buy_object();
void handle_go_to(const LLVector3d& pos);

View File

@@ -3211,13 +3211,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
((IM_TELEPORT_REQUEST == dialog) && (RlvActions::autoAcceptTeleportRequest(from_id))) );
// [/RLVa:KB]
if (is_muted)
bool following = gAgent.getAutoPilotLeaderID() == from_id;
if (!following && is_muted)
{
return;
}
// else if (is_do_not_disturb)
// else if (!following && is_do_not_disturb)
// [RLVa:KB] - Checked: 2013-11-08 (RLVa-1.4.9)
else if ( (is_do_not_disturb) && (!fRlvAutoAccept) )
else if (!following && is_do_not_disturb && !fRlvAutoAccept )
// [/RLVa:KB]
{
send_do_not_disturb_message(msg, from_id);
@@ -3299,7 +3301,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD args;
// *TODO: Translate -> [FIRST] [LAST] (maybe)
args["NAME"] = name;
args["NAME"] = LLAvatarActions::getSLURL(from_id);
args["MESSAGE"] = message;
args["MATURITY_STR"] = region_access_str;
args["MATURITY_ICON"] = region_access_icn;
@@ -3344,10 +3346,14 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
*/
LLNotification::Params params(IM_LURE_USER == dialog ? "TeleportOffered" : "TeleportRequest");
params.substitutions = args;
params.payload = payload;
if (following)
{
LLNotifications::instance().forceResponse(LLNotification::Params(params.name).payload(payload), 0);
}
else
// [RLVa:KB] - Checked: 20103-11-08 (RLVa-1.4.9)
if ( (rlv_handler_t::isEnabled()) && (fRlvAutoAccept) )
{
@@ -5269,6 +5275,9 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
{
LL_RECORD_BLOCK_TIME(FTM_PROCESS_OBJECTS);
auto agent_region = gAgent.getRegion();
if (!agent_region) return;
LLUUID id;
U32 local_id;
S32 i;
@@ -5276,7 +5285,7 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
num_objects = mesgsys->getNumberOfBlocksFast(_PREHASH_ObjectData);
bool different_region = mesgsys->getSender().getIPandPort() != gAgent.getRegion()->getHost().getIPandPort();
bool different_region = mesgsys->getSender().getIPandPort() != agent_region->getHost().getIPandPort();
for (i = 0; i < num_objects; i++)
{
@@ -7984,7 +7993,7 @@ void send_lures(const LLSD& notification, const LLSD& response)
target_name = RlvStrings::getAnonym(target_name);
else
// [/RLVa:KB]
LLAvatarNameCache::getNSName(target_id, target_name);
target_name = LLAvatarActions::getSLURL(target_id);
args["TO_NAME"] = target_name;
LLSD payload;

View File

@@ -2081,8 +2081,6 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
adjust_rect_top_right("FloaterMiniMapRect", window);
adjust_rect_top_right("FloaterLagMeter", window);
adjust_rect_top_left("FloaterBuildOptionsRect", window);
adjust_rect_bottom_left("FloaterActiveSpeakersRect", window);

View File

@@ -33,6 +33,7 @@
#include "scriptcounter.h"
#include "llavataractions.h"
#include "llavatarnamecache.h"
#include "llviewerregion.h"
#include "llselectmgr.h"
@@ -44,15 +45,6 @@ void cmdline_printchat(const std::string& message);
LLVOAvatar* find_avatar_from_object( LLViewerObject* object );
namespace
{
void countedScriptsOnAvatar(LLStringUtil::format_map_t args, const LLAvatarName& av_name)
{
args["NAME"] = av_name.getNSName();
cmdline_printchat(LLTrans::getString("ScriptCountAvatar", args));
}
}
std::map<LLUUID, ScriptCounter*> ScriptCounter::sCheckMap;
ScriptCounter::ScriptCounter(bool do_delete, LLViewerObject* object)
@@ -82,22 +74,23 @@ void ScriptCounter::requestInventories()
LLVOAvatar* av = static_cast<LLVOAvatar*>(foo);
// Iterate through all the attachment points
for (LLVOAvatar::attachment_map_t::iterator i = av->mAttachmentPoints.begin(); i != av->mAttachmentPoints.end(); ++i)
for (const auto& i : av->mAttachmentPoints)
{
if (LLViewerJointAttachment* attachment = i->second)
if (LLViewerJointAttachment* attachment = i.second)
{
if (!attachment->getValid()) continue;
// Iterate through all the attachments on this point
for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator j = attachment->mAttachedObjects.begin(); j != attachment->mAttachedObjects.end(); ++j)
if (LLViewerObject* object = *j)
for (const auto& object : attachment->mAttachedObjects)
if (object)
requestInventoriesFor(object);
}
}
}
else // Iterate through all the selected objects
{
for (LLObjectSelection::valid_root_iterator i = LLSelectMgr::getInstance()->getSelection()->valid_root_begin(); i != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); ++i)
auto selection = LLSelectMgr::getInstance()->getSelection();
for (auto i = selection->valid_root_begin(), end = selection->valid_root_end(); i != end; ++i)
if (LLSelectNode* selectNode = *i)
if (LLViewerObject* object = selectNode->getObject())
requestInventoriesFor(object);
@@ -111,10 +104,8 @@ void ScriptCounter::requestInventoriesFor(LLViewerObject* object)
{
++objectCount;
requestInventoryFor(object);
LLViewerObject::child_list_t child_list = object->getChildren();
for (LLViewerObject::child_list_t::iterator i = child_list.begin(); i != child_list.end(); ++i)
for (auto child : object->getChildren())
{
LLViewerObject* child = *i;
if (child->isAvatar()) continue;
requestInventoryFor(child);
}
@@ -140,41 +131,55 @@ void ScriptCounter::inventoryChanged(LLViewerObject* obj, LLInventoryObject::obj
if (inv)
{
LLInventoryObject::object_list_t::const_iterator end = inv->end();
for (LLInventoryObject::object_list_t::const_iterator i = inv->begin(); i != end; ++i)
if (LLInventoryObject* asset = (*i))
if (asset->getType() == LLAssetType::AT_LSL_TEXT)
uuid_vec_t ids;
for (auto asset : *inv)
{
const LLUUID& id = asset->getUUID();
if (asset->getType() == LLAssetType::AT_LSL_TEXT && id.notNull())
{
++scriptcount;
if (doDelete)
ids.push_back(id);
else
{
++scriptcount;
if (doDelete)
{
const LLUUID& id = asset->getUUID();
if (id.notNull())
{
//LL_INFOS() << "Deleting script " << id << " in " << objid << LL_ENDL;
obj->removeInventory(id);
--i; // Avoid iteration when removing, everything has shifted
end = inv->end();
}
}
else
{
const LLUUID& id = asset->getUUID();
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_GetScriptRunning);
msg->nextBlockFast(_PREHASH_Script);
msg->addUUIDFast(_PREHASH_ObjectID, obj->getID());
msg->addUUIDFast(_PREHASH_ItemID, id);
msg->sendReliable(obj->getRegion()->getHost());
sCheckMap[id] = this;
++checking;
}
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_GetScriptRunning);
msg->nextBlockFast(_PREHASH_Script);
msg->addUUIDFast(_PREHASH_ObjectID, obj->getID());
msg->addUUIDFast(_PREHASH_ItemID, id);
msg->sendReliable(obj->getRegion()->getHost());
sCheckMap[id] = this;
++checking;
}
}
}
for (const auto& id : ids)
{
//LL_INFOS() << "Deleting script " << id << " in " << objid << LL_ENDL;
obj->removeInventory(id);
}
}
summarize();
}
void ScriptCounter::processScriptRunningReply(LLMessageSystem* msg)
{
if (!sCheckMap.empty())
{
LLUUID item_id;
msg->getUUIDFast(_PREHASH_Script, _PREHASH_ItemID, item_id);
auto it = sCheckMap.find(item_id);
if (it != sCheckMap.end())
{
it->second->processRunningReply(msg);
sCheckMap.erase(it);
}
}
}
void ScriptCounter::processRunningReply(LLMessageSystem* msg)
{
BOOL is;
@@ -199,7 +204,10 @@ void ScriptCounter::summarize()
args["RUNNING"] = stringize(mRunningCount);
args["MONO"] = stringize(mMonoCount);
if (foo->isAvatar())
LLAvatarNameCache::get(foo->getID(), boost::bind(countedScriptsOnAvatar, args, _2));
{
args["NAME"] = LLAvatarActions::getSLURL(foo->getID());
cmdline_printchat(LLTrans::getString("ScriptCountAvatar", args));
}
else
cmdline_printchat(LLTrans::getString(doDelete ? "ScriptDeleteObject" : "ScriptCountObject", args));

View File

@@ -33,19 +33,19 @@
#include "llvoinventorylistener.h"
class ScriptCounter : public LLInstanceTracker<ScriptCounter, LLUUID>, public LLVOInventoryListener
class ScriptCounter final : public LLInstanceTracker<ScriptCounter, LLUUID>, public LLVOInventoryListener
{
public:
ScriptCounter(bool do_delete, LLViewerObject* object);
~ScriptCounter();
/*virtual*/ void inventoryChanged(LLViewerObject* obj, LLInventoryObject::object_list_t* inv, S32, void*);
void inventoryChanged(LLViewerObject* obj, LLInventoryObject::object_list_t* inv, S32, void*) override;
void requestInventories();
static void processScriptRunningReply(LLMessageSystem* msg);
private:
void requestInventoriesFor(LLViewerObject* object);
void requestInventoryFor(LLViewerObject* object);
friend void process_script_running_reply(LLMessageSystem* msg, void**);
void processRunningReply(LLMessageSystem* msg);
void summarize(); // Check if finished, if so, output and destroy.

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -57,6 +57,8 @@ with the same filename but different name
<texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
<texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
<texture name="FMOD_Logo" file_name="FMOD Logo.png" preload="true"/>
<texture name="Parcel_M_Dark" file_name="map_event_mature.tga" preload="true" />
<texture name="Parcel_M_Light" file_name="map_event_mature.tga" preload="false" />
<texture name="Parcel_PG_Light" file_name="map_event.tga" preload="false" />

View File

@@ -68,6 +68,10 @@
<on_click function="List.RequestTeleport"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Find on Map" name="Find on Map">
<on_click function="List.Stalk"/>
<on_visible function="List.Stalkable"/>
</menu_item_call>
<menu_item_call label="Share" name="Share">
<on_click function="List.Share"/>
<on_visible function="List.EnableSingleSelected"/>

View File

@@ -65,6 +65,10 @@
<on_click function="List.RequestTeleport"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Find on Map" name="Find on Map">
<on_click function="List.Stalk"/>
<on_visible function="List.Stalkable"/>
</menu_item_call>
<menu_item_call label="Share" name="Share">
<on_click function="List.Share"/>
<on_visible function="List.EnableSingleSelected"/>

View File

@@ -16,14 +16,34 @@
<on_click function="List.TeleportTo"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Sit On" name="Sit On">
<on_click function="List.Object.Sit"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Pay" name="Pay">
<on_click function="List.Object.Pay"/>
<on_visible function="List.Object.EnablePay"/>
</menu_item_call>
<menu_item_call label="Touch" name="Touch">
<on_click function="List.Object.Touch"/>
<on_visible function="List.Object.EnableTouch"/>
</menu_item_call>
<menu_item_call label="Edit" name="Edit">
<on_click function="List.Object.Edit" userdata="true"/>
<on_visible function="List.Object.CanEdit" userdata="true"/>
</menu_item_call>
<menu_item_call label="Add to Selection" name="Add to Selection">
<on_click function="List.Object.Edit" userdata=""/>
<on_visible function="List.Object.CanEdit" userdata=""/>
</menu_item_call>
<menu_item_separator/>
<menu_item_call label="Copy Key" name="Copy Key">
<on_click function="List.CopyUUIDs"/>
<on_enable function="List.EnableAnySelected"/>
<on_visible function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Copy Name" name="Copy Name">
<on_click function="List.CopyNames"/>
<on_enable function="List.EnableAnySelected"/>
<on_visible function="List.EnableAnySelected"/>
</menu_item_call>
<menu_item_call label="Copy SLURL" name="Copy SLURL">
<on_click function="List.CopySLURL"/>

View File

@@ -65,6 +65,10 @@
<on_click function="List.RequestTeleport"/>
<on_visible function="List.EnableSingleSelected"/>
</menu_item_call>
<menu_item_call label="Find on Map" name="Find on Map">
<on_click function="List.Stalk"/>
<on_visible function="List.Stalkable"/>
</menu_item_call>
<menu_item_call label="Share" name="Share">
<on_click function="List.Share"/>
<on_visible function="List.EnableSingleSelected"/>

View File

@@ -52,6 +52,10 @@
<menu_item_call label="Request Teleport" name="Request Teleport">
<on_click function="List.RequestTeleport"/>
</menu_item_call>
<menu_item_call label="Find on Map" name="Find on Map">
<on_click function="List.Stalk"/>
<on_visible function="List.Stalkable"/>
</menu_item_call>
<menu_item_call label="Share" name="Share">
<on_click function="List.Share"/>
</menu_item_call>

View File

@@ -56,6 +56,26 @@
<on_click function="List.TeleportTo"/>
<on_visible function="List.IsNearby"/>
</menu_item_call>
<menu_item_call label="Sit On" name="Sit On">
<on_click function="List.Object.Sit"/>
<on_visible function="List.IsNearby"/>
</menu_item_call>
<menu_item_call label="Pay" name="Pay">
<on_click function="List.Object.Pay"/>
<on_visible function="List.Object.EnablePay"/>
</menu_item_call>
<menu_item_call label="Touch" name="Touch">
<on_click function="List.Object.Touch"/>
<on_visible function="List.Object.EnableTouch"/>
</menu_item_call>
<menu_item_call label="Edit" name="Edit">
<on_click function="List.Object.Edit" userdata="true"/>
<on_visible function="List.Object.CanEdit" userdata="true"/>
</menu_item_call>
<menu_item_call label="Add to Selection" name="Add to Selection">
<on_click function="List.Object.Edit" userdata=""/>
<on_visible function="List.Object.CanEdit" userdata=""/>
</menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call

View File

@@ -6529,6 +6529,13 @@ Cancelled Sit
Cancelled Attach
</notification>
<notification
icon="notifytip.tga"
name="CancelledFollow"
type="notifytip">
Cancelled Follow
</notification>
<notification
icon="notifytip.tga"
name="ReplacedMissingWearable"

View File

@@ -80,6 +80,8 @@
<button bottom_delta="0" left="146" height="16" width="16" follows="left|bottom" image_overlay="inv_folder_trash.tga" scale_image="true" label="" tool_tip="Delete the currently selected remembered login info, if any." name="remove_login"/>
<check_box bottom_delta="0" left="173" control_name="RememberPassword" follows="left|bottom" height="16" label="Save password" name="remember_check" width="158"/>
<icon name="fmod_logo" bottom="7" height="60" left="-425" width="228" follows="right|bottom" image_name="FMOD_Logo"/>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="45" drop_shadow_visible="true" follows="right|bottom"
font="SansSerifSmall" font-style="UNDERLINE" h_pad="0" halign="right" height="16"

View File

@@ -3559,6 +3559,8 @@ If you continue to receive this message, please contact Second Life support for
<string name="Bottom">Bottom</string>
<string name="Bottom Right">Bottom Right</string>
<string name="Complexity">Complexity: [NUM]</string>
<!-- compile queue-->
<string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string>
<string name="CompileQueueServiceUnavailable">Script compilation service not available</string>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB