SL-11153 Remake of SL-9414

andreykproductengine 2019-05-13 19:47:23 +03:00
parent 493cf89fd5
commit c384904675
1 changed files with 57 additions and 2 deletions

View File

@ -111,9 +111,64 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
mMouseOutsideSlop = FALSE;
mMouseDownX = x;
mMouseDownY = y;
LLTimer pick_timer;
BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick");
LLPickInfo transparent_pick = gViewerWindow->pickImmediate(x, y, TRUE /*includes transparent*/, pick_rigged);
LLPickInfo visible_pick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged);
LLViewerObject *transp_object = transparent_pick.getObject();
LLViewerObject *visible_object = visible_pick.getObject();
// Current set of priorities
// 1. Transparent attachment pick
// 2. Transparent actionable pick
// 3. Visible attachment pick (e.x we click on attachment under invisible floor)
// 4. Visible actionable pick
// 5. Transparent pick (e.x. movement on transparent object/floor, our default pick)
// left mouse down always picks transparent (but see handleMouseUp).
// Also see LLToolPie::handleHover() - priorities are a bit different there.
// Todo: we need a more consistent set of rules to work with
if (transp_object == visible_object || !visible_object)
{
// Note: if transparent object is null, then visible object is also null
// since transparent pick includes non-tranpsarent one.
// !transparent_object check will be covered by transparent_object == visible_object.
mPick = transparent_pick;
}
else
{
// Select between two non-null picks
LLViewerObject *transp_parent = transp_object->getRootEdit();
LLViewerObject *visible_parent = visible_object->getRootEdit();
if (transp_object->isAttachment())
{
// 1. Transparent attachment
mPick = transparent_pick;
}
else if (transp_object->getClickAction() != CLICK_ACTION_DISABLED
&& (useClickAction(mask, transp_object, transp_parent) || transp_object->flagHandleTouch() || (transp_parent && transp_parent->flagHandleTouch())))
{
// 2. Transparent actionable pick
mPick = transparent_pick;
}
else if (visible_object->isAttachment())
{
// 3. Visible attachment pick
mPick = visible_pick;
}
else if (visible_object->getClickAction() != CLICK_ACTION_DISABLED
&& (useClickAction(mask, visible_object, visible_parent) || visible_object->flagHandleTouch() || (visible_parent && visible_parent->flagHandleTouch())))
{
// 4. Visible actionable pick
mPick = visible_pick;
}
else
{
// 5. Default: transparent
mPick = transparent_pick;
}
}
LL_INFOS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL;
//left mouse down always picks transparent (but see handleMouseUp)
mPick = gViewerWindow->pickImmediate(x, y, TRUE, FALSE);
mPick.mKeyMask = mask;
mMouseButtonDown = true;