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.meow-7.2.2
parent
c70a357a27
commit
543df6736f
|
|
@ -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<LLAccountingCostObserver>& observer_handle )
|
||||
: mObjectIDs( objectIDs ),
|
||||
mObserverHandle( observer_handle )
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -55,6 +55,12 @@ public:
|
|||
{
|
||||
llwarns << "Transport error "<<reason<<llendl;
|
||||
clearPendingRequests();
|
||||
|
||||
LLAccountingCostObserver* observer = mObserverHandle.get();
|
||||
if (observer)
|
||||
{
|
||||
observer->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();
|
||||
F32 physicsCost = 0.0f;
|
||||
F32 networkCost = 0.0f;
|
||||
F32 simulationCost = 0.0f;
|
||||
|
||||
//LLTransactionID transactionID;
|
||||
|
||||
for(S32 i = 0; i < dataCount; i++)
|
||||
//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)
|
||||
{
|
||||
|
||||
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?
|
||||
|
||||
observer->onWeightsUpdate(selectionCost);
|
||||
}
|
||||
}
|
||||
|
||||
clearPendingRequests();
|
||||
}
|
||||
|
||||
private:
|
||||
//List of posted objects
|
||||
LLSD mObjectIDs;
|
||||
|
||||
// Cost update observer handle
|
||||
LLHandle<LLAccountingCostObserver> mObserverHandle;
|
||||
};
|
||||
//===============================================================================
|
||||
void LLAccountingCostManager::fetchCosts( eSelectionType selectionType, const std::string& url )
|
||||
void LLAccountingCostManager::fetchCosts( eSelectionType selectionType,
|
||||
const std::string& url,
|
||||
const LLHandle<LLAccountingCostObserver>& 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
|
||||
|
|
|
|||
|
|
@ -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<LLAccountingCostObserver>& getObserverHandle() const { return mObserverHandle; }
|
||||
|
||||
protected:
|
||||
LLRootHandle<LLAccountingCostObserver> mObserverHandle;
|
||||
};
|
||||
//===============================================================================
|
||||
class LLAccountingCostManager : public LLSingleton<LLAccountingCostManager>
|
||||
{
|
||||
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<LLAccountingCostObserver>& observer_handle );
|
||||
//Delete a specific object from the pending list
|
||||
void removePendingObject( const LLUUID& objectID );
|
||||
|
||||
|
|
@ -52,4 +69,3 @@ private:
|
|||
//===============================================================================
|
||||
|
||||
#endif // LLACCOUNTINGCOSTMANAGER
|
||||
|
||||
|
|
|
|||
|
|
@ -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<LLBBox> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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<LLUICtrl>("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<LLUUID> 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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
std::set<LLUUID> textures;
|
||||
|
||||
for (list_t::iterator selection_iter = mList.begin(); selection_iter != mList.end();
|
||||
++selection_iter)
|
||||
{
|
||||
LLSelectNode* node = *iter;
|
||||
LLVOVolume* object = (LLVOVolume*)node->getObject();
|
||||
|
||||
if (object)
|
||||
LLSelectNode *select_node = *selection_iter;
|
||||
if (select_node)
|
||||
{
|
||||
cost += object->getRenderCost(textures);
|
||||
}
|
||||
LLViewerObject *vobj = select_node->getObject();
|
||||
if (vobj->getVolume())
|
||||
{
|
||||
LLVOVolume* volume = (LLVOVolume*) vobj;
|
||||
|
||||
for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
|
||||
{
|
||||
// add the cost of each individual texture in the linkset
|
||||
cost += iter->second;
|
||||
cost += volume->getRenderCost(textures);
|
||||
cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
|
||||
textures.clear();
|
||||
}
|
||||
}
|
||||
textures.clear();
|
||||
}
|
||||
|
||||
|
||||
return cost;
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// getTECount()
|
||||
|
|
|
|||
Loading…
Reference in New Issue