diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2013-06-05 16:28:33 -0400 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2013-06-05 16:28:33 -0400 |
commit | a5e41af80978babb5e8046d390d6730f57423294 (patch) | |
tree | c734b7984172f523b4a1fd3d0fcd4b6cdeadd3ed /indra/newview | |
parent | ca806315a98627b29a4933cbf8b27431ca43dd0f (diff) | |
parent | 3340eb8c7146c6690876e1927c19a11188210814 (diff) |
merge
Diffstat (limited to 'indra/newview')
-rwxr-xr-x | indra/newview/llappearancemgr.cpp | 9 | ||||
-rwxr-xr-x | indra/newview/llappearancemgr.h | 2 | ||||
-rwxr-xr-x | indra/newview/llfloatersidepanelcontainer.cpp | 15 | ||||
-rwxr-xr-x | indra/newview/llfloatersidepanelcontainer.h | 3 | ||||
-rwxr-xr-x | indra/newview/llsidepanelappearance.cpp | 10 | ||||
-rwxr-xr-x | indra/newview/llviewerobject.cpp | 22 | ||||
-rwxr-xr-x | indra/newview/llviewerobject.h | 1 | ||||
-rwxr-xr-x | indra/newview/llvoavatar.cpp | 56 |
8 files changed, 101 insertions, 17 deletions
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 646b2d18dd..722587ec0e 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3276,6 +3276,15 @@ void LLAppearanceMgr::incrementCofVersion(LLHTTPClient::ResponderPtr responder_p LLHTTPClient::get(url, body, responder_ptr, headers, 30.0f); } +U32 LLAppearanceMgr::getNumAttachmentsInCOF() +{ + const LLUUID cof = getCOF(); + LLInventoryModel::item_array_t obj_items; + getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT); + return obj_items.size(); +} + + std::string LLAppearanceMgr::getAppearanceServiceURL() const { if (gSavedSettings.getString("DebugAvatarAppearanceServiceURLOverride").empty()) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 97f3283818..9eb26767c4 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -208,6 +208,8 @@ public: void incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr = NULL); + U32 getNumAttachmentsInCOF(); + // *HACK Remove this after server side texture baking is deployed on all sims. void incrementCofVersionLegacy(); diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 13a9ba1695..02216420da 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -40,7 +40,8 @@ const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel"); LLFloaterSidePanelContainer::LLFloaterSidePanelContainer(const LLSD& key, const Params& params) -: LLFloater(key, params) +: LLFloater(key, params) +, mAppQuiting( false ) { // Prevent transient floaters (e.g. IM windows) from hiding // when this floater is clicked. @@ -56,7 +57,8 @@ BOOL LLFloaterSidePanelContainer::postBuild() } void LLFloaterSidePanelContainer::onConfirmationClose( const LLSD &confirm ) -{ +{ + mAppQuiting = confirm.asBoolean(); onClickCloseBtn(); } @@ -69,10 +71,12 @@ LLFloaterSidePanelContainer::~LLFloaterSidePanelContainer() void LLFloaterSidePanelContainer::onOpen(const LLSD& key) { getChild<LLPanel>(sMainPanelName)->onOpen(key); + mAppQuiting = false; } -void LLFloaterSidePanelContainer::onClose(bool app_quitting) -{ - mForceCloseAfterVerify = true; + +void LLFloaterSidePanelContainer::onClose( bool app_quitting ) +{ + if (! mAppQuiting ) { mForceCloseAfterVerify = true; } LLSidepanelAppearance* panel = getSidePanelAppearance(); if ( panel ) { @@ -80,6 +84,7 @@ void LLFloaterSidePanelContainer::onClose(bool app_quitting) panel->onCloseFromAppearance( this ); } } + void LLFloaterSidePanelContainer::onClickCloseBtn() { LLSidepanelAppearance* panel = getSidePanelAppearance(); diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index dc85570f7e..b276821805 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -89,6 +89,9 @@ public: private: LLSidepanelAppearance* getSidePanelAppearance(); + +public: + bool mAppQuiting; }; #endif // LL_LLFLOATERSIDEPANELCONTAINER_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 70da576c83..775c148ea1 100755 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -151,11 +151,17 @@ bool LLSidepanelAppearance::callBackExitWithoutSaveViaClose(const LLSD& notifica toggleWearableEditPanel(FALSE); showOutfitEditPanel(); LLVOAvatarSelf::onCustomizeEnd( FALSE ); - mRevertSet = true; + if ( !mLLFloaterSidePanelContainer->mAppQuiting ) + { + mRevertSet = true; + } + else + { + mLLFloaterSidePanelContainer->closeFloater( true ); + } return false; } mLLFloaterSidePanelContainer->mForceCloseAfterVerify = false; - //mRevertSet = true; return false; } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 064e96e394..63de1ab77a 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5038,6 +5038,28 @@ void LLViewerObject::clearDrawableState(U32 state, BOOL recursive) } } +BOOL LLViewerObject::isDrawableState(U32 state, BOOL recursive) const +{ + BOOL matches = FALSE; + if (mDrawable) + { + matches = mDrawable->isState(state); + } + if (recursive) + { + for (child_list_t::const_iterator iter = mChildList.begin(); + (iter != mChildList.end()) && matches; iter++) + { + LLViewerObject* child = *iter; + matches &= child->isDrawableState(state, recursive); + } + } + + return matches; +} + + + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // RN: these functions assume a 2-level hierarchy //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 316dbce7d0..0390cbc5b0 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -394,6 +394,7 @@ public: void setDrawableState(U32 state, BOOL recursive = TRUE); void clearDrawableState(U32 state, BOOL recursive = TRUE); + BOOL isDrawableState(U32 state, BOOL recursive = TRUE) const; // Called when the drawable shifts virtual void onShift(const LLVector4a &shift_vector) { } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1dbcabf2b3..4593541f35 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5220,24 +5220,60 @@ void LLVOAvatar::computeBodySize() LLAvatarAppearance::computeBodySize(); // Certain configurations of avatars can force the overall height (with offset) to go negative. - // Enforce a constraint to make sure we don't go below 0.1 meters. + // Enforce a constraint to make sure we don't go below 1.1 meters (server-enforced limit) // Camera positioning and other things start to break down when your avatar is "walking" while being fully underground + const LLViewerObject * last_object = NULL; if (isSelf() && getWearableData() && isFullyLoaded() && !LLApp::isQuitting()) { - LLViewerWearable* shape = (LLViewerWearable*)getWearableData()->getWearable(LLWearableType::WT_SHAPE, 0); - if (shape && !shape->getVolitile()) + // Do not force a hover parameter change while we have pending attachments, which may be mesh-based with + // joint offsets. + if (LLAppearanceMgr::instance().getNumAttachmentsInCOF() == getNumAttachments()) { - F32 hover_value = shape->getVisualParamWeight(AVATAR_HOVER); - if (hover_value < 0.0f && (mBodySize.mV[VZ] + hover_value < 1.1f)) + LLViewerWearable* shape = (LLViewerWearable*)getWearableData()->getWearable(LLWearableType::WT_SHAPE, 0); + BOOL loaded = TRUE; + for (attachment_map_t::const_iterator points_iter = mAttachmentPoints.begin(); + points_iter != mAttachmentPoints.end() && loaded; + ++points_iter) { - hover_value = -(mBodySize.mV[VZ] - 1.1f); // avoid floating point rounding making the above check continue to fail. - llassert(mBodySize.mV[VZ] + hover_value >= 1.1f); + const LLViewerJointAttachment *attachment_pt = (*points_iter).second; + if (attachment_pt) + { + for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator attach_iter = attachment_pt->mAttachedObjects.begin(); attach_iter != attachment_pt->mAttachedObjects.end(); attach_iter++) + { + const LLViewerObject* object = (LLViewerObject*)*attach_iter; + if (object) + { + last_object = object; + llwarns << "attachment at point: " << (*points_iter).first << " object exists: " << object->getAttachmentItemID() << llendl; + loaded &=!object->isDrawableState(LLDrawable::REBUILD_ALL); + if (!loaded && shape && !shape->getVolitile()) + { + llwarns << "caught unloaded attachment! skipping enforcement" << llendl; + } + } + } + } + } - hover_value = llmin(hover_value, 0.0f); // don't force the hover value to be greater than 0. + if (last_object) + { + LL_DEBUGS("Avatar") << "scanned at least one object!" << LL_ENDL; + } + if (loaded && shape && !shape->getVolitile()) + { + F32 hover_value = shape->getVisualParamWeight(AVATAR_HOVER); + if (hover_value < 0.0f && (mBodySize.mV[VZ] + hover_value < 1.1f)) + { + hover_value = -(mBodySize.mV[VZ] - 1.1f); // avoid floating point rounding making the above check continue to fail. + llassert(mBodySize.mV[VZ] + hover_value >= 1.1f); + + hover_value = llmin(hover_value, 0.0f); // don't force the hover value to be greater than 0. - mAvatarOffset.mV[VZ] = hover_value; - shape->setVisualParamWeight(AVATAR_HOVER,hover_value, FALSE); + LL_DEBUGS("Avatar") << "changed hover value to: " << hover_value << " from: " << mAvatarOffset.mV[VZ] << LL_ENDL; + mAvatarOffset.mV[VZ] = hover_value; + shape->setVisualParamWeight(AVATAR_HOVER,hover_value, FALSE); + } } } } |