/// \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)
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.
}
-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)
{
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);
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)
{
}
-/// \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>
&& 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)
{