diff options
author | Xiaohong Bao <bao@lindenlab.com> | 2013-04-17 23:00:36 -0600 |
---|---|---|
committer | Xiaohong Bao <bao@lindenlab.com> | 2013-04-17 23:00:36 -0600 |
commit | 674df12bc9e81b9b4290f74a96116dbbf1e7f77c (patch) | |
tree | 90ebca6a5c7f6be4162326cbfa13963af40dd113 /indra | |
parent | 4687803c8e5371cab2bdf2636397b9043edf0299 (diff) |
for SH-4105: interesting: new viewer does not handle orphaned child prims in ObjectUpdateCompressed messages
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/llviewerobject.cpp | 10 | ||||
-rw-r--r-- | indra/newview/llviewerregion.cpp | 105 | ||||
-rw-r--r-- | indra/newview/llviewerregion.h | 30 | ||||
-rw-r--r-- | indra/newview/llvocache.cpp | 8 | ||||
-rw-r--r-- | indra/newview/llvocache.h | 3 |
5 files changed, 48 insertions, 108 deletions
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d5d804bc57..ef28c3ad53 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -995,7 +995,13 @@ U32 LLViewerObject::checkMediaURL(const std::string &media_url) U32 LLViewerObject::extractSpatialExtents(LLDataPackerBinaryBuffer *dp, LLVector3& pos, LLVector3& scale, LLQuaternion& rot) { U32 parent_id = 0; - + LLViewerObject::unpackParentID(dp, parent_id); + if(parent_id > 0) + { + //is a child, no need to decode further. + return parent_id; + } + LLViewerObject::unpackVector3(dp, scale, "Scale"); LLViewerObject::unpackVector3(dp, pos, "Pos"); @@ -1003,8 +1009,6 @@ U32 LLViewerObject::extractSpatialExtents(LLDataPackerBinaryBuffer *dp, LLVector LLViewerObject::unpackVector3(dp, vec, "Rot"); rot.unpackFromVector3(vec); - LLViewerObject::unpackParentID(dp, parent_id); - return parent_id; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 84e9c8ea9a..a2ff232d02 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1020,11 +1020,6 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time) { ++iter; } - - //if(update_timer.getElapsedTimeF32() > max_time) - //{ - // break; - //} } #endif @@ -1046,24 +1041,14 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time) if(vo_entry->getParentID() > 0) //is a child { - LLVOCacheEntry* parent = getCacheEntry(vo_entry->getParentID()); - - //make sure the parent is active - if(!parent || !parent->isState(LLVOCacheEntry::ACTIVE)) - { - continue; - } + //child visibility depends on its parent. + continue; } vo_entry->calcSceneContribution(camera_origin, needs_update, mImpl->mLastCameraUpdate); mImpl->mWaitingList.insert(vo_entry); } } - - //if(update_timer.getElapsedTimeF32() > max_time) - //{ - // break; - //} } mImpl->mVisibleGroups.clear(); @@ -1145,6 +1130,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time) F32 LLViewerRegion::killInvisibleObjects(F32 max_time) { +#if 1 if(!sVOCacheCullingEnabled) { return max_time; @@ -1164,7 +1150,7 @@ F32 LLViewerRegion::killInvisibleObjects(F32 max_time) gObjectList.killObject(delete_list[i]->getVObj()); } delete_list.clear(); - +#endif return max_time; } @@ -1694,15 +1680,15 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features) //move all orphan children out of cache and insert to rendering octree. void LLViewerRegion::findOrphans(U32 parent_id) { - std::map<U32, OrphanList>::iterator iter = mOrphanMap.find(parent_id); + orphan_list_t::iterator iter = mOrphanMap.find(parent_id); if(iter != mOrphanMap.end()) { - std::set<U32>* children = mOrphanMap[parent_id].getChildList(); - for(std::set<U32>::iterator child_iter = children->begin(); child_iter != children->end(); ++child_iter) + std::vector<U32>* children = &mOrphanMap[parent_id]; + for(S32 i = 0; i < children->size(); i++) { - forceToRemoveFromCache(*child_iter, NULL); + forceToRemoveFromCache((*children)[i], NULL); } - + children->clear(); mOrphanMap.erase(parent_id); } } @@ -1727,58 +1713,42 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry) LLVector3 pos; LLVector3 scale; LLQuaternion rot; + + //decode spatial info and parent info U32 parent_id = LLViewerObject::extractSpatialExtents(entry->getDP(), pos, scale, rot); - entry->setBoundingInfo(pos, scale); - if(parent_id > 0) //has parent { entry->setParentID(parent_id); - //1, find parent, update position + //1, find the parent in cache LLVOCacheEntry* parent = getCacheEntry(parent_id); - //2, if can not, put into the orphan list. - if(!parent || !parent->getGroup()) + //2, parent is not in the cache, put into the orphan list. + if(!parent) { - std::map<U32, OrphanList>::iterator iter = mOrphanMap.find(parent_id); - if(iter != mOrphanMap.end()) + mOrphanMap[parent_id].push_back(entry->getLocalID()); + } + else //parent in cache + { + if(!parent->isState(LLVOCacheEntry::INACTIVE)) { - iter->second.addChild(entry->getLocalID()); + //parent is visible, so is the child. + addVisibleCacheEntry(entry); } - else + else { - //check if the parent is an uncacheable object - if(!parent) - { - LLUUID parent_uuid; - LLViewerObjectList::getUUIDFromLocal(parent_uuid, - parent_id, - getHost().getAddress(), - getHost().getPort()); - LLViewerObject *parent_objp = gObjectList.findObject(parent_uuid); - if(parent_objp) - { - //parent is not cacheable, remove child from the cache. - forceToRemoveFromCache(entry->getLocalID(), NULL); - return; - } - } - - //otherwise insert to the orphan list - OrphanList o_list(entry->getLocalID()); - mOrphanMap[parent_id] = o_list; + parent->addChild(entry); } - - return; - } - else - { - //update the child position to the region space. - entry->updateBoundingInfo(parent); } + + return; } + // + //no parent + // + entry->setBoundingInfo(pos, scale); if(!entry->getGroup() && entry->isState(LLVOCacheEntry::INACTIVE)) { addToVOCacheTree(entry); @@ -1787,21 +1757,20 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry) if(!parent_id) //a potential parent { //find all children and update their bounding info - std::map<U32, OrphanList>::iterator iter = mOrphanMap.find(entry->getLocalID()); + orphan_list_t::iterator iter = mOrphanMap.find(entry->getLocalID()); if(iter != mOrphanMap.end()) - { - std::set<U32>* children = mOrphanMap[parent_id].getChildList(); - for(std::set<U32>::iterator child_iter = children->begin(); child_iter != children->end(); ++child_iter) + { + std::vector<U32>* orphans = &mOrphanMap[entry->getLocalID()]; + S32 size = orphans->size(); + for(S32 i = 0; i < size; i++) { - LLVOCacheEntry* child = getCacheEntry(*child_iter); + LLVOCacheEntry* child = getCacheEntry((*orphans)[i]); if(child) { - //update the child position to the region space. - child->updateBoundingInfo(entry); - addToVOCacheTree(child); + entry->addChild(child); } } - + orphans->clear(); mOrphanMap.erase(entry->getLocalID()); } } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 2248cf5269..410c903f18 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -447,21 +447,9 @@ private: BOOL mCapabilitiesReceived; BOOL mReleaseNotesRequested; BOOL mDead; //if true, this region is in the process of deleting. - - class OrphanList - { - public: - OrphanList(){} - OrphanList(U32 child_id){addChild(child_id);} - - void addChild(U32 child_id) {mChildList.insert(child_id);} - std::set<U32>* getChildList() {return &mChildList;} - - private: - std::set<U32> mChildList; - }; - std::map<U32, OrphanList> mOrphanMap; + typedef std::map<U32, std::vector<U32> > orphan_list_t; + orphan_list_t mOrphanMap; class CacheMissItem { @@ -471,21 +459,9 @@ private: U32 mID; //local object id LLViewerRegion::eCacheMissType mType; //cache miss type -#if 0 - struct Compare - { - bool operator()(const CacheMissItem& lhs, const CacheMissItem& rhs) - { - return lhs.mID < rhs.mID; //smaller ID first. - } - }; - - typedef std::set<CacheMissItem, Compare> cache_miss_list_t; -#else typedef std::list<CacheMissItem> cache_miss_list_t; -#endif }; - CacheMissItem::cache_miss_list_t mCacheMissList; + CacheMissItem::cache_miss_list_t mCacheMissList; caps_received_signal_t mCapabilitiesReceivedSignal; LLSD mSimulatorFeatures; diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index f90bddcba9..eba768fef4 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -367,14 +367,6 @@ void LLVOCacheEntry::setBoundingInfo(const LLVector3& pos, const LLVector3& scal setBinRadius(llmin(size.getLength3().getF32() * 4.f, 256.f)); } -void LLVOCacheEntry::updateBoundingInfo(LLVOCacheEntry* parent) -{ - //LLVector4a old_pos = getPositionGroup(); - //parent->getPositionRegion() + (getPosition() * parent->getRotation()); - - shift(parent->getPositionGroup()); -} - //------------------------------------------------------------------- //LLVOCachePartition //------------------------------------------------------------------- diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 4b775a4288..2aec88537c 100644 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -114,8 +114,7 @@ public: //called from processing object update message void setBoundingInfo(const LLVector3& pos, const LLVector3& scale); - void updateBoundingInfo(LLVOCacheEntry* parent); - + void setTouched(BOOL touched = TRUE) {mTouched = touched;} BOOL isTouched() const {return mTouched;} |