diff options
| author | Mnikolenko Productengine <mnikolenko@productengine.com> | 2020-08-03 19:14:09 +0300 | 
|---|---|---|
| committer | Mnikolenko Productengine <mnikolenko@productengine.com> | 2020-08-03 19:14:09 +0300 | 
| commit | 7a9a114e168ea68345b54e80b3cfbac7deb4764a (patch) | |
| tree | 64356913973b8d29a3393357e0f480398ce43fed | |
| parent | 0570d6d3c1b56ebcd0309153ec0cebc7586a6286 (diff) | |
SL-13698 FIXED crash on model upload
| -rw-r--r-- | indra/llprimitive/lldaeloader.cpp | 26 | ||||
| -rw-r--r-- | indra/llprimitive/lldaeloader.h | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_model_preview.xml | 1 | 
3 files changed, 22 insertions, 7 deletions
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 431443788c..b9c74b7039 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -343,7 +343,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  	return LLModel::NO_ERRORS ;  } -LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly) +LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly, LLSD& log_msg)  {  	domPRef p = poly->getP();  	domListOfUInts& idx = p->getValue(); @@ -403,6 +403,7 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac  	LLVolumeFace::VertexMapData::PointMap point_map;  	U32 cur_idx = 0; +	bool log_tc_msg = true;  	for (U32 i = 0; i < vcount.getCount(); ++i)  	{ //for each polygon  		U32 first_index = 0; @@ -426,8 +427,21 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac  			if (tc_source)  			{ -				cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0], -									tc[idx[cur_idx+tc_offset]*2+1]); +				U64 idx_x = idx[cur_idx + tc_offset] * 2 + 0; +				U64 idx_y = idx[cur_idx + tc_offset] * 2 + 1; + +				if (idx_y < tc.getCount()) +				{ +					cv.mTexCoord.setVec(tc[idx_x], tc[idx_y]); +				}			 +				else if (log_tc_msg) +				{ +					log_tc_msg = false; +					LL_WARNS() << "Texture coordinates data is not complete." << LL_ENDL; +					LLSD args; +					args["Message"] = "IncompleteTC"; +					log_msg.append(args); +				}  			}  			if (norm_source) @@ -2362,7 +2376,7 @@ LLColor4 LLDAELoader::getDaeColor(daeElement* element)  	return value;  } -bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh) +bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh, LLSD& log_msg)  {  	LLModel::EModelStatus status = LLModel::NO_ERRORS;  	domTriangles_Array& tris = mesh->getTriangles_array(); @@ -2384,7 +2398,7 @@ bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)  	for (U32 i = 0; i < polys.getCount(); ++i)  	{  		domPolylistRef& poly = polys.get(i); -		status = load_face_from_dom_polylist(pModel->getVolumeFaces(), pModel->getMaterialList(), poly); +		status = load_face_from_dom_polylist(pModel->getVolumeFaces(), pModel->getMaterialList(), poly, log_msg);  		if(status != LLModel::NO_ERRORS)  		{ @@ -2448,7 +2462,7 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo  	// Get the whole set of volume faces  	// -	addVolumeFacesFromDomMesh(ret, mesh); +	addVolumeFacesFromDomMesh(ret, mesh, mWarningsArray);  	U32 volume_faces = ret->getNumVolumeFaces(); diff --git a/indra/llprimitive/lldaeloader.h b/indra/llprimitive/lldaeloader.h index 4e990dbe5e..b2db538d32 100644 --- a/indra/llprimitive/lldaeloader.h +++ b/indra/llprimitive/lldaeloader.h @@ -89,7 +89,7 @@ protected:  	//Verify that a controller matches vertex counts  	bool verifyController( domController* pController ); -	static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh); +	static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh, LLSD& log_msg = LLSD());  	static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh);  	static LLModel* loadModelFromDomMesh(domMesh* mesh); diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 4fa0b9af7d..9c1a9d2880 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -45,6 +45,7 @@    <string name="UnrecognizedJoint">Rigged to unrecognized joint name [NAME]</string>    <string name="UnknownJoints">Skinning disabled due to [COUNT] unknown joints</string>    <string name="ModelLoaded">Model [MODEL_NAME] loaded</string> +  <string name="IncompleteTC">Texture coordinates data is not complete.</string>    <panel      follows="top|left"  | 
