Automated merge with ssh://hg.lindenlab.com/bao/bao-viewer-interesting/

master
Xiaohong Bao 2012-12-18 14:37:16 -07:00
commit c66c8d32c7
10 changed files with 169 additions and 124 deletions

View File

@ -161,7 +161,7 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)
// ---------------- test methods ----------------
S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius, const LLPlane* planes)
{
static const LLVector4a scaler[] = {
LLVector4a(-1,-1,-1),
@ -174,6 +174,12 @@ S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
LLVector4a( 1, 1, 1)
};
if(!planes)
{
//use agent space
planes = mAgentPlanes;
}
U8 mask = 0;
bool result = false;
LLVector4a rscale, maxp, minp;
@ -183,7 +189,7 @@ S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
mask = mPlaneMask[i];
if (mask != 0xff)
{
const LLPlane& p(mAgentPlanes[i]);
const LLPlane& p(planes[i]);
p.getAt<3>(d);
rscale.setMul(radius, scaler[mask]);
minp.setSub(center, rscale);
@ -204,8 +210,14 @@ S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
return result?1:2;
}
//exactly same as the function AABBInFrustum(...)
//except uses mRegionPlanes instead of mAgentPlanes.
S32 LLCamera::AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& radius)
{
return AABBInFrustum(center, radius, mRegionPlanes);
}
S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)
S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes)
{
static const LLVector4a scaler[] = {
LLVector4a(-1,-1,-1),
@ -218,6 +230,12 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&
LLVector4a( 1, 1, 1)
};
if(!planes)
{
//use agent space
planes = mAgentPlanes;
}
U8 mask = 0;
bool result = false;
LLVector4a rscale, maxp, minp;
@ -227,7 +245,7 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&
mask = mPlaneMask[i];
if ((i != 5) && (mask != 0xff))
{
const LLPlane& p(mAgentPlanes[i]);
const LLPlane& p(planes[i]);
p.getAt<3>(d);
rscale.setMul(radius, scaler[mask]);
minp.setSub(center, rscale);
@ -248,6 +266,13 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&
return result?1:2;
}
//exactly same as the function AABBInFrustumNoFarClip(...)
//except uses mRegionPlanes instead of mAgentPlanes.
S32 LLCamera::AABBInRegionFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)
{
return AABBInFrustumNoFarClip(center, radius, mRegionPlanes);
}
int LLCamera::sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius)
{
LLVector3 dist = sphere_center-mFrustCenter;
@ -584,6 +609,23 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
}
}
//calculate regional planes from mAgentPlanes.
//vector "shift" is the vector of the region origin in the agent space.
void LLCamera::calcRegionFrustumPlanes(const LLVector3& shift)
{
F32 d;
LLVector3 n;
for(S32 i = 0 ; i < 7; i++)
{
if (mPlaneMask[i] != 0xff)
{
n.setVec(mAgentPlanes[i][0], mAgentPlanes[i][1], mAgentPlanes[i][2]);
d = mAgentPlanes[i][3] - n * shift;
mRegionPlanes[i].setVec(n, d);
}
}
}
void LLCamera::calculateFrustumPlanes(F32 left, F32 right, F32 top, F32 bottom)
{
LLVector3 a, b, c;

View File

@ -109,6 +109,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
U8 mPlaneMask[8]; // 8 for alignment
F32 mView; // angle between top and bottom frustum planes in radians.
@ -178,6 +179,7 @@ public:
// Return number of bytes copied.
size_t readFrustumFromBuffer(const char *buffer);
void calcAgentFrustumPlanes(LLVector3* frust);
void calcRegionFrustumPlanes(const LLVector3& shift); //calculate regional planes from mAgentPlanes.
void ignoreAgentFrustumPlane(S32 idx);
// Returns 1 if partly in, 2 if fully in.
@ -186,8 +188,10 @@ public:
S32 sphereInFrustum(const LLVector3 &center, const F32 radius) const;
S32 pointInFrustum(const LLVector3 &point) const { return sphereInFrustum(point, 0.0f); }
S32 sphereInFrustumFull(const LLVector3 &center, const F32 radius) const { return sphereInFrustum(center, radius); }
S32 AABBInFrustum(const LLVector4a& center, const LLVector4a& radius);
S32 AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius);
S32 AABBInFrustum(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes = NULL);
S32 AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& radius);
S32 AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes = NULL);
S32 AABBInRegionFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius);
//does a quick 'n dirty sphere-sphere check
S32 sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius);

