From 6c7653c65bd3f9907bcd4a8a54e4e5c1d172d15e Mon Sep 17 00:00:00 2001 From: seth_productengine Date: Thu, 28 Jul 2011 18:41:43 +0300 Subject: SH-2169 FIXED New object weights floater added. --- indra/newview/llfloaterobjectweights.cpp | 99 ++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 indra/newview/llfloaterobjectweights.cpp (limited to 'indra/newview/llfloaterobjectweights.cpp') diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp new file mode 100644 index 0000000000..93aa8dcf08 --- /dev/null +++ b/indra/newview/llfloaterobjectweights.cpp @@ -0,0 +1,99 @@ +/** + * @file llfloaterobjectweights.cpp + * @brief Object weights advanced view floater + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ +#include "llviewerprecompiledheaders.h" + +#include "llfloaterobjectweights.h" + +#include "lltextbox.h" + +LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) +: LLFloater(key), + mSelectedObjects(NULL), + mSelectedPrims(NULL), + mSelectedDownloadWeight(NULL), + mSelectedPhysicsWeight(NULL), + mSelectedServerWeight(NULL), + mSelectedDisplayWeight(NULL), + mSelectedOnLand(NULL), + mRezzedOnLand(NULL), + mRemainingCapacity(NULL), + mTotalCapacity(NULL) +{ +} + +LLFloaterObjectWeights::~LLFloaterObjectWeights() +{ +} + +// virtual +BOOL LLFloaterObjectWeights::postBuild() +{ + mSelectedObjects = getChild("objects"); + mSelectedPrims = getChild("prims"); + + mSelectedDownloadWeight = getChild("download"); + mSelectedPhysicsWeight = getChild("physics"); + 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"); + + return TRUE; +} + +// virtual +void LLFloaterObjectWeights::onOpen(const LLSD& key) +{ + updateIfNothingSelected(); +} + +void LLFloaterObjectWeights::toggleLoadingIndicators(bool visible) +{ + childSetVisible("download_loading_indicator", visible); + childSetVisible("physics_loading_indicator", visible); + childSetVisible("server_loading_indicator", visible); + childSetVisible("display_loading_indicator", visible); +} + +void LLFloaterObjectWeights::updateIfNothingSelected() +{ + const std::string text = getString("nothing_selected"); + + mSelectedObjects->setText(text); + mSelectedPrims->setText(text); + + mSelectedDownloadWeight->setText(text); + mSelectedPhysicsWeight->setText(text); + mSelectedServerWeight->setText(text); + mSelectedDisplayWeight->setText(text); + + mSelectedOnLand->setText(text); + + toggleLoadingIndicators(false); +} -- cgit v1.3 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/llfloaterobjectweights.cpp') 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.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/llfloaterobjectweights.cpp') 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.3 From 543df6736fb0ae312b9a5e056a35bf8fffd2b6c9 Mon Sep 17 00:00:00 2001 From: Seth ProductEngine 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/llfloaterobjectweights.cpp') 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.3 From ca8a484f0ee4bcb9b68268f871082d4200062f0e Mon Sep 17 00:00:00 2001 From: Seth ProductEngine Date: Mon, 22 Aug 2011 19:18:36 +0300 Subject: SH-2169 FIXED Land impacts data added to build tools floater. Land selection moved from advanced weights floater to build tools floater. Removed selection observer from weights floater, selection data update in it is initiated from build floater. --- indra/newview/llfloaterobjectweights.cpp | 115 ++++----------------- indra/newview/llfloaterobjectweights.h | 36 ++++--- indra/newview/llfloatertools.cpp | 113 +++++++++++++++----- indra/newview/llfloatertools.h | 4 + .../newview/skins/default/xui/en/floater_tools.xml | 10 +- 5 files changed, 139 insertions(+), 139 deletions(-) (limited to 'indra/newview/llfloaterobjectweights.cpp') diff --git a/indra/newview/llfloaterobjectweights.cpp b/indra/newview/llfloaterobjectweights.cpp index 7ad34431fb..7bfa8454b6 100644 --- a/indra/newview/llfloaterobjectweights.cpp +++ b/indra/newview/llfloaterobjectweights.cpp @@ -33,68 +33,36 @@ #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 LLCrossParcelFunctor::apply(LLViewerObject* obj) { - /*virtual*/ bool apply(LLViewerObject* obj) - { - // Add the root object box. - mBoundingBox.addBBoxAgent(LLBBox(obj->getPositionRegion(), obj->getRotationRegion(), obj->getScale() * -0.5f, obj->getScale() * 0.5f).getAxisAligned()); + // 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; + // 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()); } -private: - LLBBox mBoundingBox; -}; + bool result = false; -/** - * 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() + LLViewerRegion* region = obj->getRegion(); + if (region) { - LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance("object_weights"); - if(object_weights_floater) - { - object_weights_floater->updateLandImpacts(); - } + std::vector boxes; + boxes.push_back(mBoundingBox); + result = region->objectsCrossParcel(boxes); } -}; + return result; +} LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) : LLFloater(key), @@ -107,22 +75,12 @@ LLFloaterObjectWeights::LLFloaterObjectWeights(const LLSD& key) mSelectedOnLand(NULL), mRezzedOnLand(NULL), mRemainingCapacity(NULL), - mTotalCapacity(NULL), - mLandImpactsObserver(NULL) + mTotalCapacity(NULL) { - mLandImpactsObserver = new LLLandImpactsObserver(); - LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver); } LLFloaterObjectWeights::~LLFloaterObjectWeights() { - mObjectSelection = NULL; - mParcelSelection = NULL; - - mSelectMgrConnection.disconnect(); - - LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver); - delete mLandImpactsObserver; } // virtual @@ -147,21 +105,8 @@ BOOL LLFloaterObjectWeights::postBuild() // virtual void LLFloaterObjectWeights::onOpen(const LLSD& key) { - 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; + updateLandImpacts(LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel()); } // virtual @@ -190,9 +135,8 @@ void LLFloaterObjectWeights::setErrorStatus(U32 status, const std::string& reaso toggleWeightsLoadingIndicators(false); } -void LLFloaterObjectWeights::updateLandImpacts() +void LLFloaterObjectWeights::updateLandImpacts(const LLParcel* parcel) { - LLParcel *parcel = mParcelSelection->getParcel(); if (!parcel || LLSelectMgr::getInstance()->getSelection()->isEmpty()) { updateIfNothingSelected(); @@ -241,21 +185,6 @@ void LLFloaterObjectWeights::refresh() 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); - } - else - { - llwarns << "Failed to get selected object" << llendl; - } - } LLViewerRegion* region = gAgent.getRegion(); if (region && region->capabilitiesReceived()) diff --git a/indra/newview/llfloaterobjectweights.h b/indra/newview/llfloaterobjectweights.h index 50d028909e..64aa2f2bbe 100644 --- a/indra/newview/llfloaterobjectweights.h +++ b/indra/newview/llfloaterobjectweights.h @@ -30,36 +30,45 @@ #include "llfloater.h" #include "llaccountingcostmanager.h" +#include "llselectmgr.h" -class LLLandImpactsObserver; -class LLObjectSelection; -class LLParcelSelection; +class LLParcel; class LLTextBox; +/** + * 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); + +private: + LLBBox mBoundingBox; +}; + + class LLFloaterObjectWeights : public LLFloater, LLAccountingCostObserver { 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); /*virtual*/ void onWeightsUpdate(const SelectionCost& selection_cost); /*virtual*/ void setErrorStatus(U32 status, const std::string& reason); - void updateLandImpacts(); - -private: + void updateLandImpacts(const LLParcel* parcel); void refresh(); +private: void toggleWeightsLoadingIndicators(bool visible); void toggleLandImpactsLoadingIndicators(bool visible); @@ -77,13 +86,6 @@ 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/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 48aeeafcfd..1008b4a6e4 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -41,6 +41,7 @@ #include "llfloaterbuildoptions.h" #include "llfloatermediasettings.h" #include "llfloateropenobject.h" +#include "llfloaterobjectweights.h" #include "llfloaterreg.h" #include "llfocusmgr.h" #include "llmediaentry.h" @@ -54,6 +55,7 @@ #include "llpanelobject.h" #include "llpanelvolume.h" #include "llpanelpermissions.h" +#include "llparcel.h" #include "llradiogroup.h" #include "llresmgr.h" #include "llselectmgr.h" @@ -117,6 +119,24 @@ void commit_radio_group_edit(LLUICtrl* ctrl); void commit_radio_group_land(LLUICtrl* ctrl); void commit_slider_zoom(LLUICtrl *ctrl); +/** + * 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() + { + LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance("build"); + if(tools_floater) + { + tools_floater->updateLandImpacts(); + } + } +}; //static void* LLFloaterTools::createPanelPermissions(void* data) @@ -344,6 +364,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key) mCostTextBorder(NULL), mTabLand(NULL), + + mLandImpactsObserver(NULL), + mDirty(TRUE), mNeedMediaTitle(TRUE) { @@ -375,12 +398,17 @@ LLFloaterTools::LLFloaterTools(const LLSD& key) mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance())); mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance())); + mLandImpactsObserver = new LLLandImpactsObserver(); + LLViewerParcelMgr::getInstance()->addObserver(mLandImpactsObserver); } LLFloaterTools::~LLFloaterTools() { // children automatically deleted gFloaterTools = NULL; + + LLViewerParcelMgr::getInstance()->removeObserver(mLandImpactsObserver); + delete mLandImpactsObserver; } void LLFloaterTools::setStatusText(const std::string& text) @@ -449,45 +477,44 @@ void LLFloaterTools::refresh() else #endif { - F32 link_phys_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetPhysicsCost(); F32 link_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedLinksetCost(); - S32 prim_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount(); S32 link_count = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount(); - LLStringUtil::format_map_t selection_args; - selection_args["OBJ_COUNT"] = llformat("%.1d", link_count); - selection_args["PRIM_COUNT"] = llformat("%.1d", prim_count); - - std::ostringstream selection_info; - - bool show_mesh_cost = gMeshRepo.meshRezEnabled(); - - if (show_mesh_cost) + LLCrossParcelFunctor func; + if (LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, true)) { - LLStringUtil::format_map_t prim_equiv_args; - prim_equiv_args["SEL_WEIGHT"] = llformat("%.1d", (S32)link_cost); - selection_args["PE_STRING"] = getString("status_selectprimequiv", prim_equiv_args); + // Selection crosses parcel bounds. + // We don't display remaining land capacity in this case. + const LLStringExplicit empty_str(""); + childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", empty_str); } else { - selection_args["PE_STRING"] = ""; + LLViewerObject* selected_object = mObjectSelection->getFirstObject(); + if (selected_object) + { + // Select a parcel at the currently selected object's position. + LLViewerParcelMgr::getInstance()->selectParcelAt(selected_object->getPositionGlobal()); + } + else + { + llwarns << "Failed to get selected object" << llendl; + } } - selection_info << getString("status_selectcount", selection_args); - - - selection_info << ","; + LLStringUtil::format_map_t selection_args; + selection_args["OBJ_COUNT"] = llformat("%.1d", link_count); + selection_args["LAND_IMPACT"] = llformat("%.1d", (S32)link_cost); - S32 render_cost = LLSelectMgr::getInstance()->getSelection()->getSelectedObjectRenderCost(); + std::ostringstream selection_info; - childSetTextArg("selection_weight", "[PHYS_WEIGHT]", llformat("%.1f", link_phys_cost)); - childSetTextArg("selection_weight", "[DISP_WEIGHT]", llformat("%.1d", render_cost)); + selection_info << getString("status_selectcount", selection_args); getChild("selection_count")->setText(selection_info.str()); bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); childSetVisible("selection_count", have_selection); - childSetVisible("selection_weight", have_selection); + childSetVisible("remaining_capacity", have_selection); childSetVisible("selection_empty", !have_selection); } @@ -500,6 +527,13 @@ void LLFloaterTools::refresh() refreshMedia(); mPanelContents->refresh(); mPanelLandInfo->refresh(); + + // Refresh the advanced weights floater + LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance("object_weights"); + if(object_weights_floater && object_weights_floater->getVisible()) + { + object_weights_floater->refresh(); + } } void LLFloaterTools::draw() @@ -758,7 +792,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); + getChildView("remaining_capacity")->setVisible(!land_visible && have_selection); getChildView("selection_empty")->setVisible(!land_visible && !have_selection); mTab->setVisible(!land_visible); @@ -1086,6 +1120,37 @@ bool LLFloaterTools::selectedMediaEditable() return selected_Media_editable; } +void LLFloaterTools::updateLandImpacts() +{ + LLParcel *parcel = mParcelSelection->getParcel(); + if (!parcel) + { + return; + } + + S32 rezzed_prims = parcel->getSimWidePrimCount(); + S32 total_capacity = parcel->getSimWideMaxPrimCapacity(); + + std::string remaining_capacity_str = ""; + + bool show_mesh_cost = gMeshRepo.meshRezEnabled(); + if (show_mesh_cost) + { + LLStringUtil::format_map_t remaining_capacity_args; + remaining_capacity_args["LAND_CAPACITY"] = llformat("%d", total_capacity - rezzed_prims); + remaining_capacity_str = getString("status_remaining_capacity", remaining_capacity_args); + } + + childSetTextArg("remaining_capacity", "[CAPACITY_STRING]", remaining_capacity_str); + + // Update land impacts info in the weights floater + LLFloaterObjectWeights* object_weights_floater = LLFloaterReg::getTypedInstance("object_weights"); + if(object_weights_floater) + { + object_weights_floater->updateLandImpacts(parcel); + } +} + void LLFloaterTools::getMediaState() { LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection(); diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 8c4cb721d3..63ed9dc82b 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -47,6 +47,7 @@ class LLMediaCtrl; class LLTool; class LLParcelSelection; class LLObjectSelection; +class LLLandImpactsObserver; typedef LLSafeHandle LLObjectSelectionHandle; @@ -103,6 +104,7 @@ public: void updateMediaTitle(); void navigateToTitleMedia( const std::string url ); bool selectedMediaEditable(); + void updateLandImpacts(); private: void refresh(); @@ -180,6 +182,8 @@ public: LLTabContainer* mTabLand; + LLLandImpactsObserver* mLandImpactsObserver; + LLParcelSelectionHandle mParcelSelection; LLObjectSelectionHandle mObjectSelection; diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 03d6c84266..9b02f7d273 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -48,11 +48,11 @@ - [OBJ_COUNT] objects ( [PRIM_COUNT] prims[PE_STRING] ) selected + [OBJ_COUNT] objects selected, land impact [LAND_IMPACT] - , [SEL_WEIGHT] prim equivs + name="status_remaining_capacity"> + Remaining capacity [LAND_CAPACITY].