First checkin for OpenMesh 2.0
git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@2 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
329
Core/Geometry/VectorT.hh
Normal file
329
Core/Geometry/VectorT.hh
Normal file
@@ -0,0 +1,329 @@
|
||||
//=============================================================================
|
||||
//
|
||||
// OpenMesh
|
||||
// Copyright (C) 2003 by Computer Graphics Group, RWTH Aachen
|
||||
// www.openmesh.org
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// License
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU Lesser General Public License as published
|
||||
// by the Free Software Foundation, version 2.1.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful, but
|
||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
// $Revision: 4254 $
|
||||
// $Date: 2009-01-12 14:44:00 +0100 (Mo, 12. Jan 2009) $
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
|
||||
//=============================================================================
|
||||
//
|
||||
// CLASS VectorT
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
|
||||
#ifndef OPENMESH_VECTOR_HH
|
||||
#define OPENMESH_VECTOR_HH
|
||||
|
||||
|
||||
//== INCLUDES =================================================================
|
||||
|
||||
|
||||
#include <OpenMesh/Core/System/config.h>
|
||||
#include <iostream>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
|
||||
#if defined(__GNUC__) && defined(__SSE__)
|
||||
#include <xmmintrin.h>
|
||||
#endif
|
||||
|
||||
|
||||
//== NAMESPACES ===============================================================
|
||||
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
|
||||
//== CLASS DEFINITION =========================================================
|
||||
|
||||
|
||||
|
||||
/** The N values of the template Scalar type are the only data members
|
||||
of the class VectorT<Scalar,N>. This guarantees 100% compatibility
|
||||
with arrays of type Scalar and size N, allowing us to define the
|
||||
cast operators to and from arrays and array pointers.
|
||||
|
||||
In addition, this class will be specialized for Vec4f to be 16 bit
|
||||
aligned, so that aligned SSE instructions can be used on these
|
||||
vectors.
|
||||
*/
|
||||
template <typename Scalar,int N> struct VectorDataT
|
||||
{
|
||||
Scalar values_[N];
|
||||
};
|
||||
|
||||
|
||||
#if defined(__GNUC__) && defined(__SSE__)
|
||||
|
||||
/// This specialization enables us to use aligned SSE instructions.
|
||||
template <> struct VectorDataT<float, 4>
|
||||
{
|
||||
union
|
||||
{
|
||||
__m128 m128;
|
||||
float values_[4];
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
//== CLASS DEFINITION =========================================================
|
||||
|
||||
|
||||
#define DIM N
|
||||
#define TEMPLATE_HEADER template <typename Scalar, int N>
|
||||
#define CLASSNAME VectorT
|
||||
#define DERIVED VectorDataT<Scalar,N>
|
||||
#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
|
||||
|
||||
/** \class VectorT VectorT.hh <OpenMesh/Core/Math/VectorT.hh>
|
||||
A vector is an array of \<N\> values of type \<Scalar\>.
|
||||
The actual data is stored in an VectorDataT, this class just adds
|
||||
the necessary operators.
|
||||
*/
|
||||
#include "VectorT_inc.hh"
|
||||
|
||||
#undef DIM
|
||||
#undef TEMPLATE_HEADER
|
||||
#undef CLASSNAME
|
||||
#undef DERIVED
|
||||
#undef unroll
|
||||
|
||||
|
||||
|
||||
|
||||
//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
|
||||
#if OM_PARTIAL_SPECIALIZATION
|
||||
|
||||
|
||||
#define TEMPLATE_HEADER template <typename Scalar>
|
||||
#define CLASSNAME VectorT<Scalar,DIM>
|
||||
#define DERIVED VectorDataT<Scalar,DIM>
|
||||
|
||||
|
||||
#define DIM 2
|
||||
#define unroll(expr) expr(0) expr(1)
|
||||
#define unroll_comb(expr, op) expr(0) op expr(1)
|
||||
#define unroll_csv(expr) expr(0), expr(1)
|
||||
#include "VectorT_inc.hh"
|
||||
#undef DIM
|
||||
#undef unroll
|
||||
#undef unroll_comb
|
||||
#undef unroll_csv
|
||||
|
||||
|
||||
#define DIM 3
|
||||
#define unroll(expr) expr(0) expr(1) expr(2)
|
||||
#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
|
||||
#define unroll_csv(expr) expr(0), expr(1), expr(2)
|
||||
#include "VectorT_inc.hh"
|
||||
#undef DIM
|
||||
#undef unroll
|
||||
#undef unroll_comb
|
||||
#undef unroll_csv
|
||||
|
||||
|
||||
#define DIM 4
|
||||
#define unroll(expr) expr(0) expr(1) expr(2) expr(3)
|
||||
#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
|
||||
#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
|
||||
#include "VectorT_inc.hh"
|
||||
#undef DIM
|
||||
#undef unroll
|
||||
#undef unroll_comb
|
||||
#undef unroll_csv
|
||||
|
||||
|
||||
#undef TEMPLATE_HEADER
|
||||
#undef CLASSNAME
|
||||
#undef DERIVED
|
||||
|
||||
|
||||
|
||||
|
||||
//== FULL TEMPLATE SPECIALIZATIONS ============================================
|
||||
#else
|
||||
|
||||
# ifndef DOXY_IGNORE_THIS
|
||||
|
||||
/// cross product for Vec3f
|
||||
template<>
|
||||
inline VectorT<float,3>
|
||||
VectorT<float,3>::operator%(const VectorT<float,3>& _rhs) const
|
||||
{
|
||||
return
|
||||
VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
|
||||
values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
|
||||
values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
|
||||
}
|
||||
|
||||
|
||||
/// cross product for Vec3d
|
||||
template<>
|
||||
inline VectorT<double,3>
|
||||
VectorT<double,3>::operator%(const VectorT<double,3>& _rhs) const
|
||||
{
|
||||
return
|
||||
VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
|
||||
values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
|
||||
values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
|
||||
}
|
||||
|
||||
# endif // DOXY_IGNORE_THIS
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//== GLOBAL FUNCTIONS =========================================================
|
||||
|
||||
|
||||
/// \relates OpenMesh::VectorT
|
||||
/// scalar * vector
|
||||
template<typename Scalar,int N>
|
||||
inline VectorT<Scalar,N> operator*(Scalar _s, const VectorT<Scalar,N>& _v) {
|
||||
return VectorT<Scalar,N>(_v) *= _s;
|
||||
}
|
||||
|
||||
|
||||
/// \relates OpenMesh::VectorT
|
||||
/// symmetric version of the dot product
|
||||
template<typename Scalar, int N>
|
||||
inline Scalar
|
||||
dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
|
||||
return (_v1 | _v2);
|
||||
}
|
||||
|
||||
|
||||
/// \relates OpenMesh::VectorT
|
||||
/// symmetric version of the cross product
|
||||
template<typename Scalar, int N>
|
||||
inline VectorT<Scalar,N>
|
||||
cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
|
||||
return (_v1 % _v2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//== TYPEDEFS =================================================================
|
||||
|
||||
/** 1-byte signed vector */
|
||||
typedef VectorT<signed char,1> Vec1c;
|
||||
/** 1-byte unsigned vector */
|
||||
typedef VectorT<unsigned char,1> Vec1uc;
|
||||
/** 1-short signed vector */
|
||||
typedef VectorT<signed short int,1> Vec1s;
|
||||
/** 1-short unsigned vector */
|
||||
typedef VectorT<unsigned short int,1> Vec1us;
|
||||
/** 1-int signed vector */
|
||||
typedef VectorT<signed int,1> Vec1i;
|
||||
/** 1-int unsigned vector */
|
||||
typedef VectorT<unsigned int,1> Vec1ui;
|
||||
/** 1-float vector */
|
||||
typedef VectorT<float,1> Vec1f;
|
||||
/** 1-double vector */
|
||||
typedef VectorT<double,1> Vec1d;
|
||||
|
||||
/** 2-byte signed vector */
|
||||
typedef VectorT<signed char,2> Vec2c;
|
||||
/** 2-byte unsigned vector */
|
||||
typedef VectorT<unsigned char,2> Vec2uc;
|
||||
/** 2-short signed vector */
|
||||
typedef VectorT<signed short int,2> Vec2s;
|
||||
/** 2-short unsigned vector */
|
||||
typedef VectorT<unsigned short int,2> Vec2us;
|
||||
/** 2-int signed vector */
|
||||
typedef VectorT<signed int,2> Vec2i;
|
||||
/** 2-int unsigned vector */
|
||||
typedef VectorT<unsigned int,2> Vec2ui;
|
||||
/** 2-float vector */
|
||||
typedef VectorT<float,2> Vec2f;
|
||||
/** 2-double vector */
|
||||
typedef VectorT<double,2> Vec2d;
|
||||
|
||||
/** 3-byte signed vector */
|
||||
typedef VectorT<signed char,3> Vec3c;
|
||||
/** 3-byte unsigned vector */
|
||||
typedef VectorT<unsigned char,3> Vec3uc;
|
||||
/** 3-short signed vector */
|
||||
typedef VectorT<signed short int,3> Vec3s;
|
||||
/** 3-short unsigned vector */
|
||||
typedef VectorT<unsigned short int,3> Vec3us;
|
||||
/** 3-int signed vector */
|
||||
typedef VectorT<signed int,3> Vec3i;
|
||||
/** 3-int unsigned vector */
|
||||
typedef VectorT<unsigned int,3> Vec3ui;
|
||||
/** 3-float vector */
|
||||
typedef VectorT<float,3> Vec3f;
|
||||
/** 3-double vector */
|
||||
typedef VectorT<double,3> Vec3d;
|
||||
|
||||
/** 4-byte signed vector */
|
||||
typedef VectorT<signed char,4> Vec4c;
|
||||
/** 4-byte unsigned vector */
|
||||
typedef VectorT<unsigned char,4> Vec4uc;
|
||||
/** 4-short signed vector */
|
||||
typedef VectorT<signed short int,4> Vec4s;
|
||||
/** 4-short unsigned vector */
|
||||
typedef VectorT<unsigned short int,4> Vec4us;
|
||||
/** 4-int signed vector */
|
||||
typedef VectorT<signed int,4> Vec4i;
|
||||
/** 4-int unsigned vector */
|
||||
typedef VectorT<unsigned int,4> Vec4ui;
|
||||
/** 4-float vector */
|
||||
typedef VectorT<float,4> Vec4f;
|
||||
/** 4-double vector */
|
||||
typedef VectorT<double,4> Vec4d;
|
||||
|
||||
/** 6-byte signed vector */
|
||||
typedef VectorT<signed char,6> Vec6c;
|
||||
/** 6-byte unsigned vector */
|
||||
typedef VectorT<unsigned char,6> Vec6uc;
|
||||
/** 6-short signed vector */
|
||||
typedef VectorT<signed short int,6> Vec6s;
|
||||
/** 6-short unsigned vector */
|
||||
typedef VectorT<unsigned short int,6> Vec6us;
|
||||
/** 6-int signed vector */
|
||||
typedef VectorT<signed int,6> Vec6i;
|
||||
/** 6-int unsigned vector */
|
||||
typedef VectorT<unsigned int,6> Vec6ui;
|
||||
/** 6-float vector */
|
||||
typedef VectorT<float,6> Vec6f;
|
||||
/** 6-double vector */
|
||||
typedef VectorT<double,6> Vec6d;
|
||||
|
||||
|
||||
//=============================================================================
|
||||
} // namespace OpenMesh
|
||||
//=============================================================================
|
||||
#endif // OPENMESH_VECTOR_HH defined
|
||||
//=============================================================================
|
||||
Reference in New Issue
Block a user