diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a84a94171d..8e8276198d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -499,6 +499,28 @@ Value 0 + PrivateLookAtTarget + + Comment + If true, viewer shows simulated look-at behavior to others. + Persist + 1 + Type + Boolean + Value + 0 + + PrivatePointAtTarget + + Comment + If true, viewer won't show the editing arm motion. + Persist + 1 + Type + Boolean + Value + 0 + ArrowKeysAlwaysMove Comment diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 18562fde92..6d5532886c 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2762,7 +2762,8 @@ void LLAgentCamera::lookAtLastChat() BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position) { // disallow pointing at attachments and avatars - if (object && (object->isAttachment() || object->isAvatar())) + bool private_pointat = gSavedSettings.getBOOL("PrivatePointAtTarget");//this is the editing arm motion + if (object && (object->isAttachment() || object->isAvatar() || private_pointat)) { return FALSE; } diff --git a/indra/newview/llhudeffectbeam.cpp b/indra/newview/llhudeffectbeam.cpp index 37b7b2e75d..376d8cb4a9 100644 --- a/indra/newview/llhudeffectbeam.cpp +++ b/indra/newview/llhudeffectbeam.cpp @@ -76,9 +76,29 @@ LLHUDEffectBeam::~LLHUDEffectBeam() void LLHUDEffectBeam::packData(LLMessageSystem *mesgsys) { - if (!mSourceObject) + LLViewerObject* source_object = (LLViewerObject*)mSourceObject; + if (!source_object) + { + markDead(); + return; + } + else if (!source_object->isAvatar()) { - llwarns << "Missing source object!" << llendl; + LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectBeam message for ID: " + << source_object->getID().asString()<< LL_ENDL; + markDead(); + return; + } + else + { + LLVOAvatar* source_avatar = (LLVOAvatar*)source_object; + if (!source_avatar->isSelf()) + { + LL_DEBUGS("HUDEffect")<<"Non-self HUDEffectBeam message for ID: " + << source_avatar->getID().asString()<< LL_ENDL; + markDead(); + return; + } } // Pack the default data diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 8cf7d23f88..3385ef0956 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -42,7 +42,7 @@ #include "llxmltree.h" - +#include "llviewercontrol.h" BOOL LLHUDEffectLookAt::sDebugLookAt = FALSE; @@ -262,36 +262,70 @@ LLHUDEffectLookAt::~LLHUDEffectLookAt() //----------------------------------------------------------------------------- void LLHUDEffectLookAt::packData(LLMessageSystem *mesgsys) { - // Pack the default data - LLHUDEffect::packData(mesgsys); - - // Pack the type-specific data. Uses a fun packed binary format. Whee! - U8 packed_data[PKT_SIZE]; - memset(packed_data, 0, PKT_SIZE); + // pack both target object and position + // position interpreted as offset if target object is non-null + ELookAtType target_type = mTargetType; + LLVector3d target_offset_global = mTargetOffsetGlobal; + LLViewerObject* target_object = (LLViewerObject*)mTargetObject; + LLViewerObject* source_object = (LLViewerObject*)mSourceObject; + LLVOAvatar* source_avatar = NULL; + if (!source_object)//kokua TODO: find out why this happens at all and fix there + { + LL_DEBUGS("HUDEffect")<<"NULL-Object HUDEffectLookAt message" << LL_ENDL; + markDead(); + return; + } + if (source_object->isAvatar()) + { + source_avatar = (LLVOAvatar*)source_object; + } + else //kokua TODO: find out why this happens at all and fix there + { + LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectLookAt message for ID: " << source_object->getID().asString()<< LL_ENDL; + markDead(); + return; + } + bool is_self = source_avatar->isSelf(); + bool is_private = gSavedSettings.getBOOL("PrivateLookAtTarget"); + if (!is_self) //kokua TODO: find out why this happens at all and fix there + { + LL_DEBUGS("HUDEffect")<< "Non-self Avatar HUDEffectLookAt message for ID: " << source_avatar->getID().asString() << LL_ENDL; + markDead(); + return; + } + else if (is_private && target_type != LOOKAT_TARGET_AUTO_LISTEN) + { + //this mimicks "do nothing" + target_type = LOOKAT_TARGET_AUTO_LISTEN; + target_offset_global.setVec(2.5, 0.0, 0.0); + target_object = mSourceObject; + } + // Pack the default data + LLHUDEffect::packData(mesgsys); + // Pack the type-specific data. Uses a fun packed binary format. Whee! + U8 packed_data[PKT_SIZE]; + memset(packed_data, 0, PKT_SIZE); if (mSourceObject) { htonmemcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16); } - else + else //um ... we already returned ... how's that the case? { htonmemcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16); } - - // pack both target object and position - // position interpreted as offset if target object is non-null if (mTargetObject) { - htonmemcpy(&(packed_data[TARGET_OBJECT]), mTargetObject->mID.mData, MVT_LLUUID, 16); + htonmemcpy(&(packed_data[TARGET_OBJECT]), target_object->mID.mData, MVT_LLUUID, 16); } else { htonmemcpy(&(packed_data[TARGET_OBJECT]), LLUUID::null.mData, MVT_LLUUID, 16); } - htonmemcpy(&(packed_data[TARGET_POS]), mTargetOffsetGlobal.mdV, MVT_LLVector3d, 24); + htonmemcpy(&(packed_data[TARGET_POS]), target_offset_global.mdV, MVT_LLVector3d, 24); - U8 lookAtTypePacked = (U8)mTargetType; + U8 lookAtTypePacked = (U8)target_type; htonmemcpy(&(packed_data[LOOKAT_TYPE]), &lookAtTypePacked, MVT_U8, 1); @@ -358,11 +392,17 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum) { //llwarns << "Could not find target object for lookat effect" << llendl; } - U8 lookAtTypeUnpacked = 0; htonmemcpy(&lookAtTypeUnpacked, &(packed_data[LOOKAT_TYPE]), MVT_U8, 1); - mTargetType = (ELookAtType)lookAtTypeUnpacked; - + if ((U8)LOOKAT_NUM_TARGETS > lookAtTypeUnpacked) + { + mTargetType = (ELookAtType)lookAtTypeUnpacked; + } + else + { + mTargetType = LOOKAT_TARGET_NONE; + LL_DEBUGS("HUDEffect") << "Invalid target type: " << lookAtTypeUnpacked << LL_ENDL; + } if (mTargetType == LOOKAT_TARGET_NONE) { clearLookAtTarget(); diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index bfb0f150b3..fbaacbbe9b 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -98,6 +98,30 @@ LLHUDEffectPointAt::~LLHUDEffectPointAt() //----------------------------------------------------------------------------- void LLHUDEffectPointAt::packData(LLMessageSystem *mesgsys) { + LLViewerObject* source_object = (LLViewerObject*)mSourceObject; + if (!source_object) + { + markDead(); + return; + } + else if (!source_object->isAvatar()) + { + LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectPointAt message for ID: " + << source_object->getID().asString()<< LL_ENDL; + markDead(); + return; + } + else + { + LLVOAvatar* source_avatar = (LLVOAvatar*)source_object; + if (!source_avatar->isSelf()) + { + LL_DEBUGS("HUDEffect")<<"Non-self HUDEffectPointAt message for ID: " + << source_avatar->getID().asString()<< LL_ENDL; + markDead(); + return; + } + } // Pack the default data LLHUDEffect::packData(mesgsys); diff --git a/indra/newview/llhudmanager.cpp b/indra/newview/llhudmanager.cpp index 5f3178b955..60ef569168 100644 --- a/indra/newview/llhudmanager.cpp +++ b/indra/newview/llhudmanager.cpp @@ -99,7 +99,8 @@ void LLHUDManager::sendEffects() msg->nextBlockFast(_PREHASH_Effect); hep->packData(msg); hep->setNeedsSendToSim(FALSE); - gAgent.sendMessage(); + if (!hep->isDead()) //packData(msg) might have invalidated the effect + gAgent.sendMessage(); } } } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 182d0d9e8b..cd5e4002c1 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1702,6 +1702,49 @@ class LLAdvancedCheckShowPointAt : public view_listener_t }; +///////////////////// +// PRIVATE LOOK AT // +///////////////////// + +class LLAdvancedTogglePrivateLookPointAt : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string command = userdata.asString(); + if ("Look" == command) + { + bool new_value = !gSavedSettings.getBOOL("PrivateLookAtTarget"); + gSavedSettings.setBOOL("PrivateLookAtTarget", new_value); + } + else if ("Point" == command) + { + bool new_value = !gSavedSettings.getBOOL("PrivatePointAtTarget"); + gSavedSettings.setBOOL("PrivatePointAtTarget", new_value); + } + return true; + } +}; + +class LLAdvancedCheckPrivateLookPointAt : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string command = userdata["data"].asString(); + if ("Look" == command) + { + bool new_value = gSavedSettings.getBOOL("PrivateLookAtTarget"); + std::string control_name = userdata["control"].asString(); + gMenuHolder->findControl(control_name)->setValue(new_value); + } + else if ("Point" == command) + { + bool new_value = gSavedSettings.getBOOL("PrivatePointAtTarget"); + std::string control_name = userdata["control"].asString(); + gMenuHolder->findControl(control_name)->setValue(new_value); + } + return true; + } +}; ///////////////////////// // DEBUG JOINT UPDATES // @@ -8453,6 +8496,8 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedCheckShowLookAt(), "Advanced.CheckShowLookAt"); view_listener_t::addMenu(new LLAdvancedToggleShowPointAt(), "Advanced.ToggleShowPointAt"); view_listener_t::addMenu(new LLAdvancedCheckShowPointAt(), "Advanced.CheckShowPointAt"); + view_listener_t::addMenu(new LLAdvancedTogglePrivateLookPointAt(), "Advanced.TogglePrivateLookPointAt"); + view_listener_t::addMenu(new LLAdvancedCheckPrivateLookPointAt(), "Advanced.CheckPrivateLookPointAt"); view_listener_t::addMenu(new LLAdvancedToggleDebugJointUpdates(), "Advanced.ToggleDebugJointUpdates"); view_listener_t::addMenu(new LLAdvancedCheckDebugJointUpdates(), "Advanced.CheckDebugJointUpdates"); view_listener_t::addMenu(new LLAdvancedToggleDisableLOD(), "Advanced.ToggleDisableLOD"); diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3619e9ca39..4deda0580b 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3261,7 +3261,27 @@ - + + + + + + + +