View File

@ -1473,19 +1473,6 @@ void LLSpatialBridge::shiftPos(const LLVector4a& vec)
void LLSpatialBridge::cleanupReferences()
{
LLPointer<LLVOCacheEntry> dummy_entry;
if (mDrawable && mDrawable->isDead() && mDrawable->getEntry()->hasVOCacheEntry())
{
//create a dummy entry to insert the entire LLSpatialBridge to the vo_cache partition so it can be reloaded.
dummy_entry = new LLVOCacheEntry();
dummy_entry->setOctreeEntry(mEntry);
dummy_entry->addChild((LLVOCacheEntry*)mDrawable->getEntry()->getVOCacheEntry());
//llassert(!mDrawable->getParent());
//mDrawable->mParent = this;
}
LLDrawable::cleanupReferences();
if (mDrawable)
{

View File

@ -675,6 +675,8 @@ void LLViewerOctreeCull::traverse(const OctreeNode* n)
}
}
//------------------------------------------
//agent space group culling
S32 LLViewerOctreeCull::AABBInFrustumNoFarClipGroupBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInFrustumNoFarClip(group->mBounds[0], group->mBounds[1]);
@ -685,6 +687,14 @@ S32 LLViewerOctreeCull::AABBSphereIntersectGroupExtents(const LLviewerOctreeGrou
return AABBSphereIntersect(group->mExtents[0], group->mExtents[1], mCamera->getOrigin(), mCamera->mFrustumCornerDist);
}
S32 LLViewerOctreeCull::AABBInFrustumGroupBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInFrustum(group->mBounds[0], group->mBounds[1]);
}
//------------------------------------------
//------------------------------------------
//agent space object set culling
S32 LLViewerOctreeCull::AABBInFrustumNoFarClipObjectBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInFrustumNoFarClip(group->mObjectBounds[0], group->mObjectBounds[1]);
@ -695,15 +705,47 @@ S32 LLViewerOctreeCull::AABBSphereIntersectObjectExtents(const LLviewerOctreeGro
return AABBSphereIntersect(group->mObjectExtents[0], group->mObjectExtents[1], mCamera->getOrigin(), mCamera->mFrustumCornerDist);
}
S32 LLViewerOctreeCull::AABBInFrustumGroupBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInFrustum(group->mBounds[0], group->mBounds[1]);
}
S32 LLViewerOctreeCull::AABBInFrustumObjectBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInFrustum(group->mObjectBounds[0], group->mObjectBounds[1]);
}
//------------------------------------------
//------------------------------------------
//local regional space group culling
S32 LLViewerOctreeCull::AABBInRegionFrustumNoFarClipGroupBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInRegionFrustumNoFarClip(group->mBounds[0], group->mBounds[1]);
}
S32 LLViewerOctreeCull::AABBInRegionFrustumGroupBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInRegionFrustum(group->mBounds[0], group->mBounds[1]);
}
S32 LLViewerOctreeCull::AABBRegionSphereIntersectGroupExtents(const LLviewerOctreeGroup* group, const LLVector3& shift)
{
return AABBSphereIntersect(group->mExtents[0], group->mExtents[1], mCamera->getOrigin() - shift, mCamera->mFrustumCornerDist);
}
//------------------------------------------
//------------------------------------------
//local regional space object culling
S32 LLViewerOctreeCull::AABBInRegionFrustumObjectBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInRegionFrustum(group->mObjectBounds[0], group->mObjectBounds[1]);
}
S32 LLViewerOctreeCull::AABBInRegionFrustumNoFarClipObjectBounds(const LLviewerOctreeGroup* group)
{
return mCamera->AABBInRegionFrustumNoFarClip(group->mObjectBounds[0], group->mObjectBounds[1]);
}
S32 LLViewerOctreeCull::AABBRegionSphereIntersectObjectExtents(const LLviewerOctreeGroup* group, const LLVector3& shift)
{
return AABBSphereIntersect(group->mObjectExtents[0], group->mObjectExtents[1], mCamera->getOrigin() - shift, mCamera->mFrustumCornerDist);
}
//------------------------------------------
//virtual
bool LLViewerOctreeCull::checkObjects(const OctreeNode* branch, const LLviewerOctreeGroup* group)

