From 12b7069cf7ec065983a26aa2b5d5a60eb33e11f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20M=C3=B6ller?= Date: Tue, 24 Mar 2015 10:36:41 +0000 Subject: [PATCH] - fix warning with vector_cast - add compile error, if vector_cast cannot be performed - adds some color cast specializations - add simple vector_cast unittest closes #2409 git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@1249 fdac6126-5c0c-442c-9429-916003d36597 --- src/OpenMesh/Core/Utils/color_cast.hh | 28 ++++++++++++- src/OpenMesh/Core/Utils/vector_cast.hh | 58 ++++++++------------------ src/Unittests/unittests_vector_type.cc | 18 ++++++++ 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/src/OpenMesh/Core/Utils/color_cast.hh b/src/OpenMesh/Core/Utils/color_cast.hh index 3a65fad2..ddee57f3 100644 --- a/src/OpenMesh/Core/Utils/color_cast.hh +++ b/src/OpenMesh/Core/Utils/color_cast.hh @@ -82,7 +82,7 @@ struct color_caster inline static return_type cast(const src_t& _src) { dst_t dst; - vector_copy(_src, dst, GenProg::Int2Type::size_>()); + vector_cast(_src, dst, GenProg::Int2Type::size_>()); return dst; } }; @@ -222,6 +222,32 @@ struct color_caster } }; +template <> +struct color_caster +{ + typedef Vec4ui return_type; + + inline static return_type cast(const Vec3uc& _src) + { + return Vec4ui(_src[0], + _src[1], + _src[2], + 255 ); + } +}; + +template <> +struct color_caster +{ + typedef Vec4f return_type; + + inline static return_type cast(const Vec3i& _src) + { + const float f = 1.0f / 255.0f; + return Vec4f(_src[0]*f, _src[1]*f, _src[2]*f, 1.0f ); + } +}; + template <> struct color_caster { diff --git a/src/OpenMesh/Core/Utils/vector_cast.hh b/src/OpenMesh/Core/Utils/vector_cast.hh index 845d2338..0b723b5c 100644 --- a/src/OpenMesh/Core/Utils/vector_cast.hh +++ b/src/OpenMesh/Core/Utils/vector_cast.hh @@ -77,57 +77,33 @@ namespace OpenMesh { //----------------------------------------------------------------------------- - -template -inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<1> ) +template +inline void vector_cast( const src_t &_src, dst_t &_dst, GenProg::Int2Type ) { - _dst[0] = _src[0]; + GenProg::AssertCompile< (vector_traits::size_ <= vector_traits::size_) > vectorCastingToHigherDimension; + vector_cast(_src,_dst, GenProg::Int2Type()); + _dst[n-1] = static_cast::value_type >(_src[n-1]); } template -inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<2> ) +inline void vector_cast( const src_t &_src, dst_t &_dst, GenProg::Int2Type<0> ) { - _dst[0] = _src[0]; - _dst[1] = _src[1]; +} + + +template +inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type ) +{ + GenProg::AssertCompile< (vector_traits::size_ <= vector_traits::size_) > vectorCopyToHigherDimension; + vector_copy(_src,_dst, GenProg::Int2Type()); + _dst[n-1] = _src[n-1]; } template -inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<3> ) +inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<0> ) { - _dst[0] = _src[0]; - _dst[1] = _src[1]; - _dst[2] = _src[2]; } -template -inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<4> ) -{ - _dst[0] = _src[0]; - _dst[1] = _src[1]; - _dst[2] = _src[2]; - _dst[3] = _src[3]; -} - -template -inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<5> ) -{ - _dst[0] = _src[0]; - _dst[1] = _src[1]; - _dst[2] = _src[2]; - _dst[3] = _src[3]; - _dst[4] = _src[4]; -} - -template -inline void vector_copy( const src_t &_src, dst_t &_dst, GenProg::Int2Type<6> ) -{ - _dst[0] = _src[0]; - _dst[1] = _src[1]; - _dst[2] = _src[2]; - _dst[3] = _src[3]; - _dst[4] = _src[4]; - _dst[5] = _src[5]; -} //----------------------------------------------------------------------------- @@ -141,7 +117,7 @@ struct vector_caster inline static return_type cast(const src_t& _src) { dst_t dst; - vector_copy(_src, dst, GenProg::Int2Type::size_>()); + vector_cast(_src, dst, GenProg::Int2Type::size_>()); return dst; } }; diff --git a/src/Unittests/unittests_vector_type.cc b/src/Unittests/unittests_vector_type.cc index afb7b29e..240eab07 100644 --- a/src/Unittests/unittests_vector_type.cc +++ b/src/Unittests/unittests_vector_type.cc @@ -65,6 +65,24 @@ TEST_F(OpenMeshVectorTest, AbsTest) { } +/* Compute surface area via cross product + */ +TEST_F(OpenMeshVectorTest, VectorCasting) { + + OpenMesh::Vec3d vecd(1.0,2.0,3.0); + OpenMesh::Vec3f vecf = OpenMesh::vector_cast(vecd); + EXPECT_EQ(1.f, vecf[0]) << "vector type cast failed on component 0"; + EXPECT_EQ(2.f, vecf[1]) << "vector type cast failed on component 1"; + EXPECT_EQ(3.f, vecf[2]) << "vector type cast failed on component 2"; + + OpenMesh::Vec4d vecd4(40.0,30.0,20.0,10.0); + vecd = OpenMesh::vector_cast(vecd4); + EXPECT_EQ(40.0, vecd[0]) << "vector dimension cast failed on component 0"; + EXPECT_EQ(30.0, vecd[1]) << "vector dimension cast failed on component 1"; + EXPECT_EQ(20.0, vecd[2]) << "vector dimension cast failed on component 2"; + +} + }