Compare commits
45 Commits
sv-1.8.7.8
...
sv-1.8.7.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8163448a6c | ||
|
|
ac0e93dcad | ||
|
|
ed420c3645 | ||
|
|
b872860443 | ||
|
|
992f4c7b5d | ||
|
|
8f15478ba4 | ||
|
|
1c371e7be6 | ||
|
|
937c80f694 | ||
|
|
15bd41bd71 | ||
|
|
b9156b7955 | ||
|
|
623a484ae3 | ||
|
|
2ace698101 | ||
|
|
34e0c722e7 | ||
|
|
82ee06a6bd | ||
|
|
584ee8fffe | ||
|
|
d80d232ee5 | ||
|
|
de47736038 | ||
|
|
0da16e6034 | ||
|
|
6c9a156610 | ||
|
|
1726c27078 | ||
|
|
64b43a47b5 | ||
|
|
8005a58ed5 | ||
|
|
d1d42701f5 | ||
|
|
c57fceff17 | ||
|
|
265336463d | ||
|
|
3ba1c88672 | ||
|
|
90e6afe159 | ||
|
|
3209507b6c | ||
|
|
fa97d8497a | ||
|
|
a687273d57 | ||
|
|
28f13b806c | ||
|
|
f1342d7bb8 | ||
|
|
c3428c6d57 | ||
|
|
0efddbd9ff | ||
|
|
be0aba4bfa | ||
|
|
c3f03b6bbf | ||
|
|
e15839a2cb | ||
|
|
e0efbd7d26 | ||
|
|
8e57288819 | ||
|
|
107f512545 | ||
|
|
14dc348179 | ||
|
|
eccbd98d79 | ||
|
|
a5115aa69e | ||
|
|
327574db7c | ||
|
|
8b4a29cbd3 |
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
BIN
indra/newview/skins/default/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
@@ -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" />
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
BIN
indra/newview/skins/frenchtouch/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/italia/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/kirstenLite2/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/kliteat/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/new_silver/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/orangelife/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/secondlove/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/silver/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/snowwhite/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/stpatrick/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
BIN
indra/newview/skins/white_emerald/textures/FMOD Logo.png
Normal file
|
After Width: | Height: | Size: 9.5 KiB |