diff options
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 101 | 
2 files changed, 73 insertions, 35 deletions
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 3742f70df5..77c38798d1 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1924,11 +1924,8 @@ public:  			return;  		} -		if (mRes == 2) -		{ -			//fully in, don't traverse further (won't effect extents -		} -		else if (mRes && group->isState(LLSpatialGroup::SKIP_FRUSTUM_CHECK)) +		if ((mRes && group->isState(LLSpatialGroup::SKIP_FRUSTUM_CHECK)) || +			mRes == 2)  		{	//don't need to do frustum check  			LLSpatialGroup::OctreeTraveler::traverse(n);  		} diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 2aa0210a80..fd1445b33e 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -193,6 +193,7 @@ std::string gPoolNames[] =  };  void drawBox(const LLVector3& c, const LLVector3& r); +void drawBoxOutline(const LLVector3& pos, const LLVector3& size);  U32 nhpo2(U32 v)   { @@ -1531,8 +1532,10 @@ BOOL LLPipeline::visibleObjectsInFrustum(LLCamera& camera)  BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3& max)  { -	min = LLVector3(F32_MAX, F32_MAX, F32_MAX); -	max = LLVector3(-F32_MAX, -F32_MAX, -F32_MAX); +	const F32 X = 65536.f; + +	min = LLVector3(X,X,X); +	max = LLVector3(-X,-X,-X);  	U32 saved_camera_id = LLViewerCamera::sCurCameraID;  	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; @@ -3667,12 +3670,17 @@ void LLPipeline::renderDebug()  		for (U32 i = 0; i < 8; i++)  		{ +			LLVector3* frust = mShadowCamera[i].mAgentFrustum; +  			if (i > 3) -			{ +			{ //render shadow frusta as volumes +				if (mShadowFrustPoints[i-4].empty()) +				{ +					continue; +				} +  				gGL.color4fv(col+(i-4)*4);	 -				LLVector3* frust = mShadowCamera[i].mAgentFrustum; -  				gGL.begin(LLRender::TRIANGLE_STRIP);  				gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[4].mV);  				gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[5].mV); @@ -3700,31 +3708,49 @@ void LLPipeline::renderDebug()  			if (i < 4)  			{ -				gGL.begin(LLRender::LINES); -				 -				F32* c = col+i*4; -				for (U32 j = 0; j < mShadowFrustPoints[i].size(); ++j) + +				if (i == 0 || !mShadowFrustPoints[i].empty())  				{ -					 -					gGL.color3fv(c); +					//render visible point cloud +					gGL.flush(); +					glPointSize(8.f); +					gGL.begin(LLRender::POINTS); -					for (U32 k = 0; k < mShadowFrustPoints[i].size(); ++k) -					{ -						if (j != k) -						{ -							gGL.vertex3fv(mShadowFrustPoints[i][j].mV); -							gGL.vertex3fv(mShadowFrustPoints[i][k].mV); -						} -					} +					F32* c = col+i*4; +					gGL.color3fv(c); -					if (!mShadowFrustOrigin[i].isExactlyZero()) -					{ +					for (U32 j = 0; j < mShadowFrustPoints[i].size(); ++j) +					{	  						gGL.vertex3fv(mShadowFrustPoints[i][j].mV); -						gGL.color4f(1,1,1,1); -						gGL.vertex3fv(mShadowFrustOrigin[i].mV); +						  					} +					gGL.end(); + +					gGL.flush(); +					glPointSize(1.f); + +					LLVector3* ext = mShadowExtents[i];  +					LLVector3 pos = (ext[0]+ext[1])*0.5f; +					LLVector3 size = (ext[1]-ext[0])*0.5f; +					drawBoxOutline(pos, size); + +					//render camera frustum splits as outlines +					gGL.begin(LLRender::LINES); +					gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[1].mV); +					gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[2].mV); +					gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[3].mV); +					gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[0].mV); +					gGL.vertex3fv(frust[4].mV); gGL.vertex3fv(frust[5].mV); +					gGL.vertex3fv(frust[5].mV); gGL.vertex3fv(frust[6].mV); +					gGL.vertex3fv(frust[6].mV); gGL.vertex3fv(frust[7].mV); +					gGL.vertex3fv(frust[7].mV); gGL.vertex3fv(frust[4].mV); +					gGL.vertex3fv(frust[0].mV); gGL.vertex3fv(frust[4].mV); +					gGL.vertex3fv(frust[1].mV); gGL.vertex3fv(frust[5].mV); +					gGL.vertex3fv(frust[2].mV); gGL.vertex3fv(frust[6].mV); +					gGL.vertex3fv(frust[3].mV); gGL.vertex3fv(frust[7].mV); +					gGL.end();  				} -				gGL.end(); +  			}  			/*for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();  @@ -7721,14 +7747,14 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector  				//get point of intersection of 3 planes "p"  				LLVector3 p = (-d1*(n2%n3)-d2*(n3%n1)-d3*(n1%n2))/(n1*(n2%n3)); -				if (llround(p*n1+d1, 0.0001f) == 0.f && -					llround(p*n2+d2, 0.0001f) == 0.f && -					llround(p*n3+d3, 0.0001f) == 0.f) +				if (llround(p*n1+d1, 0.1f) == 0.f && +					llround(p*n2+d2, 0.1f) == 0.f && +					llround(p*n3+d3, 0.1f) == 0.f)  				{ //point is on all three planes  					BOOL found = TRUE;  					for (U32 l = 0; l < ps.size() && found; ++l)  					{ -						if (llround(ps[l].dist(p), 0.0001f) > 0.0f) +						if (llround(ps[l].dist(p), 0.1f) > 0.0f)  						{ //point is above some plane, not contained  							found = FALSE;	  						} @@ -8089,16 +8115,31 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  	at.normVec(); +	LLCamera main_camera = camera; +	  	F32 near_clip = 0.f;  	{  		//get visible point cloud  		std::vector<LLVector3> fp; +		main_camera.calcAgentFrustumPlanes(main_camera.mAgentFrustum); +		  		LLVector3 min,max; -		getVisiblePointCloud(camera,min,max,fp); +		getVisiblePointCloud(main_camera,min,max,fp);  		if (fp.empty())  		{ +			if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA)) +			{ +				mShadowCamera[0] = main_camera; +				mShadowExtents[0][0] = min; +				mShadowExtents[0][1] = max; + +				mShadowFrustPoints[0].clear(); +				mShadowFrustPoints[1].clear(); +				mShadowFrustPoints[2].clear(); +				mShadowFrustPoints[3].clear(); +			}  			mRenderTypeMask = type_mask;  			return;  		} @@ -8173,7 +8214,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)  		shadow_cam = camera;  		shadow_cam.setFar(16.f); -		LLViewerCamera::updateFrustumPlanes(shadow_cam); +		LLViewerCamera::updateFrustumPlanes(shadow_cam, FALSE, FALSE, TRUE);  		LLVector3* frust = shadow_cam.mAgentFrustum;  | 
