diff --git a/autobuild.xml b/autobuild.xml index 06a70ea5ed7ec3cf33c33182f4c0d054091a6faf..7cf6e23386ba3a032bf12526353bd792d6adfb1c 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 ae4961559ec8a6165409e688e46d73688608391f..93eca8b62ee5b42096133512f82d45e1d58c3978 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 bf71b527b326d926f7ce4e2617080566c4f5461a..8eb40ddd0bb578c07975301f7ad3cc17c93078c7 100755 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -225,7 +225,7 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater> // 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 7b7920f866ca975bc801b6d5eb13374a39b21c8b..b0bdbcb7d1db5ea9f39f1bf5b408168cb105a674 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 d48fab6dd9248cc2666d666a7fa84e3aaf32f564..02f8c0aba781cf80cb7c72bbac3e636380cd915d 100755 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -116,7 +116,7 @@ class LLPanel : public LLUICtrl, public LLBadgeHolder /*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 646b2d18dd699e5a1f2afc7b5a0acc9c98454a88..722587ec0eba11a760fe68593d274e442b47d5cf 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 97f328381877c861c3f226ce31f007e473bb98de..9eb26767c4711553ff1ff9db08d9eb9d20192e89 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -208,6 +208,8 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr> 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 13a9ba1695449889a909e77d26851a760411af00..02216420da22ba77c33f3056ac1401d375177a6f 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 dc85570f7e589bee6276b5e24ec3b8b1d212c265..b276821805b7f543346f57eb4bbedac7aef4de27 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -89,6 +89,9 @@ class LLFloaterSidePanelContainer : public LLFloater private: LLSidepanelAppearance* getSidePanelAppearance(); + +public: + bool mAppQuiting; }; #endif // LL_LLFLOATERSIDEPANELCONTAINER_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 70da576c83eab87c7e30d2d7b0b06c5c2df7c63a..775c148ea1401cf16e7ab06c212fc08794967f9d 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 064e96e3942905e6ca72a51440438565ad4c8587..63de1ab77a127bd2c35bcda44a975aa16d8ac5a4 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 316dbce7d07eca427072af14d06ef39f67c52e55..0390cbc5b00e42c29c4aaff3032c3341265d527a 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -394,6 +394,7 @@ class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate 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 1dbcabf2b3706156b774fc69b458c3a2e0c64757..4593541f357305fe2f41a09460431831ba6ac971 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); + } } } }