diff options
Diffstat (limited to 'indra/llmath/llvolume.h')
| -rw-r--r-- | indra/llmath/llvolume.h | 152 | 
1 files changed, 117 insertions, 35 deletions
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index c6a156ae37..aa58d6d114 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -55,6 +55,7 @@ class LLVolume;  #include "v4coloru.h"  #include "llrefcount.h"  #include "llfile.h" +#include "llvector4a.h"  //============================================================================ @@ -791,35 +792,114 @@ public:  class LLVolumeFace  {  public: +	class VertexData +	{ +		enum  +		{ +			POSITION = 0, +			NORMAL = 1 +		}; + +	private: +		void init() +		{ +			mData = (LLVector4a*) _mm_malloc(32, 16); +		} +	public: +		VertexData() +		{ +			init(); +		} +			 +		VertexData(const VertexData& rhs) +		{ +			init(); +			LLVector4a::memcpyNonAliased16((F32*) mData, (F32*) rhs.mData, 8); +			mTexCoord = rhs.mTexCoord; +		} + +		~VertexData() +		{ +			_mm_free(mData); +		} + +		LLVector4a& getPosition() +		{ +			return mData[POSITION]; +		} + +		LLVector4a& getNormal() +		{ +			return mData[NORMAL]; +		} + +		const LLVector4a& getPosition() const +		{ +			return mData[POSITION]; +		} + +		const LLVector4a& getNormal() const +		{ +			return mData[NORMAL]; +		} +		 + +		void setPosition(const LLVector4a& pos) +		{ +			mData[POSITION] = pos; +		} + +		void setNormal(const LLVector4a& norm) +		{ +			mData[NORMAL] = norm; +		} + +		LLVector2 mTexCoord; + +		bool operator<(const VertexData& rhs) const; +		bool operator==(const VertexData& rhs) const; +		bool compareNormal(const VertexData& rhs, F32 angle_cutoff) const; + +	private: +		LLVector4a* mData; +	}; +  	LLVolumeFace() :   		mID(0),  		mTypeMask(0), -		mHasBinormals(FALSE),  		mBeginS(0),  		mBeginT(0),  		mNumS(0), -		mNumT(0) +		mNumT(0), +		mNumVertices(0), +		mNumIndices(0), +		mPositions(NULL), +		mNormals(NULL), +		mBinormals(NULL), +		mTexCoords(NULL), +		mIndices(NULL)  	{  	} +	~LLVolumeFace(); +  	BOOL create(LLVolume* volume, BOOL partial_build = FALSE);  	void createBinormals(); -	void makeTriStrip();  	void appendFace(const LLVolumeFace& face, LLMatrix4& transform, LLMatrix4& normal_tranform); -	class VertexData -	{ -	public: -		LLVector3 mPosition; -		LLVector3 mNormal; -		LLVector3 mBinormal; -		LLVector2 mTexCoord; +	void resizeVertices(S32 num_verts); +	void allocateBinormals(S32 num_verts); +	void resizeIndices(S32 num_indices); +	void fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v, std::vector<U16>& idx); -		bool operator<(const VertexData& rhs) const; -		bool operator==(const VertexData& rhs) const; -		bool compareNormal(const VertexData& rhs, F32 angle_cutoff) const; -	}; +	void pushVertex(const VertexData& cv); +	void pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc); +	void pushIndex(const U16& idx); + +	void swapData(LLVolumeFace& rhs); + +	void getVertexData(U16 indx, LLVolumeFace::VertexData& cv);  	class VertexMapData : public LLVolumeFace::VertexData  	{ @@ -828,28 +908,20 @@ public:  		bool operator==(const LLVolumeFace::VertexData& rhs) const  		{ -			return mPosition == rhs.mPosition && +			return getPosition().equal3(rhs.getPosition()) &&  				mTexCoord == rhs.mTexCoord && -				mNormal == rhs.mNormal; +				getNormal().equal3(rhs.getNormal());  		}  		struct ComparePosition  		{ -			bool operator()(const LLVector3& a, const LLVector3& b) const +			bool operator()(const LLVector4a& a, const LLVector4a& b) const  			{ -				if (a.mV[0] != b.mV[0]) -				{ -					return a.mV[0] < b.mV[0]; -				} -				if (a.mV[1] != b.mV[1]) -				{ -					return a.mV[1] < b.mV[1]; -				} -				return a.mV[2] < b.mV[2]; +				return a.less3(b);			  			}  		}; -		typedef std::map<LLVector3, std::vector<VertexMapData>, VertexMapData::ComparePosition > PointMap; +		typedef std::map<LLVector4a, std::vector<VertexMapData>, VertexMapData::ComparePosition > PointMap;  	};  	void optimize(F32 angle_cutoff = 2.f); @@ -873,7 +945,6 @@ public:  	S32 mID;  	U32 mTypeMask;  	LLVector3 mCenter; -	BOOL mHasBinormals;  	// Only used for INNER/OUTER faces  	S32 mBeginS; @@ -883,9 +954,15 @@ public:  	LLVector3 mExtents[2]; //minimum and maximum point of face -	std::vector<VertexData> mVertices; -	std::vector<U16>	mIndices; -	std::vector<U16>	mTriStrip; +	S32 mNumVertices; +	S32 mNumIndices; + +	LLVector4a* mPositions; +	LLVector4a* mNormals; +	LLVector4a* mBinormals; +	LLVector2* mTexCoords; +	U16* mIndices; +  	std::vector<S32>	mEdge;  	//list of skin weights for rigged volumes @@ -1038,17 +1115,22 @@ public:  std::ostream& operator<<(std::ostream &s, const LLVolumeParams &volume_params); -LLVector3 calc_binormal_from_triangle( -		const LLVector3& pos0, +void calc_binormal_from_triangle( +		LLVector4a& binormal, +		const LLVector4a& pos0,  		const LLVector2& tex0, -		const LLVector3& pos1, +		const LLVector4a& pos1,  		const LLVector2& tex1, -		const LLVector3& pos2, +		const LLVector4a& pos2,  		const LLVector2& tex2);  BOOL LLLineSegmentBoxIntersect(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size); +  BOOL LLTriangleRayIntersect(const LLVector3& vert0, const LLVector3& vert1, const LLVector3& vert2, const LLVector3& orig, const LLVector3& dir,  							F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided); + +BOOL LLTriangleRayIntersect(const LLVector4a& vert0, const LLVector4a& vert1, const LLVector4a& vert2, const LLVector4a& orig, const LLVector4a& dir, +							F32* intersection_a, F32* intersection_b, F32* intersection_t, BOOL two_sided);  | 
