1 #ifndef UNITTESTS_COMMON_DUMMYTRAITS
2 #define UNITTESTS_COMMON_DUMMYTRAITS
3 #include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
4 #include <OpenMesh/Core/Utils/color_cast.hh>
5 #include <array>
6 
7 namespace Custom {
8 
9 /// A Vector class with the absolute minimum of built-in methods to test the
10 /// interface expected from Vectors used in Traits
11 template <int DIM> class Vec {
12   public:
13     // Constructor with DIM components
Vec(float x)14 	Vec(float x) : data({ x }) {}
Vec(float x,float y)15 	Vec(float x, float y) : data({ x, y }) {}
Vec(float x,float y,float z)16 	Vec(float x, float y, float z) : data({{ x, y, z }}) {}
Vec(float x,float y,float z,float w)17 	Vec(float x, float y, float z, float w) : data({ x, y, z, w }) {}
18 
19     Vec() = default;
20     Vec(Vec<DIM> const &) = default;
21 
operator [](int i)22     float &operator[](int i) { return data[i]; }
operator [](int i) const23     float operator[](int i) const { return data[i]; }
24 
25   private:
26     std::array<float, DIM> data;
27 };
28 
operator ==(Vec<DIM> const & lhs,Vec<DIM> const & rhs)29 template <int DIM> bool operator==(Vec<DIM> const &lhs, Vec<DIM> const &rhs) {
30     for (int i = 0; i < DIM; i++)
31         if (lhs[i] != rhs[i]) return false;
32     return true;
33 }
34 
35 template <int DIM>
operator +(Vec<DIM> const & lhs,Vec<DIM> const & rhs)36 Vec<DIM> operator+(Vec<DIM> const &lhs, Vec<DIM> const &rhs) {
37     Vec<DIM> result;
38     for (int i = 0; i < DIM; i++)
39         result[i] = lhs[i] + rhs[i];
40     return result;
41 }
42 
43 template <int DIM>
operator -(Vec<DIM> const & lhs,Vec<DIM> const & rhs)44 Vec<DIM> operator-(Vec<DIM> const &lhs, Vec<DIM> const &rhs) {
45     Vec<DIM> result;
46     for (int i = 0; i < DIM; i++)
47         result[i] = lhs[i] - rhs[i];
48     return result;
49 }
50 
operator *(Vec<DIM> const & lhs,float rhs)51 template <int DIM> Vec<DIM> operator*(Vec<DIM> const &lhs, float rhs) {
52     Vec<DIM> result;
53     for (int i = 0; i < DIM; i++)
54         result[i] = lhs[i] * rhs;
55     return result;
56 }
57 
operator *(float lhs,Vec<DIM> const & rhs)58 template <int DIM> Vec<DIM> operator*(float lhs, Vec<DIM> const &rhs) {
59     return rhs * lhs;
60 }
61 
operator /(Vec<DIM> const & lhs,float rhs)62 template <int DIM> Vec<DIM> operator/(Vec<DIM> const &lhs, float rhs) {
63     Vec<DIM> result;
64     for (int i = 0; i < DIM; i++)
65         result[i] = lhs[i] / rhs;
66     return result;
67 }
68 
operator +=(Vec<DIM> & lhs,Vec<DIM> const & rhs)69 template <int DIM> Vec<DIM> &operator+=(Vec<DIM> &lhs, Vec<DIM> const &rhs) {
70     return lhs = lhs + rhs;
71 }
operator -=(Vec<DIM> & lhs,Vec<DIM> const & rhs)72 template <int DIM> Vec<DIM> &operator-=(Vec<DIM> &lhs, Vec<DIM> const &rhs) {
73     return lhs = lhs - rhs;
74 }
operator *=(Vec<DIM> & lhs,float rhs)75 template <int DIM> Vec<DIM> &operator*=(Vec<DIM> &lhs, float rhs) {
76     return lhs = lhs * rhs;
77 }
operator /=(Vec<DIM> & lhs,float rhs)78 template <int DIM> Vec<DIM> &operator/=(Vec<DIM> &lhs, float rhs) {
79     return lhs = lhs / rhs;
80 }
81 
norm(Vec<DIM> const & v)82 template <int DIM> float norm(Vec<DIM> const &v) {
83     float sum = 0.0f;
84     for (int i = 0; i < DIM; i++)
85         sum += v[i] * v[i];
86     return std::sqrt(sum);
87 }
88 
normalize(Vec<DIM> & v)89 template <int DIM> Vec<DIM> &normalize(Vec<DIM> &v) { return v /= norm(v); }
vectorize(Vec<DIM> & v,float val)90 template <int DIM> Vec<DIM> &vectorize(Vec<DIM> &v, float val) {
91     for (int i = 0; i < DIM; i++)
92         v[i] = val;
93     return v;
94 }
95 
minimize(Vec<DIM> & v1,Vec<DIM> const & v2)96 template <int DIM> Vec<DIM> &minimize(Vec<DIM> &v1, Vec<DIM> const &v2) {
97     for (int i = 0; i < DIM; i++)
98         v1[i] = std::min(v1[i], v2[i]);
99     return v1;
100 }
101 
maximize(Vec<DIM> & v1,Vec<DIM> const & v2)102 template <int DIM> Vec<DIM> &maximize(Vec<DIM> &v1, Vec<DIM> const &v2) {
103     for (int i = 0; i < DIM; i++)
104         v1[i] = std::max(v1[i], v2[i]);
105     return v1;
106 }
107 
dot(Vec<DIM> const & v1,Vec<DIM> const & v2)108 template <int DIM> float dot(Vec<DIM> const &v1, Vec<DIM> const &v2) {
109     float sum = 0.f;
110     for (int i = 0; i < DIM; i++)
111         sum += v1[i] * v2[i];
112     return sum;
113 }
114 
cross(Vec<3> const & v1,Vec<3> const & v2)115 inline Vec<3> cross(Vec<3> const &v1, Vec<3> const &v2) {
116     return {v1[1] * v2[2] - v1[2] * v2[1], //
117             v1[2] * v2[0] - v1[0] * v2[2], //
118             v1[0] * v2[1] - v1[1] * v2[0]};
119 }
120 }
121 
122 namespace OpenMesh {
123 template <int DIM> struct vector_traits<Custom::Vec<DIM>> {
124     using vector_type = Custom::Vec<DIM>;
125     using value_type = float;
126     static const size_t size_ = DIM;
sizeOpenMesh::vector_traits127     static size_t size() { return size_; }
128 };
129 }
130 
131 struct CustomTraits : public OpenMesh::DefaultTraits {
132     typedef Custom::Vec<3> Point;
133     typedef Custom::Vec<3> Normal;
134 
135     typedef Custom::Vec<2> TexCoord2D;
136     typedef Custom::Vec<3> TexCoord3D;
137 };
138 
139 #endif // UNITTESTS_COMMON_DUMMYTRAITS
140