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
13 * src\LinearMath\btVector3.h
14 * The dependancies on base class btQuadWord have been removed for
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
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
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.
46 ///Vector3 can be used to represent 3D points and vectors.
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
)
86 inline Vector3
& operator+=(const Vector3
& v
)
88 m_x
+= v
.x(); m_y
+= v
.y(); m_z
+= v
.z();
93 inline Vector3
& operator-=(const Vector3
& v
)
95 m_x
-= v
.x(); m_y
-= v
.y(); m_z
-= v
.z();
100 inline Vector3
& operator*=(const float& s
)
102 m_x
*= s
; m_y
*= s
; m_z
*= s
;
107 inline Vector3
& operator/=(const float& s
)
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
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());
154 return acos(dot(v
) / s
);
158 inline Vector3
absolute() const
167 inline Vector3
cross(const Vector3
& v
) const
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
)
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();
237 operator+(const Vector3
& v1
, const Vector3
& v2
)
239 return Vector3(v1
.x() + v2
.x(), v1
.y() + v2
.y(), v1
.z() + v2
.z());
244 operator*(const Vector3
& v1
, const Vector3
& v2
)
246 return Vector3(v1
.x() * v2
.x(), v1
.y() * v2
.y(), v1
.z() * v2
.z());
251 operator-(const Vector3
& v1
, const Vector3
& v2
)
253 return Vector3(v1
.x() - v2
.x(), v1
.y() - v2
.y(), v1
.z() - v2
.z());
258 operator-(const Vector3
& v
)
260 return Vector3(-v
.x(), -v
.y(), -v
.z());
265 operator*(const Vector3
& v
, const float& s
)
267 return Vector3(v
.x() * s
, v
.y() * s
, v
.z() * s
);
272 operator*(const float& s
, const Vector3
& v
)
279 operator/(const Vector3
& v
, const float& s
)
282 return v
* (1.0f
/ s
);
287 operator/(const Vector3
& v1
, const Vector3
& v2
)
289 return Vector3(v1
.x() / v2
.x(),v1
.y() / v2
.y(),v1
.z() / v2
.z());
294 dot(const Vector3
& v1
, const Vector3
& v2
)
301 distance2(const Vector3
& v1
, const Vector3
& v2
)
303 return v1
.distance2(v2
);
308 distance(const Vector3
& v1
, const Vector3
& v2
)
310 return v1
.distance(v2
);
315 angle(const Vector3
& v1
, const Vector3
& v2
)
322 cross(const Vector3
& v1
, const Vector3
& v2
)
329 triple(const Vector3
& v1
, const Vector3
& v2
, const Vector3
& v3
)
331 return v1
.triple(v2
, v3
);
336 lerp(const Vector3
& v1
, const Vector3
& v2
, const float& t
)
338 return v1
.lerp(v2
, t
);
343 operator==(const Vector3
& p1
, const Vector3
& p2
)
345 return p1
.x() == p2
.x() && p1
.y() == p2
.y() && p1
.z() == p2
.z();
350 Vector3::distance2(const Vector3
& v
) const
352 return (v
- *this).length2();
357 Vector3::distance(const Vector3
& v
) const
359 return (v
- *this).length();
364 Vector3::normalized() const
366 return *this / length();
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
;
379 y
= wAxis
.cross( *this );
381 return ( o
+ x
* cos( angle
) + y
* sin( angle
) );
384 #endif //__VECTOR3_H__