diff options
Diffstat (limited to 'indra/newview')
-rwxr-xr-x | indra/newview/llspatialpartition.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llvieweroctree.cpp | 8 | ||||
-rw-r--r-- | indra/newview/llvieweroctree.h | 4 | ||||
-rwxr-xr-x | indra/newview/llviewerregion.cpp | 12 | ||||
-rwxr-xr-x | indra/newview/llviewerregion.h | 3 | ||||
-rwxr-xr-x | indra/newview/llvocache.cpp | 26 |
6 files changed, 46 insertions, 9 deletions
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 045fcccad7..bbbc340532 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1105,7 +1105,7 @@ public: { LLSpatialGroup* group = (LLSpatialGroup*)base_group; if (group->needsUpdate() || - group->mVisible[LLViewerCamera::sCurCameraID] < LLDrawable::getCurrentFrame() - 1) + group->getVisible(LLViewerCamera::sCurCameraID) < LLDrawable::getCurrentFrame() - 1) { group->doOcclusion(mCamera); } diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp index 5bd0a95387..ce8eef7d86 100644 --- a/indra/newview/llvieweroctree.cpp +++ b/indra/newview/llvieweroctree.cpp @@ -437,6 +437,7 @@ LLViewerOctreeGroup::~LLViewerOctreeGroup() LLViewerOctreeGroup::LLViewerOctreeGroup(OctreeNode* node) : LLTrace::MemTrackable<LLViewerOctreeGroup, 16>("LLViewerOctreeGroup"), mOctreeNode(node), + mAnyVisible(0), mState(CLEAN) { LLVector4a tmp; @@ -737,6 +738,7 @@ BOOL LLViewerOctreeGroup::isRecentlyVisible() const void LLViewerOctreeGroup::setVisible() { mVisible[LLViewerCamera::sCurCameraID] = LLViewerOctreeEntryData::getCurrentFrame(); + mAnyVisible = LLViewerOctreeEntryData::getCurrentFrame(); } void LLViewerOctreeGroup::checkStates() @@ -873,6 +875,12 @@ BOOL LLOcclusionCullingGroup::isRecentlyVisible() const return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < MIN_VIS_FRAME_RANGE ; } +BOOL LLOcclusionCullingGroup::isAnyRecentlyVisible() const +{ + const S32 MIN_VIS_FRAME_RANGE = 2; + return (LLDrawable::getCurrentFrame() - mAnyVisible) < MIN_VIS_FRAME_RANGE ; +} + //virtual void LLOcclusionCullingGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child) { diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h index 1eaa1b931e..e673bb6349 100644 --- a/indra/newview/llvieweroctree.h +++ b/indra/newview/llvieweroctree.h @@ -215,6 +215,7 @@ public: void setVisible(); BOOL isVisible() const; virtual BOOL isRecentlyVisible() const; + S32 getVisible(LLViewerCamera::eCameraID id) const {return mVisible[id];} bool isEmpty() const { return mOctreeNode->isEmpty(); } U32 getState() {return mState; } @@ -260,7 +261,7 @@ protected: LL_ALIGN_16(LLVector4a mExtents[2]); // extents (min, max) of this node and all its children LL_ALIGN_16(LLVector4a mObjectExtents[2]); // extents (min, max) of objects in this node -public: + S32 mAnyVisible; //latest visible to any camera S32 mVisible[LLViewerCamera::NUM_CAMERAS]; };//LL_ALIGN_POSTFIX(16); @@ -312,6 +313,7 @@ public: //virtual BOOL isRecentlyVisible() const; LLViewerOctreePartition* getSpatialPartition()const {return mSpatialPartition;} + BOOL isAnyRecentlyVisible() const; static U32 getNewOcclusionQueryObjectName(); static void releaseOcclusionQueryObjectName(U32 name); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 4b4de583d8..8a8d1b1922 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -377,7 +377,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mPacketsReceived(0.f), mDead(FALSE), mLastVisitedEntry(NULL), - mInvisibilityCheckHistory(-1) + mInvisibilityCheckHistory(-1), + mPaused(FALSE) { mWidth = region_width_meters; mImpl->mOriginGlobal = from_region_handle(handle); @@ -1185,6 +1186,7 @@ void LLViewerRegion::clearCachedVisibleObjects() //reset all occluders mImpl->mVOCachePartition->resetOccluders(); + mPaused = TRUE; //clean visible entries for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mVisibleEntries.begin(); iter != mImpl->mVisibleEntries.end();) @@ -1257,9 +1259,13 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time) { return did_update; } - + if(mPaused) + { + mPaused = FALSE; //unpause. + } + //reset all occluders - mImpl->mVOCachePartition->resetOccluders(); + mImpl->mVOCachePartition->resetOccluders(); max_update_time -= update_timer.getElapsedTimeF32(); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 4e2252b75b..ec61364a91 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -373,6 +373,8 @@ public: void removeFromCreatedList(U32 local_id); void addToCreatedList(U32 local_id); + BOOL isPaused() const {return mPaused;} + private: void addToVOCacheTree(LLVOCacheEntry* entry); LLViewerObject* addNewObject(LLVOCacheEntry* entry); @@ -482,6 +484,7 @@ private: BOOL mCapabilitiesReceived; BOOL mReleaseNotesRequested; BOOL mDead; //if true, this region is in the process of deleting. + BOOL mPaused; //pause processing the objects in the region typedef std::map<U32, std::vector<U32> > orphan_list_t; orphan_list_t mOrphanMap; diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 3f01ffa3cd..0466dea39d 100755 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -361,6 +361,12 @@ bool LLVOCacheEntry::isRecentlyVisible() const { bool vis = LLViewerOctreeEntryData::isRecentlyVisible(); + if(!vis && getGroup()) + { + //recently visible to any camera? + vis = ((LLOcclusionCullingGroup*)getGroup())->isAnyRecentlyVisible(); + } + //combination of projected area and squared distance if(!vis && !mParentID && mSceneContrib > sBackAngleTanSquared) { @@ -475,9 +481,13 @@ void LLVOCacheEntry::updateParentBoundingInfo(const LLVOCacheEntry* child) //------------------------------------------------------------------- LLVOCacheGroup::~LLVOCacheGroup() { - if(mOcclusionState[0] & ACTIVE_OCCLUSION) + for(S32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++) { - ((LLVOCachePartition*)mSpatialPartition)->removeOccluder(this); + if(mOcclusionState[i] & ACTIVE_OCCLUSION) + { + ((LLVOCachePartition*)mSpatialPartition)->removeOccluder(this); + break; + } } } @@ -720,6 +730,10 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion) { return 0; } + if(mRegionp->isPaused()) + { + return 0; + } ((LLViewerOctreeGroup*)mOctree->getListener(0))->rebound(); @@ -785,7 +799,7 @@ void LLVOCachePartition::addOccluders(LLViewerOctreeGroup* gp) if(!group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION)) { - group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION, LLOcclusionCullingGroup::STATE_MODE_ALL_CAMERAS); + group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); mOccludedGroups.insert(group); } } @@ -802,7 +816,11 @@ void LLVOCachePartition::processOccluders(LLCamera* camera) for(std::set<LLVOCacheGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) { LLVOCacheGroup* group = *iter; - group->doOcclusion(camera, &shift); + if(group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION)) + { + group->doOcclusion(camera, &shift); + group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); + } } } |