diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 3360276a7c..772a92706f 100755
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -5388,6 +5388,65 @@ LLInventoryObject* LLObjectBridge::getObject() const
return object;
}
+// Touch worn objects
+bool is_attachment_touchable(const LLUUID& idItem)
+{
+ const LLInventoryItem* pItem = gInventory.getItem(idItem);
+ if ( (!isAgentAvatarValid()) || (!pItem) )
+ return false;
+
+ LLViewerObject* pAttachObj = gAgentAvatarp->getWornAttachment(pItem->getLinkedUUID());
+ if (!pAttachObj)
+ return false;
+
+ return pAttachObj->flagHandleTouch();
+}
+
+void handle_attachment_touch(const LLUUID& idItem)
+{
+ const LLInventoryItem* pItem = gInventory.getItem(idItem);
+ if ( (!isAgentAvatarValid()) || (!pItem) )
+ return;
+
+ LLViewerObject* pAttachObj = gAgentAvatarp->getWornAttachment(pItem->getLinkedUUID());
+ if (!pAttachObj)
+ return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectGrab);
+ msg->nextBlockFast( _PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast( _PREHASH_ObjectData);
+ msg->addU32Fast( _PREHASH_LocalID, pAttachObj->mLocalID);
+ msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3::zero);
+ msg->addVector3("STCoord", LLVector3::zero);
+ msg->addS32Fast(_PREHASH_FaceIndex, 0);
+ msg->addVector3("Position", pAttachObj->getPosition());
+ msg->addVector3("Normal", LLVector3::zero);
+ msg->addVector3("Binormal", LLVector3::zero);
+ msg->sendMessage( pAttachObj->getRegion()->getHost());
+
+ 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, pAttachObj->mLocalID);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3::zero);
+ msg->addVector3("STCoord", LLVector3::zero);
+ msg->addS32Fast(_PREHASH_FaceIndex, 0);
+ msg->addVector3("Position", pAttachObj->getPosition());
+ msg->addVector3("Normal", LLVector3::zero);
+ msg->addVector3("Binormal", LLVector3::zero);
+ msg->sendMessage(pAttachObj->getRegion()->getHost());
+}
+//
+
// virtual
void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
{
@@ -5428,6 +5487,12 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
handle_attachment_edit(mUUID);
}
// [/SL:KB]
+ // Touch worn objects
+ else if ("touch" == action)
+ {
+ handle_attachment_touch(mUUID);
+ }
+ //
else if (isRemoveAction(action))
{
LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);
@@ -5625,6 +5690,13 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// TOOD-Catznip: should really be "Wearable And Object Edit" if we ever plan on pushing this upstream
items.push_back(std::string("Wearable Edit"));
// [/SL:KB]
+ // Touch worn objects
+ if (is_attachment_touchable(mUUID))
+ {
+ items.push_back(std::string("Touch Attachment"));
+ }
+ //
+
items.push_back(std::string("Detach From Yourself"));
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0a) | Modified: RLVa-1.2.0a
if ( (rlv_handler_t::isEnabled()) && (!gRlvAttachmentLocks.canDetach(item)) )
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 96b82f6525..34e52303fb 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -86,6 +86,7 @@
+
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 62d24f16e0..a090feaa94 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -687,6 +687,14 @@
function="Inventory.DoToSelected"
parameter="edit" />
+
+
+