Scene Fusion 2 API Reference
ksVector3.h
1 /*************************************************************************
2  *
3  * KINEMATICOUP CONFIDENTIAL
4  * __________________
5  *
6  * Copyright (2016-2021) KinematicSoup Technologies Incorporated
7  * All Rights Reserved.
8  *
9  * NOTICE: All information contained herein is, and remains
10  * the property of KinematicSoup Technologies Incorporated and its
11  * suppliers, if any. The intellectual and technical concepts contained
12  * herein are proprietary to KinematicSoup Technologies Incorporated
13  * and its suppliers and may be covered by Canadian and Foreign Patents,
14  * patents in process, and are protected by trade secret or copyright law.
15  * Dissemination of this information or reproduction of this material
16  * is strictly forbidden unless prior written permission is obtained
17  * from KinematicSoup Technologies Incorporated.
18  */
19 #pragma once
20 
21 #include <cmath>
22 #include <string>
23 #include "Exports.h"
24 
25 namespace KS
26 {
27  typedef float Scalar;
28 
29  extern "C"
30  {
31  class EXTERNAL ksVector3
32  {
33  private:
34  Scalar m_values[3];
35  enum { X = 0, Y = 1, Z = 2 };
36 
37  public:
42  {
43  m_values[X] = (Scalar)0.0;
44  m_values[Y] = (Scalar)0.0;
45  m_values[Z] = (Scalar)0.0;
46  }
47 
51  ksVector3(const ksVector3& v)
52  {
53  m_values[X] = v.x();
54  m_values[Y] = v.y();
55  m_values[Z] = v.z();
56  }
57 
61  ksVector3(Scalar x, Scalar y, Scalar z)
62  {
63  m_values[X] = x;
64  m_values[Y] = y;
65  m_values[Z] = z;
66  }
67 
72 
73  /* Component access */
74  Scalar& x() { return m_values[X]; }
75  Scalar& y() { return m_values[Y]; }
76  Scalar& z() { return m_values[Z]; }
77  const Scalar& x() const { return m_values[X]; }
78  const Scalar& y() const { return m_values[Y]; }
79  const Scalar& z() const { return m_values[Z]; }
80 
87  inline ksVector3 operator* (const Scalar& c) const
88  {
89  return ksVector3{ m_values[X] * c, m_values[Y] * c, m_values[Z] * c };
90  }
91 
98  inline ksVector3 operator/ (const Scalar& c) const
99  {
100  return ksVector3{ m_values[X] / c, m_values[Y] / c, m_values[Z] / c };
101  }
102 
109  inline ksVector3 operator+ (const ksVector3& v) const
110  {
111  return ksVector3{ m_values[X] + v.x(), m_values[Y] + v.y(), m_values[Z] + v.z() };
112  }
113 
120  inline ksVector3 operator- (const ksVector3& v) const
121  {
122  return ksVector3{ m_values[X] - v.x(), m_values[Y] - v.y(), m_values[Z] - v.z() };
123  }
124 
130  inline ksVector3 operator- () const
131  {
132  return ksVector3{ -m_values[X], -m_values[Y], -m_values[Z] };
133  }
134 
141  inline ksVector3& operator*= (const Scalar& c)
142  {
143  m_values[X] *= c;
144  m_values[Y] *= c;
145  m_values[Z] *= c;
146  return *this;
147  }
148 
155  inline ksVector3& operator/= (const Scalar& c)
156  {
157  m_values[X] /= c;
158  m_values[Y] /= c;
159  m_values[Z] /= c;
160  return *this;
161  }
162 
169  inline ksVector3& operator+= (const ksVector3& v)
170  {
171  m_values[X] += v.x();
172  m_values[Y] += v.y();
173  m_values[Z] += v.z();
174  return *this;
175  }
176 
183  inline ksVector3& operator-= (const ksVector3& v)
184  {
185  m_values[X] -= v.x();
186  m_values[Y] -= v.y();
187  m_values[Z] -= v.z();
188  return *this;
189  }
190 
197  inline bool operator== (const ksVector3& v)
198  {
199  return m_values[X] == v.x() && m_values[Y] == v.y() && m_values[Z] == v.z();
200  }
201 
208  inline bool operator!= (const ksVector3& v)
209  {
210  return !(*this == v);
211  }
212 
219  inline Scalar& operator[](const int& i)
220  {
221  return m_values[i % 3];
222  }
223 
227  inline float MagnitudeSquared()
228  {
229  return m_values[X] * m_values[X] + m_values[Y] * m_values[Y] + m_values[Z] * m_values[Z];
230  }
231 
235  inline float Magnitude()
236  {
237  return std::sqrt(MagnitudeSquared());
238  }
239 
243  void Normalize()
244  {
245  // Computation of length can overflow easily because it
246  // first computes squared length, so we first divide by
247  // the largest coefficient.
248  Scalar m = (m_values[X] < 0.0f) ? -m_values[X] : m_values[X];
249  Scalar absy = (m_values[Y] < 0.0f) ? -m_values[Y] : m_values[Y];
250  Scalar absz = (m_values[Z] < 0.0f) ? -m_values[Z] : m_values[Z];
251 
252  m = (absy > m) ? absy : m;
253  m = (absz > m) ? absz : m;
254 
255  if (m == 0 || m == -0)
256  {
257  return;
258  }
259 
260  // Scaling
261  m_values[X] /= m;
262  m_values[Y] /= m;
263  m_values[Z] /= m;
264 
265  // Normalize
266  Scalar length = (Scalar)sqrt(m_values[X] * m_values[X] + m_values[Y] * m_values[Y] + m_values[Z] * m_values[Z]);
267  m_values[X] /= length;
268  m_values[Y] /= length;
269  m_values[Z] /= length;
270  }
271 
278  bool IsZero(Scalar tolerance = 0.000001f) const
279  {
280  return ((m_values[X] * m_values[X] + m_values[Y] * m_values[Y] + m_values[Z] * m_values[Z]) < tolerance);
281  }
282 
290  static Scalar Distance(const ksVector3& v1, const ksVector3& v2)
291  {
292  return (v1 - v2).Magnitude();
293  }
294 
302  static Scalar DistanceSquared(const ksVector3& v1, const ksVector3& v2)
303  {
304  return (v1 - v2).MagnitudeSquared();
305  }
306 
314  static Scalar Dot(const ksVector3& v1, const ksVector3& v2)
315  {
316  return v1.x() * v2.x() + v1.y() * v2.y() + v1.z() * v2.z();
317  }
318 
326  static ksVector3 Cross(const ksVector3& v1, const ksVector3& v2)
327  {
328  return ksVector3{ v1.y() * v2.z() - v1.z() * v2.y(),
329  v1.z() * v2.x() - v1.x() * v2.z(),
330  v1.x() * v2.y() - v1.y() * v2.x() };
331  }
332 
338  std::string ToString()
339  {
340  return "X=" + std::to_string(m_values[X]) + ", Y=" + std::to_string(m_values[Y]) + ", Z=" + std::to_string(m_values[Z]);
341  }
342  };
343  }
344 
352  inline ksVector3 operator* (const Scalar& c, const ksVector3& v)
353  {
354  return ksVector3{ v * c };
355  }
356 }
357 
358 #undef DLL_EXPORT
Definition: ksVector3.h:32
std::string ToString()
Definition: ksVector3.h:338
ksVector3(Scalar x, Scalar y, Scalar z)
Definition: ksVector3.h:61
float Magnitude()
Definition: ksVector3.h:235
ksVector3()
Definition: ksVector3.h:41
static Scalar Dot(const ksVector3 &v1, const ksVector3 &v2)
Definition: ksVector3.h:314
Scalar & operator[](const int &i)
Definition: ksVector3.h:219
~ksVector3()
Definition: ksVector3.h:71
bool IsZero(Scalar tolerance=0.000001f) const
Definition: ksVector3.h:278
ksVector3(const ksVector3 &v)
Definition: ksVector3.h:51
static Scalar DistanceSquared(const ksVector3 &v1, const ksVector3 &v2)
Definition: ksVector3.h:302
float MagnitudeSquared()
Definition: ksVector3.h:227
void Normalize()
Definition: ksVector3.h:243
static Scalar Distance(const ksVector3 &v1, const ksVector3 &v2)
Definition: ksVector3.h:290
static ksVector3 Cross(const ksVector3 &v1, const ksVector3 &v2)
Definition: ksVector3.h:326
Definition: sfDictionaryProperty.h:24
ksVector3 operator*(const Scalar &c, const ksVector3 &v)
Definition: ksVector3.h:352