gwnavruntime/math/vec3f.h Source File

vec3f.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 #pragma once
8 
10 
11 namespace Kaim
12 {
13 
16 class Vec3f
17 {
18  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
19 
20 public:
21  // ---------------------------------- Functions ----------------------------------
22 
23  Vec3f() : x(0.0f), y(0.0f), z(0.0f) {}
24  Vec3f(KyFloat32 _x, KyFloat32 _y, KyFloat32 _z) : x(_x), y(_y), z(_z) {}
25  explicit Vec3f(const KyFloat32* coords) { Set(coords); }
26  explicit Vec3f(const Vec2f& v) : x(v.x), y(v.y), z(0.0f) {}
27  Vec3f(const Vec2f& v, KyFloat32 _z) : x(v.x), y(v.y), z(_z) {}
28 
29  void Set(KyFloat32 _x, KyFloat32 _y, KyFloat32 _z) { x = _x; y = _y; z = _z; }
30  void Set(const KyFloat32* coords) { x = coords[0]; y = coords[1]; z = coords[2]; }
31  void Set(const Vec2f& v) { x = v.x; y = v.y; z = 0.0f; }
32  void Set(const Vec2f& v, KyFloat32 _z) { x = v.x; y = v.y; z = _z; }
33 
34  void Clear() { x = 0.0f; y = 0.0f; z = 0.0f; }
35 
36  // -------------------------- Operators --------------------------------
37 
38  KyFloat32& operator[](KyInt32 i) { return (&x)[i]; }
39  KyFloat32 operator[](KyInt32 i) const { return (&x)[i]; }
40 
41  bool operator==(const Vec3f& v) const { return x == v.x && y == v.y && z == v.z; }
42  bool operator!=(const Vec3f& v) const { return x != v.x || y != v.y || z != v.z; }
43 
44  bool operator<(const Vec3f& v) const;
45  bool operator>(const Vec3f& v) const;
46  bool operator<=(const Vec3f& v) const { return !operator>(v); }
47  bool operator>=(const Vec3f& v) const { return !operator<(v); }
48 
49  Vec3f& operator*=(KyFloat32 s) { x *= s; y *= s; z *= s; return *this; }
50  Vec3f& operator/=(KyFloat32 d) { return operator*=(1.0f / d); }
51  Vec3f& operator+=(const Vec3f& v) { x += v.x; y += v.y; z += v.z; return *this; }
52  Vec3f& operator-=(const Vec3f& v) { x -= v.x; y -= v.y; z -= v.z; return *this; }
53  Vec3f operator*(KyFloat32 s) const { return Vec3f(x * s, y * s, z * s); }
54  Vec3f operator/(KyFloat32 d) const { return operator*(1.0f / d); }
55 
56  Vec3f operator+(const Vec3f& v) const { return Vec3f(x + v.x, y + v.y, z + v.z); }
57  Vec3f operator-(const Vec3f& v) const { return Vec3f(x - v.x, y - v.y, z - v.z); }
58  Vec3f operator-() const { return Vec3f(-x, -y, -z); }
59 
60  // -------------------------------- 2d --------------------------------
61 
62  Vec3f& operator+=(const Vec2f& v) { x += v.x; y += v.y; return *this; }
63  Vec3f& operator-=(const Vec2f& v) { x -= v.x; y -= v.y; return *this; }
64  Vec3f operator+(const Vec2f& v) const { return Vec3f(x + v.x, y + v.y, z); }
65  Vec3f operator-(const Vec2f& v) const { return Vec3f(x - v.x, y - v.y, z); }
66 
67  Vec2f Get2d() const { return Vec2f(x, y); }
68  KyFloat32 GetSquareLength2d() const { return x * x + y * y; }
69  KyFloat32 GetLength2d() const { return Sqrtf(x * x + y * y); }
70  KyFloat32 GetNormalized2d(Vec2f& normalized) const;
71  Vec2f GetNormalized2d() const;
72 
73  // -------------------------- Length --------------------------------
74 
75  KyFloat32 GetSquareLength() const { return x * x + y * y + z * z; }
76  KyFloat32 GetLength() const { return Sqrtf(x * x + y * y + z * z); }
78  KyFloat32 GetNormalized(Vec3f& normalized) const;
79  Vec3f GetNormalized() const;
80  bool IsNormalized() const { return IsEpsilonEqual(GetSquareLength(), 1.0f); }
81 
82  // -------------------------- Length Shorter Names --------------------------------
83 
84  KyFloat32 SqLength() const { return GetSquareLength(); }
85  KyFloat32 Length() const { return GetLength(); }
86  Vec3f Dir() const { return GetNormalized(); }
87  Vec2f Dir2d() const { return GetNormalized2d(); }
88 
89  // -------------------------- Offset --------------------------------
90 
91  Vec3f OffsetX(KyFloat32 dx) const { return Vec3f(x + dx, y, z); }
92  Vec3f OffsetY(KyFloat32 dy) const { return Vec3f(x, y + dy, z); }
93  Vec3f OffsetZ(KyFloat32 dz) const { return Vec3f(x, y, z + dz); }
94 
95  Vec3f Offset2d(KyFloat32 dx, KyFloat32 dy) const { return Vec3f(x + dx, y + dy, z); }
96 
97  // -------------------------- Zero --------------------------------
98 
99  static Vec3f Zero() { return Vec3f(0.0f, 0.0f, 0.0f); }
100  bool IsZero() const { return x == 0.0f && y == 0.0f && z == 0.0f; }
101 
102  // -------------------------- Unit --------------------------------
103 
104  static Vec3f UnitX() { return Vec3f(1.0f, 0.0f, 0.0f); }
105  static Vec3f UnitY() { return Vec3f(0.0f, 1.0f, 0.0f); }
106  static Vec3f UnitZ() { return Vec3f(0.0f, 0.0f, 1.0f); }
107 
108  // -------------------------- Data --------------------------
109 
110  KyFloat32 x;
111  KyFloat32 y;
112  KyFloat32 z;
113 };
114 
115 inline void SwapEndianness(Endianness::Target e, Vec3f& self)
116 {
117  SwapEndianness(e, self.x);
118  SwapEndianness(e, self.y);
119  SwapEndianness(e, self.z);
120 }
121 
122 template <class OSTREAM>
123 inline OSTREAM& operator<<(OSTREAM& os, const Vec3f& v)
124 {
125  os << "{" << v.x << ", " << v.y << ", " << v.z << "}";
126  return os;
127 }
128 
129 // -------------------------- Global Functions --------------------------
130 
131 inline Vec3f operator*(KyFloat32 s, const Vec3f& v) { return Vec3f(v.x * s, v.y * s, v.z * s); }
132 inline KyFloat32 DotProduct(const Vec3f& v1, const Vec3f& v2) { return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; }
133 inline KyFloat32 DotProduct2d(const Vec3f& v1, const Vec3f& v2) { return v1.x * v2.x + v1.y * v2.y; }
134 inline KyFloat32 CrossProduct_x(const Vec3f& v1, const Vec3f& v2) { return v1.y * v2.z - v1.z * v2.y; }
135 inline KyFloat32 CrossProduct_y(const Vec3f& v1, const Vec3f& v2) { return v1.z * v2.x - v1.x * v2.z; }
136 inline KyFloat32 CrossProduct_z(const Vec3f& v1, const Vec3f& v2) { return v1.x * v2.y - v1.y * v2.x; }
137 inline KyFloat32 CrossProduct2d(const Vec3f& v1, const Vec3f& v2) { return v1.x * v2.y - v1.y * v2.x; }
138 inline Vec3f CrossProduct(const Vec3f& v1, const Vec3f& v2) { return Vec3f(CrossProduct_x(v1, v2), CrossProduct_y(v1, v2), CrossProduct_z(v1, v2)); }
139 
140 inline Vec3f Seg(const Vec3f& A, const Vec3f& B) { return B - A; }
141 
143 inline Vec3f RightDir(const Vec3f& v) { return CrossProduct(v, Vec3f::UnitZ()).GetNormalized(); }
144 
145 inline KyFloat32 SquareDistance(const Vec3f& A, const Vec3f& B) { return Seg(A, B).GetSquareLength(); }
146 inline KyFloat32 SquareDistance2d(const Vec3f& A, const Vec3f& B) { return Seg(A, B).GetSquareLength2d(); }
147 
148 inline KyFloat32 Distance(const Vec3f& A, const Vec3f& B) { return Sqrtf(SquareDistance(A, B)); }
149 inline KyFloat32 Distance2d(const Vec3f& A, const Vec3f& B) { return Sqrtf(SquareDistance2d(A, B)); }
150 inline Vec3f Dir(const Vec3f& A, const Vec3f& B) { return Seg(A, B).GetNormalized(); }
151 inline Vec2f Dir2d(const Vec3f& A, const Vec3f& B) { return Vec2f(B.x - A.x, B.y - A.y).GetNormalized(); }
152 
153 inline bool IsEpsilonEqual(const Vec3f& A, const Vec3f& B) { return IsEpsilonEqual(A.x, B.x) && IsEpsilonEqual(A.y, B.y) && IsEpsilonEqual(A.z, B.z); }
154 inline bool IsEpsilonEqual2d(const Vec3f& A, const Vec3f& B) { return IsEpsilonEqual(A.x, B.x) && IsEpsilonEqual(A.y, B.y); }
155 inline bool IsEpsilonDifferent(const Vec3f& A, const Vec3f& B) { return !IsEpsilonEqual(A, B); }
156 inline bool IsEpsilonDifferent2d(const Vec3f& A, const Vec3f& B) { return !IsEpsilonEqual2d(A, B); }
157 
158 // -------------------------- Global Functions Shorter Names --------------------------
159 
160 inline KyFloat32 Dot(const Vec3f& v1, const Vec3f& v2) { return DotProduct(v1, v2); }
161 inline KyFloat32 Dot2d(const Vec3f& v1, const Vec3f& v2) { return DotProduct2d(v1, v2); }
162 inline KyFloat32 Cross_x(const Vec3f& v1, const Vec3f& v2) { return CrossProduct_x(v1, v2); }
163 inline KyFloat32 Cross_y(const Vec3f& v1, const Vec3f& v2) { return CrossProduct_y(v1, v2); }
164 inline KyFloat32 Cross_z(const Vec3f& v1, const Vec3f& v2) { return CrossProduct_z(v1, v2); }
165 inline KyFloat32 Cross2d(const Vec3f& v1, const Vec3f& v2) { return CrossProduct2d(v1, v2); }
166 inline Vec3f Cross(const Vec3f& v1, const Vec3f& v2) { return CrossProduct(v1, v2); }
167 inline KyFloat32 SqDist(const Vec3f& A, const Vec3f& B) { return SquareDistance(A, B); }
168 inline KyFloat32 SqDist2d(const Vec3f& A, const Vec3f& B) { return SquareDistance2d(A, B); }
169 inline KyFloat32 Dist(const Vec3f& A, const Vec3f& B) { return Distance(A, B); }
170 inline KyFloat32 Dist2d(const Vec3f& A, const Vec3f& B) { return Distance2d(A, B); }
171 
172 // -------------------------- end --------------------------
173 
174 inline bool Vec3f::operator<(const Vec3f& v) const
175 {
176  if (x < v.x) return true;
177  if (x > v.x) return false;
178  if (y < v.y) return true;
179  if (y > v.y) return false;
180  return (z < v.z);
181 }
182 
183 inline bool Vec3f::operator>(const Vec3f& v) const
184 {
185  if (x > v.x) return true;
186  if (x < v.x) return false;
187  if (y > v.y) return true;
188  if (y < v.y) return false;
189  return (z > v.z);
190 }
191 
193 {
194  const KyFloat32 length = GetLength();
195  if (length != 0.0f) // use CanDivideBy()
196  (*this) /= length;
197  return length;
198 }
199 
200 inline KyFloat32 Vec3f::GetNormalized(Vec3f& normalized) const
201 {
202  // Don't call Vec3f::Normalize() to avoid LHS
203  const KyFloat32 length = GetLength();
204  if (length != 0.0f) // use CanDivideBy()
205  {
206  const KyFloat32 invLength = 1.0f / length;
207  normalized.Set(x * invLength, y * invLength, z * invLength);
208  return length;
209  }
210  else
211  {
212  normalized.Set(0.0f, 0.0f, 0.0f);
213  return 0.f;
214  }
215 }
216 
217 inline Vec3f Vec3f::GetNormalized() const
218 {
219  Vec3f normalized;
220  GetNormalized(normalized);
221  return normalized;
222 }
223 
224 inline KyFloat32 Vec3f::GetNormalized2d(Vec2f& normalized2d) const
225 {
226  // don't call Vec2f::Normalize() to avoid LHS
227  const KyFloat32 length = GetLength2d();
228  if (length != 0.0f) // use CanDivideBy()
229  {
230  const KyFloat32 invLength = 1.0f / length;
231  normalized2d.Set(x * invLength, y * invLength);
232  return length;
233  }
234  else
235  {
236  normalized2d.Set(0.0f, 0.0f);
237  return 0.0f;
238  }
239 }
240 
242 {
243  const KyFloat32 length = GetLength2d();
244  if (length != 0.0f) // use CanDivideBy()
245  {
246  const KyFloat32 invLength = 1.0f / length;
247  return Vec2f(x * invLength, y * invLength);
248  }
249  else
250  {
251  return Vec2f(0.0f, 0.0f);
252  }
253 }
254 
255 
256 }
257 
Vec3f OffsetY(KyFloat32 dy) const
Returns {x, y + dy, z}.
Definition: vec3f.h:92
KyFloat32 GetNormalized(Vec3f &normalized) const
Normalizes normalized. Returns the length of this vector before normalization.
Definition: vec3f.h:200
Vec3f OffsetX(KyFloat32 dx) const
Returns {x + dx, y, z}.
Definition: vec3f.h:91
KyFloat32 Distance(const Vec2f &A, const Vec2f &B)
Returns the distance between A and B.
Definition: vec2f.h:138
Vec2f GetNormalized2d() const
as Get2d().GetNormalized()
Definition: vec3f.h:241
void Set(KyFloat32 _x, KyFloat32 _y, KyFloat32 _z)
Sets {_x, _y, _z}.
Definition: vec3f.h:29
void Set(const Vec2f &v)
Sets {v.x, v.y, 0.0f}.
Definition: vec3f.h:31
bool operator<(const Vec3f &v) const
x is compared first. ex: {1, 5, 0} < {2,="" 0,="" 0}.="" />
Definition: vec3f.h:174
static Vec3f Zero()
Returns {0.0f, 0.0f, 0.0f}.
Definition: vec3f.h:99
Vec3f()
Sets {0.0f, 0.0f, 0.0f}.
Definition: vec3f.h:23
KyFloat32 SquareDistance(const Vec2f &A, const Vec2f &B)
Returns the square of the distance between A and B.
Definition: vec2f.h:130
Vec3f(KyFloat32 _x, KyFloat32 _y, KyFloat32 _z)
Sets {_x, _y, _z}.
Definition: vec3f.h:24
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
Vec2f Dir2d(const Vec3f &A, const Vec3f &B)
Returns the normalized direction AB in 2d.
Definition: vec3f.h:151
KyFloat32 DotProduct2d(const Vec3f &v1, const Vec3f &v2)
Returns DotProduct(v1.Get2d(), v1.Get2d())
Definition: vec3f.h:133
Vec3f Offset2d(KyFloat32 dx, KyFloat32 dy) const
Returns {x + dx, y + dy, z}.
Definition: vec3f.h:95
Vec2f Dir(const Vec2f &A, const Vec2f &B)
Returns the normalized direction AB, returns zero if A == B.
Definition: vec2f.h:150
void Set(const KyFloat32 *coords)
Sets {coords[0], coords[1], coords[2]}.
Definition: vec3f.h:30
static Vec3f UnitZ()
Returns {0.0f, 0.0f, 1.0f}.
Definition: vec3f.h:106
Target
Enumerates the possible endianness types relative to the current platform.
Definition: endianness.h:27
Vec3f RightDir(const Vec3f &v)
Returns the normalized horizontal vector on the right of v. If v is vertical, this return Vec3f::Zero...
Definition: vec3f.h:143
void Set(const Vec2f &v, KyFloat32 _z)
Sets {v.x, v.y, _z}.
Definition: vec3f.h:32
2d vector using KyFloat32.
Definition: vec2f.h:18
KyFloat32 GetLength2d() const
as Get2d().GetLength()
Definition: vec3f.h:69
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
KyFloat32 Normalize()
Normalizes this vector. Returns the length of this vector before normalization.
Definition: vec3f.h:192
Vec2f operator*(KyFloat32 s, const Vec2f &v)
scalar * vec operator
Definition: vec2f.h:120
std::int32_t KyInt32
int32_t
Definition: types.h:24
static Vec3f UnitY()
Returns {0.0f, 1.0f, 0.0f}.
Definition: vec3f.h:105
Vec3f(const KyFloat32 *coords)
Sets {coords[0], coords[1], coords[2]}.
Definition: vec3f.h:25
void Clear()
Sets x=0.0f, y=0.0f and z=0.0f.
Definition: vec3f.h:34
KyFloat32 CrossProduct_z(const Vec2f &v1, const Vec2f &v2)
alias for CrossProduct, useful in some template functions
Definition: vec2f.h:123
Vec3f OffsetZ(KyFloat32 dz) const
Returns {x, y, z + dz}.
Definition: vec3f.h:93
Vec3f(const Vec2f &v, KyFloat32 _z)
Sets {v.x, v.y, _z}.
Definition: vec3f.h:27
static Vec3f UnitX()
Returns {1.0f, 0.0f, 0.0f}.
Definition: vec3f.h:104
Vec3f(const Vec2f &v)
Sets {v.x, v.y, 0.0f}.
Definition: vec3f.h:26
float KyFloat32
float
Definition: types.h:32
3d vector using 32bits floating points.
Definition: vec3f.h:16
KyFloat32 GetSquareLength2d() const
as Get2d().GetSquareLength()
Definition: vec3f.h:68