Initial Patch of Auction House bot rev. 135
[auctionmangos.git] / dep / include / g3dlite / G3D / Vector3.inl
blob99110ffc8eb60d299876665d230a156603e9cbc4
1 /** 
2   @file Vector3.inl
4   @maintainer Morgan McGuire, matrix@graphics3d.com
6   @cite Portions based on Dave Eberly's Magic Software Library at http://www.magic-software.com
8   @created 2001-06-02
9   @edited  2004-05-21
10   Copyright 2000-2004, Morgan McGuire.
11   All rights reserved.
12  */
14 //----------------------------------------------------------------------------
15 #ifdef SSE
16         // If you receive an error on this line, it is because you do not have the file
17         // xmmintrin.h needed for MMX & SSE extensions.  Download and install
18     //
19     // http://download.microsoft.com/download/vstudio60ent/SP5/Wideband-Full/WIN98Me/EN-US/vs6sp5.exe
20         // and
21     // http://download.microsoft.com/download/vb60ent/Update/6/W9X2KXP/EN-US/vcpp5.exe
22     //
23     // to get this file.
24 #   include <xmmintrin.h>
25 #endif
27 inline unsigned int hashCode(const G3D::Vector3& v) {
28      return v.hashCode();
31 namespace G3D {
33 //----------------------------------------------------------------------------
34 inline Vector3::Vector3() : x(0.0f), y(0.0f), z(0.0f) {
37 //----------------------------------------------------------------------------
39 inline Vector3::Vector3 (float fX, float fY, float fZ) : x(fX), y(fY), z(fZ) {
42 //----------------------------------------------------------------------------
43 inline Vector3::Vector3 (float V[3]) : x(V[0]), y(V[1]), z(V[2]){
45 //----------------------------------------------------------------------------
46 inline Vector3::Vector3 (double V[3]) : x((float)V[0]), y((float)V[1]), z((float)V[2]){
49 //----------------------------------------------------------------------------
50 inline Vector3::Vector3 (const Vector3& V) : x(V.x), y(V.y), z(V.z) {
53 //----------------------------------------------------------------------------
55 //inline Vector3::Vector3 (const __m128& m) {
56     // Cast from SSE packed floats
57 //    *this = *(Vector3*)&m;
58 //}
60 //----------------------------------------------------------------------------
61 inline const float& Vector3::operator[] (int i) const {
62     return ((float*)this)[i];
65 inline float& Vector3::operator[] (int i) {
66     return ((float*)this)[i];
70 //----------------------------------------------------------------------------
71 inline Vector3& Vector3::operator= (const Vector3& rkVector) {
72     x = rkVector.x;
73     y = rkVector.y;
74     z = rkVector.z;
75     return *this;
78 //----------------------------------------------------------------------------
80 inline bool Vector3::fuzzyEq(const Vector3& other) const {
81     return G3D::fuzzyEq((*this - other).squaredMagnitude(), 0);
84 //----------------------------------------------------------------------------
86 inline bool Vector3::fuzzyNe(const Vector3& other) const {
87     return G3D::fuzzyNe((*this - other).squaredMagnitude(), 0);
90 //----------------------------------------------------------------------------
92 inline bool Vector3::isFinite() const {
93     return G3D::isFinite(x) && G3D::isFinite(y) && G3D::isFinite(z);
96 //----------------------------------------------------------------------------
97 inline bool Vector3::operator== (const Vector3& rkVector) const {
98     return ( x == rkVector.x && y == rkVector.y && z == rkVector.z );
101 //----------------------------------------------------------------------------
102 inline bool Vector3::operator!= (const Vector3& rkVector) const {
103     return ( x != rkVector.x || y != rkVector.y || z != rkVector.z );
106 //----------------------------------------------------------------------------
107 inline Vector3 Vector3::operator+ (const Vector3& rkVector) const {
108     return Vector3(x + rkVector.x, y + rkVector.y, z + rkVector.z);
111 //----------------------------------------------------------------------------
112 inline Vector3 Vector3::operator- (const Vector3& rkVector) const {
113     return Vector3(x - rkVector.x, y - rkVector.y, z - rkVector.z);
116 //----------------------------------------------------------------------------
117 inline Vector3 Vector3::operator* (const Vector3& rkVector) const {
118     return Vector3(x * rkVector.x, y * rkVector.y, z * rkVector.z);
121 inline Vector3 Vector3::operator*(float f) const {
122     return Vector3(x * f, y * f, z * f);
125 //----------------------------------------------------------------------------
126 inline Vector3 Vector3::operator/ (const Vector3& rkVector) const {
127     return Vector3(x / rkVector.x, y / rkVector.y, z / rkVector.z);
130 //----------------------------------------------------------------------------
131 inline Vector3 Vector3::operator- () const {
132     return Vector3(-x, -y, -z);
135 //----------------------------------------------------------------------------
136 inline Vector3& Vector3::operator+= (const Vector3& rkVector) {
137     x += rkVector.x;
138     y += rkVector.y;
139     z += rkVector.z;
140     return *this;
143 //----------------------------------------------------------------------------
144 inline Vector3& Vector3::operator-= (const Vector3& rkVector) {
145     x -= rkVector.x;
146     y -= rkVector.y;
147     z -= rkVector.z;
148     return *this;
151 //----------------------------------------------------------------------------
152 inline Vector3& Vector3::operator*= (float fScalar) {
153     x *= fScalar;
154     y *= fScalar;
155     z *= fScalar;
156     return *this;
159 //----------------------------------------------------------------------------
160 inline Vector3& Vector3::operator*= (const Vector3& rkVector) {
161     x *= rkVector.x;
162     y *= rkVector.y;
163     z *= rkVector.z;
164     return *this;
167 //----------------------------------------------------------------------------
168 inline Vector3& Vector3::operator/= (const Vector3& rkVector) {
169     x /= rkVector.x;
170     y /= rkVector.y;
171     z /= rkVector.z;
172     return *this;
175 //----------------------------------------------------------------------------
176 inline float Vector3::squaredMagnitude () const {
177     return x*x + y*y + z*z;
180 //----------------------------------------------------------------------------
181 inline float Vector3::squaredLength () const {
182     return squaredMagnitude();
185 //----------------------------------------------------------------------------
186 inline float Vector3::magnitude() const {
187     return sqrtf(x*x + y*y + z*z);
190 //----------------------------------------------------------------------------
191 inline float Vector3::length() const {
192     return magnitude();
195 //----------------------------------------------------------------------------
196 inline Vector3 Vector3::direction () const {
197     float lenSquared = squaredMagnitude();
198     float invSqrt = 1.0f / sqrtf(lenSquared);
199     return Vector3(x * invSqrt, y * invSqrt, z * invSqrt);
202 //----------------------------------------------------------------------------
204 inline Vector3 Vector3::fastDirection () const {
205     float lenSquared = x * x + y * y + z * z;
206     float invSqrt = rsq(lenSquared);
207     return Vector3(x * invSqrt, y * invSqrt, z * invSqrt);
210 //----------------------------------------------------------------------------
211 inline float Vector3::dot (const Vector3& rkVector) const {
212     return x*rkVector.x + y*rkVector.y + z*rkVector.z;
215 //----------------------------------------------------------------------------
216 inline Vector3 Vector3::cross (const Vector3& rkVector) const {
217     return Vector3(y*rkVector.z - z*rkVector.y, z*rkVector.x - x*rkVector.z,
218                    x*rkVector.y - y*rkVector.x);
221 //----------------------------------------------------------------------------
222 inline Vector3 Vector3::unitCross (const Vector3& rkVector) const {
223     Vector3 kCross(y*rkVector.z - z*rkVector.y, z*rkVector.x - x*rkVector.z,
224                    x*rkVector.y - y*rkVector.x);
225     kCross.unitize();
226     return kCross;
229 //----------------------------------------------------------------------------
230 inline Vector3 Vector3::min(const Vector3 &v) const {
231     return Vector3(G3D::min(v.x, x), G3D::min(v.y, y), G3D::min(v.z, z));
234 //----------------------------------------------------------------------------
235 inline Vector3 Vector3::max(const Vector3 &v) const {
236     return Vector3(G3D::max(v.x, x), G3D::max(v.y, y), G3D::max(v.z, z));
239 //----------------------------------------------------------------------------
240 inline bool Vector3::isZero() const {
241     return G3D::fuzzyEq(squaredMagnitude(), 0.0f);
244 //----------------------------------------------------------------------------
246 inline bool Vector3::isUnit() const {
247     return G3D::fuzzyEq(squaredMagnitude(), 1.0f);
250 } // namespace