00001
00002
00003
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef TA_VEC3_H
00014 #define TA_VEC3_H
00015
00016 #ifndef TA_MATHS_H
00017 #include "Maths.h"
00018 #endif // TA_MATHS_H
00019
00020 TA_OBFUSCATION_SKIP_PASS_2
00021
00022 #define TA_VEC3_CALL TA_FAST_CALL
00023
00024
00025
00026 #ifndef _DEBUG
00027
00028 #endif
00029
00030
00031
00032 #if defined(TA_SSE) || defined(TA_SSE2)
00033
00034 #ifndef TA_VEC3SSE_H
00035 #include "Vec3SSE.h"
00036 #endif // TA_VEC3SSE_H
00037
00038 #elif defined(TA_META_TEMPLATED_VECTORS)
00039
00040 #ifndef TA_VEC3MT_H
00041 #include "Vec3MT.h"
00042 #endif // TA_VEC3MT_H
00043
00044 #else
00045
00046 #define TA_VEC3_ZERO_PADDING() padding = 0
00047
00048
00049 namespace TA
00050 {
00051
00052
00054
00055
00056
00057
00058 TA_ALIGN_16 struct TACOMMON_CLASS Vec3
00059 {
00060
00061 float x;
00062 float y;
00063 float z;
00064 float padding;
00065
00066 TA_OBFUSCATION_RESERVED_ON
00067 enum Axis
00068 {
00069 AXIS_X = 0,
00070 AXIS_Y,
00071 AXIS_Z,
00072 };
00073
00075
00076 Vec3() { TA_VEC3_ZERO_PADDING(); };
00077 Vec3(int x) { TA_VEC3_ZERO_PADDING(); };
00078 Vec3(const Vec3& v3Value) { x = v3Value.x; y = v3Value.y; z = v3Value.z; TA_VEC3_ZERO_PADDING(); }
00079 Vec3(float fX, float fY, float fZ) { x = fX; y = fY; z = fZ; TA_VEC3_ZERO_PADDING(); }
00080
00081 void Initialise(float fX, float fY, float fZ) { x = fX; y = fY; z = fZ; TA_VEC3_ZERO_PADDING(); }
00083
00085
00086 operator float* () { return (float*)&x; }
00087 operator const float* () const { return (float*)&x; }
00089
00091
00092 float& operator [] (int nIndex) { return ((float*)&x)[nIndex]; }
00093 const float& operator [] (int nIndex) const { return ((float*)&x)[nIndex]; }
00095
00097
00098 Vec3& operator += (const Vec3& v3Value) { x += v3Value.x; y += v3Value.y; z += v3Value.z; return *this; }
00099 Vec3& operator -= (const Vec3& v3Value) { x -= v3Value.x; y -= v3Value.y; z -= v3Value.z; return *this; }
00100 Vec3& operator *= (float fValue) { x *= fValue; y *= fValue; z *= fValue; return *this; }
00101 Vec3& operator /= (float fValue) { float fDiv = 1.0f / fValue; x *= fDiv; y *= fDiv; z *= fDiv; return *this; }
00103
00105
00106 Vec3 operator + () const { return *this; };
00107 Vec3 operator - () const { Vec3 v3ReturnValue(-x, -y, -z); return v3ReturnValue; };
00109
00111
00112 Vec3 operator + (const Vec3& v3Value) const { Vec3 v3ReturnValue(x + v3Value.x, y + v3Value.y, z + v3Value.z); return v3ReturnValue; }
00113 Vec3 operator - (const Vec3& v3Value) const { Vec3 v3ReturnValue(x - v3Value.x, y - v3Value.y, z - v3Value.z); return v3ReturnValue; }
00114 Vec3 operator * (float fValue) const { Vec3 v3ReturnValue(x * fValue, y * fValue, z * fValue); return v3ReturnValue; }
00115 Vec3 operator / (float fValue) const { float fDiv = 1.0f / fValue; Vec3 v3ReturnValue(x * fDiv, y * fDiv, z * fDiv); return v3ReturnValue; }
00117
00118 friend Vec3 operator * (float fValue, const Vec3& v3Value);
00119
00121
00122 bool operator == (const Vec3& v3Value) const { return x == v3Value.x && y == v3Value.y && z == v3Value.z; }
00123 bool operator != (const Vec3& v3Value) const { return x != v3Value.x || y != v3Value.y || z != v3Value.z; }
00125
00126
00127 static inline Vec3 TA_VEC3_CALL Cross(const Vec3& v3A, const Vec3& v3B)
00128 {
00129 Vec3 v3ReturnValue;
00130 v3ReturnValue.x = v3A.y * v3B.z - v3A.z * v3B.y;
00131 v3ReturnValue.y = v3A.z * v3B.x - v3A.x * v3B.z;
00132 v3ReturnValue.z = v3A.x * v3B.y - v3A.y * v3B.x;
00133 return v3ReturnValue;
00134 }
00135 inline Vec3 Cross(const Vec3& v3Value) const { return Cross(*this, v3Value); }
00136 static inline Vec3 TA_VEC3_CALL CrossWithUnitX(const Vec3& v3Value) { return Vec3(0.0f, v3Value.z, -v3Value.y); }
00137 inline Vec3 CrossWithUnitX() const { return CrossWithUnitX(*this); }
00138 static inline Vec3 TA_VEC3_CALL CrossWithUnitY(const Vec3& v3Value) { return Vec3(-v3Value.z, 0.0f, v3Value.x); }
00139 inline Vec3 CrossWithUnitY() const { return CrossWithUnitY(*this); }
00140 static inline Vec3 TA_VEC3_CALL CrossWithUnitZ(const Vec3& v3Value) { return Vec3(v3Value.y, -v3Value.x, 0.0f); }
00141 inline Vec3 CrossWithUnitZ() const { return CrossWithUnitZ(*this); }
00142 static inline float TA_VEC3_CALL CrossX(const Vec3& v3A, const Vec3& v3B) { return v3A.y * v3B.z - v3A.z * v3B.y; }
00143 inline float CrossX(const Vec3& v3Value) const { return CrossX(*this, v3Value); }
00144 static inline float TA_VEC3_CALL CrossY(const Vec3& v3A, const Vec3& v3B) { return v3A.z * v3B.x - v3A.x * v3B.z; }
00145 inline float CrossY(const Vec3& v3Value) const { return CrossY(*this, v3Value); }
00146 static inline float TA_VEC3_CALL CrossZ(const Vec3& v3A, const Vec3& v3B) { return v3A.x * v3B.y - v3A.y * v3B.x; }
00147 inline float CrossZ(const Vec3& v3Value) const { return CrossZ(*this, v3Value); }
00148
00149
00150
00151 static inline float TAC_CALL Dot(const Vec3& v3A, const Vec3& v3B)
00152 {
00153 return v3A.x * v3B.x + v3A.y * v3B.y + v3A.z * v3B.z;
00154 }
00155 inline float Dot(const Vec3& v3Value) const { return Dot(*this, v3Value); }
00156
00157
00158 static inline Vec3 TA_VEC3_CALL Min(const Vec3& v3A, const Vec3& v3B)
00159 {
00160 Vec3 v3Result;
00161 v3Result.x = v3A.x < v3B.x ? v3A.x : v3B.x;
00162 v3Result.y = v3A.y < v3B.y ? v3A.y : v3B.y;
00163 v3Result.z = v3A.z < v3B.z ? v3A.z : v3B.z;
00164 return v3Result;
00165 }
00166 static inline Vec3 TA_VEC3_CALL Max(const Vec3& v3A, const Vec3& v3B)
00167 {
00168 Vec3 v3Result;
00169 v3Result.x = v3A.x > v3B.x ? v3A.x : v3B.x;
00170 v3Result.y = v3A.y > v3B.y ? v3A.y : v3B.y;
00171 v3Result.z = v3A.z > v3B.z ? v3A.z : v3B.z;
00172 return v3Result;
00173 }
00174
00175 static inline float TA_VEC3_CALL GetMagnitude(const Vec3& v3Value) { return Sqrt(v3Value.x * v3Value.x + v3Value.y * v3Value.y + v3Value.z * v3Value.z); }
00176 inline float GetMagnitude() const { return Sqrt(x * x + y * y + z * z); }
00177 static inline float TA_VEC3_CALL GetMagnitudeSqrd(const Vec3& v3Value) { return v3Value.GetMagnitudeSqrd(); }
00178 inline float GetMagnitudeSqrd() const { return x * x + y * y + z * z; }
00179 static inline Vec3 TA_VEC3_CALL GetNormal(const Vec3& v3Value) { return v3Value.GetNormal(); }
00180 inline Vec3 GetNormal() const { return (*this) * ReciprocalSqrt(GetMagnitudeSqrd()); }
00181 inline void Normalise() { (*this) *= ReciprocalSqrt(GetMagnitudeSqrd()); }
00182 inline void Clear() { x = 0.0f; y = 0.0f; z = 0.0f; TA_VEC3_ZERO_PADDING(); }
00183 inline bool IsNormalised() const { return IsEqualToOneWithInError(GetMagnitudeSqrd()); }
00184 inline bool IsZero() const { return GetMagnitudeSqrd() == 0.0f; }
00185 inline int GetGreatestAxis() const;
00186 inline void GetAxisOrder(int pnAxisOrder[3]) const;
00187 inline float GetAxis(int nIndex) const { return (*this)[nIndex]; }
00188 static inline const Vec3& TA_VEC3_CALL GetUnitVector(int nIndex);
00189 inline bool IsEqualWithInError(const Vec3& v3Value, float fError) const;
00190 inline bool IsValid() const { return FloatIsOK(x) && FloatIsOK(y) && FloatIsOK(z); }
00191
00192 TA_OBFUSCATION_RESERVED_OFF
00193 };
00194
00195 TA_OBFUSCATION_RESERVED_FULL_ON
00196 const Vec3 k_v3Zero(0.0f, 0.0f, 0.0f);
00197 const Vec3 k_v3UnitX(1.0f, 0.0f, 0.0f);
00198 const Vec3 k_v3UnitY(0.0f, 1.0f, 0.0f);
00199 const Vec3 k_v3UnitZ(0.0f, 0.0f, 1.0f);
00200 TA_OBFUSCATION_RESERVED_OFF
00201
00203
00204 }
00205
00206 #include "Vec3.inl"
00207
00208 #endif
00209
00210 #endif // TA_VEC3_H
© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.