diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2011-05-24 17:36:06 -0600 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2011-05-24 17:36:06 -0600 | 
| commit | f5726a094db77ec4fbba67e33d436cba8bf60a4b (patch) | |
| tree | 6fd493a5ef0901a1b2ef51d981643deac46a67ba | |
| parent | a704394bb50012e3e8d3be358d286188afccbdf2 (diff) | |
fix for
SH-712:Asset error given on upload of duck.dae using High LOD for physics shape - Analyze seems to not complete;
SH-889: Viewer crash when analyzing physics LOD;
SH-890: Viewer crash on Exit after analyzing physics layer which never seems to complete
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 31 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.h | 1 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 25 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelwizard.cpp | 25 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.h | 10 | 
6 files changed, 90 insertions, 21 deletions
| diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 57ac7a143f..030a61cd55 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1778,7 +1778,7 @@ void LLModel::updateHullCenters()  	if (mHullPoints > 0)  	{  		mCenterOfHullCenters *= 1.f / mHullPoints; -		llassert(mPhysics.asLLSD().has("HullList")); +		llassert(mPhysics.hasHullList());  	}  } @@ -2127,6 +2127,11 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)  	}  } +bool LLModel::Decomposition::hasHullList() const +{ +	return !mHull.empty() ; +} +  LLSD LLModel::Decomposition::asLLSD() const  {  	LLSD ret; @@ -2208,14 +2213,17 @@ LLSD LLModel::Decomposition::asLLSD() const  					//convert to 16-bit normalized across domain  					U16 val = (U16) (((mHull[i][j].mV[k]-min.mV[k])/range.mV[k])*65535); -					switch (k) +					if(valid.size() < 3)  					{ -						case 0: test = test | (U64) val; break; -						case 1: test = test | ((U64) val << 16); break; -						case 2: test = test | ((U64) val << 32); break; -					}; +						switch (k) +						{ +							case 0: test = test | (U64) val; break; +							case 1: test = test | ((U64) val << 16); break; +							case 2: test = test | ((U64) val << 32); break; +						}; -					valid.insert(test); +						valid.insert(test); +					}  					U8* buff = (U8*) &val;  					//write to binary buffer @@ -2227,8 +2235,8 @@ LLSD LLModel::Decomposition::asLLSD() const  				}  			} -			//must have at least 4 unique points -			llassert(valid.size() > 3); +			//must have at least 3 unique points +			llassert(valid.size() > 2);  		}  		ret["Position"] = p; @@ -2290,10 +2298,5 @@ void LLModel::Decomposition::merge(const LLModel::Decomposition* rhs)  	{ //take physics shape mesh from rhs  		mPhysicsShapeMesh = rhs->mPhysicsShapeMesh;  	} - -	if (!mHull.empty()) -	{ //verify -		llassert(asLLSD().has("HullList")); -	}  } diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 23f4b5cb42..ebca1f9d9d 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -106,6 +106,7 @@ public:  		Decomposition(LLSD& data);  		void fromLLSD(LLSD& data);  		LLSD asLLSD() const; +		bool hasHullList() const;  		void merge(const Decomposition* rhs); 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 d9a58d56fe..90e8f055dc 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -3751,6 +3751,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; | 
