From: spog Date: Tue, 9 May 2006 22:07:29 +0000 (+0000) Subject: refactored vector classes to avoid reinterpret_cast X-Git-Tag: xonotic-v0.7.0~16^2~12^2~234 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=commitdiff_plain;h=0d98822b3c7232c4859c9605653685a7dab86ba8 refactored vector classes to avoid reinterpret_cast git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@60 8a3a26a2-13c4-0310-b231-cf6edde360e5 --- diff --git a/include/ibrush.h b/include/ibrush.h index f7a58f55..8aaf4b7d 100644 --- a/include/ibrush.h +++ b/include/ibrush.h @@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "generic/constant.h" #include "generic/callback.h" -#include "math/vector.h" +#include "generic/vector.h" #include "itexdef.h" namespace scene diff --git a/include/iglrender.h b/include/iglrender.h index d5b3684a..76216026 100644 --- a/include/iglrender.h +++ b/include/iglrender.h @@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define INCLUDED_IGLRENDER_H #include "igl.h" -#include "math/vector.h" +#include "generic/vector.h" class AABB; class Matrix4; diff --git a/include/ipatch.h b/include/ipatch.h index eee123e4..48ce39b5 100644 --- a/include/ipatch.h +++ b/include/ipatch.h @@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define INCLUDED_IPATCH_H #include "generic/constant.h" -#include "math/vector.h" +#include "generic/vector.h" namespace scene { diff --git a/include/irender.h b/include/irender.h index 28466708..d9c40b6f 100644 --- a/include/irender.h +++ b/include/irender.h @@ -116,7 +116,7 @@ class Matrix4; struct qtexture_t; class ModuleObserver; -#include "math/vector.h" +#include "generic/vector.h" class Shader { diff --git a/include/qerplugin.h b/include/qerplugin.h index 861593f6..7f2f9ca2 100644 --- a/include/qerplugin.h +++ b/include/qerplugin.h @@ -99,7 +99,7 @@ class ModuleObserver; #include "signal/signalfwd.h" #include "windowobserver.h" -#include "math/vector.h" +#include "generic/vector.h" typedef SignalHandler3 MouseEventHandler; typedef SignalFwd::handler_id_type MouseEventHandlerId; diff --git a/include/selectable.h b/include/selectable.h index 774f4e0b..fffcfe29 100644 --- a/include/selectable.h +++ b/include/selectable.h @@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include -#include "math/vector.h" +#include "generic/vector.h" #include "scenelib.h" #include "generic/callbackfwd.h" diff --git a/libs/generic/vector.cpp b/libs/generic/vector.cpp new file mode 100644 index 00000000..83765dcb --- /dev/null +++ b/libs/generic/vector.cpp @@ -0,0 +1,3 @@ + +#include "vector.h" + diff --git a/libs/generic/vector.h b/libs/generic/vector.h new file mode 100644 index 00000000..6e6f74e2 --- /dev/null +++ b/libs/generic/vector.h @@ -0,0 +1,259 @@ + +#if !defined(INCLUDED_VECTOR_H) +#define INCLUDED_VECTOR_H + +#include + +template +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 +class BasicVector3 +{ + Element m_elements[3]; +public: + + BasicVector3() + { + } + template + BasicVector3(const BasicVector3& other) + { + x() = static_cast(other.x()); + y() = static_cast(other.y()); + z() = static_cast(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 +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& 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 +inline BasicVector3 vector3_from_array(const Element* array) +{ + return BasicVector3(array[0], array[1], array[2]); +} + +template +inline Element* vector3_to_array(BasicVector3& self) +{ + return self.data(); +} +template +inline const Element* vector3_to_array(const BasicVector3& self) +{ + return self.data(); +} + +template +inline Element* vector4_to_array(BasicVector4& self) +{ + return self.data(); +} +template +inline const Element* vector4_to_array(const BasicVector4& self) +{ + return self.data(); +} + +template +inline BasicVector3& vector4_to_vector3(BasicVector4& self) +{ + return *reinterpret_cast*>(vector4_to_array(self)); +} +template +inline const BasicVector3& vector4_to_vector3(const BasicVector4& self) +{ + return *reinterpret_cast*>(vector4_to_array(self)); +} + +/// \brief A 2-element vector stored in single-precision floating-point. +typedef BasicVector2 Vector2; + +/// \brief A 3-element vector stored in single-precision floating-point. +typedef BasicVector3 Vector3; + +/// \brief A 4-element vector stored in single-precision floating-point. +typedef BasicVector4 Vector4; + + +#endif diff --git a/libs/libs.vcproj b/libs/libs.vcproj index 00bd4e06..2894ed08 100644 --- a/libs/libs.vcproj +++ b/libs/libs.vcproj @@ -427,6 +427,24 @@ + + + + + + + + + + -#include #include #include @@ -115,48 +116,6 @@ inline Element float_mod(const Element& self, const ModulusElement& modulus) } -template -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 inline BasicVector2 vector2_added(const BasicVector2& self, const BasicVector2& other) { @@ -335,79 +294,6 @@ inline double vector2_cross(const BasicVector2& self, const BasicVector return self.x() * other.y() - self.y() * other.x(); } -typedef BasicVector2 Vector2; - -/// \brief A 3-element vector. -template -class BasicVector3 -{ - Element m_elements[3]; -public: - - BasicVector3() - { - } - template - BasicVector3(const BasicVector3& other) - { - x() = static_cast(other.x()); - y() = static_cast(other.y()); - z() = static_cast(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&() - { - return reinterpret_cast&>(*this); - } - operator const BasicVector2&() const - { - return reinterpret_cast&>(*this); - } -}; - -/// \brief A 3-element vector stored in single-precision floating-point. -typedef BasicVector3 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 +302,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(array); -} -inline const Vector3& vector3_from_array(const float* array) -{ - return *reinterpret_cast(array); -} - -template -inline Element* vector3_to_array(BasicVector3& self) -{ - return reinterpret_cast(&self); -} -template -inline const Element* vector3_to_array(const BasicVector3& self) -{ - return reinterpret_cast(&self); -} - template inline void vector3_swap(BasicVector3& self, BasicVector3& other) { @@ -743,98 +609,6 @@ inline Vector3 vector3_for_spherical(double theta, double phi) } -/// \brief A 4-element vector. -template -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& 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&() - { - return reinterpret_cast&>(*this); - } - operator const BasicVector3&() const - { - return reinterpret_cast&>(*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 Vector4; template @@ -862,28 +636,6 @@ inline bool vector4_equal_epsilon(const BasicVector4& self, const Basic && float_equal_epsilon(self.w(), other.w(), epsilon); } -template -inline Element* vector4_to_array(BasicVector4& self) -{ - return reinterpret_cast(&self); -} -template -inline const float* vector4_to_array(const BasicVector4& self) -{ - return reinterpret_cast(&self); -} - -template -inline Vector3& vector4_to_vector3(BasicVector4& self) -{ - return reinterpret_cast&>(self); -} -template -inline const Vector3& vector4_to_vector3(const BasicVector4& self) -{ - return reinterpret_cast&>(self); -} - template inline BasicVector4 vector4_added(const BasicVector4& self, const BasicVector4& other) { diff --git a/libs/render.h b/libs/render.h index 71b94b76..1411303c 100644 --- a/libs/render.h +++ b/libs/render.h @@ -360,40 +360,38 @@ inline bool operator!=(const Colour4b& self, const Colour4b& 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) @@ -402,9 +400,9 @@ 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(array); + return Vertex3f(array[0], array[1], array[2]); } inline float* vertex3f_to_array(Vertex3f& vertex) @@ -426,50 +424,48 @@ inline Vertex3f vertex3f_for_vector3(const Vector3& vector3) inline const Vector3& vertex3f_to_vector3(const Vertex3f& vertex) { - return reinterpret_cast(vertex); + return vertex; } inline Vector3& vertex3f_to_vector3(Vertex3f& vertex) { - return reinterpret_cast(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) @@ -500,46 +496,61 @@ inline Normal3f normal3f_for_vector3(const Vector3& vector3) inline const Vector3& normal3f_to_vector3(const Normal3f& normal) { - return reinterpret_cast(normal); + return normal; } inline Vector3& normal3f_to_vector3(Normal3f& normal) { - return reinterpret_cast(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) @@ -570,12 +581,12 @@ inline TexCoord2f texcoord2f_for_vector2(const Vector2& vector2) inline const Vector2& texcoord2f_to_vector2(const TexCoord2f& vertex) { - return reinterpret_cast(vertex); + return vertex; } inline Vector2& texcoord2f_to_vector2(TexCoord2f& vertex) { - return reinterpret_cast(vertex); + return vertex; } /// \brief Returns \p normal rescaled to be unit-length. @@ -600,7 +611,7 @@ enum UnitSphereOctant inline UnitSphereOctant normal3f_classify_octant(const Normal3f& normal) { return static_cast( - ((normal.x > 0) << 0) | ((normal.y > 0) << 1) | ((normal.z > 0) << 2) + ((normal.x() > 0) << 0) | ((normal.y() > 0) << 1) | ((normal.z() > 0) << 2) ); } @@ -610,21 +621,21 @@ inline Normal3f normal3f_fold_octant(const Normal3f& normal, UnitSphereOctant oc 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(); } @@ -653,14 +664,14 @@ enum UnitSphereSextant 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; @@ -674,17 +685,17 @@ inline Normal3f normal3f_fold_sextant(const Normal3f& normal, UnitSphereSextant 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(); } @@ -703,9 +714,9 @@ const std::size_t c_quantise_normal = 1 << 6; inline Normal3f normal3f_folded_quantised(const Normal3f& folded) { // compress - double scale = static_cast(c_quantise_normal) / (folded.x + folded.y + folded.z); - unsigned int zbits = static_cast(folded.z * scale); - unsigned int ybits = static_cast(folded.y * scale); + double scale = static_cast(c_quantise_normal) / (folded.x() + folded.y() + folded.z()); + unsigned int zbits = static_cast(folded.z() * scale); + unsigned int ybits = static_cast(folded.y() * scale); // decompress return normal3f_normalised(Normal3f( @@ -762,7 +773,7 @@ struct uniformspherical_t 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) @@ -820,7 +831,7 @@ inline uniformspherical_t uniformspherical_quantised(const uniformspherical_t& u /// \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. @@ -835,7 +846,7 @@ inline Normal3f normal3f_quantised(const Normal3f& normal) /// \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. @@ -1071,9 +1082,9 @@ class RemapXYZ 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; } }; @@ -1082,9 +1093,9 @@ class RemapYZX 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; } }; @@ -1093,9 +1104,9 @@ class RemapZXY 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; } }; @@ -1267,12 +1278,12 @@ inline void ArbitraryMeshTriangle_calcTangents(const ArbitraryMeshVertex& a, con 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()) ) ) ); @@ -1292,12 +1303,12 @@ inline void ArbitraryMeshTriangle_calcTangents(const ArbitraryMeshVertex& a, con 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()) ) ) ); @@ -1317,12 +1328,12 @@ inline void ArbitraryMeshTriangle_calcTangents(const ArbitraryMeshVertex& a, con 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()) ) ) ); diff --git a/libs/stringio.h b/libs/stringio.h index 52407c13..8a8bd9b9 100644 --- a/libs/stringio.h +++ b/libs/stringio.h @@ -25,7 +25,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include -#include "math/vector.h" +#include "generic/vector.h" #include "iscriplib.h" #include "string/string.h" #include "generic/callback.h" diff --git a/libs/texturelib.h b/libs/texturelib.h index ca03426d..8b44597e 100644 --- a/libs/texturelib.h +++ b/libs/texturelib.h @@ -22,7 +22,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #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; diff --git a/plugins/entity/targetable.h b/plugins/entity/targetable.h index 82dd43af..f9081d88 100644 --- a/plugins/entity/targetable.h +++ b/plugins/entity/targetable.h @@ -398,7 +398,7 @@ public: return childBounds.origin; } #endif - return localToWorld().t(); + return vector4_to_vector3(localToWorld().t()); } void render(Renderer& renderer, const VolumeTest& volume) const diff --git a/plugins/md3model/md5.cpp b/plugins/md3model/md5.cpp index bf02f669..9ce15a76 100644 --- a/plugins/md3model/md5.cpp +++ b/plugins/md3model/md5.cpp @@ -298,7 +298,7 @@ bool MD5Model_parse(Model& model, Tokeniser& tokeniser) 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(sqrt(1.0f - (float_squared((*i).rotation.x()) + float_squared((*i).rotation.y()) + float_squared((*i).rotation.z())))); tokeniser.nextLine(); } diff --git a/radiant/brush_primit.cpp b/radiant/brush_primit.cpp index b8cc5d38..02b821dd 100644 --- a/radiant/brush_primit.cpp +++ b/radiant/brush_primit.cpp @@ -255,17 +255,17 @@ void Texdef_basisForNormal(const TextureProjection& projection, const Vector3& n if(g_bp_globals.m_texdefTypeId == TEXDEFTYPEID_BRUSHPRIMITIVES) { basis = g_matrix4_identity; - ComputeAxisBase(normal, basis.x(), basis.y()); - static_cast(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(basis.x()) = projection.m_basis_s; - static_cast(basis.y()) = vector3_negated(projection.m_basis_t); - static_cast(basis.z()) = vector3_normalised(vector3_cross(static_cast(basis.x()), static_cast(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); @@ -1447,8 +1447,8 @@ void BP_from_matrix(brushprimit_texdef_t& bp_texdef, const Vector3& normal, cons { Matrix4 basis; basis = g_matrix4_identity; - ComputeAxisBase(normal, basis.x(), basis.y()); - static_cast(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); diff --git a/radiant/patch.cpp b/radiant/patch.cpp index c7b6344f..719e2412 100644 --- a/radiant/patch.cpp +++ b/radiant/patch.cpp @@ -2212,24 +2212,15 @@ void Patch::BuildTesselationCurves(EMatrixMajor major) 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) diff --git a/radiant/patch.h b/radiant/patch.h index bea33119..e4c20e4e 100644 --- a/radiant/patch.h +++ b/radiant/patch.h @@ -1720,7 +1720,7 @@ public: 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()))); } } diff --git a/radiant/selection.cpp b/radiant/selection.cpp index e6142d4e..75dbbaee 100644 --- a/radiant/selection.cpp +++ b/radiant/selection.cpp @@ -476,9 +476,7 @@ public: for(std::size_t i=0; i 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) @@ -1252,15 +1250,15 @@ class TripleRemapXYZ 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(); } }; @@ -1270,15 +1268,15 @@ class TripleRemapYZX 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(); } }; @@ -1288,15 +1286,15 @@ class TripleRemapZXY 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(); } }; @@ -3580,11 +3578,11 @@ inline AABB Instance_getPivotBounds(scene::Instance& instance) 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)); } } diff --git a/radiant/view.h b/radiant/view.h index 9f201e36..b6dc414a 100644 --- a/radiant/view.h +++ b/radiant/view.h @@ -204,7 +204,7 @@ public: } const Vector3& getViewer() const { - return m_viewer; + return vector4_to_vector3(m_viewer); } };