OpenMesh
Loading...
Searching...
No Matches
VectorT.hh
1/* ========================================================================= *
2 * *
3 * OpenMesh *
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openmesh.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenMesh. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 * ========================================================================= */
41
42
43/*===========================================================================*\
44 * *
45 * $Revision$ *
46 * $Date$ *
47 * *
48\*===========================================================================*/
49
50
51//=============================================================================
52//
53// CLASS VectorT
54//
55//=============================================================================
56
57// Don't parse this header file with doxygen since
58// for some reason (obviously due to a bug in doxygen,
59// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)
60// macro expansion and preprocessor defines
61// don't work properly.
62
63#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
64#include "Vector11T.hh"
65#else
66#ifndef DOXYGEN
67
68#ifndef OPENMESH_VECTOR_HH
69#define OPENMESH_VECTOR_HH
70
71
72//== INCLUDES =================================================================
73
74#include <OpenMesh/Core/System/config.h>
75#include <ostream>
76#include <cmath>
77#include <cassert>
78#include <cstring>
79
80#if defined(__GNUC__) && defined(__SSE__)
81#include <xmmintrin.h>
82#endif
83
84//== NAMESPACES ===============================================================
85
86
87namespace OpenMesh {
88
89
90//== CLASS DEFINITION =========================================================
91
92
102template<typename Scalar, int N> class VectorDataT {
103 public:
104 Scalar values_[N];
105};
106
107
108#if defined(__GNUC__) && defined(__SSE__)
109
111template<> class VectorDataT<float, 4> {
112 public:
113 union {
114 __m128 m128;
115 float values_[4];
116 };
117};
118
119#endif
120
121
122
123
124//== CLASS DEFINITION =========================================================
125
126
127#define DIM N
128#define TEMPLATE_HEADER template <typename Scalar, int N>
129#define CLASSNAME VectorT
130#define DERIVED VectorDataT<Scalar,N>
131#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
132
138#include "VectorT_inc.hh"
139
140#undef DIM
141#undef TEMPLATE_HEADER
142#undef CLASSNAME
143#undef DERIVED
144#undef unroll
145
146
147
148
149//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
150#if OM_PARTIAL_SPECIALIZATION
151
152
153#define TEMPLATE_HEADER template <typename Scalar>
154#define CLASSNAME VectorT<Scalar,DIM>
155#define DERIVED VectorDataT<Scalar,DIM>
156
157
158#define DIM 2
159#define unroll(expr) expr(0) expr(1)
160#define unroll_comb(expr, op) expr(0) op expr(1)
161#define unroll_csv(expr) expr(0), expr(1)
162#include "VectorT_inc.hh"
163#undef DIM
164#undef unroll
165#undef unroll_comb
166#undef unroll_csv
167
168
169#define DIM 3
170#define unroll(expr) expr(0) expr(1) expr(2)
171#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
172#define unroll_csv(expr) expr(0), expr(1), expr(2)
173#include "VectorT_inc.hh"
174#undef DIM
175#undef unroll
176#undef unroll_comb
177#undef unroll_csv
178
179
180#define DIM 4
181#define unroll(expr) expr(0) expr(1) expr(2) expr(3)
182#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
183#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
184#include "VectorT_inc.hh"
185#undef DIM
186#undef unroll
187#undef unroll_comb
188#undef unroll_csv
189
190#define DIM 5
191#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
192#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
193#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
194#include "VectorT_inc.hh"
195#undef DIM
196#undef unroll
197#undef unroll_comb
198#undef unroll_csv
199
200#define DIM 6
201#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
202#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
203#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
204#include "VectorT_inc.hh"
205#undef DIM
206#undef unroll
207#undef unroll_comb
208#undef unroll_csv
209
210
211#undef TEMPLATE_HEADER
212#undef CLASSNAME
213#undef DERIVED
214
215
216
217
218//== FULL TEMPLATE SPECIALIZATIONS ============================================
219#else
220
222template<>
223inline VectorT<float,3>
225{
226 return
227 VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
228 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
229 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
230}
231
232
234template<>
237{
238 return
239 VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
240 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
241 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
242}
243
244#endif
245
246
247
248//== GLOBAL FUNCTIONS =========================================================
249
250
253template<typename Scalar1, typename Scalar2,int N>
254inline VectorT<Scalar1,N> operator*(Scalar2 _s, const VectorT<Scalar1,N>& _v) {
255 return _v*_s;
256}
257
258
261template<typename Scalar, int N>
262inline Scalar
263dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
264 return (_v1 | _v2);
265}
266
267
270template<typename Scalar, int N>
271inline VectorT<Scalar,N>
272cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
273 return (_v1 % _v2);
274}
275
276
277
278
279//== TYPEDEFS =================================================================
280
294typedef VectorT<float,1> Vec1f;
297
311typedef VectorT<float,2> Vec2f;
314
328typedef VectorT<float,3> Vec3f;
332typedef VectorT<bool,3> Vec3b;
333
347typedef VectorT<float,4> Vec4f;
350
367
381typedef VectorT<float,6> Vec6f;
384
385
386//=============================================================================
387} // namespace OpenMesh
388//=============================================================================
389
390
391#endif // OPENMESH_VECTOR_HH defined
392//=============================================================================
393#endif // DOXYGEN
394#endif // C++11
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:64
VectorT< signed char, 3 > Vec3c
3-byte signed vector
Definition Vector11T.hh:757
VectorT< double, 3 > Vec3d
3-double vector
Definition Vector11T.hh:771
VectorT< signed int, 1 > Vec1i
1-int signed vector
Definition Vector11T.hh:731
VectorT< unsigned char, 5 > Vec5uc
5-byte unsigned vector
Definition Vector11T.hh:795
VectorT< unsigned int, 2 > Vec2ui
2-int unsigned vector
Definition Vector11T.hh:750
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
VectorT< double, 1 > Vec1d
1-double vector
Definition Vector11T.hh:737
VectorT< double, 4 > Vec4d
4-double vector
Definition Vector11T.hh:790
VectorT< float, 2 > Vec2f
2-float vector
Definition Vector11T.hh:752
VectorT< signed short int, 3 > Vec3s
3-short signed vector
Definition Vector11T.hh:761
VectorT< double, 2 > Vec2d
2-double vector
Definition Vector11T.hh:754
VectorT< signed int, 5 > Vec5i
5-int signed vector
Definition Vector11T.hh:801
VectorT< signed char, 4 > Vec4c
4-byte signed vector
Definition Vector11T.hh:776
VectorT< signed char, 5 > Vec5c
5-byte signed vector
Definition Vector11T.hh:793
VectorT< unsigned int, 5 > Vec5ui
5-int unsigned vector
Definition Vector11T.hh:803
VectorT< signed short int, 5 > Vec5s
5-short signed vector
Definition Vector11T.hh:797
VectorT< unsigned int, 4 > Vec4ui
4-int unsigned vector
Definition Vector11T.hh:786
VectorT< unsigned short int, 3 > Vec3us
3-short unsigned vector
Definition Vector11T.hh:763
VectorT< unsigned char, 3 > Vec3uc
3-byte unsigned vector
Definition Vector11T.hh:759
VectorT< signed short int, 2 > Vec2s
2-short signed vector
Definition Vector11T.hh:744
VectorT< signed int, 2 > Vec2i
2-int signed vector
Definition Vector11T.hh:748
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition Vector11T.hh:667
VectorT< signed char, 2 > Vec2c
2-byte signed vector
Definition Vector11T.hh:740
VectorT< unsigned short int, 2 > Vec2us
2-short unsigned vector
Definition Vector11T.hh:746
VectorT< signed char, 6 > Vec6c
6-byte signed vector
Definition Vector11T.hh:810
VectorT< signed int, 6 > Vec6i
6-int signed vector
Definition Vector11T.hh:818
VectorT< signed int, 4 > Vec4i
4-int signed vector
Definition Vector11T.hh:784
VectorT< signed short int, 4 > Vec4s
4-short signed vector
Definition Vector11T.hh:780
VectorT< unsigned char, 6 > Vec6uc
6-byte unsigned vector
Definition Vector11T.hh:812
VectorT< float, 6 > Vec6f
6-float vector
Definition Vector11T.hh:822
VectorT< float, 5 > Vec5f
5-float vector
Definition Vector11T.hh:805
VectorT< unsigned char, 2 > Vec2uc
2-byte unsigned vector
Definition Vector11T.hh:742
VectorT< unsigned int, 6 > Vec6ui
6-int unsigned vector
Definition Vector11T.hh:820
VectorT< float, 4 > Vec4f
4-float vector
Definition Vector11T.hh:788
VectorT< unsigned char, 1 > Vec1uc
1-byte unsigned vector
Definition Vector11T.hh:725
VectorT< unsigned char, 4 > Vec4uc
4-byte unsigned vector
Definition Vector11T.hh:778
VectorT< unsigned short int, 1 > Vec1us
1-short unsigned vector
Definition Vector11T.hh:729
VectorT< float, 1 > Vec1f
1-float vector
Definition Vector11T.hh:735
VectorT< double, 6 > Vec6d
6-double vector
Definition Vector11T.hh:824
VectorT< signed short int, 1 > Vec1s
1-short signed vector
Definition Vector11T.hh:727
VectorT< bool, 3 > Vec3b
3-bool vector
Definition Vector11T.hh:773
VectorT< unsigned int, 1 > Vec1ui
1-int unsigned vector
Definition Vector11T.hh:733
VectorT< signed char, 1 > Vec1c
1-byte signed vector
Definition Vector11T.hh:723
VectorT< double, 5 > Vec5d
5-double vector
Definition Vector11T.hh:807
VectorT< unsigned short int, 4 > Vec4us
4-short unsigned vector
Definition Vector11T.hh:782
VectorT< unsigned int, 3 > Vec3ui
3-int unsigned vector
Definition Vector11T.hh:767
VectorT< unsigned short int, 6 > Vec6us
6-short unsigned vector
Definition Vector11T.hh:816
VectorT< unsigned short int, 5 > Vec5us
5-short unsigned vector
Definition Vector11T.hh:799
VectorT< float, 3 > Vec3f
3-float vector
Definition Vector11T.hh:769
VectorT< signed short int, 6 > Vec6s
6-short signed vector
Definition Vector11T.hh:814
VectorT< signed int, 3 > Vec3i
3-int signed vector
Definition Vector11T.hh:765
auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), DIM > >::type
cross product: only defined for Vec3* as specialization
Definition Vector11T.hh:367
Definition VectorT_inc.hh:73

Project OpenMesh, ©  Computer Graphics Group, RWTH Aachen. Documentation generated using doxygen .