diff options
| -rwxr-xr-x | indra/newview/llfloatermodelpreview.cpp | 88 | 
1 files changed, 67 insertions, 21 deletions
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index b74f10f5cb..918dc98a3a 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -202,6 +202,15 @@ LLViewerFetchedTexture* bindMaterialDiffuseTexture(const LLImportMaterial& mater  	return NULL;  } +std::string stripSuffix(std::string name) +{ +	if ((name.find("_LOD") != -1) || (name.find("_PHYS") != -1)) +	{ +		return name.substr(0, name.rfind('_')); +	} +	return name; +} +  LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)  : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)  	{ @@ -1993,34 +2002,71 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)  			if (!legacyMatching)  			{  				if (!mBaseModel.empty()) -				{ // replace the name of the model loaded for any non-HIGH LOD to match the others (MAINT-5601) -					for (U32 idx = 0; idx < mModel[loaded_lod].size() && idx < mBaseModel.size(); ++idx) +				{  +					BOOL name_based = FALSE; +					BOOL has_submodels = FALSE; +					for (U32 idx = 0; idx < mBaseModel.size(); ++idx)  					{ -						std::string name = mBaseModel[idx]->mLabel; -						std::string loaded_name = mModel[loaded_lod][idx]->mLabel;  +						if (mBaseModel[idx]->mSubmodelID) +						{ // don't do index-based renaming when the base model has submodels +							has_submodels = TRUE; +							if (importerDebug) +							{ +								LL_INFOS() << "High LOD has submodels" << LL_ENDL; +							} +							break; +						} +					} -						if ((loaded_name.find("_LOD") != -1) || (loaded_name.find("_PHYS") != -1)) -						{ // base model is LOD_HIGH so its name has no suffix, stripping loaded LOD name to match it -							loaded_name = loaded_name.substr(0, loaded_name.rfind('_')); +					for (U32 idx = 0; idx < mModel[loaded_lod].size(); ++idx) +					{ +						std::string loaded_name = stripSuffix(mModel[loaded_lod][idx]->mLabel); + +						LLModel* found_model = NULL; +						LLMatrix4 transform; +						FindModel(mBaseScene, loaded_name, found_model, transform); +						if (found_model) +						{ // don't rename correctly named models (even if they are placed in a wrong order) +							name_based = TRUE;  						} -						if (loaded_name != name) -						{ -							switch (loaded_lod) -							{ -							case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break; -							case LLModel::LOD_LOW:      name += "_LOD1"; break; -							case LLModel::LOD_MEDIUM:   name += "_LOD2"; break; -							case LLModel::LOD_PHYSICS:  name += "_PHYS"; break; -							case LLModel::LOD_HIGH:                      break; -							} +						if (mModel[loaded_lod][idx]->mSubmodelID) +						{ // don't rename the models when loaded LOD model has submodels +							has_submodels = TRUE; +						} +					} -							if (importerDebug) +					if (importerDebug) +					{ +						LL_INFOS() << "Loaded LOD " << loaded_lod << ": correct names" << (name_based ? "" : "NOT ") << "found; submodels " << (has_submodels ? "" : "NOT ") << "found" << LL_ENDL; +					} + +					if (!name_based && !has_submodels) +					{ // replace the name of the model loaded for any non-HIGH LOD to match the others (MAINT-5601) +					  // this actually works like "ImporterLegacyMatching" for this particular LOD +						for (U32 idx = 0; idx < mModel[loaded_lod].size() && idx < mBaseModel.size(); ++idx) +						{  +							std::string name = mBaseModel[idx]->mLabel; +							std::string loaded_name = stripSuffix(mModel[loaded_lod][idx]->mLabel); + +							if (loaded_name != name)  							{ -								LL_INFOS() << "Loded model name " << mModel[loaded_lod][idx]->mLabel << " for LOD " << loaded_lod << " doesn't match the base model. Renaming to " << name << LL_ENDL; -							} +								switch (loaded_lod) +								{ +								case LLModel::LOD_IMPOSTOR: name += "_LOD0"; break; +								case LLModel::LOD_LOW:      name += "_LOD1"; break; +								case LLModel::LOD_MEDIUM:   name += "_LOD2"; break; +								case LLModel::LOD_PHYSICS:  name += "_PHYS"; break; +								case LLModel::LOD_HIGH:                      break; +								} -							mModel[loaded_lod][idx]->mLabel = name; +								if (importerDebug) +								{ +									LL_WARNS() << "Loded model name " << mModel[loaded_lod][idx]->mLabel << " for LOD " << loaded_lod << " doesn't match the base model. Renaming to " << name << LL_ENDL; +								} + +								mModel[loaded_lod][idx]->mLabel = name; +							}  						}  					}  				}  | 
