diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2011-08-31 14:35:41 -0400 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2011-08-31 14:35:41 -0400 |
commit | 822d521e46d70359985e4d6e8ccb34766492a980 (patch) | |
tree | 4f9aefc823d6e6840cf6ec55561a502261c4ca93 /indra/newview/llselectmgr.cpp | |
parent | e58d50e509d060320174c80af647da6ff9a3839f (diff) | |
parent | 5e5869c63a05e3d773fc4d19deaff171efa5014c (diff) |
merge
Diffstat (limited to 'indra/newview/llselectmgr.cpp')
-rw-r--r-- | indra/newview/llselectmgr.cpp | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7ff58f5d34..733902ad30 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5123,7 +5123,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) gGL.getTexUnit(0)->bind(mSilhouetteImagep); LLGLSPipelineSelection gls_select; - gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); LLGLEnable blend(GL_BLEND); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); @@ -5250,7 +5249,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) } gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) @@ -6525,26 +6523,69 @@ U32 LLObjectSelection::getSelectedObjectTriangleCount() S32 LLObjectSelection::getSelectedObjectRenderCost() { S32 cost = 0; - std::set<LLUUID> textures; + LLVOVolume::texture_cost_t textures; + typedef std::set<LLUUID> uuid_list_t; + uuid_list_t computed_objects; - for (list_t::iterator selection_iter = mList.begin(); selection_iter != mList.end(); - ++selection_iter) + typedef std::list<LLPointer<LLViewerObject> > child_list_t; + typedef const child_list_t const_child_list_t; + + // add render cost of complete linksets first, to get accurate texture counts + for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter) { - LLSelectNode *select_node = *selection_iter; - if (select_node) + LLSelectNode* node = *iter; + + LLVOVolume* object = (LLVOVolume*)node->getObject(); + + if (object && object->isRootEdit()) { - 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(); - } + cost += object->getRenderCost(textures); + computed_objects.insert(object->getID()); + + const_child_list_t children = object->getChildren(); + for (const_child_list_t::const_iterator child_iter = children.begin(); + child_iter != children.end(); + ++child_iter) + { + LLViewerObject* child_obj = *child_iter; + LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); + if (child) + { + cost += child->getRenderCost(textures); + computed_objects.insert(child->getID()); + } + } + + 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; + } + + textures.clear(); } } + + // add any partial linkset objects, texture cost may be slightly misleading + for (list_t::iterator iter = mList.begin(); iter != mList.end(); ++iter) + { + LLSelectNode* node = *iter; + LLVOVolume* object = (LLVOVolume*)node->getObject(); + + if (object && computed_objects.find(object->getID()) == computed_objects.end() ) + { + cost += object->getRenderCost(textures); + computed_objects.insert(object->getID()); + } + + 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; + } + textures.clear(); + } return cost; } |