Vec3.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #ifndef ANKI_MATH_VEC3_H
  6. #define ANKI_MATH_VEC3_H
  7. #include "anki/math/CommonIncludes.h"
  8. #include "anki/math/Vec.h"
  9. namespace anki {
  10. /// @addtogroup math
  11. /// @{
  12. /// 3D vector template. One of the most used classes
  13. template<typename T>
  14. class TVec3: public TVec<T, 3, Array<T, 3>, TVec3<T>>
  15. {
  16. /// @name Friends
  17. /// @{
  18. template<typename Y>
  19. friend TVec3<Y> operator+(const Y f, const TVec3<Y>& v);
  20. template<typename Y>
  21. friend TVec3<Y> operator-(const Y f, const TVec3<Y>& v);
  22. template<typename Y>
  23. friend TVec3<Y> operator*(const Y f, const TVec3<Y>& v);
  24. template<typename Y>
  25. friend TVec3<Y> operator/(const Y f, const TVec3<Y>& v);
  26. /// @}
  27. public:
  28. using Base = TVec<T, 3, Array<T, 3>, TVec3<T>>;
  29. using Base::x;
  30. using Base::y;
  31. using Base::z;
  32. using Base::operator*;
  33. /// @name Constructors
  34. /// @{
  35. explicit TVec3()
  36. : Base()
  37. {}
  38. TVec3(const TVec3& b)
  39. : Base(b)
  40. {}
  41. explicit TVec3(const T x_, const T y_, const T z_)
  42. : Base(x_, y_, z_)
  43. {}
  44. explicit TVec3(const T f)
  45. : Base(f)
  46. {}
  47. explicit TVec3(const T arr[])
  48. : Base(arr)
  49. {}
  50. explicit TVec3(const TVec2<T>& v, const T z_)
  51. : Base(v.x(), v.y(), z_)
  52. {}
  53. /// @}
  54. /// @name Other
  55. /// @{
  56. /// 6 muls, 3 adds
  57. TVec3 cross(const TVec3& b) const
  58. {
  59. return TVec3(y() * b.z() - z() * b.y(),
  60. z() * b.x() - x() * b.z(),
  61. x() * b.y() - y() * b.x());
  62. }
  63. TVec3 getProjection(const TVec3& toThis) const
  64. {
  65. return toThis * ((*this).dot(toThis) / (toThis.dot(toThis)));
  66. }
  67. /// @}
  68. };
  69. /// @memberof TVec3
  70. template<typename T>
  71. TVec3<T> operator+(const T f, const TVec3<T>& v)
  72. {
  73. return v + f;
  74. }
  75. /// @memberof TVec3
  76. template<typename T>
  77. TVec3<T> operator-(const T f, const TVec3<T>& v)
  78. {
  79. return TVec3<T>(f) - v;
  80. }
  81. /// @memberof TVec3
  82. template<typename T>
  83. TVec3<T> operator*(const T f, const TVec3<T>& v)
  84. {
  85. return v * f;
  86. }
  87. /// @memberof TVec3
  88. template<typename T>
  89. TVec3<T> operator/(const T f, const TVec3<T>& v)
  90. {
  91. return TVec3<T>(f) / v;
  92. }
  93. /// F32 3D vector
  94. typedef TVec3<F32> Vec3;
  95. static_assert(sizeof(Vec3) == sizeof(F32) * 3, "Incorrect size");
  96. /// Half float 3D vector
  97. typedef TVec3<F16> HVec3;
  98. /// 32bit signed integer 3D vector
  99. typedef TVec3<I32> IVec3;
  100. /// 32bit unsigned integer 3D vector
  101. typedef TVec3<U32> UVec3;
  102. /// @}
  103. } // end namespace anki
  104. #endif