1 #ifndef _V3_
2 #define _V3_
3 
4 #define PFloat float
5 #define PI	 3.141592653589793
6 
7 #include <math.h>
8 class R3Matrix;
9 class Plane;
10 
11 
12 class XYCord {
13 
14 	public:
15 		long mX, mY;
16 };
17 
18 
19 class V3 {
20 
21 	public:
magnitudeSqr()22 		inline	PFloat		magnitudeSqr() const						{ return mX * mX + mY * mY + mZ * mZ;			}
magnitude()23 		inline	PFloat		magnitude()	const							{ return sqrt( mX * mX + mY * mY + mZ * mZ);	}
24 
set(const V3 & inPt)25 		inline	void		set( const V3& inPt )						{ *this = inPt;	}
set(PFloat inX,PFloat inY,PFloat inZ)26 		inline	void		set( PFloat inX, PFloat inY, PFloat inZ )	{ mX = inX; mY = inY; mZ = inZ;	}
27 
scale(PFloat inS,const V3 & inPt)28 		inline void			scale( PFloat inS, const V3& inPt )			{ mX = inS*inPt.mX; mY = inS*inPt.mY; mZ = inS*inPt.mZ;	}
scale(PFloat inS)29 		inline void			scale( PFloat inS )							{ mX *= inS; mY *= inS; mZ *= inS;				}
30 		void				normalize();
31 
32 
dot(const V3 & inV)33 		inline PFloat		dot( const V3& inV ) const					{ return mX*inV.mX + mY*inV.mY + mZ*inV.mZ;		}
34 
35 		void				transform( const R3Matrix& inMatrix );
36 		void				transform( const R3Matrix& inMatrix, const V3& inPt );
37 
38 		// Transforms the vector like the above two, but then applies a perspective transformation on the x and y coords
39 		void				transform( const R3Matrix& inMatrix, float inPersZ );
40 
applyPerspective()41 		inline void			applyPerspective()							{ mX /= mZ; mY /= mZ;	}
42 
43 
subtract(const V3 & inA)44 		inline void			subtract( const V3& inA )					{ mX -= inA.mX; mY -= inA.mY; mZ -= inA.mZ;						}
subtract(const V3 & inA,const V3 & inB)45 		inline void			subtract( const V3& inA, const V3& inB )	{ mX = inA.mX-inB.mX; mY = inA.mY-inB.mY; mZ = inA.mZ-inB.mZ;						}
46 
47 
add(PFloat inX,PFloat inY,PFloat inZ)48 		inline void			add( PFloat inX, PFloat inY, PFloat inZ )	{ mX += inX; mY += inY; mZ += inZ;				}
add(const V3 & inA,const V3 & inB)49 		inline void			add( const V3& inA, const V3& inB )			{ mX = inA.mX+inB.mX; mY = inA.mY+inB.mY; mZ = inA.mZ+inB.mZ;						}
add(const V3 & inA)50 		inline void			add( const V3& inA )						{ mX += inA.mX; mY += inA.mY; mZ += inA.mZ;						}
51 
52 
53 		void				toPlane( const V3& inNormal );
54 		void				fromPlane( const V3& inNormal );
55 
56 		// Assigns intersection of a plane with a line to this pt
57 		bool				intersection( const Plane& inPlane, const V3& inLine, const V3& inPt );
58 
59 		// Rotates this pt around the line defined by inPt1 and inPt2
60 		void				rotate( const V3& inPt1, const V3& inPt2, PFloat inAng );
61 
62 		void				cross( const V3& inA );
63 		void				cross( const V3& inA, const V3& inB );
64 
65 		PFloat	mX, mY, mZ;
66 
67 };
68 
69 #endif
70