diff options
| author | ruslantproductengine <ruslantproductengine@lindenlab.com> | 2014-11-28 18:17:54 +0200 | 
|---|---|---|
| committer | ruslantproductengine <ruslantproductengine@lindenlab.com> | 2014-11-28 18:17:54 +0200 | 
| commit | b3c8a559f6e6f340286204328e250312b2e467c5 (patch) | |
| tree | f430bccbaf2e0b83e9345fcd15ad1250a9bbbd41 /indra/newview | |
| parent | 5a1f4ac1a71b8d604cbef5f9f42823b494f04a03 (diff) | |
MAINT-3494 FIXED Generate Normals checkbox does not control generation of normals.
Diffstat (limited to 'indra/newview')
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.cpp | 75 | ||||
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.h | 7 | 
2 files changed, 77 insertions, 5 deletions
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 73bf7f3e23..f0c580c8ee 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -738,6 +738,11 @@ void LLFloaterModelPreview::toggleGenarateNormals()  {  	bool enabled = childGetValue("gen_normals").asBoolean();  	childSetEnabled("crease_angle", enabled); +	if(enabled) { +		mModelPreview->generateNormals(); +	} else { +		mModelPreview->restoreNormals(); +	}  }  //static @@ -3836,7 +3841,6 @@ void LLModelPreview::generateNormals()  	S32 which_lod = mPreviewLOD; -  	if (which_lod > 4 || which_lod < 0 ||  		mModel[which_lod].empty())  	{ @@ -3851,18 +3855,79 @@ void LLModelPreview::generateNormals()  	if (which_lod == 3 && !mBaseModel.empty())  	{ -		for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) +		if(mBaseModelFacesCopy.empty()) +		{ +			mBaseModelFacesCopy.reserve(mBaseModel.size()); +			for (LLModelLoader::model_list::iterator it = mBaseModel.begin(), itE = mBaseModel.end(); it != itE; ++it) +			{ +				v_LLVolumeFace_t faces; +				(*it)->copyFacesTo(faces); +				mBaseModelFacesCopy.push_back(std::move(faces)); +			} +		} + +		for (LLModelLoader::model_list::iterator it = mBaseModel.begin(), itE = mBaseModel.end(); it != itE; ++it)  		{ -			(*iter)->generateNormals(angle_cutoff); +			(*it)->generateNormals(angle_cutoff);  		}  		mVertexBuffer[5].clear();  	} -	for (LLModelLoader::model_list::iterator iter = mModel[which_lod].begin(); iter != mModel[which_lod].end(); ++iter) +	bool perform_copy = mModelFacesCopy[which_lod].empty(); +	if(perform_copy) { +		mModelFacesCopy[which_lod].reserve(mModel[which_lod].size()); +	} + +	for (LLModelLoader::model_list::iterator it = mModel[which_lod].begin(), itE = mModel[which_lod].end(); it != itE; ++it)  	{ -		(*iter)->generateNormals(angle_cutoff); +		if(perform_copy) +		{ +			v_LLVolumeFace_t faces; +			(*it)->copyFacesTo(faces); +			mModelFacesCopy[which_lod].push_back(std::move(faces)); +		} + +		(*it)->generateNormals(angle_cutoff); +	} + +	mVertexBuffer[which_lod].clear(); +	refresh(); +	updateStatusMessages(); +} + +void LLModelPreview::restoreNormals() +{ +	S32 which_lod = mPreviewLOD; + +	if (which_lod > 4 || which_lod < 0 || +		mModel[which_lod].empty()) +	{ +		return; +	} + +	if(!mBaseModelFacesCopy.empty()) +	{ +		llassert(mBaseModelFacesCopy.size() == mBaseModel.size()); + +		vv_LLVolumeFace_t::const_iterator itF = mBaseModelFacesCopy.begin(); +		for (LLModelLoader::model_list::iterator it = mBaseModel.begin(), itE = mBaseModel.end(); it != itE; ++it, ++itF) +		{ +			(*it)->copyFacesFrom((*itF)); +		} +	} +	mBaseModelFacesCopy.clear(); + + +	if(!mModelFacesCopy[which_lod].empty()) +	{ +		vv_LLVolumeFace_t::const_iterator itF = mModelFacesCopy[which_lod].begin(); +		for (LLModelLoader::model_list::iterator it = mModel[which_lod].begin(), itE = mModel[which_lod].end(); it != itE; ++it, ++itF) +		{ +			(*it)->copyFacesFrom((*itF)); +		}  	} +	mModelFacesCopy[which_lod].clear();  	mVertexBuffer[which_lod].clear();  	refresh(); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 6c0c60b87f..618748bd4e 100755 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -343,6 +343,7 @@ public:  	void loadModelCallback(S32 lod);  	void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);  	void generateNormals(); +	void restoreNormals();  	U32 calcResourceCost();  	void rebuildUploadData();  	void saveUploadData(bool save_skinweights, bool save_joint_poisitions); @@ -447,6 +448,12 @@ private:  	LLModelLoader::model_list mModel[LLModel::NUM_LODS];  	LLModelLoader::model_list mBaseModel; +	typedef std::vector<LLVolumeFace>		v_LLVolumeFace_t; +	typedef std::vector<v_LLVolumeFace_t>	vv_LLVolumeFace_t; +	 +	vv_LLVolumeFace_t mModelFacesCopy[LLModel::NUM_LODS]; +	vv_LLVolumeFace_t mBaseModelFacesCopy; +  	U32 mGroup;  	std::map<LLPointer<LLModel>, U32> mObject;  	U32 mMaxTriangleLimit;  | 
