diff options
author | Xiaohong Bao <bao@lindenlab.com> | 2013-09-25 16:40:05 -0600 |
---|---|---|
committer | Xiaohong Bao <bao@lindenlab.com> | 2013-09-25 16:40:05 -0600 |
commit | 456ff3949a28542ecd89ec23b0287b55a166529f (patch) | |
tree | a61697eeacdddce1c640533d71cd3def46192d77 | |
parent | b16fb80906b4098b68d8f555998f42a3017ee095 (diff) |
fix for SH-4295: Interesting: Teleporting to previous location leave some objects invisible.
-rwxr-xr-x | indra/newview/llviewerregion.cpp | 55 | ||||
-rwxr-xr-x | indra/newview/llviewerregion.h | 2 | ||||
-rwxr-xr-x | indra/newview/llworld.cpp | 10 | ||||
-rwxr-xr-x | indra/newview/llworld.h | 1 | ||||
-rwxr-xr-x | indra/newview/pipeline.cpp | 1 |
5 files changed, 68 insertions, 1 deletions
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 985f5a0a1f..24f419b4b1 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1178,6 +1178,61 @@ F32 LLViewerRegion::createVisibleObjects(F32 max_time) return max_time - update_timer.getElapsedTimeF32(); } +void LLViewerRegion::clearCachedVisibleObjects() +{ + mImpl->mWaitingList.clear(); + mImpl->mVisibleGroups.clear(); + + //clean visible entries + for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mVisibleEntries.begin(); iter != mImpl->mVisibleEntries.end();) + { + LLVOCacheEntry* entry = *iter; + LLVOCacheEntry* parent = getCacheEntry(entry->getParentID()); + + if(!entry->getParentID() || parent) //no child or parent is cache-able + { + if(parent) //has a cache-able parent + { + parent->addChild(entry); + } + + LLVOCacheEntry::vocache_entry_set_t::iterator next_iter = iter; + ++next_iter; + mImpl->mVisibleEntries.erase(iter); + iter = next_iter; + } + else //parent is not cache-able, leave it. + { + ++iter; + } + } + + //remove all visible entries. + mLastVisitedEntry = NULL; + std::vector<LLDrawable*> delete_list; + for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.begin(); + iter != mImpl->mActiveSet.end(); ++iter) + { + LLDrawable* drawablep = (LLDrawable*)(*iter)->getEntry()->getDrawable(); + + if(drawablep && !drawablep->getParent()) + { + delete_list.push_back(drawablep); + } + } + + if(!delete_list.empty()) + { + for(S32 i = 0; i < delete_list.size(); i++) + { + gObjectList.killObject(delete_list[i]->getVObj()); + } + delete_list.clear(); + } + + return; +} + BOOL LLViewerRegion::idleUpdate(F32 max_update_time) { LLTimer update_timer; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index b2df8d5325..8a375610d9 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -336,7 +336,7 @@ public: //remove from object cache if the object receives a full-update or terse update LLViewerObject* forceToRemoveFromCache(U32 local_id, LLViewerObject* objectp); void findOrphans(U32 parent_id); - + void clearCachedVisibleObjects(); void dumpCache(); void unpackRegionHandshake(); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 9009626a03..d600abeb0a 100755 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -684,6 +684,16 @@ void LLWorld::updateRegions(F32 max_update_time) } } +void LLWorld::clearAllVisibleObjects() +{ + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) + { + //clear all cached visible objects. + (*iter)->clearCachedVisibleObjects(); + } +} + void LLWorld::updateParticles() { LLViewerPartSim::getInstance()->updateSimulation(); diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index 287e41d323..b2d8418064 100755 --- a/indra/newview/llworld.h +++ b/indra/newview/llworld.h @@ -147,6 +147,7 @@ public: void getInfo(LLSD& info); U32 getNumOfActiveCachedObjects() const {return mNumOfActiveCachedObjects;} + void clearAllVisibleObjects(); public: typedef std::list<LLViewerRegion*> region_list_t; const region_list_t& getRegionList() const { return mActiveRegionList; } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 38bef1f4f5..9d8aa849ba 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7371,6 +7371,7 @@ void LLPipeline::doResetVertexBuffers() { LLSpatialPartition::sTeleportRequested = FALSE; + LLWorld::getInstance()->clearAllVisibleObjects(); clearRebuildGroups(); clearRebuildDrawables(); } |