From 1b7b319ae22ac7598b7b3d75ccbec75263450e07 Mon Sep 17 00:00:00 2001 From: seth_productengine Date: Tue, 2 Aug 2011 00:16:13 +0300 Subject: SH-2170 WIP Object and land data added to new weights floater. The data is updated upon object selection change. The land data is displayed for the land containing the primary selected object. Loading indicators added for land impacts. --- indra/newview/llfloaterobjectweights.cpp | 135 +++++++++++++++++++-- indra/newview/llfloaterobjectweights.h | 22 +++- .../default/xui/en/floater_object_weights.xml | 38 +++++- 3 files changed, 183 insertions(+), 12 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index 93aa8dcf08..80a753757e 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -27,8 +27,34 @@ #include "llfloaterobjectweights.h" +#include "llparcel.h" + +#include "llfloaterreg.h" #include "lltextbox.h" +#include "llselectmgr.h" +#include "llviewerparcelmgr.h" + +/** + * Class LLLandImpactsObserver + * + * An observer class to monitor parcel selection and update + * the land impacts data from a parcel containing the selected object. + */ +class LLLandImpactsObserver : public LLParcelObserver +{ +public: + virtual void changed() + { + LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance("object_weights"); + if(object_weights_floater) + { + object_weights_floater->updateLandImpacts(); + } + } +}; + + LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) : LLFloater(key), mSelectedObjects(NULL), @@ -40,12 +66,22 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) mSelectedOnLand(NULL), mRezzedOnLand(NULL), mRemainingCapacity(NULL), - mTotalCapacity(NULL) + mTotalCapacity(NULL), + mLandImpactsObserver(NULL) { + mLandImpactsObserver = new LLLandImpactsObserver(); + LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver); } LLFloaterObjectWeights::~LLFloaterObjectWeights() { + mObjectSelection = NULL; + mParcelSelection = NULL; + + mSelectMgrConnection.disconnect(); + + LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver); + delete mLandImpactsObserver; } // virtual @@ -59,10 +95,10 @@ BOOL LLFloaterObjectWeights::postBuild() mSelectedServerWeight = getChild("server"); mSelectedDisplayWeight = getChild("display"); - mSelectedOnLand = getChild("used_download_weight"); - mRezzedOnLand = getChild("used_download_weight"); - mRemainingCapacity = getChild("used_download_weight"); - mTotalCapacity = getChild("used_download_weight"); + mSelectedOnLand = getChild("selected"); + mRezzedOnLand = getChild("rezzed_on_land"); + mRemainingCapacity = getChild("remaining_capacity"); + mTotalCapacity = getChild("total_capacity"); return TRUE; } @@ -70,15 +106,94 @@ BOOL LLFloaterObjectWeights::postBuild() // virtual void LLFloaterObjectWeights::onOpen(const LLSD& key) { - updateIfNothingSelected(); + mSelectMgrConnection = LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLFloaterObjectWeights::refresh, this)); + + mObjectSelection = LLSelectMgr::getInstance()->getEditSelection(); + mParcelSelection = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection(); + + refresh(); +} + +// virtual +void LLFloaterObjectWeights::onClose(bool app_quitting) +{ + mSelectMgrConnection.disconnect(); + + mObjectSelection = NULL; + mParcelSelection = NULL; } -void LLFloaterObjectWeights::toggleLoadingIndicators(bool visible) +void LLFloaterObjectWeights::updateLandImpacts() +{ + LLParcel *parcel = mParcelSelection->getParcel(); + if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty()) + { + updateIfNothingSelected(); + } + else + { + S32 selected_prims = parcel->getSelectedPrimCount(); + S32 rezzed_prims = parcel->getSimWidePrimCount(); + S32 total_capacity = parcel->getSimWideMaxPrimCapacity(); + + mSelectedOnLand->setText(llformat("%d", selected_prims)); + mRezzedOnLand->setText(llformat("%d", rezzed_prims)); + mRemainingCapacity->setText(llformat("%d", total_capacity - rezzed_prims)); + mTotalCapacity->setText(llformat("%d", total_capacity)); + + toggleLandImpactsLoadingIndicators(false); + } +} + +void LLFloaterObjectWeights::refresh() +{ + if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) + { + updateIfNothingSelected(); + } + else + { + S32 prim_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); + S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + + mSelectedObjects->setText(llformat("%d", link_count)); + mSelectedPrims->setText(llformat("%d", prim_count)); + + LLViewerObject* selected_object = mObjectSelection->getPrimaryObject(); + if (selected_object) + { + // Select a parcel at the currently selected object's position. + LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); + + toggleLandImpactsLoadingIndicators(true); + } + } +} + +void LLFloaterObjectWeights::toggleWeightsLoadingIndicators(bool visible) { childSetVisible("download_loading_indicator", visible); childSetVisible("physics_loading_indicator", visible); childSetVisible("server_loading_indicator", visible); childSetVisible("display_loading_indicator", visible); + + mSelectedDownloadWeight->setVisible(!visible); + mSelectedPhysicsWeight->setVisible(!visible); + mSelectedServerWeight->setVisible(!visible); + mSelectedDisplayWeight->setVisible(!visible); +} + +void LLFloaterObjectWeights::toggleLandImpactsLoadingIndicators(bool visible) +{ + childSetVisible("selected_loading_indicator", visible); + childSetVisible("rezzed_on_land_loading_indicator", visible); + childSetVisible("remaining_capacity_loading_indicator", visible); + childSetVisible("total_capacity_loading_indicator", visible); + + mSelectedOnLand->setVisible(!visible); + mRezzedOnLand->setVisible(!visible); + mRemainingCapacity->setVisible(!visible); + mTotalCapacity->setVisible(!visible); } void LLFloaterObjectWeights::updateIfNothingSelected() @@ -94,6 +209,10 @@ void LLFloaterObjectWeights::updateIfNothingSelected() mSelectedDisplayWeight->setText(text); mSelectedOnLand->setText(text); + mRezzedOnLand->setText(text); + mRemainingCapacity->setText(text); + mTotalCapacity->setText(text); - toggleLoadingIndicators(false); + toggleWeightsLoadingIndicators(false); + toggleLandImpactsLoadingIndicators(false); } diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h index 10e35ad7a7..82743a8aa7 100644 --- a/indra/newview/llfloaterobjectweights.h +++ b/indra/newview/llfloaterobjectweights.h @@ -29,6 +29,9 @@ #include "llfloater.h" +class LLLandImpactsObserver; +class LLObjectSelection; +class LLParcelSelection; class LLTextBox; class LLFloaterObjectWeights : public LLFloater @@ -36,15 +39,25 @@ class LLFloaterObjectWeights : public LLFloater public: LOG_CLASS(LLFloaterObjectWeights); + typedef LLSafeHandle LLObjectSelectionHandle; + typedef LLSafeHandle LLParcelSelectionHandle; + LLFloaterObjectWeights(const LLSD& key); ~LLFloaterObjectWeights(); /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); + + void updateLandImpacts(); private: - void toggleLoadingIndicators(bool visible); + void refresh(); + + void toggleWeightsLoadingIndicators(bool visible); + void toggleLandImpactsLoadingIndicators(bool visible); + void updateIfNothingSelected(); LLTextBox *mSelectedObjects; @@ -59,6 +72,13 @@ private: LLTextBox *mRezzedOnLand; LLTextBox *mRemainingCapacity; LLTextBox *mTotalCapacity; + + LLLandImpactsObserver *mLandImpactsObserver; + + LLObjectSelectionHandle mObjectSelection; + LLParcelSelectionHandle mParcelSelection; + + boost::signals2::connection mSelectMgrConnection; }; #endif //LL_LLFLOATEROBJECTWEIGHTS_H diff --git a/indra/newview/skins/default/xui/en/floater_object_weights.xml b/indra/newview/skins/default/xui/en/floater_object_weights.xml index f377386679..a73db3af32 100644 --- a/indra/newview/skins/default/xui/en/floater_object_weights.xml +++ b/indra/newview/skins/default/xui/en/floater_object_weights.xml @@ -222,6 +222,14 @@ top_pad="3" value="--" width="40" /> + + + @@ -279,12 +303,20 @@ top_pad="3" value="--" width="40" /> + @@ -303,7 +335,7 @@ height="16" layout="topleft" left="10" - name="total_capacity" + name="help_SLURL" top_pad="10" value="[secondlife:///www.secondlife.com What is all this?...]" width="180" /> -- cgit v1.2.3 From ef6e51db22ad3aec42b19bcf3e077ff000ba8929 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Sat, 6 Aug 2011 14:28:53 +0300 Subject: SH-2170 FIXED Detecting selection of objects that cross parcel bounds added. In this case the land impacts data is not displayed for such selection. --- indra/newview/llfloaterobjectweights.cpp | 36 ++++++++++++++++--- indra/newview/llviewerobject.cpp | 14 ++++++++ indra/newview/llviewerobject.h | 4 +++ indra/newview/llviewerparceloverlay.cpp | 59 ++++++++++++++++++++++++++++++++ indra/newview/llviewerparceloverlay.h | 1 + indra/newview/llviewerregion.cpp | 5 +++ indra/newview/llviewerregion.h | 1 + 7 files changed, 115 insertions(+), 5 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index 80a753757e..d39a93991f 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -34,6 +34,15 @@ #include "llselectmgr.h" #include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +struct LLCrossParcelFunctor : public LLSelectedObjectFunctor +{ + /*virtual*/ bool apply(LLViewerObject* obj) + { + return obj->crossesParcelBounds(); + } +}; /** * Class LLLandImpactsObserver @@ -159,13 +168,30 @@ void LLFloaterObjectWeights::refresh() mSelectedObjects->setText(llformat("%d", link_count)); mSelectedPrims->setText(llformat("%d", prim_count)); - LLViewerObject* selected_object = mObjectSelection->getPrimaryObject(); - if (selected_object) + LLCrossParcelFunctor func; + if (LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true)) { - // Select a parcel at the currently selected object's position. - LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); + // Some of the selected objects cross parcel bounds. + // We don't display land impacts in this case. + const std::string text = getString("nothing_selected"); + + mSelectedOnLand->setText(text); + mRezzedOnLand->setText(text); + mRemainingCapacity->setText(text); + mTotalCapacity->setText(text); - toggleLandImpactsLoadingIndicators(true); + toggleLandImpactsLoadingIndicators(false); + } + else + { + LLViewerObject* selected_object = mObjectSelection->getFirstObject(); + if (selected_object) + { + // Select a parcel at the currently selected object's position. + LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); + + toggleLandImpactsLoadingIndicators(true); + } } } } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b5fdca632b..34c73ee739 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -628,6 +628,20 @@ void LLViewerObject::constructAndAddReturnable( std::vector boxes; + boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned()); + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + LLViewerObject* child = *iter; + boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned()); + } + + return mRegionp && mRegionp->objectsCrossParcel(boxes); +} + BOOL LLViewerObject::setParent(LLViewerObject* parent) { if(mParent != parent) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 1828a64917..f27b825bbe 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -243,6 +243,10 @@ public: void buildReturnablesForChildrenVO( std::vector& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion ); void constructAndAddReturnable( std::vector& returnables, LLViewerObject* pChild, LLViewerRegion* pTargetRegion ); + // This method returns true if the object crosses + // any parcel bounds in the region. + bool crossesParcelBounds(); + /* // This method will scan through this object, and then query the // selection manager to see if the local agent probably has the diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index eff16b6a6e..e619b89f9b 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -201,6 +201,65 @@ bool LLViewerParcelOverlay::encroachesOnUnowned(const std::vector& boxes return false; } +bool LLViewerParcelOverlay::encroachesOnNearbyParcel(const std::vector& boxes) const +{ + // boxes are expected to already be axis aligned + for (U32 i = 0; i < boxes.size(); ++i) + { + LLVector3 min = boxes[i].getMinAgent(); + LLVector3 max = boxes[i].getMaxAgent(); + + // If an object crosses region borders it crosses a parcel + if ( min.mV[VX] < 0 + || min.mV[VY] < 0 + || max.mV[VX] > REGION_WIDTH_METERS + || max.mV[VY] > REGION_WIDTH_METERS) + { + return true; + } + + S32 left = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + S32 right = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + S32 bottom = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + S32 top = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1)); + + const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge; + + for (S32 row = bottom; row <= top; row++) + { + for (S32 col = left; col <= right; col++) + { + // This is not the rightmost column + if (col < GRIDS_PER_EDGE-1) + { + U8 east_overlay = mOwnership[row*GRIDS_PER_EDGE+col+1]; + // If the column to the east of the current one marks + // the other parcel's west edge and the box extends + // to the west it crosses the parcel border. + if ((east_overlay & PARCEL_WEST_LINE) && col < right) + { + return true; + } + } + + // This is not the topmost column + if (row < GRIDS_PER_EDGE-1) + { + U8 north_overlay = mOwnership[(row+1)*GRIDS_PER_EDGE+col]; + // If the row to the north of the current one marks + // the other parcel's south edge and the box extends + // to the south it crosses the parcel border. + if ((north_overlay & PARCEL_SOUTH_LINE) && row < top) + { + return true; + } + } + } + } + } + return false; +} + BOOL LLViewerParcelOverlay::isSoundLocal(const LLVector3& pos) const { S32 row = S32(pos.mV[VY] / PARCEL_GRID_STEP_METERS); diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index 3c6794e7d0..7445d5bf1d 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -61,6 +61,7 @@ public: // bounding boxes which isn't perfect, but is close bool encroachesOwned(const std::vector& boxes) const; bool encroachesOnUnowned(const std::vector& boxes) const; + bool encroachesOnNearbyParcel(const std::vector& boxes) const; BOOL isSoundLocal(const LLVector3& pos) const; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 5be2234ec2..7ebfcc2b5a 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1784,6 +1784,11 @@ bool LLViewerRegion::childrenObjectReturnable( const std::vector& boxes return result; } +bool LLViewerRegion::objectsCrossParcel(const std::vector& boxes) const +{ + return mParcelOverlay && mParcelOverlay->encroachesOnNearbyParcel(boxes); +} + void LLViewerRegion::getNeighboringRegions( std::vector& uniqueRegions ) { mImpl->mLandp->getNeighboringRegions( uniqueRegions ); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index b3c19ea58d..c86c30b93c 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -322,6 +322,7 @@ public: bool objectIsReturnable(const LLVector3& pos, const std::vector& boxes) const; bool childrenObjectReturnable( const std::vector& boxes ) const; + bool objectsCrossParcel(const std::vector& boxes) const; void getNeighboringRegions( std::vector& uniqueRegions ); -- cgit v1.2.3 From 350894fc0b7b3b806350f3409765105cdf73d3e9 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Thu, 11 Aug 2011 02:00:56 +0300 Subject: SH-2064 FIXED 'Upload' button disabled while mesh upload is in progress. --- indra/newview/llfloatermodelpreview.cpp | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 95dcf8ba1e..dd30671aaa 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -429,8 +429,6 @@ BOOL LLFloaterModelPreview::postBuild() childDisable("upload_skin"); childDisable("upload_joints"); - - childDisable("ok_btn"); mViewOptionMenuButton = getChild("options_gear_btn"); @@ -775,8 +773,6 @@ void LLFloaterModelPreview::draw() } } - childSetEnabled("ok_btn", mHasUploadPerm && !mUploadModelUrl.empty()); - childSetTextArg("prim_cost", "[PRIM_COST]", llformat("%d", mModelPreview->mResourceCost)); childSetTextArg("description_label", "[TEXTURES]", llformat("%d", mModelPreview->mTextureSet.size())); @@ -3004,14 +3000,6 @@ U32 LLModelPreview::calcResourceCost() rebuildUploadData(); - if (mFMP && mModelLoader) - { - if ( getLoadState() < LLModelLoader::ERROR_PARSING) - { - mFMP->childEnable("ok_btn"); - } - } - //Upload skin is selected BUT check to see if the joints coming in from the asset were malformed. if ( mFMP && mFMP->childGetValue("upload_skin").asBoolean() ) { @@ -3140,11 +3128,6 @@ void LLModelPreview::rebuildUploadData() F32 max_scale = 0.f; - if ( mBaseScene.size() > 0) - { - mFMP->childEnable("ok_btn"); - } - //reorder materials to match mBaseModel for (U32 i = 0; i < LLModel::NUM_LODS; i++) { @@ -4245,11 +4228,7 @@ void LLModelPreview::updateStatusMessages() } } - if ( upload_ok && !errorStateFromLoader && skinAndRigOk && !has_degenerate) - { - mFMP->childEnable("ok_btn"); - } - else + if (!upload_ok || errorStateFromLoader || !skinAndRigOk || has_degenerate) { mFMP->childDisable("ok_btn"); } @@ -5438,6 +5417,8 @@ void LLFloaterModelPreview::onUpload(void* user_data) LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data; + mp->mUploadBtn->setEnabled(false); + mp->mModelPreview->rebuildUploadData(); bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean(); @@ -5586,6 +5567,7 @@ void LLFloaterModelPreview::onModelUploadFailure() { assert_main_thread(); toggleCalculateButton(true); + mUploadBtn->setEnabled(true); } S32 LLFloaterModelPreview::DecompRequest::statusCallback(const char* status, S32 p1, S32 p2) -- cgit v1.2.3 From c70a357a274d5acd7921c3185dc34b89069d4e61 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Wed, 10 Aug 2011 18:59:10 +0300 Subject: SH-2076 FIXED Removed the sculpt type 'None' from edit dialog. If a prim's sculpt type was set to 'None' it is displayed as 'Plane' in the combo box. --- indra/newview/llpanelobject.cpp | 13 +++++++++++-- indra/newview/skins/default/xui/en/floater_tools.xml | 12 ++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index c222bbb191..e4b2396bc6 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1112,7 +1112,16 @@ void LLPanelObject::getState( ) if (mCtrlSculptType) { - mCtrlSculptType->setCurrentByIndex(sculpt_stitching); + if (sculpt_stitching == LL_SCULPT_TYPE_NONE) + { + // since 'None' is no longer an option in the combo box + // use 'Plane' as an equivalent sculpt type + mCtrlSculptType->setCurrentByID(LLSD(LL_SCULPT_TYPE_PLANE)); + } + else + { + mCtrlSculptType->setCurrentByID(LLSD(sculpt_stitching)); + } mCtrlSculptType->setEnabled(editable && !isMesh); } @@ -1749,7 +1758,7 @@ void LLPanelObject::sendSculpt() U8 sculpt_type = 0; if (mCtrlSculptType) - sculpt_type |= mCtrlSculptType->getCurrentIndex(); + sculpt_type |= mCtrlSculptType->getValue().asInteger(); bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH; diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index e794a7067d..03d6c84266 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1999,26 +1999,22 @@ even though the user gets a free copy. top_pad="4" visible="false" width="150"> - + value="1" /> + value="2" /> + value="3" /> + value="4" /> Date: Wed, 17 Aug 2011 01:42:21 +0300 Subject: SH-2171 FIXED New prim weights added to weights detail floater. - Fixed detecting cross-parcel objects selection. - Various fixes in LLAccountingCostManager. - getSelectedObjectRenderCost() moved from LLFloaterTools to LLObjectSelection where it used to reside. Previous commented out implementation of this method removed. --- indra/newview/llaccountingcostmanager.cpp | 66 ++++++++++--------- indra/newview/llaccountingcostmanager.h | 20 +++++- indra/newview/llfloaterobjectweights.cpp | 102 +++++++++++++++++++++++++++--- indra/newview/llfloaterobjectweights.h | 7 +- indra/newview/llfloatertools.cpp | 36 ++--------- indra/newview/llfloatertools.h | 1 - indra/newview/llselectmgr.cpp | 34 +++++----- 7 files changed, 175 insertions(+), 91 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llaccountingcostmanager.cpp b/indra/newview/llaccountingcostmanager.cpp index 5059efbeec..0669bdfffa 100644 --- a/indra/newview/llaccountingcostmanager.cpp +++ b/indra/newview/llaccountingcostmanager.cpp @@ -29,7 +29,6 @@ #include "llagent.h" #include "llcurl.h" #include "llhttpclient.h" - //=============================================================================== LLAccountingCostManager::LLAccountingCostManager() { @@ -38,8 +37,9 @@ LLAccountingCostManager::LLAccountingCostManager() class LLAccountingCostResponder : public LLCurl::Responder { public: - LLAccountingCostResponder( const LLSD& objectIDs ) - : mObjectIDs( objectIDs ) + LLAccountingCostResponder( const LLSD& objectIDs, const LLHandle& observer_handle ) + : mObjectIDs( objectIDs ), + mObserverHandle( observer_handle ) { } @@ -55,6 +55,12 @@ public: { llwarns << "Transport error "<setErrorStatus(statusNum, reason); + } } void result( const LLSD& content ) @@ -63,43 +69,43 @@ public: if ( !content.isMap() || content.has("error") ) { llwarns << "Error on fetched data"<< llendl; - clearPendingRequests(); - return; } - - bool containsSelection = content.has("selected"); - if ( containsSelection ) + else if (content.has("selected")) { - S32 dataCount = content["selected"].size(); - - for(S32 i = 0; i < dataCount; i++) - { + F32 physicsCost = 0.0f; + F32 networkCost = 0.0f; + F32 simulationCost = 0.0f; + + //LLTransactionID transactionID; - F32 physicsCost = 0.0f; - F32 networkCost = 0.0f; - F32 simulationCost = 0.0f; - - //LLTransactionID transactionID; - - //transactionID = content["selected"][i]["local_id"].asUUID(); - physicsCost = content["selected"][i]["physics"].asReal(); - networkCost = content["selected"][i]["streaming"].asReal(); - simulationCost = content["selected"][i]["simulation"].asReal(); - - SelectionCost selectionCost( /*transactionID,*/ physicsCost, networkCost, simulationCost ); - - //How do you want to handle the updating of the invoking object/ui element? + //transactionID = content["selected"][i]["local_id"].asUUID(); + physicsCost = content["selected"]["physics"].asReal(); + networkCost = content["selected"]["streaming"].asReal(); + simulationCost = content["selected"]["simulation"].asReal(); + SelectionCost selectionCost( /*transactionID,*/ physicsCost, networkCost, simulationCost ); + + LLAccountingCostObserver* observer = mObserverHandle.get(); + if (observer) + { + observer->onWeightsUpdate(selectionCost); } } + + clearPendingRequests(); } private: //List of posted objects LLSD mObjectIDs; + + // Cost update observer handle + LLHandle mObserverHandle; }; //=============================================================================== -void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, const std::string& url ) +void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, + const std::string& url, + const LLHandle& observer_handle ) { // Invoking system must have already determined capability availability if ( !url.empty() ) @@ -115,7 +121,7 @@ void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, const st // Check to see if a request for this object has already been made. if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() ) { - mObjectList.insert( *IDIter ); + mPendingObjectQuota.insert( *IDIter ); objectList[objectIndex++] = *IDIter; } } @@ -133,7 +139,7 @@ void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, const st else if ( selectionType == Prims ) { - keystr="prim_roots"; + keystr="selected_prims"; } else { @@ -146,7 +152,7 @@ void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, const st LLSD dataToPost = LLSD::emptyMap(); dataToPost[keystr.c_str()] = objectList; - LLHTTPClient::post( url, dataToPost, new LLAccountingCostResponder( objectList )); + LLHTTPClient::post( url, dataToPost, new LLAccountingCostResponder( objectList, observer_handle )); } } else diff --git a/indra/newview/llaccountingcostmanager.h b/indra/newview/llaccountingcostmanager.h index 8ae696a98d..cccdc2e2d9 100644 --- a/indra/newview/llaccountingcostmanager.h +++ b/indra/newview/llaccountingcostmanager.h @@ -27,8 +27,24 @@ #ifndef LL_ACCOUNTINGQUOTAMANAGER_H #define LL_ACCOUNTINGQUOTAMANAGER_H //=============================================================================== +#include "llhandle.h" + #include "llaccountingcost.h" //=============================================================================== +// An interface class for panels which display the parcel accounting information. +class LLAccountingCostObserver +{ +public: + LLAccountingCostObserver() { mObserverHandle.bind(this); } + virtual ~LLAccountingCostObserver() {} + virtual void onWeightsUpdate(const SelectionCost& selection_cost) = 0; + virtual void setErrorStatus(U32 status, const std::string& reason) = 0; + const LLHandle& getObserverHandle() const { return mObserverHandle; } + +protected: + LLRootHandle mObserverHandle; +}; +//=============================================================================== class LLAccountingCostManager : public LLSingleton { public: @@ -37,7 +53,8 @@ public: //Store an object that will be eventually fetched void addObject( const LLUUID& objectID ); //Request quotas for object list - void fetchCosts( eSelectionType selectionType, const std::string& url ); + void fetchCosts( eSelectionType selectionType, const std::string& url, + const LLHandle& observer_handle ); //Delete a specific object from the pending list void removePendingObject( const LLUUID& objectID ); @@ -52,4 +69,3 @@ private: //=============================================================================== #endif // LLACCOUNTINGCOSTMANAGER - diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index d39a93991f..7ad34431fb 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -32,16 +32,48 @@ #include "llfloaterreg.h" #include "lltextbox.h" +#include "llagent.h" #include "llselectmgr.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" +/** + * struct LLCrossParcelFunctor + * + * A functor that checks whether a bounding box for all + * selected objects crosses a region or parcel bounds. + */ struct LLCrossParcelFunctor : public LLSelectedObjectFunctor { /*virtual*/ bool apply(LLViewerObject* obj) { - return obj->crossesParcelBounds(); + // Add the root object box. + mBoundingBox.addBBoxAgent(LLBBox(obj->getPositionRegion(), obj->getRotationRegion(), obj->getScale() * -0.5f, obj->getScale() * 0.5f).getAxisAligned()); + + // Extend the bounding box across all the children. + LLViewerObject::const_child_list_t children = obj->getChildren(); + for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); + iter != children.end(); iter++) + { + LLViewerObject* child = *iter; + mBoundingBox.addBBoxAgent(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned()); + } + + bool result = false; + + LLViewerRegion* region = obj->getRegion(); + if (region) + { + std::vector boxes; + boxes.push_back(mBoundingBox); + result = region->objectsCrossParcel(boxes); + } + + return result; } + +private: + LLBBox mBoundingBox; }; /** @@ -132,6 +164,32 @@ void LLFloaterObjectWeights::onClose(bool app_quitting) mParcelSelection = NULL; } +// virtual +void LLFloaterObjectWeights::onWeightsUpdate(const SelectionCost& selection_cost) +{ + mSelectedDownloadWeight->setText(llformat("%.1f", selection_cost.mNetworkCost)); + mSelectedPhysicsWeight->setText(llformat("%.1f", selection_cost.mPhysicsCost)); + mSelectedServerWeight->setText(llformat("%.1f", selection_cost.mSimulationCost)); + + S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); + mSelectedDisplayWeight->setText(llformat("%d", render_cost)); + + toggleWeightsLoadingIndicators(false); +} + +//virtual +void LLFloaterObjectWeights::setErrorStatus(U32 status, const std::string& reason) +{ + const std::string text = getString("nothing_selected"); + + mSelectedDownloadWeight->setText(text); + mSelectedPhysicsWeight->setText(text); + mSelectedServerWeight->setText(text); + mSelectedDisplayWeight->setText(text); + + toggleWeightsLoadingIndicators(false); +} + void LLFloaterObjectWeights::updateLandImpacts() { LLParcel *parcel = mParcelSelection->getParcel(); @@ -141,11 +199,9 @@ void LLFloaterObjectWeights::updateLandImpacts() } else { - S32 selected_prims = parcel->getSelectedPrimCount(); S32 rezzed_prims = parcel->getSimWidePrimCount(); S32 total_capacity = parcel->getSimWideMaxPrimCapacity(); - mSelectedOnLand->setText(llformat("%d", selected_prims)); mRezzedOnLand->setText(llformat("%d", rezzed_prims)); mRemainingCapacity->setText(llformat("%d", total_capacity - rezzed_prims)); mTotalCapacity->setText(llformat("%d", total_capacity)); @@ -156,26 +212,29 @@ void LLFloaterObjectWeights::updateLandImpacts() void LLFloaterObjectWeights::refresh() { - if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) + LLSelectMgr* sel_mgr = LLSelectMgr::getInstance(); + + if (sel_mgr->getSelection()->isEmpty()) { updateIfNothingSelected(); } else { - S32 prim_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); - S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); + S32 prim_count = sel_mgr->getSelection()->getObjectCount(); + S32 link_count = sel_mgr->getSelection()->getRootObjectCount(); + F32 prim_equiv = sel_mgr->getSelection()->getSelectedLinksetCost(); mSelectedObjects->setText(llformat("%d", link_count)); mSelectedPrims->setText(llformat("%d", prim_count)); + mSelectedOnLand->setText(llformat("%.1d", (S32)prim_equiv)); LLCrossParcelFunctor func; - if (LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true)) + if (sel_mgr->getSelection()->applyToRootObjects(&func, true)) { // Some of the selected objects cross parcel bounds. - // We don't display land impacts in this case. + // We don't display object weights and land impacts in this case. const std::string text = getString("nothing_selected"); - mSelectedOnLand->setText(text); mRezzedOnLand->setText(text); mRemainingCapacity->setText(text); mTotalCapacity->setText(text); @@ -192,6 +251,31 @@ void LLFloaterObjectWeights::refresh() toggleLandImpactsLoadingIndicators(true); } + else + { + llwarns << "Failed to get selected object" << llendl; + } + } + + LLViewerRegion* region = gAgent.getRegion(); + if (region && region->capabilitiesReceived()) + { + for (LLObjectSelection::valid_root_iterator iter = sel_mgr->getSelection()->valid_root_begin(); + iter != sel_mgr->getSelection()->valid_root_end(); ++iter) + { + LLAccountingCostManager::getInstance()->addObject((*iter)->getObject()->getID()); + } + + std::string url = region->getCapability("ResourceCostSelected"); + if (!url.empty()) + { + LLAccountingCostManager::getInstance()->fetchCosts(Roots, url, getObserverHandle()); + toggleWeightsLoadingIndicators(true); + } + } + else + { + llwarns << "Failed to get region capabilities" << llendl; } } } diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h index 82743a8aa7..50d028909e 100644 --- a/indra/newview/llfloaterobjectweights.h +++ b/indra/newview/llfloaterobjectweights.h @@ -29,12 +29,14 @@ #include "llfloater.h" +#include "llaccountingcostmanager.h" + class LLLandImpactsObserver; class LLObjectSelection; class LLParcelSelection; class LLTextBox; -class LLFloaterObjectWeights : public LLFloater +class LLFloaterObjectWeights : public LLFloater, LLAccountingCostObserver { public: LOG_CLASS(LLFloaterObjectWeights); @@ -50,6 +52,9 @@ public: /*virtual*/ void onOpen(const LLSD& key); /*virtual*/ void onClose(bool app_quitting); + /*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost); + /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); + void updateLandImpacts(); private: diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 00a0da3cde..157b66b0ac 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -435,7 +435,8 @@ void LLFloaterTools::refresh() if (sShowObjectCost) { std::string prim_cost_string; - LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost()); + S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); + LLResMgr::getInstance()->getIntegerString(prim_cost_string, render_cost); getChild("RenderingCost")->setTextArg("[COUNT]", prim_cost_string); } @@ -479,8 +480,10 @@ void LLFloaterTools::refresh() { selection_info << ","; + S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); + childSetTextArg("selection_weight", "[PHYS_WEIGHT]", llformat("%.1f", link_phys_cost)); - childSetTextArg("selection_weight", "[DISP_WEIGHT]", llformat("%.1d", calcRenderCost())); + childSetTextArg("selection_weight", "[DISP_WEIGHT]", llformat("%.1d", render_cost)); } else { @@ -1014,35 +1017,6 @@ void LLFloaterTools::onClickGridOptions() //floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE); } -S32 LLFloaterTools::calcRenderCost() -{ - S32 cost = 0; - std::set textures; - - for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin(); - selection_iter != LLSelectMgr::getInstance()->getSelection()->end(); - ++selection_iter) - { - LLSelectNode *select_node = *selection_iter; - if (select_node) - { - LLViewerObject *vobj = select_node->getObject(); - if (vobj->getVolume()) - { - LLVOVolume* volume = (LLVOVolume*) vobj; - - cost += volume->getRenderCost(textures); - cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; - textures.clear(); - } - } - } - - - return cost; -} - - // static void LLFloaterTools::setEditTool(void* tool_pointer) { diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 69636190fc..8c4cb721d3 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -113,7 +113,6 @@ private: static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response); static void setObjectType( LLPCode pcode ); void onClickGridOptions(); - S32 calcRenderCost(); public: LLButton *mBtnFocus; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 8fa4065fa6..7ff58f5d34 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6522,32 +6522,32 @@ U32 LLObjectSelection::getSelectedObjectTriangleCount() return count; } -/*S32 LLObjectSelection::getSelectedObjectRenderCost() +S32 LLObjectSelection::getSelectedObjectRenderCost() { S32 cost = 0; - LLVOVolume::texture_cost_t textures; - for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter) - { - LLSelectNode* node = *iter; - LLVOVolume* object = (LLVOVolume*)node->getObject(); - - if (object) - { - cost += object->getRenderCost(textures); - } + std::set textures; - for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) + for (list_t::iterator selection_iter = mList.begin(); selection_iter != mList.end(); + ++selection_iter) + { + LLSelectNode *select_node = *selection_iter; + if (select_node) { - // add the cost of each individual texture in the linkset - cost += iter->second; + LLViewerObject *vobj = select_node->getObject(); + if (vobj->getVolume()) + { + LLVOVolume* volume = (LLVOVolume*) vobj; + + cost += volume->getRenderCost(textures); + cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST; + textures.clear(); + } } - textures.clear(); } return cost; -}*/ - +} //----------------------------------------------------------------------------- // getTECount() -- cgit v1.2.3 From 1d4ccaeb74641ebf199072c8568e26f8fe002d32 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Wed, 17 Aug 2011 16:29:20 +0300 Subject: SH-2285 FIXED Add localization capability to mesh uploader strings - Added the convex decomposition strings to the strings.xml - Added names to hardcoded strings. --- indra/newview/llfloatermodelpreview.cpp | 7 +++++- .../skins/default/xui/en/floater_model_preview.xml | 28 +++++++++++----------- indra/newview/skins/default/xui/en/strings.xml | 8 +++++++ 3 files changed, 28 insertions(+), 15 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index c8f4c3ac36..609fb42cc6 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -96,6 +96,7 @@ #include "llsliderctrl.h" #include "llspinctrl.h" #include "lltoggleablemenu.h" +#include "lltrans.h" #include "llvfile.h" #include "llvfs.h" #include "llcallbacklist.h" @@ -1154,7 +1155,11 @@ void LLFloaterModelPreview::initDecompControls() //llinfos << param[i].mDetails.mEnumValues.mEnumsArray[k].mValue // << " - " << param[i].mDetails.mEnumValues.mEnumsArray[k].mName << llendl; - combo_box->add(param[i].mDetails.mEnumValues.mEnumsArray[k].mName, + std::string name(param[i].mDetails.mEnumValues.mEnumsArray[k].mName); + std::string localized_name; + bool is_localized = LLTrans::findString(localized_name, name); + + combo_box->add(is_localized ? localized_name : name, LLSD::Integer(param[i].mDetails.mEnumValues.mEnumsArray[k].mValue)); } combo_box->setValue(param[i].mDefault.mIntOrEnumValue); diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index c52f48cfaf..ec18f1948b 100755 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -220,9 +220,9 @@ L$ [MODEL] Select Level of Detail: - - - + + + @@ -268,7 +268,7 @@ L$ [MODEL] border="true" bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - + Mesh @@ -350,7 +350,7 @@ L$ [MODEL] border="true" bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - + Generate Normals @@ -422,15 +422,15 @@ L$ [MODEL] border="true" bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - + Step 1: Analysis - + Method: - + Quality: @@ -456,11 +456,11 @@ L$ [MODEL] border="true" bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> - + Step 2: Simplification - + Method: @@ -509,10 +509,10 @@ L$ [MODEL] name="modifiers_panel" help_topic="upload_model_modifiers"> - + Scale: - + Dimensions: @@ -522,7 +522,7 @@ L$ [MODEL] [X] x [Y] x [Z] m - + Include: @@ -530,7 +530,7 @@ L$ [MODEL] - + Pelvis Z Offset: diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f049f857f0..72b412efe2 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3625,5 +3625,13 @@ Try enclosing path to the editor with double quotes. Viewing sound beacons (yellow) Viewing media beacons (white) Hiding Particles + + + Retain% + Detail + Better Detail + Surface + Solid + Wrap -- cgit v1.2.3 From 0540b3b07667698fd50f693b56001fa3f3f00689 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Wed, 17 Aug 2011 17:59:11 +0300 Subject: SH-1868 FIXED Support initial user-supplied metric data for upload - Added initial value to the combobox --- indra/newview/skins/default/xui/en/floater_model_preview.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index ec18f1948b..7c6896becf 100755 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -40,6 +40,7 @@ name="model_category_combo" width="200"> + -- cgit v1.2.3 From 94f3432871d8512d04447cec3345694bf04537c9 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 18 Aug 2011 11:22:55 -0400 Subject: Remove ShowAdvancedBuilderOptions, now always enabled --- indra/newview/app_settings/settings.xml | 11 ----------- indra/newview/llfloatertools.cpp | 22 ++++++++-------------- 2 files changed, 8 insertions(+), 25 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 01842d1037..48a35a3218 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9481,17 +9481,6 @@ Value 0 - ShowAdvancedBuilderOptions - - Comment - Shows physics and display weight - Persist - 1 - Type - Boolean - Value - 0 - ShowAdvancedGraphicsSettings Comment diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 157b66b0ac..48aeeafcfd 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -460,7 +460,6 @@ void LLFloaterTools::refresh() std::ostringstream selection_info; - bool show_adv_weight = gSavedSettings.getBOOL("ShowAdvancedBuilderOptions"); bool show_mesh_cost = gMeshRepo.meshRezEnabled(); if (show_mesh_cost) @@ -476,24 +475,19 @@ void LLFloaterTools::refresh() selection_info << getString("status_selectcount", selection_args); - if (show_adv_weight) - { - selection_info << ","; - S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); + selection_info << ","; + + S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); + + childSetTextArg("selection_weight", "[PHYS_WEIGHT]", llformat("%.1f", link_phys_cost)); + childSetTextArg("selection_weight", "[DISP_WEIGHT]", llformat("%.1d", render_cost)); - childSetTextArg("selection_weight", "[PHYS_WEIGHT]", llformat("%.1f", link_phys_cost)); - childSetTextArg("selection_weight", "[DISP_WEIGHT]", llformat("%.1d", render_cost)); - } - else - { - selection_info<<"."; - } getChild("selection_count")->setText(selection_info.str()); bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); childSetVisible("selection_count", have_selection); - childSetVisible("selection_weight", have_selection && show_adv_weight); + childSetVisible("selection_weight", have_selection); childSetVisible("selection_empty", !have_selection); } @@ -764,7 +758,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); getChildView("selection_count")->setVisible(!land_visible && have_selection); - getChildView("selection_weight")->setVisible(!land_visible && have_selection && gSavedSettings.getBOOL("ShowAdvancedBuilderOptions")); + getChildView("selection_weight")->setVisible(!land_visible && have_selection); getChildView("selection_empty")->setVisible(!land_visible && !have_selection); mTab->setVisible(!land_visible); -- cgit v1.2.3