View File

@ -280,13 +280,26 @@ public:
virtual bool earlyFail(LLviewerOctreeGroup* group);
virtual void traverse(const OctreeNode* n);
S32 AABBInFrustumNoFarClipGroupBounds(const LLviewerOctreeGroup* group);
//agent space group cull
S32 AABBInFrustumNoFarClipGroupBounds(const LLviewerOctreeGroup* group);
S32 AABBSphereIntersectGroupExtents(const LLviewerOctreeGroup* group);
S32 AABBInFrustumNoFarClipObjectBounds(const LLviewerOctreeGroup* group);
S32 AABBSphereIntersectObjectExtents(const LLviewerOctreeGroup* group);
S32 AABBInFrustumGroupBounds(const LLviewerOctreeGroup* group);
//agent space object set cull
S32 AABBInFrustumNoFarClipObjectBounds(const LLviewerOctreeGroup* group);
S32 AABBSphereIntersectObjectExtents(const LLviewerOctreeGroup* group);
S32 AABBInFrustumObjectBounds(const LLviewerOctreeGroup* group);
//local region space group cull
S32 AABBInRegionFrustumNoFarClipGroupBounds(const LLviewerOctreeGroup* group);
S32 AABBInRegionFrustumGroupBounds(const LLviewerOctreeGroup* group);
S32 AABBRegionSphereIntersectGroupExtents(const LLviewerOctreeGroup* group, const LLVector3& shift);
//local region space object set cull
S32 AABBInRegionFrustumNoFarClipObjectBounds(const LLviewerOctreeGroup* group);
S32 AABBInRegionFrustumObjectBounds(const LLviewerOctreeGroup* group);
S32 AABBRegionSphereIntersectObjectExtents(const LLviewerOctreeGroup* group, const LLVector3& shift);
virtual S32 frustumCheck(const LLviewerOctreeGroup* group) = 0;
virtual S32 frustumCheckObjects(const LLviewerOctreeGroup* group) = 0;

View File

