diff options
| author | andreykproductengine <andreykproductengine@lindenlab.com> | 2019-05-13 19:47:23 +0300 | 
|---|---|---|
| committer | andreykproductengine <andreykproductengine@lindenlab.com> | 2019-05-13 19:47:23 +0300 | 
| commit | c384904675c4ba37e614a3c1c4e478601037f3f3 (patch) | |
| tree | c906c4bc266e7e57f4a2c9204421b5a1c8ee203a | |
| parent | 493cf89fd590b8acad0589e895c2445086b56afd (diff) | |
SL-11153 Remake of SL-9414
| -rw-r--r-- | indra/newview/lltoolpie.cpp | 59 | 
1 files changed, 57 insertions, 2 deletions
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index f184b22ccb..2a87bce134 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -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;  | 
