| OpenMesh

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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: 1291 $ *
46 * $Date: 2015-06-18 13:53:05 +0200 (Do, 18 Jun 2015) $ *
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 #ifndef DOXYGEN
63
64 #ifndef OPENMESH_VECTOR_HH
65 #define OPENMESH_VECTOR_HH
66
67
68 //== INCLUDES =================================================================
69
70
71 #include <OpenMesh/Core/System/config.h>
72 #include <ostream>
73 #include <cmath>
74 #include <cassert>
75 #include <cstring>
76
77 #if defined(__GNUC__) && defined(__SSE__)
78 #include <xmmintrin.h>
79 #endif
80
81
82 //== NAMESPACES ===============================================================
83
84
85 namespace OpenMesh {
86
87
88 //== CLASS DEFINITION =========================================================
89
90
91
101 template <typename Scalar,int N> struct VectorDataT
102 {
103 Scalar values_[N];
104 };
105
106
107 #if defined(__GNUC__) && defined(__SSE__)
108
110 template <> struct VectorDataT<float, 4>
111 {
112 union
113 {
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
222 template<>
223 inline VectorT<float,3>
224 VectorT<float,3>::operator%(const VectorT<float,3>& _rhs) const
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
234 template<>
235 inline VectorT<double,3>
236 VectorT<double,3>::operator%(const VectorT<double,3>& _rhs) const
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
253 template<typename Scalar1, typename Scalar2,int N>
254 inline VectorT<Scalar1,N> operator*(Scalar2 _s, const VectorT<Scalar1,N> _v) {
255 return _v*_s;
256 }
257
258
261 template<typename Scalar, int N>
262 inline Scalar
263 dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
264 return (_v1 | _v2);
265 }
266
267
270 template<typename Scalar, int N>
271 inline VectorT<Scalar,N>
272 cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
273 return (_v1 % _v2);
274 }
275
276
277
278
279 //== TYPEDEFS =================================================================
280
282 typedef VectorT<signed char,1> Vec1c;
284 typedef VectorT<unsigned char,1> Vec1uc;
286 typedef VectorT<signed short int,1> Vec1s;
288 typedef VectorT<unsigned short int,1> Vec1us;
290 typedef VectorT<signed int,1> Vec1i;
292 typedef VectorT<unsigned int,1> Vec1ui;
294 typedef VectorT<float,1> Vec1f;
296 typedef VectorT<double,1> Vec1d;
297
299 typedef VectorT<signed char,2> Vec2c;
301 typedef VectorT<unsigned char,2> Vec2uc;
303 typedef VectorT<signed short int,2> Vec2s;
305 typedef VectorT<unsigned short int,2> Vec2us;
307 typedef VectorT<signed int,2> Vec2i;
309 typedef VectorT<unsigned int,2> Vec2ui;
311 typedef VectorT<float,2> Vec2f;
313 typedef VectorT<double,2> Vec2d;
314
316 typedef VectorT<signed char,3> Vec3c;
318 typedef VectorT<unsigned char,3> Vec3uc;
320 typedef VectorT<signed short int,3> Vec3s;
322 typedef VectorT<unsigned short int,3> Vec3us;
324 typedef VectorT<signed int,3> Vec3i;
326 typedef VectorT<unsigned int,3> Vec3ui;
328 typedef VectorT<float,3> Vec3f;
330 typedef VectorT<double,3> Vec3d;
332 typedef VectorT<bool,3> Vec3b;
333
335 typedef VectorT<signed char,4> Vec4c;
337 typedef VectorT<unsigned char,4> Vec4uc;
339 typedef VectorT<signed short int,4> Vec4s;
341 typedef VectorT<unsigned short int,4> Vec4us;
343 typedef VectorT<signed int,4> Vec4i;
345 typedef VectorT<unsigned int,4> Vec4ui;
347 typedef VectorT<float,4> Vec4f;
349 typedef VectorT<double,4> Vec4d;
350
352 typedef VectorT<signed char, 5> Vec5c;
354 typedef VectorT<unsigned char, 5> Vec5uc;
356 typedef VectorT<signed short int, 5> Vec5s;
358 typedef VectorT<unsigned short int, 5> Vec5us;
360 typedef VectorT<signed int, 5> Vec5i;
362 typedef VectorT<unsigned int, 5> Vec5ui;
364 typedef VectorT<float, 5> Vec5f;
366 typedef VectorT<double, 5> Vec5d;
367
369 typedef VectorT<signed char,6> Vec6c;
371 typedef VectorT<unsigned char,6> Vec6uc;
373 typedef VectorT<signed short int,6> Vec6s;
375 typedef VectorT<unsigned short int,6> Vec6us;
377 typedef VectorT<signed int,6> Vec6i;
379 typedef VectorT<unsigned int,6> Vec6ui;
381 typedef VectorT<float,6> Vec6f;
383 typedef VectorT<double,6> Vec6d;
384
385
386 //=============================================================================
387 } // namespace OpenMesh
388 //=============================================================================
389 #endif // OPENMESH_VECTOR_HH defined
390 //=============================================================================
391 #endif // DOXYGEN
OpenMesh
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:64
OpenMesh::cross
osg::Vec3f cross(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition: VectorAdapter.hh:196
VectorT::operator%
VectorT< Scalar, 3 > operator%(const VectorT< Scalar, 3 > &_rhs) const
cross product: only defined for Vec3* as specialization
VectorT
Definition: VectorT_inc.hh:72
OpenMesh::dot
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