diff options
| author | leyla_linden <none@none> | 2011-01-26 17:03:26 -0800 | 
|---|---|---|
| committer | leyla_linden <none@none> | 2011-01-26 17:03:26 -0800 | 
| commit | 1a2ad232826bf485c6b1ec6606313cac04884b83 (patch) | |
| tree | c05f9c3b5c406cea7ec825fb44f364a346028757 | |
| parent | f89b8c26854e362980e3f5c16c6b3a22c932c3f6 (diff) | |
| parent | f0be01bda92553a3e9e671c26c2905b47cacb0b5 (diff) | |
Merge
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 15 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llvoavatarself.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/pipeline.cpp | 138 | ||||
| -rw-r--r-- | indra/newview/pipeline.h | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/menu_viewer.xml | 10 | 
7 files changed, 112 insertions, 60 deletions
| diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index be8f81fc62..af6064ad20 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -522,7 +522,7 @@ BOOL LLSpatialGroup::isRecentlyVisible() const  BOOL LLSpatialGroup::isVisible() const  { -	return mVisible[LLViewerCamera::sCurCameraID] == LLDrawable::getCurrentFrame() ? TRUE : FALSE; +	return mVisible[LLViewerCamera::sCurCameraID] >= LLDrawable::getCurrentFrame() ? TRUE : FALSE;  }  void LLSpatialGroup::setVisible() @@ -1345,7 +1345,8 @@ F32 LLSpatialGroup::getUpdateUrgency() const  	}  	else  	{ -		return (gFrameTimeSeconds - mLastUpdateTime+4.f)/mDistance; +		F32 time = gFrameTimeSeconds-mLastUpdateTime+4.f; +		return time + (mObjectBounds[1].dot3(mObjectBounds[1]).getF32()+1.f)/mDistance;  	}  } @@ -1356,8 +1357,8 @@ BOOL LLSpatialGroup::needsUpdate()  BOOL LLSpatialGroup::changeLOD()  { -	if (isState(ALPHA_DIRTY)) -	{ ///an alpha sort is going to happen, update distance and LOD +	if (isState(ALPHA_DIRTY | OBJECT_DIRTY)) +	{ ///a rebuild is going to happen, update distance and LoD  		return TRUE;  	} @@ -1370,7 +1371,7 @@ BOOL LLSpatialGroup::changeLOD()  			return TRUE;  		} -		if (mDistance > mRadius) +		if (mDistance > mRadius*2.f)  		{  			return FALSE;  		} @@ -4100,7 +4101,7 @@ void LLSpatialPartition::renderDebug()  									  LLPipeline::RENDER_DEBUG_RAYCAST |  									  LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |  									  LLPipeline::RENDER_DEBUG_AGENT_TARGET | -									  LLPipeline::RENDER_DEBUG_BUILD_QUEUE | +									  //LLPipeline::RENDER_DEBUG_BUILD_QUEUE |  									  LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))   	{  		return; @@ -4140,7 +4141,7 @@ void LLSpatialGroup::drawObjectBox(LLColor4 col)  {  	gGL.color4fv(col.mV);  	LLVector4a size; -	size = mObjectBounds[0]; +	size = mObjectBounds[1];  	size.mul(1.01f);  	size.add(LLVector4a(0.001f));  	drawBox(mObjectBounds[0], size); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a152ab4aa0..e9e0268587 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -937,6 +937,10 @@ U32 info_display_from_string(std::string info_display)  	{  		return LLPipeline::RENDER_DEBUG_FACE_AREA;  	} +	else if ("build queue" == info_display) +	{ +		return LLPipeline::RENDER_DEBUG_BUILD_QUEUE; +	}  	else if ("lights" == info_display)  	{  		return LLPipeline::RENDER_DEBUG_LIGHTS; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 3c66c4860e..aca233d58d 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -625,7 +625,6 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)  		mScreenp->updateWorldMatrixChildren();  		resetHUDAttachments();  	} -	LLVOAvatar::rebuildRiggedAttachments();  	return LLVOAvatar::updateCharacter(agent);  } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index e3b5e613d9..3dc82f5368 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1227,7 +1227,7 @@ BOOL LLVOVolume::updateLOD()  		mLODChanged = TRUE;
  	}
 -	lod_changed |= LLViewerObject::updateLOD();
 +	lod_changed = lod_changed || LLViewerObject::updateLOD();
  	return lod_changed;
  }
 diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 38711472a1..510d22136b 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -330,6 +330,8 @@ LLPipeline::LLPipeline() :  	mRenderDebugFeatureMask(0),  	mRenderDebugMask(0),  	mOldRenderDebugMask(0), +	mGroupQ1Locked(false), +	mGroupQ2Locked(false),  	mLastRebuildPool(NULL),  	mAlphaPool(NULL),  	mSkyPool(NULL), @@ -2118,6 +2120,7 @@ void LLPipeline::rebuildPriorityGroups()  	gMeshRepo.notifyLoadedMeshes(); +	mGroupQ1Locked = true;  	// Iterate through all drawables on the priority build queue,  	for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();  		 iter != mGroupQ1.end(); ++iter) @@ -2128,11 +2131,18 @@ void LLPipeline::rebuildPriorityGroups()  	}  	mGroupQ1.clear(); +	mGroupQ1Locked = false;  }  void LLPipeline::rebuildGroups()  { +	if (mGroupQ2.empty()) +	{ +		return; +	} + +	mGroupQ2Locked = true;  	// Iterate through some drawables on the non-priority build queue  	S32 size = (S32) mGroupQ2.size();  	S32 min_count = llclamp((S32) ((F32) (size * size)/4096*0.25f), 1, size); @@ -2142,33 +2152,30 @@ void LLPipeline::rebuildGroups()  	std::sort(mGroupQ2.begin(), mGroupQ2.end(), LLSpatialGroup::CompareUpdateUrgency());  	LLSpatialGroup::sg_vector_t::iterator iter; +	LLSpatialGroup::sg_vector_t::iterator last_iter = mGroupQ2.begin(); +  	for (iter = mGroupQ2.begin(); -		 iter != mGroupQ2.end(); ++iter) +		 iter != mGroupQ2.end() && count <= min_count; ++iter)  	{  		LLSpatialGroup* group = *iter; +		last_iter = iter; -		if (group->isDead()) +		if (!group->isDead())  		{ -			continue; +			group->rebuildGeom(); +			 +			if (group->mSpatialPartition->mRenderByGroup) +			{ +				count++; +			}  		} -		group->rebuildGeom(); -		 -		if (group->mSpatialPartition->mRenderByGroup) -		{ -			count++; -		} -			  		group->clearState(LLSpatialGroup::IN_BUILD_Q2); - -		if (count > min_count) -		{ -			++iter; -			break; -		}  	}	 -	mGroupQ2.erase(mGroupQ2.begin(), iter); +	mGroupQ2.erase(mGroupQ2.begin(), ++last_iter); + +	mGroupQ2Locked = false;  	updateMovedList(mMovedBridge);  } @@ -2463,6 +2470,8 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)  		{  			if (!group->isState(LLSpatialGroup::IN_BUILD_Q1))  			{ +				llassert_always(!mGroupQ1Locked); +  				mGroupQ1.push_back(group);  				group->setState(LLSpatialGroup::IN_BUILD_Q1); @@ -2479,11 +2488,7 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)  		}  		else if (!group->isState(LLSpatialGroup::IN_BUILD_Q2 | LLSpatialGroup::IN_BUILD_Q1))  		{ -			//llerrs << "Non-priority updates not yet supported!" << llendl; -			if (std::find(mGroupQ2.begin(), mGroupQ2.end(), group) != mGroupQ2.end()) -			{ -				llerrs << "WTF?" << llendl; -			} +			llassert_always(!mGroupQ2Locked);  			mGroupQ2.push_back(group);  			group->setState(LLSpatialGroup::IN_BUILD_Q2); @@ -2563,6 +2568,42 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)  			}  		}  	} + +	if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD) +	{ +		LLSpatialGroup* last_group = NULL; +		for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i) +		{ +			LLCullResult::bridge_list_t::iterator cur_iter = i; +			LLSpatialBridge* bridge = *cur_iter; +			LLSpatialGroup* group = bridge->getSpatialGroup(); + +			if (last_group == NULL) +			{ +				last_group = group; +			} + +			if (!bridge->isDead() && group && !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) +			{ +				stateSort(bridge, camera); +			} + +			if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD && +				last_group != group && last_group->changeLOD()) +			{ +				last_group->mLastUpdateDistance = last_group->mDistance; +			} + +			last_group = group; +		} + +		if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD && +			last_group && last_group->changeLOD()) +		{ +			last_group->mLastUpdateDistance = last_group->mDistance; +		} +	} +  	for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)  	{  		LLSpatialGroup* group = *iter; @@ -2578,19 +2619,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)  		}  	} -	if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD) -	{ -		for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i) -		{ -			LLCullResult::bridge_list_t::iterator cur_iter = i; -			LLSpatialBridge* bridge = *cur_iter; -			LLSpatialGroup* group = bridge->getSpatialGroup(); -			if (!bridge->isDead() && group && !group->isOcclusionState(LLSpatialGroup::OCCLUDED)) -			{ -				stateSort(bridge, camera); -			} -		} -	}  	{  		LLFastTimer ftm(FTM_STATESORT_DRAWABLE);  		for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList(); @@ -2621,6 +2649,11 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)  			LLDrawable* drawablep = *i;  			stateSort(drawablep, camera);  		} + +		if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD) +		{ //avoid redundant stateSort calls +			group->mLastUpdateDistance = group->mDistance; +		}  	}  } @@ -2687,21 +2720,17 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)  	if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)  	{ -		LLSpatialGroup* group = drawablep->getSpatialGroup(); -		if (!group || group->changeLOD()) +		if (drawablep->isVisible())  		{ -			if (drawablep->isVisible()) +			if (!drawablep->isActive())  			{ -				if (!drawablep->isActive()) -				{ -					bool force_update = false; -					drawablep->updateDistance(camera, force_update); -				} -				else if (drawablep->isAvatar()) -				{ -					bool force_update = false; -					drawablep->updateDistance(camera, force_update); // calls vobj->updateLOD() which calls LLVOAvatar::updateVisibility() -				} +				bool force_update = false; +				drawablep->updateDistance(camera, force_update); +			} +			else if (drawablep->isAvatar()) +			{ +				bool force_update = false; +				drawablep->updateDistance(camera, force_update); // calls vobj->updateLOD() which calls LLVOAvatar::updateVisibility()  			}  		}  	} @@ -4191,13 +4220,19 @@ void LLPipeline::renderDebug()  	if (mRenderDebugMask & LLPipeline::RENDER_DEBUG_BUILD_QUEUE)  	{  		U32 count = 0; -		U32 size = mBuildQ2.size(); +		U32 size = mGroupQ2.size();  		LLColor4 col; +		LLVertexBuffer::unbind();  		LLGLEnable blend(GL_BLEND); +		gGL.setSceneBlendType(LLRender::BT_ALPHA);  		LLGLDepthTest depth(GL_TRUE, GL_FALSE);  		gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep); +		gGL.pushMatrix(); +		glLoadMatrixd(gGLModelView); +		gGLLastMatrix = NULL; +  		for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ2.begin(); iter != mGroupQ2.end(); ++iter)  		{  			LLSpatialGroup* group = *iter; @@ -4219,7 +4254,7 @@ void LLPipeline::renderDebug()  				glMultMatrixf((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);  			} -			F32 alpha = (F32) (size-count)/size; +			F32 alpha = llclamp((F32) (size-count)/size, 0.f, 1.f);  			LLVector2 c(1.f-alpha, alpha); @@ -4227,7 +4262,7 @@ void LLPipeline::renderDebug()  			++count; -			col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.1f); +			col.set(c.mV[0], c.mV[1], 0, alpha*0.5f+0.5f);  			group->drawObjectBox(col);  			if (bridge) @@ -4237,6 +4272,7 @@ void LLPipeline::renderDebug()  		}  	} +	gGL.popMatrix();  	gGL.flush();  	gPipeline.renderPhysicsDisplay(); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 7ae83e9816..0eb020605e 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -632,6 +632,8 @@ protected:  	LLDrawable::drawable_list_t 	mBuildQ2; // non-priority  	LLSpatialGroup::sg_vector_t		mGroupQ1; //priority  	LLSpatialGroup::sg_vector_t		mGroupQ2; // non-priority +	bool mGroupQ2Locked; +	bool mGroupQ1Locked;  	LLViewerObject::vobj_list_t		mCreateQ; diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 8e2c5840ee..3e006d7b31 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2258,6 +2258,16 @@             parameter="face area" />          </menu_item_check>          <menu_item_check +         label="Build Queue" +         name="Build Queue"> +          <menu_item_check.on_check +           function="Advanced.CheckInfoDisplay" +           parameter="build queue" /> +          <menu_item_check.on_click +           function="Advanced.ToggleInfoDisplay" +           parameter="build queue" /> +        </menu_item_check> +        <menu_item_check           label="Lights"           name="Lights">            <menu_item_check.on_check | 
