summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2013-06-05 16:28:33 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2013-06-05 16:28:33 -0400
commita5e41af80978babb5e8046d390d6730f57423294 (patch)
treec734b7984172f523b4a1fd3d0fcd4b6cdeadd3ed /indra/newview
parentca806315a98627b29a4933cbf8b27431ca43dd0f (diff)
parent3340eb8c7146c6690876e1927c19a11188210814 (diff)
merge
Diffstat (limited to 'indra/newview')
-rwxr-xr-xindra/newview/llappearancemgr.cpp9
-rwxr-xr-xindra/newview/llappearancemgr.h2
-rwxr-xr-xindra/newview/llfloatersidepanelcontainer.cpp15
-rwxr-xr-xindra/newview/llfloatersidepanelcontainer.h3
-rwxr-xr-xindra/newview/llsidepanelappearance.cpp10
-rwxr-xr-xindra/newview/llviewerobject.cpp22
-rwxr-xr-xindra/newview/llviewerobject.h1
-rwxr-xr-xindra/newview/llvoavatar.cpp56
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);
+ }
}
}
}