diff options
| -rwxr-xr-x | indra/newview/app_settings/settings.xml | 15 | ||||
| -rw-r--r-- | indra/newview/llvieweroctree.h | 12 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 10 | ||||
| -rwxr-xr-x | indra/newview/llvocache.cpp | 60 | ||||
| -rwxr-xr-x | indra/newview/llvocache.h | 19 | ||||
| -rwxr-xr-x | indra/newview/llworld.cpp | 2 | 
6 files changed, 90 insertions, 28 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8642114362..435dddda77 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -765,6 +765,17 @@        <key>Value</key>        <real>0.0311</real>      </map> +    <key>BackShpereCullingRadius</key> +    <map> +      <key>Comment</key> +      <string>Radius of back sphere in meters, objects behind camera but within this radius are loaded for rendering</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>20.0</real> +    </map>      <key>BottomPanelNew</key>      <map>        <key>Comment</key> @@ -6879,10 +6890,10 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>ObjectCacheViewCullingEnabled</key> +    <key>RequestFullRegionCache</key>      <map>        <key>Comment</key> -      <string>Enable the object cache view culling. Needs to restart viewer.</string> +      <string>If set, ask sim to send full region object cache. Needs to restart viewer.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h index 6ebd1d6da1..174af5e22f 100644 --- a/indra/newview/llvieweroctree.h +++ b/indra/newview/llvieweroctree.h @@ -83,7 +83,9 @@ public:  		NUM_DATA_TYPE  	}eEntryDataType_t; -	~LLViewerOctreeEntry(); +protected: +	virtual ~LLViewerOctreeEntry(); +  public:  	LLViewerOctreeEntry(); @@ -187,7 +189,7 @@ class LLviewerOctreeGroup : public LLOctreeListener<LLViewerOctreeEntry>  {  	friend class LLViewerOctreeCull;  protected: -	~LLviewerOctreeGroup(); +	virtual ~LLviewerOctreeGroup();  public:	  	enum @@ -303,13 +305,15 @@ public:  		STATE_MODE_ALL_CAMERAS,		//used for occlusion state, set state for all cameras  	} eSetStateMode; +protected: +	virtual ~LLOcclusionCullingGroup(); +  public:  	LLOcclusionCullingGroup(OctreeNode* node, LLViewerOctreePartition* part);  	LLOcclusionCullingGroup(const LLOcclusionCullingGroup& rhs) : LLviewerOctreeGroup(rhs)  	{  		*this = rhs; -	} -	~LLOcclusionCullingGroup(); +	}	  	void setOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);  	void clearOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 99db71c2ee..6e9f649d23 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -2483,11 +2483,11 @@ void LLViewerRegion::unpackRegionHandshake()  	U32 flags = 0;  	if(sVOCacheCullingEnabled)  	{ -		flags = 0x00000001; //set the bit 0 to be 1 to ask sim to send all cacheable objects. -		if(mImpl->mCacheMap.empty()) -		{ -			flags |= 0x00000002; //set the bit 1 to be 1 to tell sim the cache file is empty, no need to send cache probes. -		} +		flags |= 0x00000001; //set the bit 0 to be 1 to ask sim to send all cacheable objects.		 +	} +	if(mImpl->mCacheMap.empty()) +	{ +		flags |= 0x00000002; //set the bit 1 to be 1 to tell sim the cache file is empty, no need to send cache probes.  	}  	msg->addU32("Flags", flags );  	msg->sendReliable(host); diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 01666778b1..ada412be8c 100755 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -473,6 +473,31 @@ void LLVOCacheEntry::updateParentBoundingInfo(const LLVOCacheEntry* child)  //-------------------------------------------------------------------  //LLVOCachePartition  //------------------------------------------------------------------- +LLVOCacheGroup::~LLVOCacheGroup() +{ +	if(mOcclusionState[0] & ACTIVE_OCCLUSION) +	{ +		((LLVOCachePartition*)mSpatialPartition)->removeOccluder(this); +	} +} + +//virtual +void LLVOCacheGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child) +{ +	if (child->getListenerCount() == 0) +	{ +		new LLVOCacheGroup(child, mSpatialPartition); +	} +	else +	{ +		OCT_ERRS << "LLVOCacheGroup redundancy detected." << LL_ENDL; +	} + +	unbound(); +	 +	((LLviewerOctreeGroup*)child->getListener(0))->unbound(); +} +  LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp)  :	LLTrace::MemTrackable<LLVOCachePartition>("LLVOCachePartition")  { @@ -487,7 +512,7 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp)  		mCulledTime[i] = 0;  		mCullHistory[i] = -1;  	} -	new LLOcclusionCullingGroup(mOctree, this); +	new LLVOCacheGroup(mOctree, this);  }  void LLVOCachePartition::addEntry(LLViewerOctreeEntry* entry) @@ -615,11 +640,11 @@ private:  class LLVOCacheOctreeBackCull : public LLViewerOctreeCull  {  public: -	LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp)  +	LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp, F32 back_sphere_radius)   		: LLViewerOctreeCull(camera), mRegionp(regionp)  	{  		mLocalShift = shift; -		mSphereRadius = 20.f; //20m +		mSphereRadius = back_sphere_radius;  	}  	virtual S32 frustumCheck(const LLviewerOctreeGroup* group) @@ -653,7 +678,7 @@ private:  	LLVector3        mLocalShift; //shift vector from agent space to local region space.  }; -void LLVOCachePartition::selectBackObjects(LLCamera &camera) +void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 back_sphere_radius)  {  	if(LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)  	{ @@ -674,7 +699,7 @@ void LLVOCachePartition::selectBackObjects(LLCamera &camera)  	//localize the camera  	LLVector3 region_agent = mRegionp->getOriginAgent(); -	LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp); +	LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp, back_sphere_radius);  	culler.traverse(mOctree);  	mBackSlectionEnabled--; @@ -689,6 +714,7 @@ void LLVOCachePartition::selectBackObjects(LLCamera &camera)  S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)  {  	static LLCachedControl<bool> use_object_cache_occlusion(gSavedSettings,"UseObjectCacheOcclusion"); +	static LLCachedControl<F32> back_sphere_radius(gSavedSettings,"BackShpereCullingRadius");  	if(!LLViewerRegion::sVOCacheCullingEnabled)  	{ @@ -720,7 +746,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)  		}  		if(LLViewerOctreeEntryData::getCurrentFrame() % seed != mIdleHash)  		{ -			selectBackObjects(camera);//process back objects selection +			selectBackObjects(camera, back_sphere_radius);//process back objects selection  			return 0; //nothing changed, reduce frequency of culling  		}  	} @@ -755,11 +781,11 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)  void LLVOCachePartition::addOccluders(LLviewerOctreeGroup* gp)  { -	LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)gp; +	LLVOCacheGroup* group = (LLVOCacheGroup*)gp;  	if(!group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION))  	{ -		group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); +		group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION, LLOcclusionCullingGroup::STATE_MODE_ALL_CAMERAS);  		mOccludedGroups.insert(group);  	}  } @@ -773,9 +799,9 @@ void LLVOCachePartition::processOccluders(LLCamera* camera)  	LLVector3 region_agent = mRegionp->getOriginAgent();  	LLVector4a shift(region_agent[0], region_agent[1], region_agent[2]); -	for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) +	for(std::set<LLVOCacheGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter)  	{ -		LLOcclusionCullingGroup* group = *iter; +		LLVOCacheGroup* group = *iter;  		group->doOcclusion(camera, &shift);  	}	  } @@ -787,15 +813,23 @@ void LLVOCachePartition::resetOccluders()  		return;  	} -	for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) +	for(std::set<LLVOCacheGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter)  	{ -		LLOcclusionCullingGroup* group = *iter; -		group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); +		LLVOCacheGroup* group = *iter; +		group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION, LLOcclusionCullingGroup::STATE_MODE_ALL_CAMERAS);  	}	  	mOccludedGroups.clear();  	sNeedsOcclusionCheck = FALSE;  } +void LLVOCachePartition::removeOccluder(LLVOCacheGroup* group) +{ +	if(mOccludedGroups.empty()) +	{ +		return; +	} +	mOccludedGroups.erase(group); +}  //-------------------------------------------------------------------  //LLVOCache  //------------------------------------------------------------------- diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index cc755b6231..b58bb3d499 100755 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -160,6 +160,18 @@ public:  	static U32                  sMinFrameRange;  }; +class LLVOCacheGroup : public LLOcclusionCullingGroup +{ +public: +	LLVOCacheGroup(OctreeNode* node, LLViewerOctreePartition* part) : LLOcclusionCullingGroup(node, part){}	 + +	//virtual +	void handleChildAddition(const OctreeNode* parent, OctreeNode* child); + +protected: +	virtual ~LLVOCacheGroup(); +}; +  class LLVOCachePartition : public LLViewerOctreePartition, public LLTrace::MemTrackable<LLVOCachePartition>  {  public: @@ -171,9 +183,10 @@ public:  	void addOccluders(LLviewerOctreeGroup* gp);  	void resetOccluders();  	void processOccluders(LLCamera* camera); -	 +	void removeOccluder(LLVOCacheGroup* group); +  private: -	void selectBackObjects(LLCamera &camera); //select objects behind camera. +	void selectBackObjects(LLCamera &camera, F32 back_sphere_radius); //select objects behind camera.  public:  	static BOOL sNeedsOcclusionCheck; @@ -181,7 +194,7 @@ public:  private:  	U32   mCullHistory[LLViewerCamera::NUM_CAMERAS];  	U32   mCulledTime[LLViewerCamera::NUM_CAMERAS]; -	std::set<LLOcclusionCullingGroup*> mOccludedGroups; +	std::set<LLVOCacheGroup*> mOccludedGroups;  	S32   mBackSlectionEnabled; //enable to select back objects if > 0.  	U32   mIdleHash; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index d600abeb0a..f283cdb4b8 100755 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -110,7 +110,7 @@ LLWorld::LLWorld() :  	gGL.getTexUnit(0)->bind(mDefaultWaterTexturep);  	mDefaultWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); -	LLViewerRegion::sVOCacheCullingEnabled = gSavedSettings.getBOOL("ObjectCacheViewCullingEnabled") && gSavedSettings.getBOOL("ObjectCacheEnabled"); +	LLViewerRegion::sVOCacheCullingEnabled = gSavedSettings.getBOOL("RequestFullRegionCache") && gSavedSettings.getBOOL("ObjectCacheEnabled");  } | 
