summaryrefslogtreecommitdiff
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
parentca806315a98627b29a4933cbf8b27431ca43dd0f (diff)
parent3340eb8c7146c6690876e1927c19a11188210814 (diff)
merge
-rwxr-xr-xautobuild.xml4
-rwxr-xr-xindra/llui/llfloater.cpp13
-rwxr-xr-xindra/llui/llfloater.h2
-rwxr-xr-xindra/llui/llpanel.cpp4
-rwxr-xr-xindra/llui/llpanel.h2
-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
13 files changed, 116 insertions, 27 deletions
diff --git a/autobuild.xml b/autobuild.xml
index 06a70ea5ed..7cf6e23386 100755
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1291,9 +1291,9 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>df8857aeb5f44dfd95f9f9f57814423a</string>
+ <string>ddd6a49dd5bbb76216f73feafa26e65c</string>
<key>url</key>
- <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearanceutility-source/rev/275707/arch/Linux/installer/llappearanceutility_source-0.1-linux-20130511.tar.bz2</string>
+ <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearanceutility-source/rev/276989/arch/Linux/installer/llappearanceutility_source-0.1-linux-20130605.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index ae4961559e..93eca8b62e 100755
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -704,9 +704,9 @@ void LLFloater::openFloater(const LLSD& key)
dirtyRect();
}
-void LLFloater::verifyClose()
+void LLFloater::verifyClose( bool app_quitting )
{
- LLPanel::handleCloseConfirmation();
+ LLPanel::handleCloseConfirmation( app_quitting );
}
void LLFloater::closeFloater(bool app_quitting)
@@ -717,16 +717,21 @@ void LLFloater::closeFloater(bool app_quitting)
{
if ( mVerifyUponClose && !mForceCloseAfterVerify )
{
+
+ llinfos<<"prep#dogshit1"<<llendl;
onClose( app_quitting );
if ( mForceCloseAfterVerify )
{
+
+ llinfos<<"prep#dogshit1b"<<llendl;
return;
}
}
}
if (app_quitting)
- {
+ {
+ llinfos<<"prep#dogshit2"<<llendl;
LLFloater::sQuitting = true;
}
@@ -2659,7 +2664,7 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
{
if ( floaterp->mVerifyUponClose )
{
- floaterp->verifyClose();
+ floaterp->verifyClose(app_quitting);
}
else
{
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index bf71b527b3..8eb40ddd0b 100755
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -225,7 +225,7 @@ public:
// If allowed, close the floater cleanly, releasing focus.
virtual void closeFloater(bool app_quitting = false);
- virtual void verifyClose();
+ virtual void verifyClose( bool app_quitting = false );
// Close the floater or its host. Use when hidding or toggling a floater instance.
virtual void closeHostedFloater();
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 7b7920f866..b0bdbcb7d1 100755
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -354,11 +354,11 @@ void LLPanel::handleVisibilityChange ( BOOL new_visibility )
}
-void LLPanel::handleCloseConfirmation( )
+void LLPanel::handleCloseConfirmation( bool app_quitting)
{
if (mCloseConfirmationSignal)
{
- (*mCloseConfirmationSignal)(this, LLSD() );
+ (*mCloseConfirmationSignal)(this, LLSD( app_quitting ) );
}
}
void LLPanel::setFocus(BOOL b)
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index d48fab6dd9..02f8c0aba7 100755
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -116,7 +116,7 @@ public:
/*virtual*/ void draw();
/*virtual*/ BOOL handleKeyHere( KEY key, MASK mask );
/*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
- void handleCloseConfirmation( );
+ void handleCloseConfirmation( bool app_quitting );
// From LLFocusableElement
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);
+ }
}
}
}