diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2011-06-24 15:09:10 -0600 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2011-06-24 15:09:10 -0600 | 
| commit | f83b08b69c84d6df9cebb79167804cd295555481 (patch) | |
| tree | 5b996dd831e1960ba55717b9ed4d6fe3506052c4 /indra | |
| parent | c3ac5be99521979a9cb4395abf729bbbb59e5d49 (diff) | |
fix for SH-1878: Viewer hang in GLOD_Group::adaptTriangleBudget during LLModelPreview::genLODs;
SH-1891: viewer crashes while previewing "RYOMA 3D XML File.dae";
SH-1890: Crash loading palm tree
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llmath/llvolume.cpp | 58 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 11 | 
3 files changed, 45 insertions, 34 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index d401ce7de7..bddb8d8c66 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2774,11 +2774,13 @@ void LLVolume::makeTetrahedron()  	n[2] = cv[2].getNormal();  	n += 3; -	tc[0] = cv[0].mTexCoord; -	tc[1] = cv[1].mTexCoord; -	tc[2] = cv[2].mTexCoord; -	tc += 3; - +	if(tc) +	{ +		tc[0] = cv[0].mTexCoord; +		tc[1] = cv[1].mTexCoord; +		tc[2] = cv[2].mTexCoord; +		tc += 3; +	}  	//side 2  	cv[0].setPosition(p[3]); @@ -2797,11 +2799,14 @@ void LLVolume::makeTetrahedron()  	n[2] = cv[2].getNormal();  	n += 3; -	tc[0] = cv[0].mTexCoord; -	tc[1] = cv[1].mTexCoord; -	tc[2] = cv[2].mTexCoord; -	tc += 3; -	 +	if(tc) +	{ +		tc[0] = cv[0].mTexCoord; +		tc[1] = cv[1].mTexCoord; +		tc[2] = cv[2].mTexCoord; +		tc += 3; +	} +  	//side 3  	cv[0].setPosition(p[3]);  	cv[1].setPosition(p[1]); @@ -2819,10 +2824,13 @@ void LLVolume::makeTetrahedron()  	n[2] = cv[2].getNormal();  	n += 3; -	tc[0] = cv[0].mTexCoord; -	tc[1] = cv[1].mTexCoord; -	tc[2] = cv[2].mTexCoord; -	tc += 3; +	if(tc) +	{ +		tc[0] = cv[0].mTexCoord; +		tc[1] = cv[1].mTexCoord; +		tc[2] = cv[2].mTexCoord; +		tc += 3; +	}  	//side 4  	cv[0].setPosition(p[2]); @@ -2841,10 +2849,13 @@ void LLVolume::makeTetrahedron()  	n[2] = cv[2].getNormal();  	n += 3; -	tc[0] = cv[0].mTexCoord; -	tc[1] = cv[1].mTexCoord; -	tc[2] = cv[2].mTexCoord; -	tc += 3; +	if(tc) +	{ +		tc[0] = cv[0].mTexCoord; +		tc[1] = cv[1].mTexCoord; +		tc[2] = cv[2].mTexCoord; +		tc += 3; +	}  	//set index buffer  	for (U16 i = 0; i < 12; i++) @@ -5613,7 +5624,16 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size);  		LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size); -		LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size); + +		if(src.mTexCoords) +		{ +			LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size); +		} +		else +		{ +			ll_aligned_free_16(mTexCoords) ; +			mTexCoords = NULL ; +		}  		if (src.mBinormals) diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index f2fe20b3e7..972f256076 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -260,7 +260,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  			if (!tc_source)  			{ -				ll_aligned_free_16(face.mTexCoords); +				ll_aligned_free_16(new_face.mTexCoords);  				new_face.mTexCoords = NULL;  			} @@ -291,7 +291,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa  		if (!tc_source)  		{ -			ll_aligned_free_16(face.mTexCoords); +			ll_aligned_free_16(new_face.mTexCoords);  			new_face.mTexCoords = NULL;  		}  	} @@ -479,7 +479,7 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac  				if (!tc_source)  				{ -					ll_aligned_free_16(face.mTexCoords); +					ll_aligned_free_16(new_face.mTexCoords);  					new_face.mTexCoords = NULL;  				} @@ -513,7 +513,7 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac  		if (!tc_source)  		{ -			ll_aligned_free_16(face.mTexCoords); +			ll_aligned_free_16(new_face.mTexCoords);  			new_face.mTexCoords = NULL;  		}  	} @@ -713,7 +713,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac  		if (!t)  		{ -			ll_aligned_free_16(face.mTexCoords); +			ll_aligned_free_16(new_face.mTexCoords);  			new_face.mTexCoords = NULL;  		}  	} diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 77713b6ebb..0006e3423b 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -4500,16 +4500,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)  			bool skinned = include_skin_weights && !mdl->mSkinWeights.empty(); -			U32 mask = LLVertexBuffer::MAP_VERTEX; -			 -			if (vf.mNormals) -			{ -				mask |= LLVertexBuffer::MAP_NORMAL; -			} -			if (vf.mTexCoords) -			{ -				mask |= LLVertexBuffer::MAP_TEXCOORD0; -			} +			U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 ;  			if (skinned)  			{ | 
