diff options
Diffstat (limited to 'indra/llmath')
| -rwxr-xr-x | indra/llmath/llcamera.cpp | 86 | ||||
| -rwxr-xr-x | indra/llmath/llcamera.h | 37 | ||||
| -rwxr-xr-x | indra/llmath/llvolume.cpp | 76 | 
3 files changed, 101 insertions, 98 deletions
| diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp index 22ba26f99b..33cf185196 100755 --- a/indra/llmath/llcamera.cpp +++ b/indra/llmath/llcamera.cpp @@ -42,6 +42,11 @@ LLCamera::LLCamera() :  	mPlaneCount(6),  	mFrustumCornerDist(0.f)  { +	for (U32 i = 0; i < PLANE_MASK_NUM; i++) +	{ +		mPlaneMask[i] = PLANE_MASK_NONE; +	} +  	calculateFrustumPlanes();  }  @@ -52,6 +57,11 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p  	mPlaneCount(6),  	mFrustumCornerDist(0.f)  { +	for (U32 i = 0; i < PLANE_MASK_NUM; i++) +	{ +		mPlaneMask[i] = PLANE_MASK_NONE; +	} +  	mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);  	mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);  	if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE; @@ -87,14 +97,14 @@ F32 LLCamera::getMaxView() const  void LLCamera::setUserClipPlane(LLPlane& plane)  { -	mPlaneCount = 7; -	mAgentPlanes[6] = plane; -	mPlaneMask[6] = plane.calcPlaneMask(); +	mPlaneCount = AGENT_PLANE_USER_CLIP_NUM; +	mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane; +	mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask();  }  void LLCamera::disableUserClipPlane()  { -	mPlaneCount = 6; +	mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM;  }  void LLCamera::setView(F32 vertical_fov_rads)  @@ -161,31 +171,33 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)  // ---------------- test methods  ----------------  -S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius)  +static	const LLVector4a sFrustumScaler[] =   { -	static const LLVector4a scaler[] = { -		LLVector4a(-1,-1,-1), -		LLVector4a( 1,-1,-1), -		LLVector4a(-1, 1,-1), -		LLVector4a( 1, 1,-1), -		LLVector4a(-1,-1, 1), -		LLVector4a( 1,-1, 1), -		LLVector4a(-1, 1, 1), -		LLVector4a( 1, 1, 1) -	}; +	LLVector4a(-1,-1,-1), +	LLVector4a( 1,-1,-1), +	LLVector4a(-1, 1,-1), +	LLVector4a( 1, 1,-1), +	LLVector4a(-1,-1, 1), +	LLVector4a( 1,-1, 1), +	LLVector4a(-1, 1, 1), +	LLVector4a( 1, 1, 1)		// 8 entries +}; +S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius)  +{  	U8 mask = 0;  	bool result = false;  	LLVector4a rscale, maxp, minp;  	LLSimdScalar d; -	for (U32 i = 0; i < mPlaneCount; i++) +	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7 +	for (U32 i = 0; i < max_planes; i++)  	{  		mask = mPlaneMask[i]; -		if (mask != 0xff) +		if (mask < PLANE_MASK_NUM)  		{  			const LLPlane& p(mAgentPlanes[i]);  			p.getAt<3>(d); -			rscale.setMul(radius, scaler[mask]); +			rscale.setMul(radius, sFrustumScaler[mask]);  			minp.setSub(center, rscale);  			d = -d;  			if (p.dot3(minp).getF32() > d)  @@ -207,29 +219,19 @@ S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius)  S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius)   { -	static const LLVector4a scaler[] = { -		LLVector4a(-1,-1,-1), -		LLVector4a( 1,-1,-1), -		LLVector4a(-1, 1,-1), -		LLVector4a( 1, 1,-1), -		LLVector4a(-1,-1, 1), -		LLVector4a( 1,-1, 1), -		LLVector4a(-1, 1, 1), -		LLVector4a( 1, 1, 1) -	}; -  	U8 mask = 0;  	bool result = false;  	LLVector4a rscale, maxp, minp;  	LLSimdScalar d; -	for (U32 i = 0; i < mPlaneCount; i++) +	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7 +	for (U32 i = 0; i < max_planes; i++)  	{  		mask = mPlaneMask[i]; -		if ((i != 5) && (mask != 0xff)) +		if ((i != 5) && (mask < PLANE_MASK_NUM))  		{  			const LLPlane& p(mAgentPlanes[i]);  			p.getAt<3>(d); -			rscale.setMul(radius, scaler[mask]); +			rscale.setMul(radius, sFrustumScaler[mask]);  			minp.setSub(center, rscale);  			d = -d;  			if (p.dot3(minp).getF32() > d)  @@ -369,7 +371,7 @@ int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius)  	bool res = false;  	for (int i = 0; i < 6; i++)  	{ -		if (mPlaneMask[i] != 0xff) +		if (mPlaneMask[i] != PLANE_MASK_NONE)  		{  			float d = mAgentPlanes[i].dist(sphere_center); @@ -541,14 +543,14 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)  		return;  	} -	mPlaneMask[idx] = 0xff; +	mPlaneMask[idx] = PLANE_MASK_NONE;  	mAgentPlanes[idx].clear();  }  void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)  { -	for (int i = 0; i < 8; i++) +	for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++)  	{  		mAgentFrustum[i] = frust[i];  	} @@ -560,22 +562,22 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)  	//order of planes is important, keep most likely to fail in the front of the list  	//near - frust[0], frust[1], frust[2] -	mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]); +	mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]);  	//far   -	mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]); +	mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]);  	//left   -	mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]); +	mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]);  	//right   -	mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]); +	mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]);  	//top   -	mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]); +	mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]);  	//bottom   -	mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]); +	mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]);  	//cache plane octant facing mask for use in AABBInFrustum  	for (U32 i = 0; i < mPlaneCount; i++) @@ -635,7 +637,7 @@ void LLCamera::calculateWorldFrustumPlanes()  	LLVector3 center = mOrigin - mXAxis*mNearPlane;  	mWorldPlanePos = center;  	LLVector3 pnorm;	 -	for (int p=0; p<4; p++) +	for (int p = 0; p < PLANE_NUM; p++)  	{  		mLocalPlanes[p].getVector3(pnorm);  		LLVector3 norm = rotateToAbsolute(pnorm); diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h index 0b591be622..1283cfb16b 100755 --- a/indra/llmath/llcamera.h +++ b/indra/llmath/llcamera.h @@ -76,26 +76,39 @@ public:  		PLANE_RIGHT = 1,  		PLANE_BOTTOM = 2,  		PLANE_TOP = 3, -		PLANE_NUM = 4 +		PLANE_NUM = 4, +		PLANE_MASK_NONE = 0xff		// Disable this plane  	};  	enum {  		PLANE_LEFT_MASK = (1<<PLANE_LEFT),  		PLANE_RIGHT_MASK = (1<<PLANE_RIGHT),  		PLANE_BOTTOM_MASK = (1<<PLANE_BOTTOM),  		PLANE_TOP_MASK = (1<<PLANE_TOP), -		PLANE_ALL_MASK = 0xf +		PLANE_ALL_MASK = 0xf,  	};  	enum -	{ +	{	// Indexes to mAgentPlanes[] and mPlaneMask[]  		AGENT_PLANE_LEFT = 0, -		AGENT_PLANE_RIGHT, -		AGENT_PLANE_NEAR, -		AGENT_PLANE_BOTTOM, -		AGENT_PLANE_TOP, -		AGENT_PLANE_FAR, +		AGENT_PLANE_RIGHT = 1, +		AGENT_PLANE_NEAR = 2, +		AGENT_PLANE_BOTTOM = 3, +		AGENT_PLANE_TOP = 4, +		AGENT_PLANE_FAR = 5, +		AGENT_PLANE_USER_CLIP = 6 +	}; +	enum +	{	// Sizes for mAgentPlanes[].  7th entry is special case for user clip +		AGENT_PLANE_NO_USER_CLIP_NUM = 6, +		AGENT_PLANE_USER_CLIP_NUM = 7, +		PLANE_MASK_NUM = 8			// 7 actually used, 8 is for alignment  	}; +	enum +	{ +		AGENT_FRUSTRUM_NUM = 8 +	}; +	  	enum {  		HORIZ_PLANE_LEFT = 0,  		HORIZ_PLANE_RIGHT = 1, @@ -108,15 +121,15 @@ public:  	};  private: -	LL_ALIGN_16(LLPlane mAgentPlanes[7]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP -	U8 mPlaneMask[8];         // 8 for alignment	 +	LL_ALIGN_16(LLPlane mAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP +	U8 mPlaneMask[PLANE_MASK_NUM];         // 8 for alignment	  	F32 mView;					// angle between top and bottom frustum planes in radians.  	F32 mAspect;				// width/height  	S32 mViewHeightInPixels;	// for ViewHeightInPixels() only  	F32 mNearPlane;  	F32 mFarPlane; -	LL_ALIGN_16(LLPlane mLocalPlanes[4]); +	LL_ALIGN_16(LLPlane mLocalPlanes[PLANE_NUM]);  	F32 mFixedDistance;			// Always return this distance, unless < 0  	LLVector3 mFrustCenter;		// center of frustum and radius squared for ultra-quick exclusion test  	F32 mFrustRadiusSquared; @@ -128,7 +141,7 @@ private:  	LLVector3 mWorldPlanePos;		// Position of World Planes (may be offset from camera)  public: -	LLVector3 mAgentFrustum[8];  //8 corners of 6-plane frustum +	LLVector3 mAgentFrustum[AGENT_FRUSTRUM_NUM];  //8 corners of 6-plane frustum  	F32	mFrustumCornerDist;		//distance to corner of frustum against far clip plane  	LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; } diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index b90830ddd8..ad0ca618a0 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -94,16 +94,6 @@ const S32 SCULPT_MIN_AREA_DETAIL = 1;  extern BOOL gDebugGL; -void calc_tangent_from_triangle( -	LLVector4a&			normal, -	LLVector4a&			tangent_out, -	const LLVector4a& v1, -	const LLVector2&  w1, -	const LLVector4a& v2, -	const LLVector2&  w2, -	const LLVector4a& v3, -	const LLVector2&  w3); -  BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)  {      	LLVector3 test = (pt2-pt1)%(pt3-pt2); @@ -1604,7 +1594,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,  			S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions());  			if (is_sculpted) -				sides = llmax(sculpt_size,1); +				sides = llmax(sculpt_size, 1);  			genNGon(params, sides);  		} @@ -2072,7 +2062,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge  	generate(); -	if (mParams.getSculptID().isNull() && ((mParams.getSculptType() == LL_SCULPT_TYPE_NONE) || (mParams.getSculptType() == LL_SCULPT_TYPE_MESH))) +	if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE || mParams.getSculptType() == LL_SCULPT_TYPE_MESH)  	{  		createVolumeFaces();  	} @@ -5289,7 +5279,6 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		if (src.mTangents)  		{  			allocateTangents(src.mNumVertices); -			llassert(mTangents);  			LLVector4a::memcpyNonAliased16((F32*) mTangents, (F32*) src.mTangents, vert_size);  		}  		else @@ -5301,7 +5290,6 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		if (src.mWeights)  		{  			allocateWeights(src.mNumVertices); -			llassert(mWeights);  			LLVector4a::memcpyNonAliased16((F32*) mWeights, (F32*) src.mWeights, vert_size);  		}  		else @@ -5317,14 +5305,14 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size);  	} - +	  	//delete   	return *this;  }  LLVolumeFace::~LLVolumeFace()  { -		ll_aligned_free_16(mExtents); +	ll_aligned_free_16(mExtents);  	mExtents = NULL;  	freeData(); @@ -5334,7 +5322,7 @@ void LLVolumeFace::freeData()  {  	ll_aligned_free_16(mPositions);  	mPositions = NULL; -	ll_aligned_free_16(mNormals); +	ll_aligned_free_16( mNormals);  	mNormals = NULL;  	ll_aligned_free_16(mTexCoords);  	mTexCoords = NULL; @@ -5920,10 +5908,10 @@ void LLVolumeFace::cacheOptimize()  		wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);  	} -	LLVector4a* tangent = NULL; +	LLVector4a* binorm = NULL;  	if (mTangents)  	{ -		tangent = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); +		binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);  	}  	//allocate mapping of old indices to new indices @@ -6120,7 +6108,7 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)  			lhs.setSub(corners[1].getPosition(), corners[0].getPosition());  			LLVector4a rhs;  			rhs.setSub(corners[2].getPosition(), corners[1].getPosition()); -			baseVert.getNormal().setCross3(lhs, rhs); +			baseVert.getNormal().setCross3(lhs, rhs);   			baseVert.getNormal().normalize3fast();  		} @@ -6366,7 +6354,7 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)  		num_vertices++;  	} - +		  	allocateTangents(num_vertices);		  	for (S32 i = 0; i < num_vertices; i++) @@ -6719,7 +6707,7 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con  void LLVolumeFace::allocateTangents(S32 num_verts)  { -		ll_aligned_free_16(mTangents); +	ll_aligned_free_16(mTangents);  	mTangents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);  } @@ -7372,39 +7360,39 @@ void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVe  {  	LLVector4a* tan1 = (LLVector4a*) ll_aligned_malloc_16(vertexCount*2*sizeof(LLVector4a)); - LLVector4a* tan2 = tan1 + vertexCount; +    LLVector4a* tan2 = tan1 + vertexCount;  	memset(tan1, 0, vertexCount*2*sizeof(LLVector4a)); -   for (U32 a = 0; a < triangleCount; a++) -   { -      U32 i1 = *index_array++; -      U32 i2 = *index_array++; -      U32 i3 = *index_array++; +    for (U32 a = 0; a < triangleCount; a++) +    { +        U32 i1 = *index_array++; +        U32 i2 = *index_array++; +        U32 i3 = *index_array++; -      const LLVector4a& v1 = vertex[i1]; -      const LLVector4a& v2 = vertex[i2]; -      const LLVector4a& v3 = vertex[i3]; +        const LLVector4a& v1 = vertex[i1]; +        const LLVector4a& v2 = vertex[i2]; +        const LLVector4a& v3 = vertex[i3]; -      const LLVector2& w1 = texcoord[i1]; -      const LLVector2& w2 = texcoord[i2]; -      const LLVector2& w3 = texcoord[i3]; +        const LLVector2& w1 = texcoord[i1]; +        const LLVector2& w2 = texcoord[i2]; +        const LLVector2& w3 = texcoord[i3];  		const F32* v1ptr = v1.getF32ptr();  		const F32* v2ptr = v2.getF32ptr();  		const F32* v3ptr = v3.getF32ptr(); -      float x1 = v2ptr[0] - v1ptr[0]; -      float x2 = v3ptr[0] - v1ptr[0]; -      float y1 = v2ptr[1] - v1ptr[1]; -      float y2 = v3ptr[1] - v1ptr[1]; -      float z1 = v2ptr[2] - v1ptr[2]; -      float z2 = v3ptr[2] - v1ptr[2]; +        float x1 = v2ptr[0] - v1ptr[0]; +        float x2 = v3ptr[0] - v1ptr[0]; +        float y1 = v2ptr[1] - v1ptr[1]; +        float y2 = v3ptr[1] - v1ptr[1]; +        float z1 = v2ptr[2] - v1ptr[2]; +        float z2 = v3ptr[2] - v1ptr[2]; -      float s1 = w2.mV[0] - w1.mV[0]; -      float s2 = w3.mV[0] - w1.mV[0]; -      float t1 = w2.mV[1] - w1.mV[1]; -      float t2 = w3.mV[1] - w1.mV[1]; +        float s1 = w2.mV[0] - w1.mV[0]; +        float s2 = w3.mV[0] - w1.mV[0]; +        float t1 = w2.mV[1] - w1.mV[1]; +        float t2 = w3.mV[1] - w1.mV[1];  		F32 rd = s1*t2-s2*t1; | 
