diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2011-05-24 17:37:21 -0600 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2011-05-24 17:37:21 -0600 | 
| commit | cb797532c0bd7ca0ab4caf66c48aa55ec99160a0 (patch) | |
| tree | 1c5d90dcb2dfd93cc03acf2d2156c0ddaed3340b /indra/newview | |
| parent | 79131e8a480ab3611ce739717ed84c6ad76aa234 (diff) | |
| parent | f5726a094db77ec4fbba67e33d436cba8bf60a4b (diff) | |
Automated merge with http://hg.secondlife.com/mesh-development
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 25 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelwizard.cpp | 25 | ||||
| -rwxr-xr-x | indra/newview/llmeshrepository.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.h | 10 | 
4 files changed, 72 insertions, 7 deletions
| diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 9dd5269a6b..2a3bd37129 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -4962,9 +4962,12 @@ LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LL  	if (mdl)  	{  		U16 index_offset = 0; +		U16 tri[3] ;  		mPositions.clear();  		mIndices.clear(); +		mBBox[1] = LLVector3(F32_MIN, F32_MIN, F32_MIN) ; +		mBBox[0] = LLVector3(F32_MAX, F32_MAX, F32_MAX) ;  		//queue up vertex positions and indices  		for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) @@ -4978,12 +4981,28 @@ LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LL  			for (U32 j = 0; j < face.mNumVertices; ++j)  			{  				mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr())); +				for(U32 k = 0 ; k < 3 ; k++) +				{ +					mBBox[0].mV[k] = llmin(mBBox[0].mV[k], mPositions[j].mV[k]) ; +					mBBox[1].mV[k] = llmax(mBBox[1].mV[k], mPositions[j].mV[k]) ; +				}  			} -			for (U32 j = 0; j < face.mNumIndices; ++j) +			updateTriangleAreaThreshold() ; + +			for (U32 j = 0; j+2 < face.mNumIndices; j += 3)  			{ -				mIndices.push_back(face.mIndices[j]+index_offset); -			} +				tri[0] = face.mIndices[j] + index_offset ; +				tri[1] = face.mIndices[j + 1] + index_offset ; +				tri[2] = face.mIndices[j + 2] + index_offset ; +				 +				if(isValidTriangle(tri[0], tri[1], tri[2])) +				{ +					mIndices.push_back(tri[0]); +					mIndices.push_back(tri[1]); +					mIndices.push_back(tri[2]); +				} +			}			  			index_offset += face.mNumVertices;  		} diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp index faf81dbc5c..e44737f39e 100644 --- a/indra/newview/llfloatermodelwizard.cpp +++ b/indra/newview/llfloatermodelwizard.cpp @@ -441,10 +441,13 @@ LLFloaterModelWizard::DecompRequest::DecompRequest(const std::string& stage, LLM  	if (mdl)  	{  		U16 index_offset = 0; +		U16 tri[3] ;  		mPositions.clear();  		mIndices.clear(); - +		mBBox[1] = LLVector3(F32_MIN, F32_MIN, F32_MIN) ; +		mBBox[0] = LLVector3(F32_MAX, F32_MAX, F32_MAX) ; +		  		//queue up vertex positions and indices  		for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)  		{ @@ -457,11 +460,27 @@ LLFloaterModelWizard::DecompRequest::DecompRequest(const std::string& stage, LLM  			for (U32 j = 0; j < face.mNumVertices; ++j)  			{  				mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr())); +				for(U32 k = 0 ; k < 3 ; k++) +				{ +					mBBox[0].mV[k] = llmin(mBBox[0].mV[k], mPositions[j].mV[k]) ; +					mBBox[1].mV[k] = llmax(mBBox[1].mV[k], mPositions[j].mV[k]) ; +				}  			} -			for (U32 j = 0; j < face.mNumIndices; ++j) +			updateTriangleAreaThreshold() ; + +			for (U32 j = 0; j+2 < face.mNumIndices; j += 3)  			{ -				mIndices.push_back(face.mIndices[j]+index_offset); +				tri[0] = face.mIndices[j] + index_offset ; +				tri[1] = face.mIndices[j + 1] + index_offset ; +				tri[2] = face.mIndices[j + 2] + index_offset ; +				 +				if(isValidTriangle(tri[0], tri[1], tri[2])) +				{ +					mIndices.push_back(tri[0]); +					mIndices.push_back(tri[1]); +					mIndices.push_back(tri[2]); +				}  			}  			index_offset += face.mNumVertices; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 2f5563e1a6..b79f120eda 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -3820,6 +3820,25 @@ void LLPhysicsDecomp::run()  	mDone = true;  } +void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()  +{ +	F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ; +	range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ; +	range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ; + +	mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ; +} + +//check if the triangle area is large enough to qualify for a valid triangle +bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)  +{ +	LLVector3 a = mPositions[idx2] - mPositions[idx1] ; +	LLVector3 b = mPositions[idx3] - mPositions[idx1] ; +	F32 c = a * b ; + +	return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ; +} +  void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)  {  	mStatusMessage = msg; diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index f859e29c07..0a6954bade 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -152,7 +152,7 @@ public:  		std::string mStatusMessage;  		std::vector<LLModel::PhysicsMesh> mHullMesh;  		LLModel::convex_hull_decomposition mHull; -		 +			  		//status message callback, called from decomposition thread  		virtual S32 statusCallback(const char* status, S32 p1, S32 p2) = 0; @@ -160,6 +160,14 @@ public:  		virtual void completed() = 0;  		virtual void setStatusMessage(const std::string& msg); + +	protected: +		//internal use +		LLVector3 mBBox[2] ; +		F32 mTriangleAreaThreshold ; + +		void updateTriangleAreaThreshold() ; +		bool isValidTriangle(U16 idx1, U16 idx2, U16 idx3) ;  	};  	LLCondition* mSignal; | 
