#ifndef UNITTESTS_COMMON_DUMMYTRAITS #define UNITTESTS_COMMON_DUMMYTRAITS #include #include #include namespace Custom { /// A Vector class with the absolute minimum of built-in methods to test the /// interface expected from Vectors used in Traits template class Vec { public: // Constructor with DIM components Vec(float x) : data({ x }) {} Vec(float x, float y) : data({ x, y }) {} Vec(float x, float y, float z) : data({{ x, y, z }}) {} Vec(float x, float y, float z, float w) : data({ x, y, z, w }) {} Vec() = default; Vec(Vec const &) = default; float &operator[](int i) { return data[i]; } float operator[](int i) const { return data[i]; } private: std::array data; }; template bool operator==(Vec const &lhs, Vec const &rhs) { for (int i = 0; i < DIM; i++) if (lhs[i] != rhs[i]) return false; return true; } template Vec operator+(Vec const &lhs, Vec const &rhs) { Vec result; for (int i = 0; i < DIM; i++) result[i] = lhs[i] + rhs[i]; return result; } template Vec operator-(Vec const &lhs, Vec const &rhs) { Vec result; for (int i = 0; i < DIM; i++) result[i] = lhs[i] - rhs[i]; return result; } template Vec operator*(Vec const &lhs, float rhs) { Vec result; for (int i = 0; i < DIM; i++) result[i] = lhs[i] * rhs; return result; } template Vec operator*(float lhs, Vec const &rhs) { return rhs * lhs; } template Vec operator/(Vec const &lhs, float rhs) { Vec result; for (int i = 0; i < DIM; i++) result[i] = lhs[i] / rhs; return result; } template Vec &operator+=(Vec &lhs, Vec const &rhs) { return lhs = lhs + rhs; } template Vec &operator-=(Vec &lhs, Vec const &rhs) { return lhs = lhs - rhs; } template Vec &operator*=(Vec &lhs, float rhs) { return lhs = lhs * rhs; } template Vec &operator/=(Vec &lhs, float rhs) { return lhs = lhs / rhs; } template float norm(Vec const &v) { float sum = 0.0f; for (int i = 0; i < DIM; i++) sum += v[i] * v[i]; return std::sqrt(sum); } template Vec &normalize(Vec &v) { return v /= norm(v); } template Vec &vectorize(Vec &v, float val) { for (int i = 0; i < DIM; i++) v[i] = val; return v; } template Vec &minimize(Vec &v1, Vec const &v2) { for (int i = 0; i < DIM; i++) v1[i] = std::min(v1[i], v2[i]); return v1; } template Vec &maximize(Vec &v1, Vec const &v2) { for (int i = 0; i < DIM; i++) v1[i] = std::max(v1[i], v2[i]); return v1; } template float dot(Vec const &v1, Vec const &v2) { float sum = 0.f; for (int i = 0; i < DIM; i++) sum += v1[i] * v2[i]; return sum; } inline Vec<3> cross(Vec<3> const &v1, Vec<3> const &v2) { return {v1[1] * v2[2] - v1[2] * v2[1], // v1[2] * v2[0] - v1[0] * v2[2], // v1[0] * v2[1] - v1[1] * v2[0]}; } } namespace OpenMesh { template struct vector_traits> { using vector_type = Custom::Vec; using value_type = float; static const size_t size_ = DIM; static size_t size() { return size_; } }; } struct CustomTraits : public OpenMesh::DefaultTraits { typedef Custom::Vec<3> Point; typedef Custom::Vec<3> Normal; typedef Custom::Vec<2> TexCoord2D; typedef Custom::Vec<3> TexCoord3D; }; #endif // UNITTESTS_COMMON_DUMMYTRAITS