From a0082bd9e27cebc3df08a2a9c77aa092bc46f585 Mon Sep 17 00:00:00 2001
From: Pascal Serrarens <pascal@passervr.com>
Date: Mon, 30 Dec 2024 12:15:01 +0100
Subject: [PATCH 1/2] Add direction documentation

---
 AngleUsing.h                |  52 -----
 Direction.cpp               |  28 +--
 Direction.h                 |  63 ++++-
 DoxyGen/DoxyWarnLogfile.txt | 113 +++++----
 DoxyGen/Doxyfile            | 449 +++++++++++++++++++++++++-----------
 5 files changed, 431 insertions(+), 274 deletions(-)
 delete mode 100644 AngleUsing.h

diff --git a/AngleUsing.h b/AngleUsing.h
deleted file mode 100644
index f2bc80e..0000000
--- a/AngleUsing.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-#ifndef DISCRETEANGLE_H
-#define DISCRETEANGLE_H
-
-#include "Angle.h"
-#include "Range.h"
-
-namespace Passer {
-namespace LinearAlgebra {
-
-// A fixed angle between (-180..180]
-
-template <typename T>
-class AngleUsing {
- public:
-  AngleUsing(T sourceValue) { this->value = sourceValue; }
-  AngleUsing(float f);
-  float ToFloat() const;
-  inline T GetValue() const { return this->value; }
-
-  AngleUsing<T> operator+(const AngleUsing<T> a) {
-    AngleUsing<T> r = AngleUsing((float)this->value + a.value);
-    return r;
-  }
-
-  inline AngleUsing<T> operator+=(const AngleUsing<T> a) {
-    return this->value + a.value;
-  }
-
-  inline AngleUsing<T> operator-(const AngleUsing<T> a) {
-    return this->value - a.value;
-  }
-
-  inline AngleUsing<T> operator-() {
-    this->value = -this->value;
-    return *this;
-  }
-
-  inline bool operator==(const AngleUsing<T> a) {
-    return this->value == a.value;
-  }
-
-  // protected:
-  T value;
-};
-
-}  // namespace LinearAlgebra
-}  // namespace Passer
-using namespace Passer::LinearAlgebra;
-
-#endif
-*/
\ No newline at end of file
diff --git a/Direction.cpp b/Direction.cpp
index c465b4a..a9bbd76 100644
--- a/Direction.cpp
+++ b/Direction.cpp
@@ -9,8 +9,7 @@
 
 #include <math.h>
 
-template <typename T>
-DirectionOf<T>::DirectionOf() {
+template <typename T> DirectionOf<T>::DirectionOf() {
   this->horizontal = AngleOf<T>();
   this->vertical = AngleOf<T>();
 }
@@ -50,15 +49,16 @@ Vector3 Passer::LinearAlgebra::DirectionOf<T>::ToVector3() const {
 }
 
 template <typename T>
-DirectionOf<T> Passer::LinearAlgebra::DirectionOf<T>::FromVector3(Vector3 v) {
+DirectionOf<T>
+Passer::LinearAlgebra::DirectionOf<T>::FromVector3(Vector3 vector) {
   DirectionOf<T> d;
   d.horizontal = AngleOf<T>::Atan2(
-      v.Right(),
-      v.Forward());  // AngleOf<T>::Radians(atan2f(v.Right(), v.Forward()));
+      vector.Right(),
+      vector.Forward()); // AngleOf<T>::Radians(atan2f(v.Right(), v.Forward()));
   d.vertical =
       AngleOf<T>::Degrees(-90) -
       AngleOf<T>::Acos(
-          v.Up());  // AngleOf<T>::Radians(-(0.5f * pi) - acosf(v.Up()));
+          vector.Up()); // AngleOf<T>::Radians(-(0.5f * pi) - acosf(v.Up()));
   d.Normalize();
   return d;
 }
