True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

Vec3.h

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------------
00002 // File Name: Vec3.h
00003 // Description:
00006 //
00007 // Copyright (C) 2004 - 2006 True Axis Pty Ltd, Australia. 
00008 // All Rights Reserved.
00009 //
00010 // History:
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 //#define TA_SSE2
00025 
00026 #ifndef _DEBUG
00027 //#define TA_SSE2
00028 #endif
00029 
00030 //#define TA_META_TEMPLATED_VECTORS
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 //#define TA_VEC3_ZERO_PADDING()
00048 
00049 namespace TA
00050 {
00051 
00052 
00054 
00055 
00056 //---------------------------------------------------------------------------------
00057 //---------------------------------------------------------------------------------
00058 TA_ALIGN_16 struct TACOMMON_CLASS Vec3
00059 {   
00060     // No hungarian notation here for ease of use.
00061     float x;
00062     float y;
00063     float z;
00064     float padding; // add an extra variable for 16 byte alignment
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     // cross product
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     // dot product
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     // min / max
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; // Axis order from biggest to smallest
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.