28#ifndef OZZ_OZZ_BASE_MATHS_VEC_FLOAT_H_
29#define OZZ_OZZ_BASE_MATHS_VEC_FLOAT_H_
34#include "ozz/base/maths/math_constant.h"
35#include "ozz/base/platform.h"
48 explicit OZZ_INLINE
Float2(
float _f) : x(_f), y(_f) {}
51 OZZ_INLINE
Float2(
float _x,
float _y) : x(_x), y(_y) {}
60 static OZZ_INLINE
Float2 x_axis() {
return Float2(1.f, 0.f); }
63 static OZZ_INLINE
Float2 y_axis() {
return Float2(0.f, 1.f); }
74 explicit OZZ_INLINE
Float3(
float _f) : x(_f), y(_f), z(_f) {}
77 OZZ_INLINE
Float3(
float _x,
float _y,
float _z) : x(_x), y(_y), z(_z) {}
80 OZZ_INLINE
Float3(
Float2 _v,
float _z) : x(_v.x), y(_v.y), z(_z) {}
89 static OZZ_INLINE
Float3 x_axis() {
return Float3(1.f, 0.f, 0.f); }
92 static OZZ_INLINE
Float3 y_axis() {
return Float3(0.f, 1.f, 0.f); }
95 static OZZ_INLINE
Float3 z_axis() {
return Float3(0.f, 0.f, 1.f); }
106 explicit OZZ_INLINE
Float4(
float _f) : x(_f), y(_f), z(_f), w(_f) {}
109 OZZ_INLINE
Float4(
float _x,
float _y,
float _z,
float _w)
110 : x(_x), y(_y), z(_z), w(_w) {}
113 OZZ_INLINE
Float4(
Float3 _v,
float _w) : x(_v.x), y(_v.y), z(_v.z), w(_w) {}
117 : x(_v.x), y(_v.y), z(_z), w(_w) {}
126 static OZZ_INLINE
Float4 x_axis() {
return Float4(1.f, 0.f, 0.f, 0.f); }
129 static OZZ_INLINE
Float4 y_axis() {
return Float4(0.f, 1.f, 0.f, 0.f); }
132 static OZZ_INLINE
Float4 z_axis() {
return Float4(0.f, 0.f, 1.f, 0.f); }
135 static OZZ_INLINE
Float4 w_axis() {
return Float4(0.f, 0.f, 0.f, 1.f); }
140 return Float4(_a.x + _b.x, _a.y + _b.y, _a.z + _b.z, _a.w + _b.w);
142OZZ_INLINE Float3 operator+(
const Float3& _a,
const Float3& _b) {
143 return Float3(_a.x + _b.x, _a.y + _b.y, _a.z + _b.z);
145OZZ_INLINE Float2 operator+(
const Float2& _a,
const Float2& _b) {
146 return Float2(_a.x + _b.x, _a.y + _b.y);
150OZZ_INLINE Float4 operator-(
const Float4& _a,
const Float4& _b) {
151 return Float4(_a.x - _b.x, _a.y - _b.y, _a.z - _b.z, _a.w - _b.w);
153OZZ_INLINE Float3 operator-(
const Float3& _a,
const Float3& _b) {
154 return Float3(_a.x - _b.x, _a.y - _b.y, _a.z - _b.z);
156OZZ_INLINE Float2 operator-(
const Float2& _a,
const Float2& _b) {
157 return Float2(_a.x - _b.x, _a.y - _b.y);
161OZZ_INLINE Float4 operator-(
const Float4& _v) {
162 return Float4(-_v.x, -_v.y, -_v.z, -_v.w);
164OZZ_INLINE Float3 operator-(
const Float3& _v) {
165 return Float3(-_v.x, -_v.y, -_v.z);
167OZZ_INLINE Float2 operator-(
const Float2& _v) {
return Float2(-_v.x, -_v.y); }
170OZZ_INLINE Float4 operator*(
const Float4& _a,
const Float4& _b) {
171 return Float4(_a.x * _b.x, _a.y * _b.y, _a.z * _b.z, _a.w * _b.w);
173OZZ_INLINE Float3 operator*(
const Float3& _a,
const Float3& _b) {
174 return Float3(_a.x * _b.x, _a.y * _b.y, _a.z * _b.z);
176OZZ_INLINE Float2 operator*(
const Float2& _a,
const Float2& _b) {
177 return Float2(_a.x * _b.x, _a.y * _b.y);
182OZZ_INLINE Float4 operator*(
const Float4& _a,
float _f) {
183 return Float4(_a.x * _f, _a.y * _f, _a.z * _f, _a.w * _f);
185OZZ_INLINE Float3 operator*(
const Float3& _a,
float _f) {
186 return Float3(_a.x * _f, _a.y * _f, _a.z * _f);
188OZZ_INLINE Float2 operator*(
const Float2& _a,
float _f) {
189 return Float2(_a.x * _f, _a.y * _f);
193OZZ_INLINE Float4 operator/(
const Float4& _a,
const Float4& _b) {
194 return Float4(_a.x / _b.x, _a.y / _b.y, _a.z / _b.z, _a.w / _b.w);
196OZZ_INLINE Float3 operator/(
const Float3& _a,
const Float3& _b) {
197 return Float3(_a.x / _b.x, _a.y / _b.y, _a.z / _b.z);
199OZZ_INLINE Float2 operator/(
const Float2& _a,
const Float2& _b) {
200 return Float2(_a.x / _b.x, _a.y / _b.y);
204OZZ_INLINE Float4 operator/(
const Float4& _a,
float _f) {
205 return Float4(_a.x / _f, _a.y / _f, _a.z / _f, _a.w / _f);
207OZZ_INLINE Float3 operator/(
const Float3& _a,
float _f) {
208 return Float3(_a.x / _f, _a.y / _f, _a.z / _f);
210OZZ_INLINE Float2 operator/(
const Float2& _a,
float _f) {
211 return Float2(_a.x / _f, _a.y / _f);
215OZZ_INLINE
float HAdd(
const Float4& _v) {
return _v.x + _v.y + _v.z + _v.w; }
216OZZ_INLINE
float HAdd(
const Float3& _v) {
return _v.x + _v.y + _v.z; }
217OZZ_INLINE
float HAdd(
const Float2& _v) {
return _v.x + _v.y; }
220OZZ_INLINE
float Dot(
const Float4& _a,
const Float4& _b) {
221 return _a.x * _b.x + _a.y * _b.y + _a.z * _b.z + _a.w * _b.w;
223OZZ_INLINE
float Dot(
const Float3& _a,
const Float3& _b) {
224 return _a.x * _b.x + _a.y * _b.y + _a.z * _b.z;
226OZZ_INLINE
float Dot(
const Float2& _a,
const Float2& _b) {
227 return _a.x * _b.x + _a.y * _b.y;
231OZZ_INLINE Float3 Cross(
const Float3& _a,
const Float3& _b) {
232 return Float3(_a.y * _b.z - _b.y * _a.z, _a.z * _b.x - _b.z * _a.x,
233 _a.x * _b.y - _b.x * _a.y);
237OZZ_INLINE
float Length(
const Float4& _v) {
238 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z + _v.w * _v.w;
239 return std::sqrt(len2);
241OZZ_INLINE
float Length(
const Float3& _v) {
242 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z;
243 return std::sqrt(len2);
245OZZ_INLINE
float Length(
const Float2& _v) {
246 const float len2 = _v.x * _v.x + _v.y * _v.y;
247 return std::sqrt(len2);
251OZZ_INLINE
float LengthSqr(
const Float4& _v) {
252 return _v.x * _v.x + _v.y * _v.y + _v.z * _v.z + _v.w * _v.w;
254OZZ_INLINE
float LengthSqr(
const Float3& _v) {
255 return _v.x * _v.x + _v.y * _v.y + _v.z * _v.z;
257OZZ_INLINE
float LengthSqr(
const Float2& _v) {
258 return _v.x * _v.x + _v.y * _v.y;
262OZZ_INLINE Float4 Normalize(
const Float4& _v) {
263 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z + _v.w * _v.w;
264 assert(len2 != 0.f &&
"_v is not normalizable");
265 const float len = std::sqrt(len2);
266 return Float4(_v.x / len, _v.y / len, _v.z / len, _v.w / len);
268OZZ_INLINE Float3 Normalize(
const Float3& _v) {
269 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z;
270 assert(len2 != 0.f &&
"_v is not normalizable");
271 const float len = std::sqrt(len2);
272 return Float3(_v.x / len, _v.y / len, _v.z / len);
274OZZ_INLINE Float2 Normalize(
const Float2& _v) {
275 const float len2 = _v.x * _v.x + _v.y * _v.y;
276 assert(len2 != 0.f &&
"_v is not normalizable");
277 const float len = std::sqrt(len2);
278 return Float2(_v.x / len, _v.y / len);
282OZZ_INLINE
bool IsNormalized(
const Float4& _v) {
283 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z + _v.w * _v.w;
284 return std::abs(len2 - 1.f) < kNormalizationToleranceSq;
286OZZ_INLINE
bool IsNormalized(
const Float3& _v) {
287 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z;
288 return std::abs(len2 - 1.f) < kNormalizationToleranceSq;
290OZZ_INLINE
bool IsNormalized(
const Float2& _v) {
291 const float len2 = _v.x * _v.x + _v.y * _v.y;
292 return std::abs(len2 - 1.f) < kNormalizationToleranceSq;
297OZZ_INLINE Float4 NormalizeSafe(
const Float4& _v,
const Float4& _safer) {
298 assert(IsNormalized(_safer) &&
"_safer is not normalized");
299 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z + _v.w * _v.w;
303 const float len = std::sqrt(len2);
304 return Float4(_v.x / len, _v.y / len, _v.z / len, _v.w / len);
306OZZ_INLINE Float3 NormalizeSafe(
const Float3& _v,
const Float3& _safer) {
307 assert(IsNormalized(_safer) &&
"_safer is not normalized");
308 const float len2 = _v.x * _v.x + _v.y * _v.y + _v.z * _v.z;
312 const float len = std::sqrt(len2);
313 return Float3(_v.x / len, _v.y / len, _v.z / len);
315OZZ_INLINE Float2 NormalizeSafe(
const Float2& _v,
const Float2& _safer) {
316 assert(IsNormalized(_safer) &&
"_safer is not normalized");
317 const float len2 = _v.x * _v.x + _v.y * _v.y;
321 const float len = std::sqrt(len2);
322 return Float2(_v.x / len, _v.y / len);
327OZZ_INLINE Float4 Lerp(
const Float4& _a,
const Float4& _b,
float _f) {
328 return Float4((_b.x - _a.x) * _f + _a.x, (_b.y - _a.y) * _f + _a.y,
329 (_b.z - _a.z) * _f + _a.z, (_b.w - _a.w) * _f + _a.w);
331OZZ_INLINE Float3 Lerp(
const Float3& _a,
const Float3& _b,
float _f) {
332 return Float3((_b.x - _a.x) * _f + _a.x, (_b.y - _a.y) * _f + _a.y,
333 (_b.z - _a.z) * _f + _a.z);
335OZZ_INLINE Float2 Lerp(
const Float2& _a,
const Float2& _b,
float _f) {
336 return Float2((_b.x - _a.x) * _f + _a.x, (_b.y - _a.y) * _f + _a.y);
340OZZ_INLINE
bool Compare(
const Float4& _a,
const Float4& _b,
float _tolerance) {
341 const math::Float4 diff = _a - _b;
342 return Dot(diff, diff) <= _tolerance * _tolerance;
344OZZ_INLINE
bool Compare(
const Float3& _a,
const Float3& _b,
float _tolerance) {
345 const math::Float3 diff = _a - _b;
346 return Dot(diff, diff) <= _tolerance * _tolerance;
348OZZ_INLINE
bool Compare(
const Float2& _a,
const Float2& _b,
float _tolerance) {
349 const math::Float2 diff = _a - _b;
350 return Dot(diff, diff) <= _tolerance * _tolerance;
354OZZ_INLINE
bool operator<(
const Float4& _a,
const Float4& _b) {
355 return _a.x < _b.x && _a.y < _b.y && _a.z < _b.z && _a.w < _b.w;
357OZZ_INLINE
bool operator<(
const Float3& _a,
const Float3& _b) {
358 return _a.x < _b.x && _a.y < _b.y && _a.z < _b.z;
360OZZ_INLINE
bool operator<(
const Float2& _a,
const Float2& _b) {
361 return _a.x < _b.x && _a.y < _b.y;
365OZZ_INLINE
bool operator<=(
const Float4& _a,
const Float4& _b) {
366 return _a.x <= _b.x && _a.y <= _b.y && _a.z <= _b.z && _a.w <= _b.w;
368OZZ_INLINE
bool operator<=(
const Float3& _a,
const Float3& _b) {
369 return _a.x <= _b.x && _a.y <= _b.y && _a.z <= _b.z;
371OZZ_INLINE
bool operator<=(
const Float2& _a,
const Float2& _b) {
372 return _a.x <= _b.x && _a.y <= _b.y;
376OZZ_INLINE
bool operator>(
const Float4& _a,
const Float4& _b) {
377 return _a.x > _b.x && _a.y > _b.y && _a.z > _b.z && _a.w > _b.w;
379OZZ_INLINE
bool operator>(
const Float3& _a,
const Float3& _b) {
380 return _a.x > _b.x && _a.y > _b.y && _a.z > _b.z;
382OZZ_INLINE
bool operator>(
const Float2& _a,
const Float2& _b) {
383 return _a.x > _b.x && _a.y > _b.y;
387OZZ_INLINE
bool operator>=(
const Float4& _a,
const Float4& _b) {
388 return _a.x >= _b.x && _a.y >= _b.y && _a.z >= _b.z && _a.w >= _b.w;
390OZZ_INLINE
bool operator>=(
const Float3& _a,
const Float3& _b) {
391 return _a.x >= _b.x && _a.y >= _b.y && _a.z >= _b.z;
393OZZ_INLINE
bool operator>=(
const Float2& _a,
const Float2& _b) {
394 return _a.x >= _b.x && _a.y >= _b.y;
399OZZ_INLINE
bool operator==(
const Float4& _a,
const Float4& _b) {
400 return _a.x == _b.x && _a.y == _b.y && _a.z == _b.z && _a.w == _b.w;
402OZZ_INLINE
bool operator==(
const Float3& _a,
const Float3& _b) {
403 return _a.x == _b.x && _a.y == _b.y && _a.z == _b.z;
405OZZ_INLINE
bool operator==(
const Float2& _a,
const Float2& _b) {
406 return _a.x == _b.x && _a.y == _b.y;
411OZZ_INLINE
bool operator!=(
const Float4& _a,
const Float4& _b) {
412 return _a.x != _b.x || _a.y != _b.y || _a.z != _b.z || _a.w != _b.w;
414OZZ_INLINE
bool operator!=(
const Float3& _a,
const Float3& _b) {
415 return _a.x != _b.x || _a.y != _b.y || _a.z != _b.z;
417OZZ_INLINE
bool operator!=(
const Float2& _a,
const Float2& _b) {
418 return _a.x != _b.x || _a.y != _b.y;
422OZZ_INLINE Float4 Min(
const Float4& _a,
const Float4& _b) {
423 return Float4(_a.x < _b.x ? _a.x : _b.x, _a.y < _b.y ? _a.y : _b.y,
424 _a.z < _b.z ? _a.z : _b.z, _a.w < _b.w ? _a.w : _b.w);
426OZZ_INLINE Float3 Min(
const Float3& _a,
const Float3& _b) {
427 return Float3(_a.x < _b.x ? _a.x : _b.x, _a.y < _b.y ? _a.y : _b.y,
428 _a.z < _b.z ? _a.z : _b.z);
430OZZ_INLINE Float2 Min(
const Float2& _a,
const Float2& _b) {
431 return Float2(_a.x < _b.x ? _a.x : _b.x, _a.y < _b.y ? _a.y : _b.y);
435OZZ_INLINE Float4 Max(
const Float4& _a,
const Float4& _b) {
436 return Float4(_a.x > _b.x ? _a.x : _b.x, _a.y > _b.y ? _a.y : _b.y,
437 _a.z > _b.z ? _a.z : _b.z, _a.w > _b.w ? _a.w : _b.w);
439OZZ_INLINE Float3 Max(
const Float3& _a,
const Float3& _b) {
440 return Float3(_a.x > _b.x ? _a.x : _b.x, _a.y > _b.y ? _a.y : _b.y,
441 _a.z > _b.z ? _a.z : _b.z);
443OZZ_INLINE Float2 Max(
const Float2& _a,
const Float2& _b) {
444 return Float2(_a.x > _b.x ? _a.x : _b.x, _a.y > _b.y ? _a.y : _b.y);
449OZZ_INLINE Float4 Clamp(
const Float4& _a,
const Float4& _v,
const Float4& _b) {
450 const Float4 min(_v.x < _b.x ? _v.x : _b.x, _v.y < _b.y ? _v.y : _b.y,
451 _v.z < _b.z ? _v.z : _b.z, _v.w < _b.w ? _v.w : _b.w);
452 return Float4(_a.x > min.x ? _a.x : min.x, _a.y > min.y ? _a.y : min.y,
453 _a.z > min.z ? _a.z : min.z, _a.w > min.w ? _a.w : min.w);
455OZZ_INLINE Float3 Clamp(
const Float3& _a,
const Float3& _v,
const Float3& _b) {
456 const Float3 min(_v.x < _b.x ? _v.x : _b.x, _v.y < _b.y ? _v.y : _b.y,
457 _v.z < _b.z ? _v.z : _b.z);
458 return Float3(_a.x > min.x ? _a.x : min.x, _a.y > min.y ? _a.y : min.y,
459 _a.z > min.z ? _a.z : min.z);
461OZZ_INLINE Float2 Clamp(
const Float2& _a,
const Float2& _v,
const Float2& _b) {
462 const Float2 min(_v.x < _b.x ? _v.x : _b.x, _v.y < _b.y ? _v.y : _b.y);
463 return Float2(_a.x > min.x ? _a.x : min.x, _a.y > min.y ? _a.y : min.y);
Definition vec_float.h:41
Definition vec_float.h:67
Definition vec_float.h:99