#include "generic/constant.h"
#include "generic/callback.h"
-#include "math/vector.h"
+#include "generic/vector.h"
#include "itexdef.h"
namespace scene
#define INCLUDED_IGLRENDER_H
#include "igl.h"
-#include "math/vector.h"
+#include "generic/vector.h"
class AABB;
class Matrix4;
#define INCLUDED_IPATCH_H
#include "generic/constant.h"
-#include "math/vector.h"
+#include "generic/vector.h"
namespace scene
{
struct qtexture_t;
class ModuleObserver;
-#include "math/vector.h"
+#include "generic/vector.h"
class Shader
{
#include "signal/signalfwd.h"
#include "windowobserver.h"
-#include "math/vector.h"
+#include "generic/vector.h"
typedef SignalHandler3<const WindowVector&, ButtonIdentifier, ModifierFlags> MouseEventHandler;
typedef SignalFwd<MouseEventHandler>::handler_id_type MouseEventHandlerId;
#include <cstddef>
-#include "math/vector.h"
+#include "generic/vector.h"
#include "scenelib.h"
#include "generic/callbackfwd.h"
--- /dev/null
+
+#include "vector.h"
+
--- /dev/null
+
+#if !defined(INCLUDED_VECTOR_H)
+#define INCLUDED_VECTOR_H
+
+#include <cstddef>
+
+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];
+ }
+
+ Element* data()
+ {
+ return m_elements;
+ }
+ const Element* data() const
+ {
+ return m_elements;
+ }
+};
+
+/// \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];
+ }
+
+ Element* data()
+ {
+ return m_elements;
+ }
+ const Element* data() const
+ {
+ return m_elements;
+ }
+};
+
+/// \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];
+ }
+ 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];
+ }
+ Element& w()
+ {
+ return m_elements[3];
+ }
+ const 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];
+ }
+
+ Element* data()
+ {
+ return m_elements;
+ }
+ const Element* data() const
+ {
+ return m_elements;
+ }
+};
+
+template<typename Element>
+inline BasicVector3<Element> vector3_from_array(const Element* array)
+{
+ return BasicVector3<Element>(array[0], array[1], array[2]);
+}
+
+template<typename Element>
+inline Element* vector3_to_array(BasicVector3<Element>& self)
+{
+ return self.data();
+}
+template<typename Element>
+inline const Element* vector3_to_array(const BasicVector3<Element>& self)
+{
+ return self.data();
+}
+
+template<typename Element>
+inline Element* vector4_to_array(BasicVector4<Element>& self)
+{
+ return self.data();
+}
+template<typename Element>
+inline const Element* vector4_to_array(const BasicVector4<Element>& self)
+{
+ return self.data();
+}
+
+template<typename Element>
+inline BasicVector3<Element>& vector4_to_vector3(BasicVector4<Element>& self)
+{
+ return *reinterpret_cast<BasicVector3<Element>*>(vector4_to_array(self));
+}
+template<typename Element>
+inline const BasicVector3<Element>& vector4_to_vector3(const BasicVector4<Element>& self)
+{
+ return *reinterpret_cast<const BasicVector3<Element>*>(vector4_to_array(self));
+}
+
+/// \brief A 2-element vector stored in single-precision floating-point.
+typedef BasicVector2<float> Vector2;
+
+/// \brief A 3-element vector stored in single-precision floating-point.
+typedef BasicVector3<float> Vector3;
+
+/// \brief A 4-element vector stored in single-precision floating-point.
+typedef BasicVector4<float> Vector4;
+
+
+#endif
<File
RelativePath=".\generic\static.h">
</File>
+ <File
+ RelativePath=".\generic\vector.cpp">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)/$(InputName)1.obj"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCLCompilerTool"
+ ObjectFile="$(IntDir)/$(InputName)1.obj"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\generic\vector.h">
+ </File>
</Filter>
<Filter
Name="memory"
inline void aabb_corners_oriented(const AABB& aabb, const Matrix4& rotation, Vector3 corners[8])
{
- Vector3 x = Vector3(rotation.x()) * aabb.extents.x();
- Vector3 y = Vector3(rotation.y()) * aabb.extents.y();
- Vector3 z = Vector3(rotation.z()) * aabb.extents.z();
+ Vector3 x = vector4_to_vector3(rotation.x()) * aabb.extents.x();
+ Vector3 y = vector4_to_vector3(rotation.y()) * aabb.extents.y();
+ Vector3 z = vector4_to_vector3(rotation.z()) * aabb.extents.z();
corners[0] = aabb.origin + -x + y + z;
corners[1] = aabb.origin + x + y + z;
inline void aabb_planes_oriented(const AABB& aabb, const Matrix4& rotation, Plane3 planes[6])
{
- double x = vector3_dot(Vector3(rotation.x()), aabb.origin);
- double y = vector3_dot(Vector3(rotation.y()), aabb.origin);
- double z = vector3_dot(Vector3(rotation.z()), aabb.origin);
-
- planes[0] = Plane3(Vector3(rotation.x()), x + aabb.extents[0]);
- planes[1] = Plane3(-Vector3(rotation.x()), -(x - aabb.extents[0]));
- planes[2] = Plane3(Vector3(rotation.y()), y + aabb.extents[1]);
- planes[3] = Plane3(-Vector3(rotation.y()), -(y - aabb.extents[1]));
- planes[4] = Plane3(Vector3(rotation.z()), z + aabb.extents[2]);
- planes[5] = Plane3(-Vector3(rotation.z()), -(z - aabb.extents[2]));
+ double x = vector3_dot(vector4_to_vector3(rotation.x()), aabb.origin);
+ double y = vector3_dot(vector4_to_vector3(rotation.y()), aabb.origin);
+ double z = vector3_dot(vector4_to_vector3(rotation.z()), aabb.origin);
+
+ planes[0] = Plane3(vector4_to_vector3(rotation.x()), x + aabb.extents[0]);
+ planes[1] = Plane3(-vector4_to_vector3(rotation.x()), -(x - aabb.extents[0]));
+ planes[2] = Plane3(vector4_to_vector3(rotation.y()), y + aabb.extents[1]);
+ planes[3] = Plane3(-vector4_to_vector3(rotation.y()), -(y - aabb.extents[1]));
+ planes[4] = Plane3(vector4_to_vector3(rotation.z()), z + aabb.extents[2]);
+ planes[5] = Plane3(-vector4_to_vector3(rotation.z()), -(z - aabb.extents[2]));
}
const Vector3 aabb_normals[6] = {
/// \file
/// \brief Vector data types and related operations.
+#include "generic/vector.h"
+
#if 0
#define lrint(dbl) ((int)((dbl) + 0.5))
#endif
#include <cmath>
-#include <cstddef>
#include <float.h>
#include <algorithm>
}
-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)
{
}
/// \brief A 3-float vertex.
-struct Vertex3f
+struct Vertex3f : public Vector3
{
- float x, y, z;
-
Vertex3f()
{
}
Vertex3f(float _x, float _y, float _z)
- : x(_x), y(_y), z(_z)
+ : Vector3(_x, _y, _z)
{
}
};
inline bool operator<(const Vertex3f& self, const Vertex3f& other)
{
- if(self.x != other.x)
+ if(self.x() != other.x())
{
- return self.x < other.x;
+ return self.x() < other.x();
}
- if(self.y != other.y)
+ if(self.y() != other.y())
{
- return self.y < other.y;
+ return self.y() < other.y();
}
- if(self.z != other.z)
+ if(self.z() != other.z())
{
- return self.z < other.z;
+ return self.z() < other.z();
}
return false;
}
inline bool operator==(const Vertex3f& self, const Vertex3f& other)
{
- return self.x == other.x && self.y == other.y && self.z == other.z;
+ return self.x() == other.x() && self.y() == other.y() && self.z() == other.z();
}
inline bool operator!=(const Vertex3f& self, const Vertex3f& other)
}
-inline const Vertex3f& vertex3f_from_array(const float* array)
+inline Vertex3f vertex3f_from_array(const float* array)
{
- return *reinterpret_cast<const Vertex3f*>(array);
+ return Vertex3f(array[0], array[1], array[2]);
}
inline float* vertex3f_to_array(Vertex3f& vertex)
inline const Vector3& vertex3f_to_vector3(const Vertex3f& vertex)
{
- return reinterpret_cast<const Vector3&>(vertex);
+ return vertex;
}
inline Vector3& vertex3f_to_vector3(Vertex3f& vertex)
{
- return reinterpret_cast<Vector3&>(vertex);
+ return vertex;
}
/// \brief A 3-float normal.
-struct Normal3f
+struct Normal3f : public Vector3
{
- float x, y, z;
-
Normal3f()
{
}
Normal3f(float _x, float _y, float _z)
- : x(_x), y(_y), z(_z)
+ : Vector3(_x, _y, _z)
{
}
};
inline bool operator<(const Normal3f& self, const Normal3f& other)
{
- if(self.x != other.x)
+ if(self.x() != other.x())
{
- return self.x < other.x;
+ return self.x() < other.x();
}
- if(self.y != other.y)
+ if(self.y() != other.y())
{
- return self.y < other.y;
+ return self.y() < other.y();
}
- if(self.z != other.z)
+ if(self.z() != other.z())
{
- return self.z < other.z;
+ return self.z() < other.z();
}
return false;
}
inline bool operator==(const Normal3f& self, const Normal3f& other)
{
- return self.x == other.x && self.y == other.y && self.z == other.z;
+ return self.x() == other.x() && self.y() == other.y() && self.z() == other.z();
}
inline bool operator!=(const Normal3f& self, const Normal3f& other)
inline const Vector3& normal3f_to_vector3(const Normal3f& normal)
{
- return reinterpret_cast<const Vector3&>(normal);
+ return normal;
}
inline Vector3& normal3f_to_vector3(Normal3f& normal)
{
- return reinterpret_cast<Vector3&>(normal);
+ return normal;
}
/// \brief A 2-float texture-coordinate set.
-struct TexCoord2f
+struct TexCoord2f : public Vector2
{
- float s, t;
-
TexCoord2f()
{
}
TexCoord2f(float _s, float _t)
- : s(_s), t(_t)
+ : Vector2(_s, _t)
+ {
+ }
+
+ float& s()
+ {
+ return x();
+ }
+ const float& s() const
+ {
+ return x();
+ }
+ float& t()
+ {
+ return y();
+ }
+ const float& t() const
{
+ return y();
}
};
inline bool operator<(const TexCoord2f& self, const TexCoord2f& other)
{
- if(self.s != other.s)
+ if(self.s() != other.s())
{
- return self.s < other.s;
+ return self.s() < other.s();
}
- if(self.t != other.t)
+ if(self.t() != other.t())
{
- return self.t < other.t;
+ return self.t() < other.t();
}
return false;
}
inline bool operator==(const TexCoord2f& self, const TexCoord2f& other)
{
- return self.s == other.s && self.t == other.t;
+ return self.s() == other.s() && self.t() == other.t();
}
inline bool operator!=(const TexCoord2f& self, const TexCoord2f& other)
inline const Vector2& texcoord2f_to_vector2(const TexCoord2f& vertex)
{
- return reinterpret_cast<const Vector2&>(vertex);
+ return vertex;
}
inline Vector2& texcoord2f_to_vector2(TexCoord2f& vertex)
{
- return reinterpret_cast<Vector2&>(vertex);
+ return vertex;
}
/// \brief Returns \p normal rescaled to be unit-length.
inline UnitSphereOctant normal3f_classify_octant(const Normal3f& normal)
{
return static_cast<UnitSphereOctant>(
- ((normal.x > 0) << 0) | ((normal.y > 0) << 1) | ((normal.z > 0) << 2)
+ ((normal.x() > 0) << 0) | ((normal.y() > 0) << 1) | ((normal.z() > 0) << 2)
);
}
switch(octant)
{
case UNITSPHEREOCTANT_000:
- return Normal3f(-normal.x, -normal.y, -normal.z);
+ return Normal3f(-normal.x(), -normal.y(), -normal.z());
case UNITSPHEREOCTANT_001:
- return Normal3f(normal.x, -normal.y, -normal.z);
+ return Normal3f(normal.x(), -normal.y(), -normal.z());
case UNITSPHEREOCTANT_010:
- return Normal3f(-normal.x, normal.y, -normal.z);
+ return Normal3f(-normal.x(), normal.y(), -normal.z());
case UNITSPHEREOCTANT_011:
- return Normal3f(normal.x, normal.y, -normal.z);
+ return Normal3f(normal.x(), normal.y(), -normal.z());
case UNITSPHEREOCTANT_100:
- return Normal3f(-normal.x, -normal.y, normal.z);
+ return Normal3f(-normal.x(), -normal.y(), normal.z());
case UNITSPHEREOCTANT_101:
- return Normal3f(normal.x, -normal.y, normal.z);
+ return Normal3f(normal.x(), -normal.y(), normal.z());
case UNITSPHEREOCTANT_110:
- return Normal3f(-normal.x, normal.y, normal.z);
+ return Normal3f(-normal.x(), normal.y(), normal.z());
case UNITSPHEREOCTANT_111:
- return Normal3f(normal.x, normal.y, normal.z);
+ return Normal3f(normal.x(), normal.y(), normal.z());
}
return Normal3f();
}
inline UnitSphereSextant normal3f_classify_sextant(const Normal3f& normal)
{
return
- normal.x >= normal.y
- ? normal.x >= normal.z
- ? normal.y >= normal.z
+ normal.x() >= normal.y()
+ ? normal.x() >= normal.z()
+ ? normal.y() >= normal.z()
? UNITSPHERESEXTANT_XYZ
: UNITSPHERESEXTANT_XZY
: UNITSPHERESEXTANT_ZXY
- : normal.y >= normal.z
- ? normal.x >= normal.z
+ : normal.y() >= normal.z()
+ ? normal.x() >= normal.z()
? UNITSPHERESEXTANT_YXZ
: UNITSPHERESEXTANT_YZX
: UNITSPHERESEXTANT_ZYX;
switch(sextant)
{
case UNITSPHERESEXTANT_XYZ:
- return Normal3f(normal.x, normal.y, normal.z);
+ return Normal3f(normal.x(), normal.y(), normal.z());
case UNITSPHERESEXTANT_XZY:
- return Normal3f(normal.x, normal.z, normal.y);
+ return Normal3f(normal.x(), normal.z(), normal.y());
case UNITSPHERESEXTANT_YXZ:
- return Normal3f(normal.y, normal.x, normal.z);
+ return Normal3f(normal.y(), normal.x(), normal.z());
case UNITSPHERESEXTANT_YZX:
- return Normal3f(normal.y, normal.z, normal.x);
+ return Normal3f(normal.y(), normal.z(), normal.x());
case UNITSPHERESEXTANT_ZXY:
- return Normal3f(normal.z, normal.x, normal.y);
+ return Normal3f(normal.z(), normal.x(), normal.y());
case UNITSPHERESEXTANT_ZYX:
- return Normal3f(normal.z, normal.y, normal.x);
+ return Normal3f(normal.z(), normal.y(), normal.x());
}
return Normal3f();
}
inline Normal3f normal3f_folded_quantised(const Normal3f& folded)
{
// compress
- double scale = static_cast<float>(c_quantise_normal) / (folded.x + folded.y + folded.z);
- unsigned int zbits = static_cast<unsigned int>(folded.z * scale);
- unsigned int ybits = static_cast<unsigned int>(folded.y * scale);
+ double scale = static_cast<float>(c_quantise_normal) / (folded.x() + folded.y() + folded.z());
+ unsigned int zbits = static_cast<unsigned int>(folded.z() * scale);
+ unsigned int ybits = static_cast<unsigned int>(folded.y() * scale);
// decompress
return normal3f_normalised(Normal3f(
inline spherical_t spherical_from_normal3f(const Normal3f& normal)
{
- return spherical_t(normal.x == 0 ? c_pi / 2 : normal.x > 0 ? atan(normal.y / normal.x) : atan(normal.y / normal.x) + c_pi, acos(normal.z));
+ return spherical_t(normal.x() == 0 ? c_pi / 2 : normal.x() > 0 ? atan(normal.y() / normal.x()) : atan(normal.y() / normal.x()) + c_pi, acos(normal.z()));
}
inline Normal3f normal3f_from_spherical(const spherical_t& spherical)
/// \brief Returns a \p vertex quantised to \p precision.
inline Vertex3f vertex3f_quantised(const Vertex3f& vertex, float precision)
{
- return Vertex3f(float_quantise(vertex.x, precision), float_quantise(vertex.y, precision), float_quantise(vertex.z, precision));
+ return Vertex3f(float_quantise(vertex.x(), precision), float_quantise(vertex.y(), precision), float_quantise(vertex.z(), precision));
}
/// \brief Returns a \p normal quantised to a fixed precision.
/// \brief Returns a \p texcoord quantised to \p precision.
inline TexCoord2f texcoord2f_quantised(const TexCoord2f& texcoord, float precision)
{
- return TexCoord2f(float_quantise(texcoord.s, precision), float_quantise(texcoord.t, precision));
+ return TexCoord2f(float_quantise(texcoord.s(), precision), float_quantise(texcoord.t(), precision));
}
/// \brief Standard vertex type for lines and points.
public:
static void set(Vertex3f& vertex, float x, float y, float z)
{
- vertex.x = x;
- vertex.y = y;
- vertex.z = z;
+ vertex.x() = x;
+ vertex.y() = y;
+ vertex.z() = z;
}
};
public:
static void set(Vertex3f& vertex, float x, float y, float z)
{
- vertex.x = z;
- vertex.y = x;
- vertex.z = y;
+ vertex.x() = z;
+ vertex.y() = x;
+ vertex.z() = y;
}
};
public:
static void set(Vertex3f& vertex, float x, float y, float z)
{
- vertex.x = y;
- vertex.y = z;
- vertex.z = x;
+ vertex.x() = y;
+ vertex.y() = z;
+ vertex.z() = x;
}
};
Vector3 cross(
vector3_cross(
vector3_subtracted(
- Vector3(b.vertex.x, b.texcoord.s, b.texcoord.t),
- Vector3(a.vertex.x, a.texcoord.s, a.texcoord.t)
+ Vector3(b.vertex.x(), b.texcoord.s(), b.texcoord.t()),
+ Vector3(a.vertex.x(), a.texcoord.s(), a.texcoord.t())
),
vector3_subtracted(
- Vector3(c.vertex.x, c.texcoord.s, c.texcoord.t),
- Vector3(a.vertex.x, a.texcoord.s, a.texcoord.t)
+ Vector3(c.vertex.x(), c.texcoord.s(), c.texcoord.t()),
+ Vector3(a.vertex.x(), a.texcoord.s(), a.texcoord.t())
)
)
);
Vector3 cross(
vector3_cross(
vector3_subtracted(
- Vector3(b.vertex.y, b.texcoord.s, b.texcoord.t),
- Vector3(a.vertex.y, a.texcoord.s, a.texcoord.t)
+ Vector3(b.vertex.y(), b.texcoord.s(), b.texcoord.t()),
+ Vector3(a.vertex.y(), a.texcoord.s(), a.texcoord.t())
),
vector3_subtracted(
- Vector3(c.vertex.y, c.texcoord.s, c.texcoord.t),
- Vector3(a.vertex.y, a.texcoord.s, a.texcoord.t)
+ Vector3(c.vertex.y(), c.texcoord.s(), c.texcoord.t()),
+ Vector3(a.vertex.y(), a.texcoord.s(), a.texcoord.t())
)
)
);
Vector3 cross(
vector3_cross(
vector3_subtracted(
- Vector3(b.vertex.z, b.texcoord.s, b.texcoord.t),
- Vector3(a.vertex.z, a.texcoord.s, a.texcoord.t)
+ Vector3(b.vertex.z(), b.texcoord.s(), b.texcoord.t()),
+ Vector3(a.vertex.z(), a.texcoord.s(), a.texcoord.t())
),
vector3_subtracted(
- Vector3(c.vertex.z, c.texcoord.s, c.texcoord.t),
- Vector3(a.vertex.z, a.texcoord.s, a.texcoord.t)
+ Vector3(c.vertex.z(), c.texcoord.s(), c.texcoord.t()),
+ Vector3(a.vertex.z(), a.texcoord.s(), a.texcoord.t())
)
)
);
#include <stdlib.h>
#include <cctype>
-#include "math/vector.h"
+#include "generic/vector.h"
#include "iscriplib.h"
#include "string/string.h"
#include "generic/callback.h"
#if !defined (INCLUDED_TEXTURELIB_H)
#define INCLUDED_TEXTURELIB_H
-#include "math/vector.h"
+#include "generic/vector.h"
typedef Vector3 Colour3;
typedef unsigned int GLuint;
class LoadImageCallback;
return childBounds.origin;
}
#endif
- return localToWorld().t();
+ return vector4_to_vector3(localToWorld().t());
}
void render(Renderer& renderer, const VolumeTest& volume) const
MD5_RETURN_FALSE_IF_FAIL(MD5_parseString(tokeniser, jointName));
MD5_RETURN_FALSE_IF_FAIL(MD5_parseInteger(tokeniser, (*i).parent));
MD5_RETURN_FALSE_IF_FAIL(MD5_parseVector3(tokeniser, (*i).position));
- MD5_RETURN_FALSE_IF_FAIL(MD5_parseVector3(tokeniser, (*i).rotation));
+ MD5_RETURN_FALSE_IF_FAIL(MD5_parseVector3(tokeniser, vector4_to_vector3((*i).rotation)));
(*i).rotation.w() = -static_cast<float>(sqrt(1.0f - (float_squared((*i).rotation.x()) + float_squared((*i).rotation.y()) + float_squared((*i).rotation.z()))));
tokeniser.nextLine();
}
if(g_bp_globals.m_texdefTypeId == TEXDEFTYPEID_BRUSHPRIMITIVES)
{
basis = g_matrix4_identity;
- ComputeAxisBase(normal, basis.x(), basis.y());
- static_cast<Vector3&>(basis.z()) = normal;
+ ComputeAxisBase(normal, vector4_to_vector3(basis.x()), vector4_to_vector3(basis.y()));
+ vector4_to_vector3(basis.z()) = normal;
matrix4_transpose(basis);
//DebugAxisBase(normal);
}
else if(g_bp_globals.m_texdefTypeId == TEXDEFTYPEID_HALFLIFE)
{
basis = g_matrix4_identity;
- static_cast<Vector3&>(basis.x()) = projection.m_basis_s;
- static_cast<Vector3&>(basis.y()) = vector3_negated(projection.m_basis_t);
- static_cast<Vector3&>(basis.z()) = vector3_normalised(vector3_cross(static_cast<Vector3&>(basis.x()), static_cast<Vector3&>(basis.y())));
+ vector4_to_vector3(basis.x()) = projection.m_basis_s;
+ vector4_to_vector3(basis.y()) = vector3_negated(projection.m_basis_t);
+ vector4_to_vector3(basis.z()) = vector3_normalised(vector3_cross(vector4_to_vector3(basis.x()), vector4_to_vector3(basis.y())));
matrix4_multiply_by_matrix4(basis, matrix4_rotation_for_z_degrees(-projection.m_texdef.rotate));
//globalOutputStream() << "debug: " << projection.m_basis_s << projection.m_basis_t << normal << "\n";
matrix4_transpose(basis);
{
Matrix4 basis;
basis = g_matrix4_identity;
- ComputeAxisBase(normal, basis.x(), basis.y());
- static_cast<Vector3&>(basis.z()) = normal;
+ ComputeAxisBase(normal, vector4_to_vector3(basis.x()), vector4_to_vector3(basis.y()));
+ vector4_to_vector3(basis.z()) = normal;
matrix4_transpose(basis);
matrix4_affine_invert(basis);
inline void vertex_assign_ctrl(ArbitraryMeshVertex& vertex, const PatchControl& ctrl)
{
- vertex.vertex.x = ctrl.m_vertex[0];
- vertex.vertex.y = ctrl.m_vertex[1];
- vertex.vertex.z = ctrl.m_vertex[2];
- vertex.texcoord.s = ctrl.m_texcoord[0];
- vertex.texcoord.t = ctrl.m_texcoord[1];
+ vertex.vertex = vertex3f_for_vector3(ctrl.m_vertex);
+ vertex.texcoord = texcoord2f_for_vector2(ctrl.m_texcoord);
}
inline void vertex_clear_normal(ArbitraryMeshVertex& vertex)
{
- vertex.normal.x = 0;
- vertex.normal.y = 0;
- vertex.normal.z = 0;
- vertex.tangent.x = 0;
- vertex.tangent.y = 0;
- vertex.tangent.z = 0;
- vertex.bitangent.x = 0;
- vertex.bitangent.y = 0;
- vertex.bitangent.z = 0;
+ vertex.normal = Normal3f(0, 0, 0);
+ vertex.tangent = Normal3f(0, 0, 0);
+ vertex.bitangent = Normal3f(0, 0, 0);
}
inline void tangents_remove_degenerate(Vector3 tangents[6], Vector2 textureTangents[6], unsigned int flags)
if(m_dragPlanes.isSelected()) // this should only be true when the transform is a pure translation.
{
- m_patch.transform(m_dragPlanes.evaluateTransform(matrix.t()));
+ m_patch.transform(m_dragPlanes.evaluateTransform(vector4_to_vector3(matrix.t())));
}
}
for(std::size_t i=0; i<count; ++i)
{
Vector3 world_point(vector4_projected(matrix4_transformed_vector4(m_inverse, clipped[i])));
- m_primitives.back().m_points[i].vertex.x = world_point[0];
- m_primitives.back().m_points[i].vertex.y = world_point[1];
- m_primitives.back().m_points[i].vertex.z = world_point[2];
+ m_primitives.back().m_points[i].vertex = vertex3f_for_vector3(world_point);
}
}
Point3D point = segment_closest_point_to_point(segment, Vector3(0, 0, 0));
assign_if_closer(best, SelectionIntersection(point.z(), 0));
}
- else if(count > 2 && !point_test_polygon_2d(Vector4(0, 0, 0, 0), normalised, normalised + count))
+ else if(count > 2 && !point_test_polygon_2d(Vector3(0, 0, 0), normalised, normalised + count))
{
point_iterator_t end = normalised + count;
for(point_iterator_t previous = end-1, current = normalised; current != end; previous = current, ++current)
public:
static float& x(Triple& triple)
{
- return triple.x;
+ return triple.x();
}
static float& y(Triple& triple)
{
- return triple.y;
+ return triple.y();
}
static float& z(Triple& triple)
{
- return triple.z;
+ return triple.z();
}
};
public:
static float& x(Triple& triple)
{
- return triple.y;
+ return triple.y();
}
static float& y(Triple& triple)
{
- return triple.z;
+ return triple.z();
}
static float& z(Triple& triple)
{
- return triple.x;
+ return triple.x();
}
};
public:
static float& x(Triple& triple)
{
- return triple.z;
+ return triple.z();
}
static float& y(Triple& triple)
{
- return triple.x;
+ return triple.x();
}
static float& z(Triple& triple)
{
- return triple.y;
+ return triple.y();
}
};
Editable* editable = Node_getEditable(instance.path().top());
if(editable != 0)
{
- return AABB(matrix4_multiplied_by_matrix4(instance.localToWorld(), editable->getLocalPivot()).t(), Vector3(0, 0, 0));
+ return AABB(vector4_to_vector3(matrix4_multiplied_by_matrix4(instance.localToWorld(), editable->getLocalPivot()).t()), Vector3(0, 0, 0));
}
else
{
- return AABB(instance.localToWorld().t(), Vector3(0, 0, 0));
+ return AABB(vector4_to_vector3(instance.localToWorld().t()), Vector3(0, 0, 0));
}
}
}
const Vector3& getViewer() const
{
- return m_viewer;
+ return vector4_to_vector3(m_viewer);
}
};