2 * Copyright 2008 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
12 * This is a refactored and stripped down version of bullet-2.66 src\LinearMath\btVector3.h
13 * The dependancies on base class btQuadWord have been removed for simplification.
18 Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/
20 This software is provided 'as-is', without any express or implied warranty.
21 In no event will the authors be held liable for any damages arising from the use of this software.
22 Permission is granted to anyone to use this software for any purpose,
23 including commercial applications, and to alter it and redistribute it freely,
24 subject to the following restrictions:
26 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
27 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
28 3. This notice may not be removed or altered from any source distribution.
35 ///Vector3 can be used to represent 3D points and vectors.
47 inline Vector3(const Vector3
& v
)
49 *((Vector3
*)this) = v
;
53 inline Vector3(const float& x
, const float& y
, const float& z
)
55 m_x
= x
, m_y
= y
, m_z
= z
;
59 inline const float& x() const { return m_x
; }
62 inline const float& y() const { return m_y
; }
65 inline const float& z() const { return m_z
; }
68 inline void setValue(const float& x
, const float& y
, const float& z
)
75 inline Vector3
& operator+=(const Vector3
& v
)
77 m_x
+= v
.x(); m_y
+= v
.y(); m_z
+= v
.z();
82 inline Vector3
& operator-=(const Vector3
& v
)
84 m_x
-= v
.x(); m_y
-= v
.y(); m_z
-= v
.z();
89 inline Vector3
& operator*=(const float& s
)
91 m_x
*= s
; m_y
*= s
; m_z
*= s
;
96 inline Vector3
& operator/=(const float& s
)
99 return *this *= 1.0f
/ s
;
103 inline float dot(const Vector3
& v
) const
105 return m_x
* v
.x() + m_y
* v
.y() + m_z
* v
.z();
109 inline float length2() const
115 inline float length() const
117 return sqrt(length2());
121 inline float distance2(const Vector3
& v
) const;
124 inline float distance(const Vector3
& v
) const;
127 inline Vector3
& normalize()
129 return *this /= length();
133 inline Vector3
normalized() const;
136 inline Vector3
rotate( const Vector3
& wAxis
, const float angle
);
139 inline float angle(const Vector3
& v
) const
141 float s
= sqrt(length2() * v
.length2());
143 return acos(dot(v
) / s
);
147 inline Vector3
absolute() const
156 inline Vector3
cross(const Vector3
& v
) const
159 m_y
* v
.z() - m_z
* v
.y(),
160 m_z
* v
.x() - m_x
* v
.z(),
161 m_x
* v
.y() - m_y
* v
.x());
165 inline float triple(const Vector3
& v1
, const Vector3
& v2
) const
167 return m_x
* (v1
.y() * v2
.z() - v1
.z() * v2
.y()) +
168 m_y
* (v1
.z() * v2
.x() - v1
.x() * v2
.z()) +
169 m_z
* (v1
.x() * v2
.y() - v1
.y() * v2
.x());
173 inline int minAxis() const
175 return m_x
< m_y
? (m_x
< m_z
? 0 : 2) : (m_y
< m_z
? 1 : 2);
179 inline int maxAxis() const
181 return m_x
< m_y
? (m_y
< m_z
? 2 : 1) : (m_x
< m_z
? 2 : 0);
185 inline int furthestAxis() const
187 return absolute().minAxis();
191 inline int closestAxis() const
193 return absolute().maxAxis();
197 inline void setInterpolate3(const Vector3
& v0
, const Vector3
& v1
, float rt
)
200 m_x
= s
* v0
.x() + rt
* v1
.x();
201 m_y
= s
* v0
.y() + rt
* v1
.y();
202 m_z
= s
* v0
.z() + rt
* v1
.z();
203 //don't do the unused w component
204 // m_co[3] = s * v0[3] + rt * v1[3];
208 inline Vector3
lerp(const Vector3
& v
, const float& t
) const
210 return Vector3(m_x
+ (v
.x() - m_x
) * t
,
211 m_y
+ (v
.y() - m_y
) * t
,
212 m_z
+ (v
.z() - m_z
) * t
);
216 inline Vector3
& operator*=(const Vector3
& v
)
218 m_x
*= v
.x(); m_y
*= v
.y(); m_z
*= v
.z();
225 operator+(const Vector3
& v1
, const Vector3
& v2
)
227 return Vector3(v1
.x() + v2
.x(), v1
.y() + v2
.y(), v1
.z() + v2
.z());
231 operator*(const Vector3
& v1
, const Vector3
& v2
)
233 return Vector3(v1
.x() * v2
.x(), v1
.y() * v2
.y(), v1
.z() * v2
.z());
237 operator-(const Vector3
& v1
, const Vector3
& v2
)
239 return Vector3(v1
.x() - v2
.x(), v1
.y() - v2
.y(), v1
.z() - v2
.z());
243 operator-(const Vector3
& v
)
245 return Vector3(-v
.x(), -v
.y(), -v
.z());
249 operator*(const Vector3
& v
, const float& s
)
251 return Vector3(v
.x() * s
, v
.y() * s
, v
.z() * s
);
255 operator*(const float& s
, const Vector3
& v
)
261 operator/(const Vector3
& v
, const float& s
)
264 return v
* (1.0f
/ s
);
268 operator/(const Vector3
& v1
, const Vector3
& v2
)
270 return Vector3(v1
.x() / v2
.x(),v1
.y() / v2
.y(),v1
.z() / v2
.z());
274 dot(const Vector3
& v1
, const Vector3
& v2
)
280 distance2(const Vector3
& v1
, const Vector3
& v2
)
282 return v1
.distance2(v2
);
287 distance(const Vector3
& v1
, const Vector3
& v2
)
289 return v1
.distance(v2
);
293 angle(const Vector3
& v1
, const Vector3
& v2
)
299 cross(const Vector3
& v1
, const Vector3
& v2
)
305 triple(const Vector3
& v1
, const Vector3
& v2
, const Vector3
& v3
)
307 return v1
.triple(v2
, v3
);
311 lerp(const Vector3
& v1
, const Vector3
& v2
, const float& t
)
313 return v1
.lerp(v2
, t
);
317 inline bool operator==(const Vector3
& p1
, const Vector3
& p2
)
319 return p1
.x() == p2
.x() && p1
.y() == p2
.y() && p1
.z() == p2
.z();
322 inline float Vector3::distance2(const Vector3
& v
) const
324 return (v
- *this).length2();
327 inline float Vector3::distance(const Vector3
& v
) const
329 return (v
- *this).length();
332 inline Vector3
Vector3::normalized() const
334 return *this / length();
337 inline Vector3
Vector3::rotate( const Vector3
& wAxis
, const float angle
)
339 // wAxis must be a unit lenght vector
341 Vector3 o
= wAxis
* wAxis
.dot( *this );
342 Vector3 x
= *this - o
;
345 y
= wAxis
.cross( *this );
347 return ( o
+ x
* cos( angle
) + y
* sin( angle
) );
350 #endif //__VECTOR3_H__