64 #ifndef OPENMESH_VECTOR_HH
65 #define OPENMESH_VECTOR_HH
70 #include <OpenMesh/Core/System/config.h>
76 #if defined(__GNUC__) && defined(__SSE__)
77 #include <xmmintrin.h>
80 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
82 #include <initializer_list>
83 #include <type_traits>
95 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
100 template<
typename... Ts>
101 struct are_convertible_to;
103 template<
typename To,
typename From,
typename... Froms>
104 struct are_convertible_to<To, From, Froms...> {
105 static constexpr
bool value = std::is_convertible<From, To>::value && are_convertible_to<To, Froms...>::value;
107 template<
typename To,
typename From>
108 struct are_convertible_to<To, From> :
public std::is_convertible<From, To> {};
122 template<
typename Scalar,
int N>
class VectorDataT {
124 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
127 template<
typename... T>
128 constexpr VectorDataT(T... vs) : values_ {{vs...}} {
129 static_assert(
sizeof...(vs) == N,
130 "Incorrect number of vector components supplied.");
132 std::array<Scalar, N> values_;
139 #if defined(__GNUC__) && defined(__SSE__)
142 template<>
class VectorDataT<float, 4> {
144 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
147 template<
typename... T>
148 constexpr VectorDataT(T... vs) : values_ {{vs...}} {
149 static_assert(
sizeof...(vs) == 4,
150 "Incorrect number of vector components supplied.");
155 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
156 std::array<float, 4> values_;
172 #define TEMPLATE_HEADER template <typename Scalar, int N>
173 #define CLASSNAME VectorT
174 #define DERIVED VectorDataT<Scalar,N>
175 #define unroll(expr) for (int i=0; i<N; ++i) expr(i)
182 #include "VectorT_inc.hh"
185 #undef TEMPLATE_HEADER
194 #if OM_PARTIAL_SPECIALIZATION
197 #define TEMPLATE_HEADER template <typename Scalar>
198 #define CLASSNAME VectorT<Scalar,DIM>
199 #define DERIVED VectorDataT<Scalar,DIM>
203 #define unroll(expr) expr(0) expr(1)
204 #define unroll_comb(expr, op) expr(0) op expr(1)
205 #define unroll_csv(expr) expr(0), expr(1)
206 #include "VectorT_inc.hh"
214 #define unroll(expr) expr(0) expr(1) expr(2)
215 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
216 #define unroll_csv(expr) expr(0), expr(1), expr(2)
217 #include "VectorT_inc.hh"
225 #define unroll(expr) expr(0) expr(1) expr(2) expr(3)
226 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
227 #define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
228 #include "VectorT_inc.hh"
235 #define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
236 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
237 #define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
238 #include "VectorT_inc.hh"
245 #define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
246 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
247 #define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
248 #include "VectorT_inc.hh"
255 #undef TEMPLATE_HEADER
272 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
273 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
284 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
285 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
297 template<
typename Scalar1,
typename Scalar2,
int N>
305 template<
typename Scalar,
int N>
314 template<
typename Scalar,
int N>
435 #if __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
444 constexpr OpenMesh::Vec4f
operator"" _htmlColor(
unsigned long long raw_color) {
445 return OpenMesh::Vec4f(
446 ((raw_color >> 24) & 0xFF) / 255.0f,
447 ((raw_color >> 16) & 0xFF) / 255.0f,
448 ((raw_color >> 8) & 0xFF) / 255.0f,
449 ((raw_color >> 0) & 0xFF) / 255.0f);
453 #endif // OPENMESH_VECTOR_HH defined
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition: VectorAdapter.hh:181
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:64
osg::Vec3f cross(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition: VectorAdapter.hh:196
Definition: VectorT_inc.hh:72
VectorT< Scalar, 3 > operator%(const VectorT< Scalar, 3 > &_rhs) const
cross product: only defined for Vec3* as specialization