diff options
| author | Dave Parks <davep@lindenlab.com> | 2013-06-20 17:17:28 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2013-06-20 17:17:28 -0500 | 
| commit | 4e46ce5520cb3d8793921c2a0f9e67f16ad776ba (patch) | |
| tree | 856b9f3aac9c8046b544b868e4e007a264adae1a | |
| parent | 1e3060f6d5658946395a618201fc6b9788c8f0be (diff) | |
MATBUG-204 Fix for crash in genVolumeBBoxes
| -rwxr-xr-x | indra/llmath/llvolume.cpp | 13 | ||||
| -rwxr-xr-x | indra/newview/llface.cpp | 117 | ||||
| -rwxr-xr-x | indra/newview/llface.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvovolume.cpp | 2 | 
4 files changed, 39 insertions, 95 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index c4e1f0c84c..14cebfe5aa 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -7277,9 +7277,6 @@ void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVe  		const LLVector4a& t = tan1[a]; -		llassert(tan1[a].getLength3().getF32() >= 0.f); -		llassert(tan2[a].getLength3().getF32() >= 0.f); -  		LLVector4a ncrosst;  		ncrosst.setCross3(n,t); @@ -7299,16 +7296,6 @@ void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVe  			tsubn.getF32ptr()[3] = handedness;  			tangent[a] = tsubn; - -			/* -			These are going off on invalid input and hindering other debugging. -			llassert(llfinite(tangent[a].getF32ptr()[0])); -			llassert(llfinite(tangent[a].getF32ptr()[1])); -			llassert(llfinite(tangent[a].getF32ptr()[2])); - -			llassert(!llisnan(tangent[a].getF32ptr()[0])); -			llassert(!llisnan(tangent[a].getF32ptr()[1])); -			llassert(!llisnan(tangent[a].getF32ptr()[2]));*/  		}  		else  		{ //degenerate, make up a value diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index f021f4ed0f..e63e4285e7 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -768,7 +768,7 @@ bool less_than_max_mag(const LLVector4a& vec)  }  BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, -								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume) +								const LLMatrix4& mat_vert_in, BOOL global_volume)  {  	//get bounding box  	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED)) @@ -777,10 +777,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		LLMatrix4a mat_vert;  		mat_vert.loadu(mat_vert_in); -		LLMatrix4a mat_normal; -		mat_normal.loadu(mat_normal_in); - -		//VECTORIZE THIS  		LLVector4a min,max;  		if (f >= volume.getNumVolumeFaces()) @@ -797,104 +793,65 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,  		llassert(less_than_max_mag(max));  		//min, max are in volume space, convert to drawable render space -		LLVector4a center; -		LLVector4a t; -		t.setAdd(min, max); -		t.mul(0.5f); -		mat_vert.affineTransform(t, center); -		LLVector4a size; -		size.setSub(max, min); -		size.mul(0.5f); -		llassert(less_than_max_mag(min)); -		llassert(less_than_max_mag(max)); +		//get 8 corners of bounding box +		LLVector4Logical mask[6]; -		if (!global_volume) +		for (U32 i = 0; i < 6; ++i)  		{ -			//VECTORIZE THIS -			LLVector4a scale; -			scale.load3(mDrawablep->getVObj()->getScale().mV); -			size.mul(scale); +			mask[i].clear();  		} -		// Catch potential badness from normalization before it happens -		// -		llassert(mat_normal.mMatrix[0].isFinite3() && (mat_normal.mMatrix[0].dot3(mat_normal.mMatrix[0]).getF32() > F_APPROXIMATELY_ZERO)); -		llassert(mat_normal.mMatrix[1].isFinite3() && (mat_normal.mMatrix[1].dot3(mat_normal.mMatrix[1]).getF32() > F_APPROXIMATELY_ZERO)); -		llassert(mat_normal.mMatrix[2].isFinite3() && (mat_normal.mMatrix[2].dot3(mat_normal.mMatrix[2]).getF32() > F_APPROXIMATELY_ZERO)); - -		mat_normal.mMatrix[0].normalize3fast(); -		mat_normal.mMatrix[1].normalize3fast(); -		mat_normal.mMatrix[2].normalize3fast(); +		mask[0].setElement<2>(); //001 +		mask[1].setElement<1>(); //010 +		mask[2].setElement<1>(); //011 +		mask[2].setElement<2>(); +		mask[3].setElement<0>(); //100 +		mask[4].setElement<0>(); //101 +		mask[4].setElement<2>(); +		mask[5].setElement<0>(); //110 +		mask[5].setElement<1>(); -		LLVector4a v[4]; +		LLVector4a v[8]; -		//get 4 corners of bounding box -		mat_normal.rotate(size,v[0]); +		v[6] = min; +		v[7] = max; -		//VECTORIZE THIS -		LLVector4a scale; -		 -		scale.set(-1.f, -1.f, 1.f); -		scale.mul(size); -		mat_normal.rotate(scale, v[1]); -		 -		scale.set(1.f, -1.f, -1.f); -		scale.mul(size); -		mat_normal.rotate(scale, v[2]); -		 -		scale.set(-1.f, 1.f, -1.f); -		scale.mul(size); -		mat_normal.rotate(scale, v[3]); - -		LLVector4a& newMin = mExtents[0]; -		LLVector4a& newMax = mExtents[1]; -		 -		newMin = newMax = center; -		 -		llassert(less_than_max_mag(center)); -		 -		for (U32 i = 0; i < 4; i++) +		for (U32 i = 0; i < 6; ++i)  		{ -			LLVector4a delta; -			delta.setAbs(v[i]); -			LLVector4a min; -			min.setSub(center, delta); -			LLVector4a max; -			max.setAdd(center, delta); +			v[i].setSelectWithMask(mask[i], min, max); +		} -			newMin.setMin(newMin,min); -			newMax.setMax(newMax,max); +		LLVector4a tv[8]; -			llassert(less_than_max_mag(newMin)); -			llassert(less_than_max_mag(newMax)); +		//transform bounding box into drawable space +		for (U32 i = 0; i < 8; ++i) +		{ +			mat_vert.affineTransform(v[i], tv[i]);  		} +	 +		//find bounding box +		LLVector4a& newMin = mExtents[0]; +		LLVector4a& newMax = mExtents[1]; -		if (!mDrawablep->isActive()) +		newMin = newMax = tv[0]; + +		for (U32 i = 1; i < 8; ++i)  		{ -			LLVector4a offset; -			offset.load3(mDrawablep->getRegion()->getOriginAgent().mV); -			newMin.add(offset); -			newMax.add(offset); -			 -			llassert(less_than_max_mag(newMin)); -			llassert(less_than_max_mag(newMax)); +			newMin.setMin(newMin, tv[i]); +			newMax.setMax(newMax, tv[i]);  		} -		t.setAdd(newMin, newMax); +		LLVector4a t; +		t.setAdd(newMin,newMax);  		t.mul(0.5f); -		llassert(less_than_max_mag(t)); -		 -		//VECTORIZE THIS  		mCenterLocal.set(t.getF32ptr()); -		 -		llassert(less_than_max_mag(newMin)); -		llassert(less_than_max_mag(newMax));  		t.setSub(newMax,newMin);  		mBoundingSphereRadius = t.getLength3().getF32()*0.5f; +	  		updateCenterAgent();  	} diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 0687544d53..763634a3ab 100755 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -195,7 +195,7 @@ public:  	void		setSize(S32 numVertices, S32 num_indices = 0, bool align = false);  	BOOL		genVolumeBBoxes(const LLVolume &volume, S32 f, -								   const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE); +								   const LLMatrix4& mat, BOOL global_volume = FALSE);  	void		init(LLDrawable* drawablep, LLViewerObject* objp);  	void		destroy(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index eb9e1bb2d0..77a7d22ea3 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1458,7 +1458,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)  			continue;  		}  		res &= face->genVolumeBBoxes(*volume, i, -										mRelativeXform, mRelativeXformInvTrans, +										mRelativeXform,   										(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);  		if (rebuild) | 