@ -87,6 +87,7 @@ const F32 CAP_REQUEST_TIMEOUT = 18;
const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;
LLViewerRegion* LLViewerRegion::sCurRegionp = NULL;
BOOL LLViewerRegion::sVOCacheCullingEnabled = FALSE;
typedef std::map<std::string, std::string> CapabilityMap;
@ -141,7 +142,6 @@ public:
LLVOCacheEntry::vocache_entry_map_t mCacheMap; //all cached entries
LLVOCacheEntry::vocache_entry_set_t mActiveSet; //all active entries;
LLVOCacheEntry::vocache_entry_set_t mWaitingSet; //entries waiting for LLDrawable to be generated.
std::set< LLPointer<LLVOCacheEntry> > mDummyEntries; //dummy vo cache entries, for LLSpatialBridge use.
std::set< LLviewerOctreeGroup* > mVisibleGroups; //visible groupa
LLVOCachePartition* mVOCachePartition;
LLVOCacheEntry::vocache_entry_set_t mVisibleEntries; //must-be-created visible entries wait for objects creation.
@ -841,17 +841,8 @@ void LLViewerRegion::removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* d
{
return;
}
if(entry->isDummy())
{
mImpl->mDummyEntries.insert(entry); //keep a copy to prevent from being deleted.
addToVOCacheTree(entry);
}
else if(!drawablep->getParent()) //root node
{
addToVOCacheTree(entry);
mImpl->mVisibleEntries.erase(entry);
}
else //child node
if(drawablep->getParent()) //child object
{
LLViewerOctreeEntry* parent_oct_entry = drawablep->getParent()->getEntry();
if(parent_oct_entry && parent_oct_entry->hasVOCacheEntry())
@ -860,7 +851,19 @@ void LLViewerRegion::removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* d
parent->addChild(entry);
}
}
else //insert to vo cache tree.
{
//shift to the local regional space from agent space
const LLVector3 pos = drawablep->getVObj()->getPositionRegion();
LLVector4a vec(pos[0], pos[1], pos[2]);
LLVector4a shift;
shift.setSub(vec, entry->getPositionGroup());
entry->shift(shift);
addToVOCacheTree(entry);
}
mImpl->mVisibleEntries.erase(entry);
mImpl->mActiveSet.erase(entry);
mImpl->mWaitingSet.erase(entry);
entry->setState(LLVOCacheEntry::INACTIVE);
@ -878,7 +881,10 @@ void LLViewerRegion::addVisibleGroup(LLviewerOctreeGroup* group)
void LLViewerRegion::addToVOCacheTree(LLVOCacheEntry* entry)
{
static BOOL vo_cache_culling_enabled = gSavedSettings.getBOOL("ObjectCacheViewCullingEnabled");
if(!sVOCacheCullingEnabled)
{
return;
}
if(mDead || !entry || !entry->getEntry())
{
@ -954,12 +960,13 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time)
//process visible entries
max_time *= 0.5f; //only use up to half available time to update entries.
#if 1
for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mVisibleEntries.begin(); iter != mImpl->mVisibleEntries.end();)
{
LLVOCacheEntry* vo_entry = *iter;
vo_entry->calcSceneContribution(camera_origin, needs_update, mImpl->mLastCameraUpdate);
if(vo_entry->getState() < LLVOCacheEntry::WAITING && !vo_entry->isDummy())
if(vo_entry->getState() < LLVOCacheEntry::WAITING)
{
mImpl->mWaitingList.insert(vo_entry);
}
@ -987,12 +994,7 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time)
if(!vo_entry->getNumOfChildren())
{
if(vo_entry->isDummy())
{
mImpl->mDummyEntries.erase(vo_entry);
iter = mImpl->mVisibleEntries.erase(iter);
}
else if(vo_entry->getState() >= LLVOCacheEntry::WAITING)
if(vo_entry->getState() >= LLVOCacheEntry::WAITING)
{
iter = mImpl->mVisibleEntries.erase(iter);
}
@ -1011,6 +1013,7 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time)
// break;
//}
}
#endif
//process visible groups
std::set< LLviewerOctreeGroup* >::iterator group_iter = mImpl->mVisibleGroups.begin();
@ -1027,11 +1030,6 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time)
if((*i)->hasVOCacheEntry())
{
LLVOCacheEntry* vo_entry = (LLVOCacheEntry*)(*i)->getVOCacheEntry();
if(vo_entry->isDummy())
{
addVisibleCacheEntry(vo_entry); //for LLSpatialBridge.
continue;
}
vo_entry->calcSceneContribution(camera_origin, needs_update, mImpl->mLastCameraUpdate);
mImpl->mWaitingList.insert(vo_entry);
@ -1118,6 +1116,11 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
F32 LLViewerRegion::killInvisibleObjects(F32 max_time)
{
if(!sVOCacheCullingEnabled)
{
return max_time;
}
std::vector<LLDrawable*> delete_list;
for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.begin();
iter != mImpl->mActiveSet.end(); ++iter)
@ -1695,13 +1698,6 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
LLVOCacheEntry* LLViewerRegion::getCacheEntryForOctree(U32 local_id)
{
static BOOL vo_cache_culling_enabled = gSavedSettings.getBOOL("ObjectCacheViewCullingEnabled");
if(!vo_cache_culling_enabled)
{
return NULL;
}
LLVOCacheEntry* entry = getCacheEntry(local_id);
removeFromVOCacheTree(entry);
@ -1741,44 +1737,6 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U8 &cache_miss_type)
}
addVisibleCacheEntry(entry);
#if 0
if(entry->isBridgeChild()) //bridge child
{
addVisibleCacheEntry(entry);
}
else
{
U32 parent_id = entry->getParentID();
if(parent_id > 0) //has parent
{
LLVOCacheEntry* parent = getCacheEntry(parent_id);
if(parent) //parent cached
{
parent->addChild(entry);
if(parent->isState(LLVOCacheEntry::INACTIVE))
{
//addToVOCacheTree(parent);
addVisibleCacheEntry(parent);
}
else //parent visible
{
addVisibleCacheEntry(parent);
}
}
else //parent not cached. This should not happen, but just in case...
{
addVisibleCacheEntry(entry);
}
}
else //root node
{
//addToVOCacheTree(entry);
addVisibleCacheEntry(entry);
}
}
#endif
return true;
}
else

View File

