diff options
| author | Dave Parks <davep@lindenlab.com> | 2012-10-23 13:36:20 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2012-10-23 13:36:20 -0500 | 
| commit | 16c6b56ee46bb84a6ec6dd0ed188697503e7a1c4 (patch) | |
| tree | a759d3561a483e5da523ee5e44daca0fa61dbbe9 /indra/newview | |
| parent | 88fb47bf84b4e995ca36632fc9154cb5a3763def (diff) | |
| parent | 10697d59b6082a6e472cf80063ef767cad73bc75 (diff) | |
Automated merge with https://bitbucket.org/lindenlab/viewer-cat
Diffstat (limited to 'indra/newview')
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.cpp | 123 | 
1 files changed, 76 insertions, 47 deletions
| diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index e501fcaa90..6d0d9f67d5 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -3884,15 +3884,30 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  	U32 triangle_count = 0; -	for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) +	U32 instanced_triangle_count = 0; + +	//get the triangle count for the whole scene +	for (LLModelLoader::scene::iterator iter = mBaseScene.begin(), endIter = mBaseScene.end(); iter != endIter; ++iter)  	{ -		LLModel* mdl = *iter; -		for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) +		for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)  		{ -			triangle_count += mdl->getVolumeFace(i).mNumIndices/3; +			LLModel* mdl = instance->mModel; +			if (mdl) +			{ +				instanced_triangle_count += mdl->getNumTriangles(); +			}  		}  	} +	//get the triangle count for the non-instanced set of models +	for (U32 i = 0; i < mBaseModel.size(); ++i) +	{ +		triangle_count += mBaseModel[i]->getNumTriangles(); +	} +	 +	//get ratio of uninstanced triangles to instanced triangles +	F32 triangle_ratio = (F32) triangle_count / (F32) instanced_triangle_count; +  	U32 base_triangle_count = triangle_count;  	U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; @@ -3926,6 +3941,8 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  		if (which_lod > -1 && which_lod < NUM_LOD)  		{  			limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger(); +			//convert from "scene wide" to "non-instanced" triangle limit +			limit *= triangle_ratio;  		}  	}  	else @@ -4031,7 +4048,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  		U32 actual_verts = 0;  		U32 submeshes = 0; -		mRequestedTriangleCount[lod] = triangle_count; +		mRequestedTriangleCount[lod] = triangle_count/triangle_ratio;  		mRequestedErrorThreshold[lod] = lod_error_threshold;  		glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode); @@ -4213,28 +4230,36 @@ void LLModelPreview::updateStatusMessages()  		//initialize total for this lod to 0  		total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0; -		for (U32 i = 0; i < mModel[lod].size(); ++i) -		{ //for each model in the lod -			S32 cur_tris = 0; -			S32 cur_verts = 0; -			S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces(); - -			for (S32 j = 0; j < cur_submeshes; ++j) -			{ //for each submesh (face), add triangles and vertices to current total -				const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j); -				cur_tris += face.mNumIndices/3; -				cur_verts += face.mNumVertices; -			} +		for (LLModelLoader::scene::iterator iter = mScene[lod].begin(), endIter = mScene[lod].end(); iter != endIter; ++iter) +		{ +			for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance) +			{ +				LLModel* model = instance->mModel; +				if (model) +				{ +					 //for each model in the lod +					S32 cur_tris = 0; +					S32 cur_verts = 0; +					S32 cur_submeshes = model->getNumVolumeFaces(); + +					for (S32 j = 0; j < cur_submeshes; ++j) +					{ //for each submesh (face), add triangles and vertices to current total +						const LLVolumeFace& face = model->getVolumeFace(j); +						cur_tris += face.mNumIndices/3; +						cur_verts += face.mNumVertices; +					} -			//add this model to the lod total -			total_tris[lod] += cur_tris; -			total_verts[lod] += cur_verts; -			total_submeshes[lod] += cur_submeshes; +					//add this model to the lod total +					total_tris[lod] += cur_tris; +					total_verts[lod] += cur_verts; +					total_submeshes[lod] += cur_submeshes; -			//store this model's counts to asset data -			tris[lod].push_back(cur_tris); -			verts[lod].push_back(cur_verts); -			submeshes[lod].push_back(cur_submeshes); +					//store this model's counts to asset data +					tris[lod].push_back(cur_tris); +					verts[lod].push_back(cur_verts); +					submeshes[lod].push_back(cur_submeshes); +				} +			}  		}  	} @@ -4411,34 +4436,38 @@ void LLModelPreview::updateStatusMessages()  	}  	//add up physics triangles etc -	S32 start = 0; -	S32 end = mModel[LLModel::LOD_PHYSICS].size(); -  	S32 phys_tris = 0;  	S32 phys_hulls = 0;  	S32 phys_points = 0; -	for (S32 i = start; i < end; ++i) -	{ //add up hulls and points and triangles for selected mesh(es) -		LLModel* model = mModel[LLModel::LOD_PHYSICS][i]; -		S32 cur_submeshes = model->getNumVolumeFaces(); - -		LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull; - -		if (!decomp.empty()) +	//get the triangle count for the whole scene +	for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter) +	{ +		for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)  		{ -			phys_hulls += decomp.size(); -			for (U32 i = 0; i < decomp.size(); ++i) +			LLModel* model = instance->mModel; +			if (model)  			{ -				phys_points += decomp[i].size(); -			} -		} -		else -		{ //choose physics shape OR decomposition, can't use both -			for (S32 j = 0; j < cur_submeshes; ++j) -			{ //for each submesh (face), add triangles and vertices to current total -				const LLVolumeFace& face = model->getVolumeFace(j); -				phys_tris += face.mNumIndices/3; +				S32 cur_submeshes = model->getNumVolumeFaces(); + +				LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull; + +				if (!decomp.empty()) +				{ +					phys_hulls += decomp.size(); +					for (U32 i = 0; i < decomp.size(); ++i) +					{ +						phys_points += decomp[i].size(); +					} +				} +				else +				{ //choose physics shape OR decomposition, can't use both +					for (S32 j = 0; j < cur_submeshes; ++j) +					{ //for each submesh (face), add triangles and vertices to current total +						const LLVolumeFace& face = model->getVolumeFace(j); +						phys_tris += face.mNumIndices/3; +					} +				}  			}  		}  	} | 
