]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/math/vector.h
gcc fix
[xonotic/netradiant.git] / libs / math / vector.h
index a9d2a80905ef1d954e7a6f51caf462576e8aa2ef..19fdd755925c48f470be85f983ed62672965dfb4 100644 (file)
@@ -25,12 +25,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 /// \file
 /// \brief Vector data types and related operations.
 
-#if 0
-
-#define        lrint(dbl)              ((int)((dbl) + 0.5))
-#define        lrintf(flt)             ((int)((flt) + 0.5))
-
-#endif
+#include "generic/vector.h"
 
 #if defined (_MSC_VER)
 
@@ -47,21 +42,31 @@ inline int lrint (double flt)
        return i;
 } 
 
-#else // lrint is part of ISO C99
+#elif defined(__FreeBSD__)
+
+inline int lrint(double f)
+{
+  return static_cast<int>(f + 0.5);
+}
 
+#elif defined(__GNUC__)
+
+ // lrint is part of ISO C99
 #define        _ISOC9X_SOURCE  1
 #define _ISOC99_SOURCE 1
 
 #define        __USE_ISOC9X    1
 #define        __USE_ISOC99    1
 
+#else
+#error "unsupported platform"
 #endif
 
 #include <cmath>
-#include <cstddef>
 #include <float.h>
 #include <algorithm>
 
+
 //#include "debugging/debugging.h"
 
 /// \brief Returns true if \p self is equal to other \p other within \p epsilon.
@@ -115,48 +120,6 @@ inline Element float_mod(const Element& self, const ModulusElement& modulus)
 }
 
 
