From 08c29aea25645dbfe76a04de9e703f49cf7ada85 Mon Sep 17 00:00:00 2001 From: Armin Weatherwax Date: Thu, 29 Jul 2010 16:13:19 +0200 Subject: some more HUDEffect revamp --- linden/indra/newview/app_settings/logcontrol.xml | 1 + linden/indra/newview/llhudeffectbeam.cpp | 25 +++++++- linden/indra/newview/llhudeffectlookat.cpp | 75 +++++++++++++--------- linden/indra/newview/llhudeffectpointat.cpp | 26 ++++++++ linden/indra/newview/llviewermenu.cpp | 43 ++++++++++--- .../skins/default/xui/en-us/menu_viewer.xml | 15 +++-- 6 files changed, 140 insertions(+), 45 deletions(-) diff --git a/linden/indra/newview/app_settings/logcontrol.xml b/linden/indra/newview/app_settings/logcontrol.xml index 1f84f49..281cc38 100644 --- a/linden/indra/newview/app_settings/logcontrol.xml +++ b/linden/indra/newview/app_settings/logcontrol.xml @@ -52,6 +52,7 @@ + diff --git a/linden/indra/newview/llhudeffectbeam.cpp b/linden/indra/newview/llhudeffectbeam.cpp index a7c1214..f6dff50 100644 --- a/linden/indra/newview/llhudeffectbeam.cpp +++ b/linden/indra/newview/llhudeffectbeam.cpp @@ -83,9 +83,30 @@ 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/linden/indra/newview/llhudeffectlookat.cpp b/linden/indra/newview/llhudeffectlookat.cpp index 1c24e7d..a997910 100644 --- a/linden/indra/newview/llhudeffectlookat.cpp +++ b/linden/indra/newview/llhudeffectlookat.cpp @@ -269,48 +269,65 @@ 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); - - if (mSourceObject) - { - htonmemcpy(&(packed_data[SOURCE_AVATAR]), mSourceObject->mID.mData, MVT_LLUUID, 16); - } - else - { - 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 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 && source_object->isAvatar()) //strange enough that non-avatar objects try to send a lookat message + if (!source_object) + { + markDead(); + return; + } + if (source_object->isAvatar()) //strange enough that non-objects try + //to send a lookat message ... { source_avatar = (LLVOAvatar*)source_object; } + else //... more strange if its an non-avatar object ... + { + LL_DEBUGS("HUDEffect")<<"Non-Avatar HUDEffectLookAt message for ID: " << source_object->getID().asString()<< LL_ENDL; + markDead(); + return; + } - if (source_avatar) + + bool is_self = source_avatar->isSelf(); + bool is_private = gSavedSettings.getBOOL("PrivateLookAtTarget"); + if (!is_self) //... very strange if it is not self. But happens. Also at local opensim. { - bool is_self = source_avatar->isSelf(); //more strange if it is not self. - bool is_private = gSavedSettings.getBOOL("PrivateLookAtTarget"); - - if (is_private && is_self) - { - //this mimicks "do nothing" - target_type = LOOKAT_TARGET_AUTO_LISTEN; - target_offset_global.setVec(2.5, 0.0, 0.0); - target_object = mSourceObject; - } + 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 //um ... we already returned ... how's that the case? + { + htonmemcpy(&(packed_data[SOURCE_AVATAR]), LLUUID::null.mData, MVT_LLUUID, 16); } if (mTargetObject) @@ -396,7 +413,7 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum) htonmemcpy(&lookAtTypeUnpacked, &(packed_data[LOOKAT_TYPE]), MVT_U8, 1); if (lookAtTypeUnpacked > 10) { - LL_DEBUGS("LookAt")<< "wrong lookAtTypeUnpacked: " << lookAtTypeUnpacked << LL_ENDL; + LL_DEBUGS("HUDEffect")<< "wrong lookAtTypeUnpacked: " << lookAtTypeUnpacked << LL_ENDL; lookAtTypeUnpacked = 0; } diff --git a/linden/indra/newview/llhudeffectpointat.cpp b/linden/indra/newview/llhudeffectpointat.cpp index 2b82748..17485cf 100644 --- a/linden/indra/newview/llhudeffectpointat.cpp +++ b/linden/indra/newview/llhudeffectpointat.cpp @@ -103,6 +103,32 @@ 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/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp index 6a7a818..4012505 100644 --- a/linden/indra/newview/llviewermenu.cpp +++ b/linden/indra/newview/llviewermenu.cpp @@ -10143,15 +10143,28 @@ class LLAdvancedTogglePrivateLookPointAt : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - // Noate: PrivateLookAtTarget also hides point at -- MC - bool new_value = !gSavedSettings.getBOOL("PrivateLookAtTarget"); - if (new_value) + std::string command = userdata.asString(); + if ("Look" == command) + { + bool new_value = !gSavedSettings.getBOOL("PrivateLookAtTarget"); + if (new_value) + { + // Disable show look at and show point at if you make yours private. It's only fair, after all -- MC + LLHUDEffectLookAt::sDebugLookAt = FALSE; + LLHUDEffectPointAt::sDebugPointAt = FALSE; + } + gSavedSettings.setBOOL("PrivateLookAtTarget", new_value); + } + else if ("Point" == command) { - // Disable show look at and show point at if you make yours private. It's only fair, after all -- MC - LLHUDEffectLookAt::sDebugLookAt = FALSE; - LLHUDEffectPointAt::sDebugPointAt = FALSE; + bool new_value = !gSavedSettings.getBOOL("PrivatePointAtTarget"); + + // do not disable show look at and show point at if you make yours private, + // since this only hides the arm motion while editing -- AW + + gSavedSettings.setBOOL("PrivatePointAtTarget", new_value); } - gSavedSettings.setBOOL("PrivateLookAtTarget", new_value); + return true; } }; @@ -10160,9 +10173,19 @@ class LLAdvancedCheckPrivateLookPointAt : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - bool new_value = gSavedSettings.getBOOL("PrivateLookAtTarget"); - std::string control_name = userdata["control"].asString(); - gMenuHolder->findControl(control_name)->setValue(new_value); + 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; } }; diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml index 5d97a60..8033ba7 100644 --- a/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml +++ b/linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml @@ -1860,12 +1860,19 @@ - + + userdata="Look" /> + userdata="Look" /> + + + + -- cgit v1.1