@@ -79,8 +79,9 @@ DirectionOf<T> Passer::LinearAlgebra::DirectionOf<T>::Radians(float horizontal,
 
 template <typename T>
 bool Passer::LinearAlgebra::DirectionOf<T>::operator==(
-    const DirectionOf<T> d) const {
-  return (this->horizontal == d.horizontal) && (this->vertical == d.vertical);
+    const DirectionOf<T> direction) const {
+  return (this->horizontal == direction.horizontal) &&
+         (this->vertical == direction.vertical);
 }
 
 template <typename T>
@@ -90,16 +91,7 @@ DirectionOf<T> Passer::LinearAlgebra::DirectionOf<T>::operator-() const {
   return r;
 }
 
-template <typename T>
-Vector3 DirectionOf<T>::ToVector3() {
-  Vector3 v = Quaternion::Euler(-this->vertical.InDegrees(),
-                                this->horizontal.InDegrees(), 0) *
-              Vector3::forward;
-  return v;
-}
-
-template <typename T>
-void DirectionOf<T>::Normalize() {
+template <typename T> void DirectionOf<T>::Normalize() {
   if (this->vertical > AngleOf<T>::Degrees(90) ||
       this->vertical < AngleOf<T>::Degrees(-90)) {
     this->horizontal += AngleOf<T>::Degrees(180);
diff --git a/Direction.h b/Direction.h
index 79ca814..ebb75f7 100644
--- a/Direction.h
+++ b/Direction.h
@@ -12,46 +12,87 @@ namespace LinearAlgebra {
 
 struct Vector3;
 
-template <typename T>
-class DirectionOf {
- public:
+/// @brief A direction using angles in various representations
+/// @tparam T The internal type used for the representations of the angles
+/// A direction is represented using two angles:
+/// * The horizontal angle ranging from -180 (inclusive) to 180 (exclusive)
+/// degrees which is a rotation in the horizontal plane
+/// * A vertical angle ranging from -90 (inclusive) to 90 (exclusive) degrees
+/// which is the rotation in the up/down direction applied after the horizontal
+/// rotation has been applied.
+/// The angles are automatically normalized to stay within the abovenmentioned
+/// ranges.
+template <typename T> class DirectionOf {
+public:
   /// @brief horizontal angle, range= (-180..180]
   AngleOf<T> horizontal;
   /// @brief vertical angle, range in degrees = (-90..90]
   AngleOf<T> vertical;
 
+  /// @brief Create a new direction with zero angles
   DirectionOf<T>();
+  /// @brief Create a new direction
+  /// @param horizontal The horizontal angle
+  /// @param vertical The vertical angle.
   DirectionOf<T>(AngleOf<T> horizontal, AngleOf<T> vertical);
 
+  /// @brief Convert the direction into a carthesian vector
+  /// @return The carthesian vector corresponding to this direction.
   Vector3 ToVector3() const;
-  static DirectionOf<T> FromVector3(Vector3 v);
+  /// @brief Convert a carthesian vector into a direction
+  /// @param v The carthesian vector
+  /// @return The direction.
+  /// @note Information about the length of the carthesian vector is not
+  /// included in this transformation.
+  static DirectionOf<T> FromVector3(Vector3 vector);
 
+  /// @brief Create a direction using angle values in degrees
+  /// @param horizontal The horizontal angle in degrees
+  /// @param vertical The vertical angle in degrees
+  /// @return The direction
   static DirectionOf<T> Degrees(float horizontal, float vertical);
+  /// @brief Create a direction using angle values in radians
+  /// @param horizontal The horizontal angle in radians
+  /// @param vertical The vertical angle in radians
+  /// @return The direction
   static DirectionOf<T> Radians(float horizontal, float vertical);
 
+  /// @brief A forward direction with zero for both angles
   const static DirectionOf forward;
+  /// @brief A backward direction with horizontal angle -180 and zero vertical
+  /// angle
   const static DirectionOf back;
+  /// @brief A upward direction with zero horizontal angle and vertical angle 90
   const static DirectionOf up;
+  /// @brief A downward direction with zero horizontal angle and vertical angle
+  /// -90
   const static DirectionOf down;
+  /// @brief A left-pointing direction with horizontal angle -90 and zero
+  /// vertical angle
   const static DirectionOf left;
+  /// @brief A right-pointing direction with horizontal angle 90 and zero
+  /// vertical angle
   const static DirectionOf right;
 
-  bool operator==(const DirectionOf<T> d) const;
+  /// @brief Test whether this direction is equal to another direction
+  /// @param direction The direction to compare to
+  /// @return True when the direction angles are equal, false otherwise.
+  bool operator==(const DirectionOf<T> direction) const;
 
+  /// @brief Negate/reverse the direction
+  /// @return The reversed direction.
   DirectionOf<T> operator-() const;
 
-  Vector3 ToVector3();
-
- protected:
+protected:
+  /// @brief Normalize this vector to the specified ranges
   void Normalize();
 };
 
 using DirectionSingle = DirectionOf<float>;
 using Direction16 = DirectionOf<signed short>;
-using Direction = DirectionOf<float>;
 
-}  // namespace LinearAlgebra
-}  // namespace Passer
+} // namespace LinearAlgebra
+} // namespace Passer
 using namespace Passer::LinearAlgebra;
 
 #endif
\ No newline at end of file
diff --git a/DoxyGen/DoxyWarnLogfile.txt b/DoxyGen/DoxyWarnLogfile.txt
index b1425a0..fac369b 100644
--- a/DoxyGen/DoxyWarnLogfile.txt
+++ b/DoxyGen/DoxyWarnLogfile.txt
@@ -2,39 +2,39 @@ warning: source 'images' is not a readable file or directory... skipping.
 d:/PlatformIO/linear-algebra/Quaternion.cpp:100: warning: no uniquely matching class member found for 
   Quaternion Quaternion::operator*(const Quaternion &r2) const
 Possible candidates:
-  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(const AngleOf< T > &angle, float factor)' at line 120 of file d:/PlatformIO/linear-algebra/Angle.h
-  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(float factor, const AngleOf< T > &angle)' at line 127 of file d:/PlatformIO/linear-algebra/Angle.h
+  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(const AngleOf< T > &angle, float factor)' at line 117 of file d:/PlatformIO/linear-algebra/Angle.h
+  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(float factor, const AngleOf< T > &angle)' at line 124 of file d:/PlatformIO/linear-algebra/Angle.h
   'Vector3 Passer::LinearAlgebra::MatrixOf< T >::operator*(const Vector3 v) const' at line 64 of file d:/PlatformIO/linear-algebra/Matrix.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 100 of file d:/PlatformIO/linear-algebra/Polar.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 103 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 116 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 119 of file d:/PlatformIO/linear-algebra/Polar.h
   'Vector3 Passer::LinearAlgebra::Quaternion::operator*(const Vector3 &vector) const' at line 98 of file d:/PlatformIO/linear-algebra/Quaternion.h
   'Quaternion Passer::LinearAlgebra::Quaternion::operator*(const Quaternion &rotation) const' at line 106 of file d:/PlatformIO/linear-algebra/Quaternion.h
   'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(const SphericalOf< T > &v, float f)' at line 109 of file d:/PlatformIO/linear-algebra/Spherical.h
   'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(float f, const SphericalOf< T > &v)' at line 112 of file d:/PlatformIO/linear-algebra/Spherical.h
   'SphericalOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SphericalOf< T > &vector) const' at line 45 of file d:/PlatformIO/linear-algebra/SwingTwist.h
   'SwingTwistOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SwingTwistOf< T > &rotation) const' at line 53 of file d:/PlatformIO/linear-algebra/SwingTwist.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 143 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 146 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 151 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 154 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 142 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 145 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 150 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 153 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Quaternion.cpp:108: warning: no uniquely matching class member found for 
   Vector3 Quaternion::operator*(const Vector3 &p) const
 Possible candidates:
-  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(const AngleOf< T > &angle, float factor)' at line 120 of file d:/PlatformIO/linear-algebra/Angle.h
-  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(float factor, const AngleOf< T > &angle)' at line 127 of file d:/PlatformIO/linear-algebra/Angle.h
+  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(const AngleOf< T > &angle, float factor)' at line 117 of file d:/PlatformIO/linear-algebra/Angle.h
+  'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(float factor, const AngleOf< T > &angle)' at line 124 of file d:/PlatformIO/linear-algebra/Angle.h
   'Vector3 Passer::LinearAlgebra::MatrixOf< T >::operator*(const Vector3 v) const' at line 64 of file d:/PlatformIO/linear-algebra/Matrix.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 100 of file d:/PlatformIO/linear-algebra/Polar.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 103 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 116 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 119 of file d:/PlatformIO/linear-algebra/Polar.h
   'Vector3 Passer::LinearAlgebra::Quaternion::operator*(const Vector3 &vector) const' at line 98 of file d:/PlatformIO/linear-algebra/Quaternion.h
   'Quaternion Passer::LinearAlgebra::Quaternion::operator*(const Quaternion &rotation) const' at line 106 of file d:/PlatformIO/linear-algebra/Quaternion.h
   'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(const SphericalOf< T > &v, float f)' at line 109 of file d:/PlatformIO/linear-algebra/Spherical.h
   'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(float f, const SphericalOf< T > &v)' at line 112 of file d:/PlatformIO/linear-algebra/Spherical.h
   'SphericalOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SphericalOf< T > &vector) const' at line 45 of file d:/PlatformIO/linear-algebra/SwingTwist.h
   'SwingTwistOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SwingTwistOf< T > &rotation) const' at line 53 of file d:/PlatformIO/linear-algebra/SwingTwist.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 143 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 146 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 151 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 154 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 142 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 145 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 150 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 153 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Quaternion.cpp:152: warning: no uniquely matching class member found for 
   Quaternion Quaternion::LookRotation(const Vector3 &forward, const Vector3 &up)
 Possible candidates:
@@ -54,40 +54,41 @@ d:/PlatformIO/linear-algebra/Spherical.cpp:137: warning: no uniquely matching cl
   template < T >
   SphericalOf< T > SphericalOf::operator-(const SphericalOf< T > &s2) const
 Possible candidates:
-  'AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator-() const' at line 102 of file d:/PlatformIO/linear-algebra/Angle.h
-  'AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator-(const AngleOf< T > &angle) const' at line 106 of file d:/PlatformIO/linear-algebra/Angle.h
-  'DirectionOf< T > Passer::LinearAlgebra::DirectionOf< T >::operator-() const' at line 41 of file d:/PlatformIO/linear-algebra/Direction.h
-  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-() const' at line 82 of file d:/PlatformIO/linear-algebra/Polar.h
-  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-(const PolarOf &v) const' at line 87 of file d:/PlatformIO/linear-algebra/Polar.h
-  'RangeUsing< T > Passer::LinearAlgebra::RangeUsing< T >::operator-(RangeUsing< T > a)' at line 38 of file d:/PlatformIO/linear-algebra/Range.h
-  'RangeUsing< T > Passer::LinearAlgebra::RangeUsing< T >::operator-()' at line 40 of file d:/PlatformIO/linear-algebra/Range.h
+  'AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator-() const' at line 99 of file d:/PlatformIO/linear-algebra/Angle.h
+  'AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator-(const AngleOf< T > &angle) const' at line 103 of file d:/PlatformIO/linear-algebra/Angle.h
+  'DirectionOf< T > Passer::LinearAlgebra::DirectionOf< T >::operator-() const' at line 84 of file d:/PlatformIO/linear-algebra/Direction.h
+  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-() const' at line 98 of file d:/PlatformIO/linear-algebra/Polar.h
+  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-(const PolarOf &v) const' at line 103 of file d:/PlatformIO/linear-algebra/Polar.h
   'SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator-() const' at line 91 of file d:/PlatformIO/linear-algebra/Spherical.h
   'SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator-(const SphericalOf< T > &v) const' at line 96 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'Vector2 Passer::LinearAlgebra::Vector2::operator-()' at line 118 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Vector2 Passer::LinearAlgebra::Vector2::operator-(const Vector2 &v) const' at line 123 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Vector3 Passer::LinearAlgebra::Vector3::operator-() const' at line 126 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Vector3 Passer::LinearAlgebra::Vector3::operator-(const Vector3 &v) const' at line 131 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Vector2 Passer::LinearAlgebra::Vector2::operator-()' at line 117 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Vector2 Passer::LinearAlgebra::Vector2::operator-(const Vector2 &v) const' at line 122 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Vector3 Passer::LinearAlgebra::Vector3::operator-() const' at line 125 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Vector3 Passer::LinearAlgebra::Vector3::operator-(const Vector3 &v) const' at line 130 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Vector2.cpp:20: warning: no uniquely matching class member found for 
   Vector2::Vector2(float _x, float _y)
 Possible candidates:
-  'Passer::LinearAlgebra::Vector2::Vector2()' at line 45 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 49 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 53 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 56 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2()' at line 44 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 48 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 52 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 55 of file d:/PlatformIO/linear-algebra/Vector2.h
 d:/PlatformIO/linear-algebra/Vector2.cpp:32: warning: no uniquely matching class member found for 
-  Vector2::Vector2(Polar p)
+  Vector2::Vector2(PolarSingle p)
 Possible candidates:
-  'Passer::LinearAlgebra::Vector2::Vector2()' at line 45 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 49 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 53 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 56 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2()' at line 44 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 48 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 52 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 55 of file d:/PlatformIO/linear-algebra/Vector2.h
 d:/PlatformIO/linear-algebra/Vector3.cpp:33: warning: no uniquely matching class member found for 
   Vector3::Vector3(SphericalOf< float > s)
 Possible candidates:
-  'Passer::LinearAlgebra::Vector3::Vector3()' at line 49 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Passer::LinearAlgebra::Vector3::Vector3(float right, float up, float forward)' at line 54 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Passer::LinearAlgebra::Vector3::Vector3(Vector2 v)' at line 57 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Passer::LinearAlgebra::Vector3::Vector3(SphericalOf< float > v)' at line 61 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3()' at line 48 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3(float right, float up, float forward)' at line 53 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3(Vector2 v)' at line 56 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3(SphericalOf< float > v)' at line 60 of file d:/PlatformIO/linear-algebra/Vector3.h
+d:/PlatformIO/linear-algebra/Direction.h:43: warning: argument 'v' of command @param is not found in the argument list of Passer::LinearAlgebra::DirectionOf< T >::FromVector3(Vector3 vector)
+d:/PlatformIO/linear-algebra/Direction.h:43: warning: The following parameter of Passer::LinearAlgebra::DirectionOf::FromVector3(Vector3 vector) is not documented:
+  parameter 'vector'
 d:/PlatformIO/linear-algebra/Matrix.h:12: warning: Member MatrixOf(unsigned int rows, unsigned int cols) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
 d:/PlatformIO/linear-algebra/Matrix.h:13: warning: Member MatrixOf(unsigned int rows, unsigned int cols, const T *source) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
 d:/PlatformIO/linear-algebra/Matrix.h:17: warning: Member MatrixOf(Vector3 v) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
@@ -103,20 +104,18 @@ d:/PlatformIO/linear-algebra/Matrix.h:108: warning: Member RowCount() const (fun
 d:/PlatformIO/linear-algebra/Matrix.h:109: warning: Member ColCount() const (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
 d:/PlatformIO/linear-algebra/Matrix.h:57: warning: Member Multiply(const MatrixOf< T > *m1, const MatrixOf< T > *m2, MatrixOf< T > *r) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
 d:/PlatformIO/linear-algebra/Matrix.h:63: warning: Member Multiply(const MatrixOf< T > *m, Vector3 v) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:124: warning: Member operator-=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:129: warning: Member operator+=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:150: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:161: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:146: warning: Member operator*(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:158: warning: Member operator/(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:84: warning: Member Forward() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:85: warning: Member Up() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:86: warning: Member Right() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:132: warning: Member operator-=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:137: warning: Member operator+=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:158: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:170: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:154: warning: Member operator*(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:166: warning: Member operator/(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
-t f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:166: warning: Member operator/(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:123: warning: Member operator-=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:128: warning: Member operator+=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:149: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:160: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:145: warning: Member operator*(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:157: warning: Member operator/(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:83: warning: Member Forward() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:84: warning: Member Up() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:85: warning: Member Right() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:131: warning: Member operator-=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:136: warning: Member operator+=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:157: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:169: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:153: warning: Member operator*(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:165: warning: Member operator/(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
diff --git a/DoxyGen/Doxyfile b/DoxyGen/Doxyfile
index 335a8f2..e57d669 100644
--- a/DoxyGen/Doxyfile
+++ b/DoxyGen/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.9.2
+# Doxyfile 1.9.8
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
@@ -12,6 +12,16 @@
 # For lists, items can also be appended using:
 # TAG += value [value, ...]
 # Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
 
 #---------------------------------------------------------------------------
 # Project related configuration options
@@ -58,18 +68,30 @@ PROJECT_LOGO           = //intranet/home/Afbeeldingen/PasserVR/Logos/Logo3NameRi
 # entered, it will be relative to the location where doxygen was started. If
 # left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       = //intranet/web/apis/LinearAlgebra
+OUTPUT_DIRECTORY       = //intranet/web/passer_life/apis/LinearAlgebra
 
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
 # option can be useful when feeding doxygen a huge amount of source files, where
 # putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
 # The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# number of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL   = 8
+
 # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
 # characters to appear in the names of generated files. If set to NO, non-ASCII
 # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
@@ -81,14 +103,14 @@ ALLOW_UNICODE_NAMES    = NO
 # The OUTPUT_LANGUAGE tag is used to specify the language in which all
 # documentation generated by doxygen is written. Doxygen will use this
 # information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
 # The default value is: English.
 
 OUTPUT_LANGUAGE        = English
@@ -341,6 +363,17 @@ MARKDOWN_SUPPORT       = YES
 
 TOC_INCLUDE_HEADINGS   = 0
 
+# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to
+# generate identifiers for the Markdown headings. Note: Every identifier is
+# unique.
+# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a
+# sequence number starting at 0 and GITHUB use the lower case version of title
+# with any whitespace replaced by '-' and punctuation characters removed.
+# The default value is: DOXYGEN.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+MARKDOWN_ID_STYLE      = DOXYGEN
+
 # When enabled doxygen tries to link words that correspond to documented
 # classes, or namespaces to their corresponding documentation. Such a link can
 # be prevented in individual cases by putting a % sign in front of the word or
@@ -452,7 +485,7 @@ TYPEDEF_HIDES_STRUCT   = NO
 
 LOOKUP_CACHE_SIZE      = 0
 
-# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
 # during processing. When set to 0 doxygen will based this on the number of
 # cores available in the system. You can set it explicitly to a value larger
 # than 0 to get more control over the balance between CPU load and processing
@@ -465,6 +498,14 @@ LOOKUP_CACHE_SIZE      = 0
 
 NUM_PROC_THREADS       = 1
 
+# If the TIMESTAMP tag is set different from NO then each generated page will
+# contain the date or date and time when the page was generated. Setting this to
+# NO can help when comparing the output of multiple runs.
+# Possible values are: YES, NO, DATETIME and DATE.
+# The default value is: NO.
+
+TIMESTAMP              = NO
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -546,7 +587,8 @@ HIDE_UNDOC_MEMBERS     = NO
 # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
 # undocumented classes that are normally visible in the class hierarchy. If set
 # to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
+# will also hide undocumented C++ concepts if enabled. This option has no effect
+# if EXTRACT_ALL is enabled.
 # The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = YES
@@ -577,14 +619,15 @@ INTERNAL_DOCS          = NO
 # filesystem is case sensitive (i.e. it supports files in the same directory
 # whose names only differ in casing), the option must be set to YES to properly
 # deal with such files in case they appear in the input. For filesystems that
-# are not case sensitive the option should be be set to NO to properly deal with
+# are not case sensitive the option should be set to NO to properly deal with
 # output files written for symbols that only differ in casing, such as for two
 # classes, one named CLASS and the other named Class, and to also support
 # references to files without having to specify the exact matching casing. On
 # Windows (including Cygwin) and MacOS, users should typically set this option
 # to NO, whereas on Linux or other Unix flavors it should typically be set to
 # YES.
-# The default value is: system dependent.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
 
 CASE_SENSE_NAMES       = NO
 
@@ -836,11 +879,26 @@ WARN_IF_INCOMPLETE_DOC = YES
 
 WARN_NO_PARAMDOC       = NO
 
+# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about
+# undocumented enumeration values. If set to NO, doxygen will accept
+# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: NO.
+
+WARN_IF_UNDOC_ENUM_VAL = NO
+
 # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
 # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
 # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
 # at the end of the doxygen process doxygen will return with a non-zero status.
-# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves
+# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not
+# write the warning messages in between other messages but write them at the end
+# of a run, in case a WARN_LOGFILE is defined the warning messages will be
+# besides being in the defined file also be shown at the end of a run, unless
+# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case
+# the behavior will remain as with the setting FAIL_ON_WARNINGS.
+# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT.
 # The default value is: NO.
 
 WARN_AS_ERROR          = NO
@@ -851,13 +909,27 @@ WARN_AS_ERROR          = NO
 # and the warning text. Optionally the format may contain $version, which will
 # be replaced by the version of the file (if it could be obtained via
 # FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
 # The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT       = "at line $line of file $file"
+
 # The WARN_LOGFILE tag can be used to specify a file to which warning and error
 # messages should be written. If left blank the output is written to standard
-# error (stderr).
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
 
 WARN_LOGFILE           = DoxyWarnLogfile.txt
 
@@ -879,10 +951,21 @@ INPUT                  = .. \
 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
 # documentation (see:
 # https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
 # The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
+# "INPUT_ENCODING" for further information on supported encodings.
+
+INPUT_FILE_ENCODING    =
+
 # If the value of the INPUT tag contains directories, you can use the
 # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
 # *.h) to filter out the source-files in the directories.
@@ -894,12 +977,12 @@ INPUT_ENCODING         = UTF-8
 # Note the list of default checked file patterns might differ from the list of
 # default file extension mappings.
 #
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
-# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
-# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
-# *.vhdl, *.ucf, *.qsf and *.ice.
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm,
+# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl,
+# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php,
+# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be
+# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
 
 FILE_PATTERNS          = *.c \
                          *.cc \
@@ -977,16 +1060,14 @@ EXCLUDE_SYMLINKS       = NO
 # Note that the wildcards are matched against the file with absolute path, so to
 # exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = gtest*, googletest*
+EXCLUDE_PATTERNS       = gtest* \
+                         googletest*
 
 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
 # (namespaces, classes, functions, etc.) that should be excluded from the
 # output. The symbol name can be a fully qualified name, a word, or if the
 # wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
+# ANamespace::AClass, ANamespace::*Test
 
 EXCLUDE_SYMBOLS        =
 
@@ -1032,6 +1113,11 @@ IMAGE_PATH             = images \
 # code is scanned, but not when the output code is generated. If lines are added
 # or removed, the anchors will not be placed correctly.
 #
+# Note that doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
 # Note that for custom extensions or not directly supported extensions you also
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
 # properly processed by doxygen.
@@ -1073,6 +1159,15 @@ FILTER_SOURCE_PATTERNS =
 
 USE_MDFILE_AS_MAINPAGE =
 
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER  = 72
+
 #---------------------------------------------------------------------------
 # Configuration options related to source browsing
 #---------------------------------------------------------------------------
@@ -1210,10 +1305,11 @@ CLANG_DATABASE_PATH    =
 
 ALPHABETICAL_INDEX     = YES
 
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
+# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
+# that should be ignored while generating the index headers. The IGNORE_PREFIX
+# tag works for classes, function and member names. The entity will be placed in
+# the alphabetical list under the first letter of the entity name that remains
+# after removing the prefix.
 # This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 IGNORE_PREFIX          =
@@ -1292,7 +1388,12 @@ HTML_STYLESHEET        =
 # Doxygen will copy the style sheet files to the output directory.
 # Note: The order of the extra style sheet files is of importance (e.g. the last
 # style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
+# list).
+# Note: Since the styling of scrollbars can currently not be overruled in
+# Webkit/Chromium, the styling will be left out of the default doxygen.css if
+# one or more extra stylesheets have been specified. So if scrollbar
+# customization is desired it has to be added explicitly. For an example see the
+# documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_STYLESHEET  = custom_doxygen.css
@@ -1307,6 +1408,19 @@ HTML_EXTRA_STYLESHEET  = custom_doxygen.css
 
 HTML_EXTRA_FILES       =
 
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme.
+# Possible values are: LIGHT always generate light mode output, DARK always
+# generate dark mode output, AUTO_LIGHT automatically set the mode according to
+# the user preference, use light mode if no preference is set (the default),
+# AUTO_DARK automatically set the mode according to the user preference, use
+# dark mode if no preference is set and TOGGLE allow to user to switch between
+# light and dark mode via a button.
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE        = LIGHT
+
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
 # will adjust the colors in the style sheet and background images according to
 # this color. Hue is specified as an angle on a color-wheel, see
@@ -1337,15 +1451,6 @@ HTML_COLORSTYLE_SAT    = 0
 
 HTML_COLORSTYLE_GAMMA  = 103
 
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP         = NO
-
 # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
 # documentation will contain a main index with vertical navigation menus that
 # are dynamically created via JavaScript. If disabled, the navigation index will
@@ -1365,6 +1470,13 @@ HTML_DYNAMIC_MENUS     = YES
 
 HTML_DYNAMIC_SECTIONS  = NO
 
+# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be
+# dynamically folded and expanded in the generated HTML source code.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_CODE_FOLDING      = YES
+
 # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
 # shown in the various tree structured indices initially; the user can expand
 # and collapse entries dynamically later on. Doxygen will expand the tree to
@@ -1401,6 +1513,13 @@ GENERATE_DOCSET        = NO
 
 DOCSET_FEEDNAME        = "Doxygen generated docs"
 
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL         =
+
 # This tag specifies a string that should uniquely identify the documentation
 # set bundle. This should be a reverse domain-name style string, e.g.
 # com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1488,6 +1607,16 @@ BINARY_TOC             = NO
 
 TOC_EXPAND             = NO
 
+# The SITEMAP_URL tag is used to specify the full URL of the place where the
+# generated documentation will be placed on the server by the user during the
+# deployment of the documentation. The generated sitemap is called sitemap.xml
+# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL
+# is specified no sitemap is generated. For information about the sitemap
+# protocol see https://www.sitemaps.org
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SITEMAP_URL            =
+
 # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
 # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
 # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
@@ -1605,7 +1734,7 @@ GENERATE_TREEVIEW      = NO
 # area (value NO) or if it should extend to the full height of the window (value
 # YES). Setting this to YES gives a layout similar to
 # https://docs.readthedocs.io with more room for contents, but less room for the
-# project logo, title, and description. If either GENERATOR_TREEVIEW or
+# project logo, title, and description. If either GENERATE_TREEVIEW or
 # DISABLE_INDEX is set to NO, this option has no effect.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1636,6 +1765,13 @@ TREEVIEW_WIDTH         = 250
 
 EXT_LINKS_IN_WINDOW    = NO
 
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS       = YES
+
 # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
 # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
 # https://inkscape.org) to generate formulas as SVG images instead of PNGs for
@@ -1656,17 +1792,6 @@ HTML_FORMULA_FORMAT    = png
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT    = YES
-
 # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
 # to create new LaTeX commands to be used in formulas as building blocks. See
 # the section "Including formulas" for details.
@@ -1980,9 +2105,16 @@ PDF_HYPERLINKS         = YES
 
 USE_PDFLATEX           = YES
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help.
+# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error.
+# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch
+# mode nothing is printed on the terminal, errors are scrolled as if <return> is
+# hit at every error; missing files that TeX tries to input or request from
+# keyboard input (\read on a not open input stream) cause the job to abort,
+# NON_STOP In nonstop mode the diagnostic message will appear on the terminal,
+# but there is no possibility of user interaction just like in batch mode,
+# SCROLL In scroll mode, TeX will stop only for missing files to input or if
+# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at
+# each error, asking for user intervention.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
@@ -2003,14 +2135,6 @@ LATEX_HIDE_INDICES     = NO
 
 LATEX_BIB_STYLE        = plain
 
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_TIMESTAMP        = NO
-
 # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
 # path from which the emoji images will be read. If a relative path is entered,
 # it will be relative to the LATEX_OUTPUT directory. If left blank the
@@ -2176,7 +2300,7 @@ DOCBOOK_OUTPUT         = docbook
 #---------------------------------------------------------------------------
 
 # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures
 # the structure of the code including all documentation. Note that this feature
 # is still experimental and incomplete at the moment.
 # The default value is: NO.
@@ -2187,6 +2311,28 @@ GENERATE_AUTOGEN_DEF   = NO
 # Configuration options related to Sqlite3 output
 #---------------------------------------------------------------------------
 
+# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3
+# database with symbols found by doxygen stored in tables.
+# The default value is: NO.
+
+GENERATE_SQLITE3       = NO
+
+# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be
+# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put
+# in front of it.
+# The default directory is: sqlite3.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_OUTPUT         = sqlite3
+
+# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db
+# database file will be recreated with each doxygen run. If set to NO, doxygen
+# will warn if an a database file is already found and not modify it.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_RECREATE_DB    = YES
+
 #---------------------------------------------------------------------------
 # Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
@@ -2261,7 +2407,8 @@ SEARCH_INCLUDES        = YES
 
 # The INCLUDE_PATH tag can be used to specify one or more directories that
 # contain include files that are not input files but should be processed by the
-# preprocessor.
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
 # This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
 INCLUDE_PATH           =
@@ -2328,15 +2475,15 @@ TAGFILES               =
 
 GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
+# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces
+# will be listed in the class and namespace index. If set to NO, only the
+# inherited external classes will be listed.
 # The default value is: NO.
 
 ALLEXTERNALS           = NO
 
 # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
+# in the topic index. If set to NO, only the current project's groups will be
 # listed.
 # The default value is: YES.
 
@@ -2350,25 +2497,9 @@ EXTERNAL_GROUPS        = YES
 EXTERNAL_PAGES         = YES
 
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to diagram generator tools
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS         = YES
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
-DIA_PATH               =
-
 # If set to YES the inheritance and collaboration graphs will hide inheritance
 # and usage relations if the target is undocumented or is not a class.
 # The default value is: YES.
@@ -2377,7 +2508,7 @@ HIDE_UNDOC_RELATIONS   = YES
 
 # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
 # available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
 # Bell Labs. The other options in this section have no effect if this option is
 # set to NO
 # The default value is: NO.
@@ -2394,49 +2525,73 @@ HAVE_DOT               = NO
 
 DOT_NUM_THREADS        = 0
 
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_FONTNAME           = Helvetica
+DOT_COMMON_ATTR        = "fontname=Helvetica,fontsize=10"
 
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
+# arrows shapes.</a>
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_FONTSIZE           = 10
+DOT_EDGE_ATTR          = "labelfontname=Helvetica,labelfontsize=10"
 
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
+# The default value is: shape=box,height=0.2,width=0.4.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NODE_ATTR          = "shape=box,height=0.2,width=0.4"
+
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTPATH           =
 
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will
+# generate a graph for each documented class showing the direct and indirect
+# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and
+# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case
+# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the
+# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used.
+# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance
+# relations will be shown as texts / links.
+# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN.
 # The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
 # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
 # graph for each documented class showing the direct and indirect implementation
 # dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
+# class with other documented classes. Explicit enabling a collaboration graph,
+# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the
+# command \collaborationgraph. Disabling a collaboration graph can be
+# accomplished by means of the command \hidecollaborationgraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
 # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
+# groups, showing the direct groups dependencies. Explicit enabling a group
+# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means
+# of the command \groupgraph. Disabling a directory graph can be accomplished by
+# means of the command \hidegroupgraph. See also the chapter Grouping in the
+# manual.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2496,7 +2651,9 @@ TEMPLATE_RELATIONS     = NO
 # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
 # YES then doxygen will generate a graph for each documented file showing the
 # direct and indirect include dependencies of the file with other documented
-# files.
+# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO,
+# can be accomplished by means of the command \includegraph. Disabling an
+# include graph can be accomplished by means of the command \hideincludegraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2505,7 +2662,10 @@ INCLUDE_GRAPH          = YES
 # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
 # set to YES then doxygen will generate a graph for each documented file showing
 # the direct and indirect include dependencies of the file with other documented
-# files.
+# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set
+# to NO, can be accomplished by means of the command \includedbygraph. Disabling
+# an included by graph can be accomplished by means of the command
+# \hideincludedbygraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2545,16 +2705,26 @@ GRAPHICAL_HIERARCHY    = YES
 # If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
 # dependencies a directory has on other directories in a graphical way. The
 # dependency relations are determined by the #include relations between the
-# files in the directories.
+# files in the directories. Explicit enabling a directory graph, when
+# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command
+# \directorygraph. Disabling a directory graph can be accomplished by means of
+# the command \hidedirectorygraph.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
 DIRECTORY_GRAPH        = YES
 
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH    = 1
+
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
 # generated by dot. For an explanation of the image formats see the section
 # output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
+# https://www.graphviz.org/)).
 # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
 # to make the SVG files visible in IE 9+ (other browsers do not have this
 # requirement).
@@ -2591,11 +2761,12 @@ DOT_PATH               =
 
 DOTFILE_DIRS           =
 
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
 
-MSCFILE_DIRS           =
+DIA_PATH               =
 
 # The DIAFILE_DIRS tag can be used to specify one or more directories that
 # contain dia files that are included in the documentation (see the \diafile
@@ -2604,10 +2775,10 @@ MSCFILE_DIRS           =
 DIAFILE_DIRS           =
 
 # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
 
 PLANTUML_JAR_PATH      =
 
@@ -2645,18 +2816,6 @@ DOT_GRAPH_MAX_NODES    = 50
 
 MAX_DOT_GRAPH_DEPTH    = 0
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT        = NO
-
 # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
 # files in one run (i.e. multiple -o and -T options on the command line). This
 # makes dot run faster, but since only newer versions of dot (>1.8.10) support
@@ -2669,6 +2828,8 @@ DOT_MULTI_TARGETS      = NO
 # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
 # explaining the meaning of the various boxes and arrows in the dot generated
 # graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2682,3 +2843,19 @@ GENERATE_LEGEND        = YES
 # The default value is: YES.
 
 DOT_CLEANUP            = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will
+# use a built-in version of mscgen tool to produce the charts. Alternatively,
+# the MSCGEN_TOOL tag can also specify the name an external tool. For instance,
+# specifying prog as the value, doxygen will call the tool as prog -T
+# <outfile_format> -o <outputfile> <inputfile>. The external tool should support
+# output file formats "png", "eps", "svg", and "ismap".
+
+MSCGEN_TOOL            =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =

From 0b63a044eb84175cc922f3f1fe0ce039d101bf7b Mon Sep 17 00:00:00 2001
From: Pascal Serrarens <pascal@passervr.com>
Date: Mon, 30 Dec 2024 12:38:29 +0100
Subject: [PATCH 2/2] Updated documentation, cleanup

---
 AngleAxis.cpp               |  53 -------------
 Direction.h                 |   2 +-
 DoxyGen/DoxyWarnLogfile.txt | 151 ++++++++++++++++++++++--------------
 Polar.h                     |   2 +
 Quaternion.h                |  59 +++++++-------
 README.md                   |  21 +++--
 Spherical.h                 |   2 +
 SwingTwist.h                |  25 +++---
 Vector2.h                   |   5 +-
 Vector3.h                   |  13 ++--
 10 files changed, 160 insertions(+), 173 deletions(-)
 delete mode 100644 AngleAxis.cpp

diff --git a/AngleAxis.cpp b/AngleAxis.cpp
deleted file mode 100644
index 6e17e51..0000000
--- a/AngleAxis.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0.If a copy of the MPL was not distributed with this
-// file, You can obtain one at https ://mozilla.org/MPL/2.0/.
-
-#include "AngleAxis.h"
-
-template <typename T>
-AngleAxisOf<T>::AngleAxisOf() {
-  this->angle = 0.0F;
-  this->axis = DirectionOf<T>();
-}
-
-template <typename T>
-AngleAxisOf<T>::AngleAxisOf(float angle, DirectionOf<T> axis) {
-  this->angle = angle;
-  this->axis = axis;
-}
-
-template <typename T>
-AngleAxisOf<T>::AngleAxisOf(float angle, Vector3 axis) {
-  this->angle = angle;
-  this->axis = DirectionOf<T>::FromVector3(axis);
-}
-
-template <typename T>
-AngleAxisOf<T>::AngleAxisOf(Quaternion q) {
-  float angle;
-  Vector3 axis;
-  q.ToAngleAxis(&angle, &axis);
-  this->angle = angle;
-  this->axis = DirectionOf<T>::FromVector3(axis);
-}
-
-template <typename T>
-const AngleAxisOf<T> AngleAxisOf<T>::zero =
-    AngleAxisOf<T>(0.0, DirectionOf<T>(AngleOf<T>(), AngleOf<T>()));
-
-template <typename T>
-Quaternion AngleAxisOf<T>::ToQuaternion() {
-  Vector3 axisVector = this->axis.ToVector3();
-  Quaternion q = Quaternion::AngleAxis(this->angle, axisVector);
-  return q;
-}
-
-template <typename T>
-DirectionOf<T> AngleAxisOf<T>::GetSwing() {
-  return this->axis;
-}
-
-template class AngleAxisOf<float>;
-template class AngleAxisOf<signed short>;
-*/
\ No newline at end of file
diff --git a/Direction.h b/Direction.h
index ebb75f7..b614a04 100644
--- a/Direction.h
+++ b/Direction.h
@@ -13,7 +13,7 @@ namespace LinearAlgebra {
 struct Vector3;
 
 /// @brief A direction using angles in various representations
-/// @tparam T The internal type used for the representations of the angles
+/// @tparam T The implementation type used for the representation of the angles
 /// A direction is represented using two angles:
 /// * The horizontal angle ranging from -180 (inclusive) to 180 (exclusive)
 /// degrees which is a rotation in the horizontal plane
diff --git a/DoxyGen/DoxyWarnLogfile.txt b/DoxyGen/DoxyWarnLogfile.txt
index fac369b..3f3c14a 100644
--- a/DoxyGen/DoxyWarnLogfile.txt
+++ b/DoxyGen/DoxyWarnLogfile.txt
@@ -5,36 +5,36 @@ Possible candidates:
   'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(const AngleOf< T > &angle, float factor)' at line 117 of file d:/PlatformIO/linear-algebra/Angle.h
   'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(float factor, const AngleOf< T > &angle)' at line 124 of file d:/PlatformIO/linear-algebra/Angle.h
   'Vector3 Passer::LinearAlgebra::MatrixOf< T >::operator*(const Vector3 v) const' at line 64 of file d:/PlatformIO/linear-algebra/Matrix.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 116 of file d:/PlatformIO/linear-algebra/Polar.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 119 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 118 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 121 of file d:/PlatformIO/linear-algebra/Polar.h
   'Vector3 Passer::LinearAlgebra::Quaternion::operator*(const Vector3 &vector) const' at line 98 of file d:/PlatformIO/linear-algebra/Quaternion.h
   'Quaternion Passer::LinearAlgebra::Quaternion::operator*(const Quaternion &rotation) const' at line 106 of file d:/PlatformIO/linear-algebra/Quaternion.h
-  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(const SphericalOf< T > &v, float f)' at line 109 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(float f, const SphericalOf< T > &v)' at line 112 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'SphericalOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SphericalOf< T > &vector) const' at line 45 of file d:/PlatformIO/linear-algebra/SwingTwist.h
-  'SwingTwistOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SwingTwistOf< T > &rotation) const' at line 53 of file d:/PlatformIO/linear-algebra/SwingTwist.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 142 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 145 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 150 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 153 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(const SphericalOf< T > &v, float f)' at line 111 of file d:/PlatformIO/linear-algebra/Spherical.h
+  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(float f, const SphericalOf< T > &v)' at line 114 of file d:/PlatformIO/linear-algebra/Spherical.h
+  'SphericalOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SphericalOf< T > &vector) const' at line 46 of file d:/PlatformIO/linear-algebra/SwingTwist.h
+  'SwingTwistOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SwingTwistOf< T > &rotation) const' at line 54 of file d:/PlatformIO/linear-algebra/SwingTwist.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 141 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 144 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 149 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 152 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Quaternion.cpp:108: warning: no uniquely matching class member found for 
   Vector3 Quaternion::operator*(const Vector3 &p) const
 Possible candidates:
   'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(const AngleOf< T > &angle, float factor)' at line 117 of file d:/PlatformIO/linear-algebra/Angle.h
   'friend AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator*(float factor, const AngleOf< T > &angle)' at line 124 of file d:/PlatformIO/linear-algebra/Angle.h
   'Vector3 Passer::LinearAlgebra::MatrixOf< T >::operator*(const Vector3 v) const' at line 64 of file d:/PlatformIO/linear-algebra/Matrix.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 116 of file d:/PlatformIO/linear-algebra/Polar.h
-  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 119 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(const PolarOf &v, float f)' at line 118 of file d:/PlatformIO/linear-algebra/Polar.h
+  'friend PolarOf Passer::LinearAlgebra::PolarOf< T >::operator*(float f, const PolarOf &v)' at line 121 of file d:/PlatformIO/linear-algebra/Polar.h
   'Vector3 Passer::LinearAlgebra::Quaternion::operator*(const Vector3 &vector) const' at line 98 of file d:/PlatformIO/linear-algebra/Quaternion.h
   'Quaternion Passer::LinearAlgebra::Quaternion::operator*(const Quaternion &rotation) const' at line 106 of file d:/PlatformIO/linear-algebra/Quaternion.h
-  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(const SphericalOf< T > &v, float f)' at line 109 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(float f, const SphericalOf< T > &v)' at line 112 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'SphericalOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SphericalOf< T > &vector) const' at line 45 of file d:/PlatformIO/linear-algebra/SwingTwist.h
-  'SwingTwistOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SwingTwistOf< T > &rotation) const' at line 53 of file d:/PlatformIO/linear-algebra/SwingTwist.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 142 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 145 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 150 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 153 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(const SphericalOf< T > &v, float f)' at line 111 of file d:/PlatformIO/linear-algebra/Spherical.h
+  'friend SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator*(float f, const SphericalOf< T > &v)' at line 114 of file d:/PlatformIO/linear-algebra/Spherical.h
+  'SphericalOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SphericalOf< T > &vector) const' at line 46 of file d:/PlatformIO/linear-algebra/SwingTwist.h
+  'SwingTwistOf< T > Passer::LinearAlgebra::SwingTwistOf< T >::operator*(const SwingTwistOf< T > &rotation) const' at line 54 of file d:/PlatformIO/linear-algebra/SwingTwist.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(const Vector2 &v, float f)' at line 141 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector2 Passer::LinearAlgebra::Vector2::operator*(float f, const Vector2 &v)' at line 144 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(const Vector3 &v, float f)' at line 149 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'friend Vector3 Passer::LinearAlgebra::Vector3::operator*(float f, const Vector3 &v)' at line 152 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Quaternion.cpp:152: warning: no uniquely matching class member found for 
   Quaternion Quaternion::LookRotation(const Vector3 &forward, const Vector3 &up)
 Possible candidates:
@@ -43,13 +43,13 @@ Possible candidates:
 d:/PlatformIO/linear-algebra/Quaternion.cpp:330: warning: no uniquely matching class member found for 
   Quaternion Quaternion::Euler(Vector3 euler)
 Possible candidates:
-  'static Quaternion Passer::LinearAlgebra::Quaternion::Euler(float x, float y, float z)' at line 218 of file d:/PlatformIO/linear-algebra/Quaternion.h
-  'static Quaternion Passer::LinearAlgebra::Quaternion::Euler(Vector3 eulerAngles)' at line 225 of file d:/PlatformIO/linear-algebra/Quaternion.h
+  'static Quaternion Passer::LinearAlgebra::Quaternion::Euler(float x, float y, float z)' at line 215 of file d:/PlatformIO/linear-algebra/Quaternion.h
+  'static Quaternion Passer::LinearAlgebra::Quaternion::Euler(Vector3 eulerAngles)' at line 222 of file d:/PlatformIO/linear-algebra/Quaternion.h
 d:/PlatformIO/linear-algebra/Quaternion.cpp:362: warning: no uniquely matching class member found for 
   Quaternion Quaternion::EulerXYZ(Vector3 euler)
 Possible candidates:
-  'static Quaternion Passer::LinearAlgebra::Quaternion::EulerXYZ(float x, float y, float z)' at line 235 of file d:/PlatformIO/linear-algebra/Quaternion.h
-  'static Quaternion Passer::LinearAlgebra::Quaternion::EulerXYZ(Vector3 eulerAngles)' at line 242 of file d:/PlatformIO/linear-algebra/Quaternion.h
+  'static Quaternion Passer::LinearAlgebra::Quaternion::EulerXYZ(float x, float y, float z)' at line 232 of file d:/PlatformIO/linear-algebra/Quaternion.h
+  'static Quaternion Passer::LinearAlgebra::Quaternion::EulerXYZ(Vector3 eulerAngles)' at line 239 of file d:/PlatformIO/linear-algebra/Quaternion.h
 d:/PlatformIO/linear-algebra/Spherical.cpp:137: warning: no uniquely matching class member found for 
   template < T >
   SphericalOf< T > SphericalOf::operator-(const SphericalOf< T > &s2) const
@@ -57,35 +57,35 @@ Possible candidates:
   'AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator-() const' at line 99 of file d:/PlatformIO/linear-algebra/Angle.h
   'AngleOf< T > Passer::LinearAlgebra::AngleOf< T >::operator-(const AngleOf< T > &angle) const' at line 103 of file d:/PlatformIO/linear-algebra/Angle.h
   'DirectionOf< T > Passer::LinearAlgebra::DirectionOf< T >::operator-() const' at line 84 of file d:/PlatformIO/linear-algebra/Direction.h
-  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-() const' at line 98 of file d:/PlatformIO/linear-algebra/Polar.h
-  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-(const PolarOf &v) const' at line 103 of file d:/PlatformIO/linear-algebra/Polar.h
-  'SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator-() const' at line 91 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator-(const SphericalOf< T > &v) const' at line 96 of file d:/PlatformIO/linear-algebra/Spherical.h
-  'Vector2 Passer::LinearAlgebra::Vector2::operator-()' at line 117 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Vector2 Passer::LinearAlgebra::Vector2::operator-(const Vector2 &v) const' at line 122 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Vector3 Passer::LinearAlgebra::Vector3::operator-() const' at line 125 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Vector3 Passer::LinearAlgebra::Vector3::operator-(const Vector3 &v) const' at line 130 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-() const' at line 100 of file d:/PlatformIO/linear-algebra/Polar.h
+  'PolarOf Passer::LinearAlgebra::PolarOf< T >::operator-(const PolarOf &v) const' at line 105 of file d:/PlatformIO/linear-algebra/Polar.h
+  'SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator-() const' at line 93 of file d:/PlatformIO/linear-algebra/Spherical.h
+  'SphericalOf< T > Passer::LinearAlgebra::SphericalOf< T >::operator-(const SphericalOf< T > &v) const' at line 98 of file d:/PlatformIO/linear-algebra/Spherical.h
+  'Vector2 Passer::LinearAlgebra::Vector2::operator-()' at line 116 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Vector2 Passer::LinearAlgebra::Vector2::operator-(const Vector2 &v) const' at line 121 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Vector3 Passer::LinearAlgebra::Vector3::operator-() const' at line 124 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Vector3 Passer::LinearAlgebra::Vector3::operator-(const Vector3 &v) const' at line 129 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Vector2.cpp:20: warning: no uniquely matching class member found for 
   Vector2::Vector2(float _x, float _y)
 Possible candidates:
-  'Passer::LinearAlgebra::Vector2::Vector2()' at line 44 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 48 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 52 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 55 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2()' at line 43 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 47 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 51 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 54 of file d:/PlatformIO/linear-algebra/Vector2.h
 d:/PlatformIO/linear-algebra/Vector2.cpp:32: warning: no uniquely matching class member found for 
   Vector2::Vector2(PolarSingle p)
 Possible candidates:
-  'Passer::LinearAlgebra::Vector2::Vector2()' at line 44 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 48 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 52 of file d:/PlatformIO/linear-algebra/Vector2.h
-  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 55 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2()' at line 43 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(float right, float forward)' at line 47 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(Vector3 v)' at line 51 of file d:/PlatformIO/linear-algebra/Vector2.h
+  'Passer::LinearAlgebra::Vector2::Vector2(PolarOf< float > v)' at line 54 of file d:/PlatformIO/linear-algebra/Vector2.h
 d:/PlatformIO/linear-algebra/Vector3.cpp:33: warning: no uniquely matching class member found for 
   Vector3::Vector3(SphericalOf< float > s)
 Possible candidates:
-  'Passer::LinearAlgebra::Vector3::Vector3()' at line 48 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Passer::LinearAlgebra::Vector3::Vector3(float right, float up, float forward)' at line 53 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Passer::LinearAlgebra::Vector3::Vector3(Vector2 v)' at line 56 of file d:/PlatformIO/linear-algebra/Vector3.h
-  'Passer::LinearAlgebra::Vector3::Vector3(SphericalOf< float > v)' at line 60 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3()' at line 47 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3(float right, float up, float forward)' at line 52 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3(Vector2 v)' at line 55 of file d:/PlatformIO/linear-algebra/Vector3.h
+  'Passer::LinearAlgebra::Vector3::Vector3(SphericalOf< float > v)' at line 59 of file d:/PlatformIO/linear-algebra/Vector3.h
 d:/PlatformIO/linear-algebra/Direction.h:43: warning: argument 'v' of command @param is not found in the argument list of Passer::LinearAlgebra::DirectionOf< T >::FromVector3(Vector3 vector)
 d:/PlatformIO/linear-algebra/Direction.h:43: warning: The following parameter of Passer::LinearAlgebra::DirectionOf::FromVector3(Vector3 vector) is not documented:
   parameter 'vector'
@@ -104,18 +104,51 @@ d:/PlatformIO/linear-algebra/Matrix.h:108: warning: Member RowCount() const (fun
 d:/PlatformIO/linear-algebra/Matrix.h:109: warning: Member ColCount() const (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
 d:/PlatformIO/linear-algebra/Matrix.h:57: warning: Member Multiply(const MatrixOf< T > *m1, const MatrixOf< T > *m2, MatrixOf< T > *r) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
 d:/PlatformIO/linear-algebra/Matrix.h:63: warning: Member Multiply(const MatrixOf< T > *m, Vector3 v) (function) of class Passer::LinearAlgebra::MatrixOf is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:123: warning: Member operator-=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:128: warning: Member operator+=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:149: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:160: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:145: warning: Member operator*(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector2.h:157: warning: Member operator/(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:83: warning: Member Forward() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:84: warning: Member Up() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:85: warning: Member Right() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:131: warning: Member operator-=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:136: warning: Member operator+=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:157: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:169: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:153: warning: Member operator*(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
-d:/PlatformIO/linear-algebra/Vector3.h:165: warning: Member operator/(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:106: warning: Member operator-=(const PolarOf &v) (function) of class Passer::LinearAlgebra::PolarOf is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:111: warning: Member operator+=(const PolarOf &v) (function) of class Passer::LinearAlgebra::PolarOf is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:124: warning: Member operator*=(float f) (function) of class Passer::LinearAlgebra::PolarOf is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:136: warning: Member operator/=(float f) (function) of class Passer::LinearAlgebra::PolarOf is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:121: warning: Member operator*(float f, const PolarOf &v) (friend) of class Passer::LinearAlgebra::PolarOf is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:133: warning: Member operator/(float f, const PolarOf &v) (friend) of class Passer::LinearAlgebra::PolarOf is not documented.
+d:/PlatformIO/linear-algebra/Polar.h:59: warning: argument 's' of command @param is not found in the argument list of Passer::LinearAlgebra::PolarOf< T >::FromSpherical(SphericalOf< T > v)
+d:/PlatformIO/linear-algebra/Polar.h:59: warning: The following parameter of Passer::LinearAlgebra::PolarOf::FromSpherical(SphericalOf< T > v) is not documented:
+  parameter 'v'
+d:/PlatformIO/linear-algebra/Spherical.h:29: warning: Member SphericalOf(float distance, AngleOf< T > horizontal, AngleOf< T > vertical) (function) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:29: warning: Member SphericalOf(float distance, DirectionOf< T > direction) (function) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:99: warning: Member operator-=(const SphericalOf< T > &v) (function) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:104: warning: Member operator+=(const SphericalOf< T > &v) (function) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:117: warning: Member operator*=(float f) (function) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:129: warning: Member operator/=(float f) (function) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:54: warning: Member Rad (variable) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:114: warning: Member operator*(float f, const SphericalOf< T > &v) (friend) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/Spherical.h:126: warning: Member operator/(float f, const SphericalOf< T > &v) (friend) of class Passer::LinearAlgebra::SphericalOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:22: warning: Member SwingTwistOf(DirectionOf< T > swing, AngleOf< T > twist) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:22: warning: Member SwingTwistOf(AngleOf< T > horizontal, AngleOf< T > vertical, AngleOf< T > twist) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:31: warning: Member ToQuaternion() const (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:34: warning: Member ToAngleAxis() const (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:39: warning: Member operator==(const SwingTwistOf< T > d) const (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:55: warning: Member operator*=(const SwingTwistOf< T > &rotation) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:69: warning: Member Normalize() (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:28: warning: Member Degrees(float horizontal, float vertical=0, float twist=0) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:32: warning: Member FromQuaternion(Quaternion q) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:35: warning: Member FromAngleAxis(SphericalOf< T > aa) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:57: warning: Member Inverse(SwingTwistOf< T > rotation) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:67: warning: Member Angle(const SwingTwistOf< T > &r1, const SwingTwistOf< T > &r2) (function) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:21: warning: Member swing (variable) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:22: warning: Member twist (variable) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/SwingTwist.h:37: warning: Member identity (variable) of class Passer::LinearAlgebra::SwingTwistOf is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:122: warning: Member operator-=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:127: warning: Member operator+=(const Vector2 &v) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:148: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:159: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:144: warning: Member operator*(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector2.h:156: warning: Member operator/(float f, const Vector2 &v) (friend) of struct Passer::LinearAlgebra::Vector2 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:82: warning: Member Forward() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:83: warning: Member Up() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:84: warning: Member Right() const (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:130: warning: Member operator-=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:135: warning: Member operator+=(const Vector3 &v) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:156: warning: Member operator*=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:168: warning: Member operator/=(float f) (function) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:152: warning: Member operator*(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
+d:/PlatformIO/linear-algebra/Vector3.h:164: warning: Member operator/(float f, const Vector3 &v) (friend) of struct Passer::LinearAlgebra::Vector3 is not documented.
diff --git a/Polar.h b/Polar.h
index e1c746f..0e62cf8 100644
--- a/Polar.h
+++ b/Polar.h
@@ -13,6 +13,8 @@ namespace LinearAlgebra {
 struct Vector2;
 template <typename T> class SphericalOf;
 
+/// @brief A polar vector using an angle in various representations
+/// @tparam T The implementation type used for the representation of the angle
 template <typename T> class PolarOf {
 public:
   /// @brief The distance in meters
diff --git a/Quaternion.h b/Quaternion.h
index 1979c76..34e0827 100644
--- a/Quaternion.h
+++ b/Quaternion.h
@@ -7,12 +7,9 @@
 
 #include "Vector3.h"
 
-namespace Passer {
-namespace LinearAlgebra {
-
 extern "C" {
 /// <summary>
-/// A quaternion
+/// A quaternion (C-style)
 /// </summary>
 /// This is a C-style implementation
 typedef struct Quat {
@@ -35,11 +32,14 @@ typedef struct Quat {
 } Quat;
 }
 
+namespace Passer {
+namespace LinearAlgebra {
+
 /// <summary>
 /// A quaternion
 /// </summary>
 struct Quaternion : Quat {
- public:
+public:
   /// <summary>
   /// Create a new identity quaternion
   /// </summary>
@@ -80,7 +80,7 @@ struct Quaternion : Quat {
   /// <returns>A unit quaternion</returns>
   /// This will preserve the orientation,
   /// but ensures that it is a unit quaternion.
-  static Quaternion Normalize(const Quaternion& q);
+  static Quaternion Normalize(const Quaternion &q);
 
   /// <summary>
   /// Convert to euler angles
@@ -88,14 +88,14 @@ struct Quaternion : Quat {
   /// <param name="q">The quaternion to convert</param>
   /// <returns>A vector containing euler angles</returns>
   /// The euler angles performed in the order: Z, X, Y
-  static Vector3 ToAngles(const Quaternion& q);
+  static Vector3 ToAngles(const Quaternion &q);
 
   /// <summary>
   /// Rotate a vector using this quaterion
   /// </summary>
   /// <param name="vector">The vector to rotate</param>
   /// <returns>The rotated vector</returns>
-  Vector3 operator*(const Vector3& vector) const;
+  Vector3 operator*(const Vector3 &vector) const;
   /// <summary>
   /// Multiply this quaternion with another quaternion
   /// </summary>
@@ -103,7 +103,7 @@ struct Quaternion : Quat {
   /// <returns>The resulting rotation</returns>
   /// The result will be this quaternion rotated according to
   /// the give rotation.
-  Quaternion operator*(const Quaternion& rotation) const;
+  Quaternion operator*(const Quaternion &rotation) const;
 
   /// <summary>
   /// Check the equality of two quaternions
@@ -114,7 +114,7 @@ struct Quaternion : Quat {
   /// themselves. Two quaternions with the same rotational effect may have
   /// different components. Use Quaternion::Angle to check if the rotations are
   /// the same.
-  bool operator==(const Quaternion& quaternion) const;
+  bool operator==(const Quaternion &quaternion) const;
 
   /// <summary>
   /// The inverse of quaterion
@@ -129,8 +129,8 @@ struct Quaternion : Quat {
   /// <param name="forward">The look direction</param>
   /// <param name="upwards">The up direction</param>
   /// <returns>The look rotation</returns>
-  static Quaternion LookRotation(const Vector3& forward,
-                                 const Vector3& upwards);
+  static Quaternion LookRotation(const Vector3 &forward,
+                                 const Vector3 &upwards);
   /// <summary>
   /// Creates a quaternion with the given forward direction with up =
   /// Vector3::up
@@ -140,7 +140,7 @@ struct Quaternion : Quat {
   /// For the rotation, Vector::up is used for the up direction.
   /// Note: if the forward direction == Vector3::up, the result is
   /// Quaternion::identity
-  static Quaternion LookRotation(const Vector3& forward);
+  static Quaternion LookRotation(const Vector3 &forward);
 
   /// <summary>
   /// Calculat the rotation from on vector to another
@@ -157,8 +157,7 @@ struct Quaternion : Quat {
   /// <param name="to">The destination rotation</param>
   /// <param name="maxDegreesDelta">The maximum amount of degrees to
   /// rotate</param> <returns>The possibly limited rotation</returns>
-  static Quaternion RotateTowards(const Quaternion& from,
-                                  const Quaternion& to,
+  static Quaternion RotateTowards(const Quaternion &from, const Quaternion &to,
                                   float maxDegreesDelta);
 
   /// <summary>
@@ -167,13 +166,13 @@ struct Quaternion : Quat {
   /// <param name="angle">The angle</param>
   /// <param name="axis">The axis</param>
   /// <returns>The resulting quaternion</returns>
-  static Quaternion AngleAxis(float angle, const Vector3& axis);
+  static Quaternion AngleAxis(float angle, const Vector3 &axis);
   /// <summary>
   /// Convert this quaternion to angle/axis representation
   /// </summary>
   /// <param name="angle">A pointer to the angle for the result</param>
   /// <param name="axis">A pointer to the axis for the result</param>
-  void ToAngleAxis(float* angle, Vector3* axis);
+  void ToAngleAxis(float *angle, Vector3 *axis);
 
   /// <summary>
   /// Get the angle between two orientations
@@ -191,9 +190,8 @@ struct Quaternion : Quat {
   /// <param name="factor">The factor between 0 and 1.</param>
   /// <returns>The resulting rotation</returns>
   /// A factor 0 returns rotation1, factor1 returns rotation2.
-  static Quaternion Slerp(const Quaternion& rotation1,
-                          const Quaternion& rotation2,
-                          float factor);
+  static Quaternion Slerp(const Quaternion &rotation1,
+                          const Quaternion &rotation2, float factor);
   /// <summary>
   /// Unclamped sherical lerp between two rotations
   /// </summary>
@@ -203,9 +201,8 @@ struct Quaternion : Quat {
   /// <returns>The resulting rotation</returns>
   /// A factor 0 returns rotation1, factor1 returns rotation2.
   /// Values outside the 0..1 range will result in extrapolated rotations
-  static Quaternion SlerpUnclamped(const Quaternion& rotation1,
-                                   const Quaternion& rotation2,
-                                   float factor);
+  static Quaternion SlerpUnclamped(const Quaternion &rotation1,
+                                   const Quaternion &rotation2, float factor);
 
   /// <summary>
   /// Create a rotation from euler angles
@@ -263,10 +260,8 @@ struct Quaternion : Quat {
   /// <param name="swing">A pointer to the quaternion for the swing
   /// result</param> <param name="twist">A pointer to the quaternion for the
   /// twist result</param>
-  static void GetSwingTwist(Vector3 axis,
-                            Quaternion rotation,
-                            Quaternion* swing,
-                            Quaternion* twist);
+  static void GetSwingTwist(Vector3 axis, Quaternion rotation,
+                            Quaternion *swing, Quaternion *twist);
 
   /// <summary>
   /// Calculate the dot product of two quaternions
@@ -276,20 +271,20 @@ struct Quaternion : Quat {
   /// <returns></returns>
   static float Dot(Quaternion rotation1, Quaternion rotation2);
 
- private:
+private:
   float GetLength() const;
   float GetLengthSquared() const;
-  static float GetLengthSquared(const Quaternion& q);
+  static float GetLengthSquared(const Quaternion &q);
 
-  void ToAxisAngleRad(const Quaternion& q, Vector3* const axis, float* angle);
+  void ToAxisAngleRad(const Quaternion &q, Vector3 *const axis, float *angle);
   static Quaternion FromEulerRad(Vector3 euler);
   static Quaternion FromEulerRadXYZ(Vector3 euler);
 
   Vector3 xyz() const;
 };
 
-}  // namespace LinearAlgebra
-}  // namespace Passer
+} // namespace LinearAlgebra
+} // namespace Passer
 using namespace Passer::LinearAlgebra;
 
 #endif
diff --git a/README.md b/README.md
index 35bf50f..afc4fbb 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,21 @@
-\mainpage Vector Algebra
+\mainpage Linear Algebra
 
-Vector algebra library
+Linear algebra library
 
 Main components
 ---------------
-* [Vector3](struct_passer_1_1_linear_algebra_1_1_vector3.html)
-* [Quaternion](struct_passer_1_1_linear_algebra_1_1_quaternion.html)
+Carthesian coordinate systems
+* [Vector3](#Passer::LinearAlgebra::Vector3): A 3D carthesian vector
+* [Vector2](#Passer::LinearAlgebra::Vector2): A 2D carthesian vector
 
-* [Vector2](https://serrarens.nl/apis/LinearAlgebra/struct_vector2.html)
+Other coodinate systems
+* [Polar](#Passer::LinearAlgebra::PolarOf): A 2D polar vector
+* [Spherical](#Passer::LinearAlgebra::SphericalOf): A 3D spherical vector
 
-* [Polar](https://passervr.com/apis/LinearAlgebra/struct_polar.html)
+Rotations
+* [Quaternion](#Passer::LinearAlgebra::Quaternion): A quaternion rotation
+* [SwingTwist](#Passer::LinearAlgebra::SwingTwistOf): A swing/twist angular rotation
+
+Basics
+* [Angle](#Passer::LinearAlgebra::AngleOf): An angle
+* [Direction](#Passer::LinearAlgebra::DirectionOf): A direction using angles
diff --git a/Spherical.h b/Spherical.h
index 4d803bd..e4d6682 100644
--- a/Spherical.h
+++ b/Spherical.h
@@ -13,6 +13,8 @@ namespace LinearAlgebra {
 struct Vector3;
 template <typename T> class PolarOf;
 
+/// @brief A spherical vector using angles in various representations
+/// @tparam T The implementation type used for the representations of the agles
 template <typename T> class SphericalOf {
 public:
   /// @brief The distance in meters
diff --git a/SwingTwist.h b/SwingTwist.h
index 7fac16a..df1d03d 100644
--- a/SwingTwist.h
+++ b/SwingTwist.h
@@ -13,9 +13,11 @@
 namespace Passer {
 namespace LinearAlgebra {
 
-template <typename T>
-class SwingTwistOf {
- public:
+/// @brief An orientation using swing and twist angles in various
+/// representations
+/// @tparam T The implmentation type used for the representation of the angles
+template <typename T> class SwingTwistOf {
+public:
   DirectionOf<T> swing;
   AngleOf<T> twist;
 
@@ -23,8 +25,7 @@ class SwingTwistOf {
   SwingTwistOf<T>(DirectionOf<T> swing, AngleOf<T> twist);
   SwingTwistOf<T>(AngleOf<T> horizontal, AngleOf<T> vertical, AngleOf<T> twist);
 
-  static SwingTwistOf<T> Degrees(float horizontal,
-                                 float vertical = 0,
+  static SwingTwistOf<T> Degrees(float horizontal, float vertical = 0,
                                  float twist = 0);
 
   Quaternion ToQuaternion() const;
@@ -42,7 +43,7 @@ class SwingTwistOf {
   /// </summary>
   /// <param name="vector">The vector to rotate</param>
   /// <returns>The rotated vector</returns>
-  SphericalOf<T> operator*(const SphericalOf<T>& vector) const;
+  SphericalOf<T> operator*(const SphericalOf<T> &vector) const;
   /// <summary>
   /// Multiply this rotation with another rotation
   /// </summary>
@@ -50,8 +51,8 @@ class SwingTwistOf {
   /// <returns>The resulting swing/twist rotation</returns>
   /// The result will be this rotation rotated according to
   /// the give rotation.
-  SwingTwistOf<T> operator*(const SwingTwistOf<T>& rotation) const;
-  SwingTwistOf<T> operator*=(const SwingTwistOf<T>& rotation);
+  SwingTwistOf<T> operator*(const SwingTwistOf<T> &rotation) const;
+  SwingTwistOf<T> operator*=(const SwingTwistOf<T> &rotation);
 
   static SwingTwistOf<T> Inverse(SwingTwistOf<T> rotation);
 
@@ -61,9 +62,9 @@ class SwingTwistOf {
   /// <param name="angle">The angle</param>
   /// <param name="axis">The axis</param>
   /// <returns>The resulting quaternion</returns>
-  static SwingTwistOf<T> AngleAxis(float angle, const DirectionOf<T>& axis);
+  static SwingTwistOf<T> AngleAxis(float angle, const DirectionOf<T> &axis);
 
-  static AngleOf<T> Angle(const SwingTwistOf<T>& r1, const SwingTwistOf<T>& r2);
+  static AngleOf<T> Angle(const SwingTwistOf<T> &r1, const SwingTwistOf<T> &r2);
 
   void Normalize();
 };
@@ -71,8 +72,8 @@ class SwingTwistOf {
 using SwingTwistSingle = SwingTwistOf<float>;
 using SwingTwist16 = SwingTwistOf<signed short>;
 
-}  // namespace LinearAlgebra
-}  // namespace Passer
+} // namespace LinearAlgebra
+} // namespace Passer
 using namespace Passer::LinearAlgebra;
 
 #endif
diff --git a/Vector2.h b/Vector2.h
index eabac98..8b072d3 100644
--- a/Vector2.h
+++ b/Vector2.h
@@ -9,7 +9,7 @@
 
 extern "C" {
 /// <summary>
-/// 2-dimensional Vector representation
+/// 2-dimensional Vector representation (C-style)
 /// </summary>
 /// This is a C-style implementation
 /// This uses the right-handed coordinate system.
@@ -31,9 +31,8 @@ namespace LinearAlgebra {
 
 struct Vector3;
 template <typename T> class PolarOf;
-// using Polar = PolarOf<float>
 
-/// @brief A 2=dimensional vector
+/// @brief A 2-dimensional vector
 /// @remark This uses the right=handed carthesian coordinate system.
 /// @note This implementation intentionally avoids the use of x and y
 struct Vector2 : Vec2 {
diff --git a/Vector3.h b/Vector3.h
index 9839659..341801a 100644
--- a/Vector3.h
+++ b/Vector3.h
@@ -7,15 +7,9 @@
 
 #include "Vector2.h"
 
-namespace Passer {
-namespace LinearAlgebra {
-
-// struct Spherical;
-template <typename T> class SphericalOf;
-
 extern "C" {
 /// <summary>
-/// 3-dimensional Vector representation
+/// 3-dimensional Vector representation (C-style)
 /// </summary>
 /// This is a C-style implementation
 /// This uses the right-handed coordinate system.
@@ -37,6 +31,11 @@ protected:
 } Vec3;
 }
 
+namespace Passer {
+namespace LinearAlgebra {
+
+template <typename T> class SphericalOf;
+
 /// @brief A 3-dimensional vector
 /// @remark This uses a right-handed carthesian coordinate system.
 /// @note This implementation intentionally avoids the use of x, y and z values.