repository_infos: Enable automatic updates on the main Haiku repostiory.
[haiku.git] / src / apps / haiku3d / Vector3.h
blob28c1f7aa86e13a0dae88559464b42d5db4d96e25
1 /*
2 * Copyright 2008 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Alexandre Deckner
8 */
12 * This is a refactored and stripped down version of bullet-2.66
13 * src\LinearMath\btVector3.h
14 * The dependancies on base class btQuadWord have been removed for
15 * simplification.
20 Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans
21 http://continuousphysics.com/Bullet/
23 This software is provided 'as-is', without any express or implied warranty.
24 In no event will the authors be held liable for any damages arising from the
25 use of this software.
26 Permission is granted to anyone to use this software for any purpose,
27 including commercial applications, and to alter it and redistribute it freely,
28 subject to the following restrictions:
30 1. The origin of this software must not be misrepresented; you must not claim
31 that you wrote the original software. If you use this software in a product,
32 an acknowledgment in the product documentation would be appreciated but is
33 not required.
34 2. Altered source versions must be plainly marked as such, and must not be
35 misrepresented as being the original software.
36 3. This notice may not be removed or altered from any source distribution.
40 #ifndef __VECTOR3_H__
41 #define __VECTOR3_H__
43 #include "assert.h"
44 #include "math.h"
46 ///Vector3 can be used to represent 3D points and vectors.
48 class Vector3 {
49 protected:
50 float m_x;
51 float m_y;
52 float m_z;
54 public:
55 inline Vector3() {}
58 inline Vector3(const Vector3& v)
60 *((Vector3*)this) = v;
64 inline Vector3(const float& x, const float& y, const float& z)
66 m_x = x, m_y = y, m_z = z;
70 inline const float& x() const { return m_x; }
73 inline const float& y() const { return m_y; }
76 inline const float& z() const { return m_z; }
79 inline void setValue(const float& x, const float& y, const float& z)
81 m_x = x;
82 m_y = y;
83 m_z = z;
86 inline Vector3& operator+=(const Vector3& v)
88 m_x += v.x(); m_y += v.y(); m_z += v.z();
89 return *this;
93 inline Vector3& operator-=(const Vector3& v)
95 m_x -= v.x(); m_y -= v.y(); m_z -= v.z();
96 return *this;
100 inline Vector3& operator*=(const float& s)
102 m_x *= s; m_y *= s; m_z *= s;
103 return *this;
107 inline Vector3& operator/=(const float& s)
109 assert(s != 0.0f);
110 return *this *= 1.0f / s;
114 inline float dot(const Vector3& v) const
116 return m_x * v.x() + m_y * v.y() + m_z * v.z();
120 inline float length2() const
122 return dot(*this);
126 inline float length() const
128 return sqrt(length2());
132 inline float distance2(const Vector3& v) const;
135 inline float distance(const Vector3& v) const;
138 inline Vector3& normalize()
140 return *this /= length();
144 inline Vector3 normalized() const;
147 inline Vector3 rotate( const Vector3& wAxis, const float angle );
150 inline float angle(const Vector3& v) const
152 float s = sqrt(length2() * v.length2());
153 assert(s != 0.0f);
154 return acos(dot(v) / s);
158 inline Vector3 absolute() const
160 return Vector3(
161 fabs(m_x),
162 fabs(m_y),
163 fabs(m_z));
167 inline Vector3 cross(const Vector3& v) const
169 return Vector3(
170 m_y * v.z() - m_z * v.y(),
171 m_z * v.x() - m_x * v.z(),
172 m_x * v.y() - m_y * v.x());
176 inline float triple(const Vector3& v1, const Vector3& v2) const
178 return m_x * (v1.y() * v2.z() - v1.z() * v2.y())
179 + m_y * (v1.z() * v2.x() - v1.x() * v2.z())
180 + m_z * (v1.x() * v2.y() - v1.y() * v2.x());
184 inline int minAxis() const
186 return m_x < m_y ? (m_x < m_z ? 0 : 2) : (m_y < m_z ? 1 : 2);
190 inline int maxAxis() const
192 return m_x < m_y ? (m_y < m_z ? 2 : 1) : (m_x < m_z ? 2 : 0);
196 inline int furthestAxis() const
198 return absolute().minAxis();
202 inline int closestAxis() const
204 return absolute().maxAxis();
208 inline void setInterpolate3(const Vector3& v0, const Vector3& v1, float rt)
210 float s = 1.0f - rt;
211 m_x = s * v0.x() + rt * v1.x();
212 m_y = s * v0.y() + rt * v1.y();
213 m_z = s * v0.z() + rt * v1.z();
214 // don't do the unused w component
215 // m_co[3] = s * v0[3] + rt * v1[3];
219 inline Vector3 lerp(const Vector3& v, const float& t) const
221 return Vector3(m_x + (v.x() - m_x) * t,
222 m_y + (v.y() - m_y) * t,
223 m_z + (v.z() - m_z) * t);
227 inline Vector3& operator*=(const Vector3& v)
229 m_x *= v.x(); m_y *= v.y(); m_z *= v.z();
230 return *this;
236 inline Vector3
237 operator+(const Vector3& v1, const Vector3& v2)
239 return Vector3(v1.x() + v2.x(), v1.y() + v2.y(), v1.z() + v2.z());
243 inline Vector3
244 operator*(const Vector3& v1, const Vector3& v2)
246 return Vector3(v1.x() * v2.x(), v1.y() * v2.y(), v1.z() * v2.z());
250 inline Vector3
251 operator-(const Vector3& v1, const Vector3& v2)
253 return Vector3(v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z());
257 inline Vector3
258 operator-(const Vector3& v)
260 return Vector3(-v.x(), -v.y(), -v.z());
264 inline Vector3
265 operator*(const Vector3& v, const float& s)
267 return Vector3(v.x() * s, v.y() * s, v.z() * s);
271 inline Vector3
272 operator*(const float& s, const Vector3& v)
274 return v * s;
278 inline Vector3
279 operator/(const Vector3& v, const float& s)
281 assert(s != 0.0f);
282 return v * (1.0f / s);
286 inline Vector3
287 operator/(const Vector3& v1, const Vector3& v2)
289 return Vector3(v1.x() / v2.x(),v1.y() / v2.y(),v1.z() / v2.z());
293 inline float
294 dot(const Vector3& v1, const Vector3& v2)
296 return v1.dot(v2);
300 inline float
301 distance2(const Vector3& v1, const Vector3& v2)
303 return v1.distance2(v2);
307 inline float
308 distance(const Vector3& v1, const Vector3& v2)
310 return v1.distance(v2);
314 inline float
315 angle(const Vector3& v1, const Vector3& v2)
317 return v1.angle(v2);
321 inline Vector3
322 cross(const Vector3& v1, const Vector3& v2)
324 return v1.cross(v2);
328 inline float
329 triple(const Vector3& v1, const Vector3& v2, const Vector3& v3)
331 return v1.triple(v2, v3);
335 inline Vector3
336 lerp(const Vector3& v1, const Vector3& v2, const float& t)
338 return v1.lerp(v2, t);
342 inline bool
343 operator==(const Vector3& p1, const Vector3& p2)
345 return p1.x() == p2.x() && p1.y() == p2.y() && p1.z() == p2.z();
349 inline float
350 Vector3::distance2(const Vector3& v) const
352 return (v - *this).length2();
356 inline float
357 Vector3::distance(const Vector3& v) const
359 return (v - *this).length();
363 inline Vector3
364 Vector3::normalized() const
366 return *this / length();
370 inline Vector3
371 Vector3::rotate( const Vector3& wAxis, const float angle )
373 // wAxis must be a unit lenght vector
375 Vector3 o = wAxis * wAxis.dot( *this );
376 Vector3 x = *this - o;
377 Vector3 y;
379 y = wAxis.cross( *this );
381 return ( o + x * cos( angle ) + y * sin( angle ) );
384 #endif //__VECTOR3_H__