diff options
Diffstat (limited to 'indra/llmath')
| -rw-r--r-- | indra/llmath/llmath.h | 7 | ||||
| -rw-r--r-- | indra/llmath/llvolume.cpp | 177 | ||||
| -rw-r--r-- | indra/llmath/llvolume.h | 6 | 
3 files changed, 19 insertions, 171 deletions
| diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index eea7c977fb..9297bcbac2 100644 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -510,6 +510,13 @@ inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)  	VEC_TYPE Q1 = data[data.size()/4];  	VEC_TYPE Q3 = data[data.size()-data.size()/4-1]; +	if ((F32)(Q3-Q1) < 1.f) +	{ +		// not enough variation to detect outliers +		return; +	} + +  	VEC_TYPE min = (VEC_TYPE) ((F32) Q1-k * (F32) (Q3-Q1));  	VEC_TYPE max = (VEC_TYPE) ((F32) Q3+k * (F32) (Q3-Q1)); diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 2893e746e9..1a95f9cd46 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2078,7 +2078,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge  	mFaceMask = 0x0;  	mDetail = detail;  	mSculptLevel = -2; -	mIsTetrahedron = FALSE; +	mIsMeshAssetLoaded = FALSE;  	mLODScaleBias.setVec(1,1,1);  	mHullPoints = NULL;  	mHullIndices = NULL; @@ -2100,7 +2100,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge  	generate(); -	if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE) +	if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE || mParams.getSculptType() == LL_SCULPT_TYPE_MESH)  	{  		createVolumeFaces();  	} @@ -2408,7 +2408,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)  	LLSD mdl;  	if (!unzip_llsd(mdl, is, size))  	{ -		llwarns << "not a valid mesh asset!" << llendl; +		LL_DEBUGS("MeshStreaming") << "Failed to unzip LLSD blob for LoD, will probably fetch from sim again." << llendl;  		return false;  	} @@ -2706,173 +2706,21 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)  	return true;  } -void tetrahedron_set_normal(LLVolumeFace::VertexData* cv) -{ -	LLVector4a v0; -	v0.setSub(cv[1].getPosition(), cv[0].getNormal()); -	LLVector4a v1; -	v1.setSub(cv[2].getNormal(), cv[0].getPosition()); -	 -	cv[0].getNormal().setCross3(v0,v1); -	cv[0].getNormal().normalize3fast(); -	cv[1].setNormal(cv[0].getNormal()); -	cv[2].setNormal(cv[1].getNormal()); -} -BOOL LLVolume::isTetrahedron() +BOOL LLVolume::isMeshAssetLoaded()  { -	return mIsTetrahedron; +	return mIsMeshAssetLoaded;  } -void LLVolume::makeTetrahedron() +void LLVolume::setMeshAssetLoaded(BOOL loaded)  { -	mVolumeFaces.clear(); - -	LLVolumeFace face; - -	F32 x = 0.25f; -	LLVector4a p[] =  -	{ //unit tetrahedron corners -		LLVector4a(x,x,x), -		LLVector4a(-x,-x,x), -		LLVector4a(-x,x,-x), -		LLVector4a(x,-x,-x) -	}; - -	face.mExtents[0].splat(-x); -	face.mExtents[1].splat(x); -	 -	LLVolumeFace::VertexData cv[3]; - -	//set texture coordinates -	cv[0].mTexCoord = LLVector2(0,0); -	cv[1].mTexCoord = LLVector2(1,0); -	cv[2].mTexCoord = LLVector2(0.5f, 0.5f*F_SQRT3); - - -	//side 1 -	cv[0].setPosition(p[1]); -	cv[1].setPosition(p[0]); -	cv[2].setPosition(p[2]); - -	tetrahedron_set_normal(cv); - -	face.resizeVertices(12); -	face.resizeIndices(12); - -	LLVector4a* v = (LLVector4a*) face.mPositions; -	LLVector4a* n = (LLVector4a*) face.mNormals; -	LLVector2* tc = (LLVector2*) face.mTexCoords; - -	v[0] = cv[0].getPosition(); -	v[1] = cv[1].getPosition(); -	v[2] = cv[2].getPosition(); -	v += 3; - -	n[0] = cv[0].getNormal(); -	n[1] = cv[1].getNormal(); -	n[2] = cv[2].getNormal(); -	n += 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]); -	cv[1].setPosition(p[0]); -	cv[2].setPosition(p[1]); - -	tetrahedron_set_normal(cv); - -	v[0] = cv[0].getPosition(); -	v[1] = cv[1].getPosition(); -	v[2] = cv[2].getPosition(); -	v += 3; - -	n[0] = cv[0].getNormal(); -	n[1] = cv[1].getNormal(); -	n[2] = cv[2].getNormal(); -	n += 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]); -	cv[2].setPosition(p[2]); - -	tetrahedron_set_normal(cv); - -	v[0] = cv[0].getPosition(); -	v[1] = cv[1].getPosition(); -	v[2] = cv[2].getPosition(); -	v += 3; - -	n[0] = cv[0].getNormal(); -	n[1] = cv[1].getNormal(); -	n[2] = cv[2].getNormal(); -	n += 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]); -	cv[1].setPosition(p[0]); -	cv[2].setPosition(p[3]); - -	tetrahedron_set_normal(cv); - -	v[0] = cv[0].getPosition(); -	v[1] = cv[1].getPosition(); -	v[2] = cv[2].getPosition(); -	v += 3; - -	n[0] = cv[0].getNormal(); -	n[1] = cv[1].getNormal(); -	n[2] = cv[2].getNormal(); -	n += 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++) -	{ -		face.mIndices[i] = i; -	} -	 -	mVolumeFaces.push_back(face); -	mSculptLevel = 0; -	mIsTetrahedron = TRUE; +	mIsMeshAssetLoaded = loaded;  }  void LLVolume::copyVolumeFaces(const LLVolume* volume)  {  	mVolumeFaces = volume->mVolumeFaces;  	mSculptLevel = 0; -	mIsTetrahedron = FALSE;  }  void LLVolume::cacheOptimize() @@ -2886,14 +2734,7 @@ void LLVolume::cacheOptimize()  S32	LLVolume::getNumFaces() const  { -	U8 sculpt_type = (mParams.getSculptType() & LL_SCULPT_TYPE_MASK); - -	if (sculpt_type == LL_SCULPT_TYPE_MESH) -	{ -		return LL_SCULPT_MESH_MAX_FACES; -	} - -	return (S32)mProfilep->mFaces.size(); +	return mIsMeshAssetLoaded ? getNumVolumeFaces() : (S32)mProfilep->mFaces.size();  } @@ -7269,7 +7110,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  		resizeVertices(num_vertices);  		resizeIndices(num_indices); -		if ((volume->getParams().getSculptType() & LL_SCULPT_TYPE_MASK) != LL_SCULPT_TYPE_MESH) +		if (!volume->isMeshAssetLoaded())  		{  			mEdge.resize(num_indices);  		} diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index f67f8f644d..f0e59a3c00 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -1058,14 +1058,14 @@ protected:  public:  	virtual bool unpackVolumeFaces(std::istream& is, S32 size); -	virtual void makeTetrahedron(); -	virtual BOOL isTetrahedron(); +	virtual void setMeshAssetLoaded(BOOL loaded); +	virtual BOOL isMeshAssetLoaded();   protected:  	BOOL mUnique;  	F32 mDetail;  	S32 mSculptLevel; -	BOOL mIsTetrahedron; +	BOOL mIsMeshAssetLoaded;  	LLVolumeParams mParams;  	LLPath *mPathp; | 
