summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/llmath/llcamera.cpp16
-rwxr-xr-xindra/llmath/llcamera.h2
-rwxr-xr-xindra/llmath/llplane.h8
-rw-r--r--indra/newview/llvieweroctree.cpp10
-rwxr-xr-xindra/newview/llviewerregion.cpp4
-rwxr-xr-xindra/newview/llviewerregion.h1
-rwxr-xr-xindra/newview/llvocache.cpp10
-rwxr-xr-xindra/newview/llvocache.h1
-rwxr-xr-xindra/newview/llworld.cpp5
9 files changed, 44 insertions, 13 deletions
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index 054afd3e95..6a1e3804be 100755
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -161,6 +161,22 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)
// ---------------- test methods ----------------
+bool LLCamera::isChanged()
+{
+ bool changed = false;
+ for (U32 i = 0; i < mPlaneCount; i++)
+ {
+ U8 mask = mPlaneMask[i];
+ if (mask != 0xff && !changed)
+ {
+ changed = !mAgentPlanes[i].equal(mLastAgentPlanes[i]);
+ }
+ mLastAgentPlanes[i].set(mAgentPlanes[i]);
+ }
+
+ return changed;
+}
+
S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius, const LLPlane* planes)
{
static const LLVector4a scaler[] = {
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index 898d73ed7e..a7cdcff4ac 100755
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -110,6 +110,7 @@ public:
private:
LL_ALIGN_16(LLPlane mAgentPlanes[7]); //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
LL_ALIGN_16(LLPlane mRegionPlanes[7]); //frustum planes in a local region space, derived from mAgentPlanes
+ LL_ALIGN_16(LLPlane mLastAgentPlanes[7]);
U8 mPlaneMask[8]; // 8 for alignment
F32 mView; // angle between top and bottom frustum planes in radians.
@@ -138,6 +139,7 @@ public:
LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane);
virtual ~LLCamera();
+ bool isChanged(); //check if mAgentPlanes changed since last frame.
void setUserClipPlane(LLPlane& plane);
void disableUserClipPlane();
diff --git a/indra/llmath/llplane.h b/indra/llmath/llplane.h
index 3c32441b11..64a3eed0e5 100755
--- a/indra/llmath/llplane.h
+++ b/indra/llmath/llplane.h
@@ -93,7 +93,13 @@ public:
{
return mV.greaterEqual(LLVector4a::getZero()).getGatheredBits() & LLVector4Logical::MASK_XYZ;
}
-
+
+ //check if two planes are nearly same
+ bool equal(const LLPlane& p) const
+ {
+ return mV.equals4(p.mV);
+ }
+
private:
LLVector4a mV;
} LL_ALIGN_POSTFIX(16);
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index 7b3186d40a..bba3d26e09 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -464,15 +464,16 @@ bool LLviewerOctreeGroup::removeFromGroup(LLViewerOctreeEntry* entry)
llassert(!entry->getGroup());
unbound();
+ setState(OBJECT_DIRTY);
+
if (mOctreeNode)
{
- if (!mOctreeNode->remove(entry))
+ if (!mOctreeNode->remove(entry)) //this could cause *this* pointer to be destroyed, so no more function calls after this.
{
OCT_ERRS << "Could not remove LLVOCacheEntry from LLVOCacheOctreeGroup" << llendl;
return false;
}
- }
- setState(OBJECT_DIRTY);
+ }
return true;
}
@@ -580,9 +581,10 @@ void LLviewerOctreeGroup::handleInsertion(const TreeNode* node, LLViewerOctreeEn
//virtual
void LLviewerOctreeGroup::handleRemoval(const TreeNode* node, LLViewerOctreeEntry* obj)
{
- obj->setGroup(NULL);
unbound();
setState(OBJECT_DIRTY);
+
+ obj->setGroup(NULL); //this could cause *this* pointer to be destroyed. So no more function calls after this.
}
//virtual
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index d4de33cc38..f2e6f65bba 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -88,6 +88,7 @@ const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000;
BOOL LLViewerRegion::sVOCacheCullingEnabled = FALSE;
+S32 LLViewerRegion::sLastCameraUpdated = 0;
typedef std::map<std::string, std::string> CapabilityMap;
@@ -992,6 +993,7 @@ void LLViewerRegion::removeFromVOCacheTree(LLVOCacheEntry* entry)
}
mImpl->mVOCachePartition->removeEntry(entry->getEntry());
+ entry->mLastCameraUpdated = sLastCameraUpdated;
}
//add the visible entries
@@ -1219,7 +1221,7 @@ F32 LLViewerRegion::killInvisibleObjects(F32 max_time)
iter = mImpl->mActiveSet.begin();
}
- if(!(*iter)->isRecentlyVisible())
+ if(!(*iter)->isRecentlyVisible() && (*iter)->mLastCameraUpdated != sLastCameraUpdated)
{
killObject((*iter), delete_list);
}
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index cc314dc43b..24d3dfae92 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -410,6 +410,7 @@ public:
std::vector<LLUUID> mMapAvatarIDs;
static BOOL sVOCacheCullingEnabled; //vo cache culling enabled or not.
+ static S32 sLastCameraUpdated;
private:
LLViewerRegionImpl * mImpl;
LLFrameTimer mRegionTimer;
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 69c32db13e..6e0243e985 100755
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -219,18 +219,14 @@ void LLVOCacheEntry::setState(U32 state)
if(getState() == ACTIVE)
{
- const S32 MIN_REAVTIVE_INTERVAL = 32;
+ const S32 MIN_REAVTIVE_INTERVAL = 128;
U32 last_visible = getVisible();
setVisible();
- if(getVisible() - last_visible < MIN_REAVTIVE_INTERVAL + mMinFrameRange)
+ if(getVisible() - last_visible > MIN_REAVTIVE_INTERVAL + mMinFrameRange)
{
- mMinFrameRange = llmin(mMinFrameRange * 2, getInvisibleObjectsLiveTime() * 32);
- }
- else
- {
- mMinFrameRange = getInvisibleObjectsLiveTime(); //reset
+ mLastCameraUpdated = 0; //reset
}
}
}
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 0248298eb5..816ef88dc4 100755
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -130,6 +130,7 @@ public:
typedef std::set<LLVOCacheEntry*> vocache_entry_set_t;
typedef std::set<LLVOCacheEntry*, CompareVOCacheEntry> vocache_entry_priority_list_t;
+ S32 mLastCameraUpdated;
protected:
U32 mLocalID;
U32 mParentID;
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 9659da6bf1..bfc5077c90 100755
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -666,6 +666,11 @@ void LLWorld::updateRegions(F32 max_update_time)
LLTimer update_timer;
BOOL did_one = FALSE;
+ if(LLViewerCamera::getInstance()->isChanged())
+ {
+ LLViewerRegion::sLastCameraUpdated = LLViewerOctreeEntryData::getCurrentFrame();
+ }
+
// Perform idle time updates for the regions (and associated surfaces)
for (region_list_t::iterator iter = mRegionList.begin();
iter != mRegionList.end(); ++iter)