-template<typename Element>
-class BasicVector2
-{
-  Element m_elements[2];
-public:
-  BasicVector2()
-  {
-  }
-  BasicVector2(const Element& x_, const Element& y_)
-  {
-    x() = x_;
-    y() = y_;
-  }
-
-  Element& x()
-  {
-    return m_elements[0];
-  }
-  const Element& x() const
-  {
-    return m_elements[0];
-  }
-  Element& y()
-  {
-    return m_elements[1];
-  }
-  const Element& y() const
-  {
-    return m_elements[1];
-  }
-
-  const Element& operator[](std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& operator[](std::size_t i)
-  {
-    return m_elements[i];
-  }
-};
-
-
 template<typename Element, typename OtherElement>
 inline BasicVector2<Element> vector2_added(const BasicVector2<Element>& self, const BasicVector2<OtherElement>& other)
 {
@@ -335,79 +298,6 @@ inline double vector2_cross(const BasicVector2<Element>& self, const BasicVector
   return self.x() * other.y() - self.y() * other.x();
 }
 
-typedef BasicVector2<float> Vector2;
-
-/// \brief A 3-element vector.
-template<typename Element>
-class BasicVector3
-{
-  Element m_elements[3];
-public:
-
-  BasicVector3()
-  {
-  }
-  template<typename OtherElement>
-  BasicVector3(const BasicVector3<OtherElement>& other)
-  {
-    x() = static_cast<Element>(other.x());
-    y() = static_cast<Element>(other.y());
-    z() = static_cast<Element>(other.z());
-  }
-  BasicVector3(const Element& x_, const Element& y_, const Element& z_)
-  {
-    x() = x_;
-    y() = y_;
-    z() = z_;
-  }
-
-  Element& x()
-  {
-    return m_elements[0];
-  }
-  const Element& x() const
-  {
-    return m_elements[0];
-  }
-  Element& y()
-  {
-    return m_elements[1];
-  }
-  const Element& y() const
-  {
-    return m_elements[1];
-  }
-  Element& z()
-  {
-    return m_elements[2];
-  }
-  const Element& z() const
-  {
-    return m_elements[2];
-  }
-
-  const Element& operator[](std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& operator[](std::size_t i)
-  {
-    return m_elements[i];
-  }
-
-  operator BasicVector2<Element>&()
-  {
-    return reinterpret_cast<BasicVector2<Element>&>(*this);
-  }
-  operator const BasicVector2<Element>&() const
-  {
-    return reinterpret_cast<const BasicVector2<Element>&>(*this);
-  }
-};
-
-/// \brief A 3-element vector stored in single-precision floating-point.
-typedef BasicVector3<float> Vector3;
-
 const Vector3 g_vector3_identity(0, 0, 0);
 const Vector3 g_vector3_max = Vector3(FLT_MAX, FLT_MAX, FLT_MAX);
 const Vector3 g_vector3_axis_x(1, 0, 0);
@@ -416,26 +306,6 @@ const Vector3 g_vector3_axis_z(0, 0, 1);
 
 const Vector3 g_vector3_axes[3] = { g_vector3_axis_x, g_vector3_axis_y, g_vector3_axis_z };
 
-inline Vector3& vector3_from_array(float* array)
-{
-  return *reinterpret_cast<Vector3*>(array);
-}
-inline const Vector3& vector3_from_array(const float* array)
-{
-  return *reinterpret_cast<const Vector3*>(array);
-}
-
-template<typename Element>
-inline Element* vector3_to_array(BasicVector3<Element>& self)
-{
-  return reinterpret_cast<Element*>(&self);
-}
-template<typename Element>
-inline const Element* vector3_to_array(const BasicVector3<Element>& self)
-{
-  return reinterpret_cast<const Element*>(&self);
-}
-
 template<typename Element, typename OtherElement>
 inline void vector3_swap(BasicVector3<Element>& self, BasicVector3<OtherElement>& other)
 {
@@ -743,98 +613,6 @@ inline Vector3 vector3_for_spherical(double theta, double phi)
 }
 
 
-/// \brief A 4-element vector.
-template<typename Element>
-class BasicVector4
-{
-  Element m_elements[4];
-public:
-
-  BasicVector4()
-  {
-  }
-  BasicVector4(Element x_, Element y_, Element z_, Element w_)
-  {
-    x() = x_;
-    y() = y_;
-    z() = z_;
-    w() = w_;
-  }
-  BasicVector4(const BasicVector3<Element>& self, Element w_)
-  {
-    x() = self.x();
-    y() = self.y();
-    z() = self.z();
-    w() = w_;
-  }
-
-  Element& x()
-  {
-    return m_elements[0];
-  }
-  Element x() const
-  {
-    return m_elements[0];
-  }
-  Element& y()
-  {
-    return m_elements[1];
-  }
-  Element y() const
-  {
-    return m_elements[1];
-  }
-  Element& z()
-  {
-    return m_elements[2];
-  }
-  Element z() const
-  {
-    return m_elements[2];
-  }
-  Element& w()
-  {
-    return m_elements[3];
-  }
-  Element w() const
-  {
-    return m_elements[3];
-  }
-
-  Element index(std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& index(std::size_t i)
-  {
-    return m_elements[i];
-  }
-  Element operator[](std::size_t i) const
-  {
-    return m_elements[i];
-  }
-  Element& operator[](std::size_t i)
-  {
-    return m_elements[i];
-  }
-
-  operator BasicVector3<Element>&()
-  {
-    return reinterpret_cast<BasicVector3<Element>&>(*this);
-  }
-  operator const BasicVector3<Element>&() const
-  {
-    return reinterpret_cast<const BasicVector3<Element>&>(*this);
-  }
-
-  bool operator==(const BasicVector4& other) const
-  {
-    return x() == other.x() && y() == other.y() && z() == other.z() && w() == other.w();
-  }
-};
-
-/// \brief A 4-element vector stored in single-precision floating-point.
-typedef BasicVector4<float> Vector4;
 
 
 template<typename Element, typename OtherElement>
@@ -862,28 +640,6 @@ inline bool vector4_equal_epsilon(const BasicVector4<Element>& self, const Basic
     && float_equal_epsilon(self.w(), other.w(), epsilon);
 }
 
-template<typename Element>
-inline Element* vector4_to_array(BasicVector4<Element>& self)
-{
-  return reinterpret_cast<Element*>(&self);
-}
-template<typename Element>
-inline const float* vector4_to_array(const BasicVector4<Element>& self)
-{
-  return reinterpret_cast<const Element*>(&self);
-}
-
-template<typename Element>
-inline Vector3& vector4_to_vector3(BasicVector4<Element>& self)
-{
-  return reinterpret_cast<BasicVector3<Element>&>(self);
-}
-template<typename Element>
-inline const Vector3& vector4_to_vector3(const BasicVector4<Element>& self)
-{
-  return reinterpret_cast<const BasicVector3<Element>&>(self);
-}
-
 template<typename Element, typename OtherElement>
 inline BasicVector4<Element> vector4_added(const BasicVector4<Element>& self, const BasicVector4<OtherElement>& other)
 {