@ -392,6 +392,7 @@ public:
LLDynamicArray<LLUUID> mMapAvatarIDs;
static LLViewerRegion* sCurRegionp;
static BOOL sVOCacheCullingEnabled; //vo cache culling enabled or not.
private:
LLViewerRegionImpl * mImpl;

View File

@ -424,24 +424,6 @@ void LLVOCacheEntry::calcSceneContribution(const LLVector3& camera_origin, bool
setVisible();
}
U32 LLVOCacheEntry::getParentID()
{
if(!(mState & CHILD))
{
return 0; //not a child
}
U32 parent_id = 0;
LLDataPackerBinaryBuffer* dp = getDP();
if(dp)
{
dp->reset();
dp->unpackU32(parent_id, "ParentID");
dp->reset();
}
return parent_id;
}
//-------------------------------------------------------------------
//LLVOCachePartition
//-------------------------------------------------------------------
@ -471,24 +453,31 @@ void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry)
class LLVOCacheOctreeCull : public LLViewerOctreeCull
{
public:
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp) : LLViewerOctreeCull(camera), mRegionp(regionp) {}
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp, const LLVector3& shift) : LLViewerOctreeCull(camera), mRegionp(regionp)
{
mLocalShift = shift;
}
virtual S32 frustumCheck(const LLviewerOctreeGroup* group)
{
S32 res = AABBInFrustumNoFarClipGroupBounds(group);
//S32 res = AABBInRegionFrustumGroupBounds(group);
S32 res = AABBInRegionFrustumNoFarClipGroupBounds(group);
if (res != 0)
{
res = llmin(res, AABBSphereIntersectGroupExtents(group));
res = llmin(res, AABBRegionSphereIntersectGroupExtents(group, mLocalShift));
}
return res;
}
virtual S32 frustumCheckObjects(const LLviewerOctreeGroup* group)
{
S32 res = AABBInFrustumNoFarClipObjectBounds(group);
//S32 res = AABBInRegionFrustumObjectBounds(group);
S32 res = AABBInRegionFrustumNoFarClipObjectBounds(group);
if (res != 0)
{
res = llmin(res, AABBSphereIntersectObjectExtents(group));
res = llmin(res, AABBRegionSphereIntersectObjectExtents(group, mLocalShift));
}
return res;
}
@ -500,10 +489,16 @@ public:
private:
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
};
S32 LLVOCachePartition::cull(LLCamera &camera)
{
if(!LLViewerRegion::sVOCacheCullingEnabled)
{
return 0;
}
if(mVisitedTime == LLViewerOctreeEntryData::getCurrentFrame())
{
return 0; //already visited.
@ -511,8 +506,12 @@ S32 LLVOCachePartition::cull(LLCamera &camera)
mVisitedTime = LLViewerOctreeEntryData::getCurrentFrame();
((LLviewerOctreeGroup*)mOctree->getListener(0))->rebound();
LLVOCacheOctreeCull culler(&camera, mRegionp);
//localize the camera
LLVector3 region_agent = mRegionp->getOriginAgent();
camera.calcRegionFrustumPlanes(region_agent);
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent);
culler.traverse(mOctree);
return 0;

View File

@ -98,7 +98,6 @@ public:
S32 getHitCount() const { return mHitCount; }
S32 getCRCChangeCount() const { return mCRCChangeCount; }
S32 getMinVisFrameRange()const;
U32 getParentID();
void calcSceneContribution(const LLVector3& camera_origin, bool needs_update, U32 last_update);
void setSceneContribution(F32 scene_contrib) {mSceneContrib = scene_contrib;}
@ -118,7 +117,6 @@ public:
LLVOCacheEntry* getChild(S32 i) {return mChildrenList[i];}
S32 getNumOfChildren() {return mChildrenList.size();}
void clearChildrenList() {mChildrenList.clear();}
bool isDummy() {return !mBuffer;}
public:
typedef std::map<U32, LLPointer<LLVOCacheEntry> > vocache_entry_map_t;

View File

@ -110,6 +110,7 @@ LLWorld::LLWorld() :
gGL.getTexUnit(0)->bind(mDefaultWaterTexturep);
mDefaultWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
LLViewerRegion::sVOCacheCullingEnabled = (BOOL)gSavedSettings.getBOOL("ObjectCacheViewCullingEnabled");
}