From ff1f50bb152a2b06728f6dc3543ba1879b12eae5 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sat, 27 Jun 2015 19:36:03 +0200 Subject: [PATCH] Added GTX_wrap --- glm/CMakeLists.txt | 2 +- glm/gtx/wrap.inl | 95 ++++++++-------------------- readme.md | 3 +- test/gtx/CMakeLists.txt | 1 + test/gtx/gtx_wrap.cpp | 134 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 165 insertions(+), 70 deletions(-) create mode 100644 test/gtx/gtx_wrap.cpp diff --git a/glm/CMakeLists.txt b/glm/CMakeLists.txt index 12b2df1f..8f2f552e 100644 --- a/glm/CMakeLists.txt +++ b/glm/CMakeLists.txt @@ -33,7 +33,7 @@ source_group("GTX Files" FILES ${GTX_HEADER}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) if(GLM_TEST_ENABLE) - add_executable(${NAME} ${ROOT_TEXT} ${ROOT_NAT} + add_executable(${NAME} ${ROOT_TEXT} ${ROOT_MD} ${ROOT_NAT} ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} ${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER} diff --git a/glm/gtx/wrap.inl b/glm/gtx/wrap.inl index 5cd084ea..d0d8e256 100644 --- a/glm/gtx/wrap.inl +++ b/glm/gtx/wrap.inl @@ -33,67 +33,46 @@ namespace glm { template - GLM_FUNC_QUALIFIER genType clamp - ( - genType const & Texcoord - ) + GLM_FUNC_QUALIFIER genType clamp(genType const & Texcoord) { return glm::clamp(Texcoord, genType(0), genType(1)); } template - GLM_FUNC_QUALIFIER tvec2 clamp - ( - tvec2 const & Texcoord - ) + GLM_FUNC_QUALIFIER tvec2 clamp(tvec2 const & Texcoord) { tvec2 Result; for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); + Result[i] = clamp_to_edge(Texcoord[i]); return Result; } template - GLM_FUNC_QUALIFIER tvec3 clamp - ( - tvec3 const & Texcoord - ) + GLM_FUNC_QUALIFIER tvec3 clamp(tvec3 const & Texcoord) { tvec3 Result; for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); + Result[i] = clamp_to_edge(Texcoord[i]); return Result; } template - GLM_FUNC_QUALIFIER tvec4 clamp - ( - tvec4 const & Texcoord - ) + GLM_FUNC_QUALIFIER tvec4 clamp(tvec4 const & Texcoord) { tvec4 Result; for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) - Result[i] = clamp(Texcoord[i]); + Result[i] = clamp_to_edge(Texcoord[i]); return Result; } - //////////////////////// - // repeat - - template - GLM_FUNC_QUALIFIER genType repeat - ( - genType const & Texcoord - ) + template + GLM_FUNC_QUALIFIER genType repeat(genType const & Texcoord) { return glm::fract(Texcoord); } - template - GLM_FUNC_QUALIFIER tvec2 repeat - ( - tvec2 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec2 repeat(tvec2 const & Texcoord) { tvec2 Result; for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) @@ -101,11 +80,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec3 repeat - ( - tvec3 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec3 repeat(tvec3 const & Texcoord) { tvec3 Result; for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) @@ -113,11 +89,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec4 repeat - ( - tvec4 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec4 repeat(tvec4 const & Texcoord) { tvec4 Result; for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) @@ -125,18 +98,13 @@ namespace glm return Result; } - //////////////////////// - // mirrorRepeat - - template - GLM_FUNC_QUALIFIER genType mirrorRepeat - ( - genType const & Texcoord - ) + template + GLM_FUNC_QUALIFIER genType mirrorRepeat(genType const & Texcoord) { - genType const Clamp = genType(int(glm::floor(Texcoord)) % 2); - genType const Floor = glm::floor(Texcoord); - genType const Rest = Texcoord - Floor; + genType const Abs = glm::abs(Texcoord); + genType const Clamp = genType(int(glm::floor(Abs)) % 2); + genType const Floor = glm::floor(Abs); + genType const Rest = Abs - Floor; genType const Mirror = Clamp + Rest; genType Out; @@ -147,11 +115,8 @@ namespace glm return Out; } - template - GLM_FUNC_QUALIFIER tvec2 mirrorRepeat - ( - tvec2 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec2 mirrorRepeat(tvec2 const & Texcoord) { tvec2 Result; for(typename tvec2::size_type i = 0; i < tvec2::value_size(); ++i) @@ -159,11 +124,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec3 mirrorRepeat - ( - tvec3 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec3 mirrorRepeat(tvec3 const & Texcoord) { tvec3 Result; for(typename tvec3::size_type i = 0; i < tvec3::value_size(); ++i) @@ -171,11 +133,8 @@ namespace glm return Result; } - template - GLM_FUNC_QUALIFIER tvec4 mirrorRepeat - ( - tvec4 const & Texcoord - ) + template + GLM_FUNC_QUALIFIER tvec4 mirrorRepeat(tvec4 const & Texcoord) { tvec4 Result; for(typename tvec4::size_type i = 0; i < tvec4::value_size(); ++i) diff --git a/readme.md b/readme.md index a35496f4..dd1f44a3 100644 --- a/readme.md +++ b/readme.md @@ -56,7 +56,8 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate) - Added 'fmod' overload to GTX_common with tests #308 - Left handed perspective and lookAt functions #314 - Added functions eulerAngleXYZ and extractEulerAngleXYZ #311 -- Added to perform to perform std::hash on GLM types #320 +- Added to perform std::hash on GLM types #320 +- Added for texcoord wrapping ##### Improvements: - Changed usage of __has_include to support Intel compiler #307 diff --git a/test/gtx/CMakeLists.txt b/test/gtx/CMakeLists.txt index 4be4343f..be39a6c5 100644 --- a/test/gtx/CMakeLists.txt +++ b/test/gtx/CMakeLists.txt @@ -48,3 +48,4 @@ glmCreateTestGTC(gtx_string_cast) glmCreateTestGTC(gtx_type_aligned) glmCreateTestGTC(gtx_vector_angle) glmCreateTestGTC(gtx_vector_query) +glmCreateTestGTC(gtx_wrap) diff --git a/test/gtx/gtx_wrap.cpp b/test/gtx/gtx_wrap.cpp new file mode 100644 index 00000000..2366170e --- /dev/null +++ b/test/gtx/gtx_wrap.cpp @@ -0,0 +1,134 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net) +/// Permission is hereby granted, free of charge, to any person obtaining a copy +/// of this software and associated documentation files (the "Software"), to deal +/// in the Software without restriction, including without limitation the rights +/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +/// copies of the Software, and to permit persons to whom the Software is +/// furnished to do so, subject to the following conditions: +/// +/// The above copyright notice and this permission notice shall be included in +/// all copies or substantial portions of the Software. +/// +/// Restrictions: +/// By making use of the Software for military purposes, you choose to make +/// a Bunny unhappy. +/// +/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +/// THE SOFTWARE. +/// +/// @file test/gtx/gtx_normal.cpp +/// @date 2013-10-25 / 2014-11-25 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include +#include + +namespace clamp +{ + int test() + { + int Error(0); + + float A = glm::clamp(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::clamp(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::clamp(1.0f); + Error += glm::epsilonEqual(C, 1.0f, 0.00001f) ? 0 : 1; + + float D = glm::clamp(-0.5f); + Error += glm::epsilonEqual(D, 0.0f, 0.00001f) ? 0 : 1; + + float E = glm::clamp(1.5f); + Error += glm::epsilonEqual(E, 1.0f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace clamp + +namespace repeat +{ + int test() + { + int Error(0); + + float A = glm::repeat(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::repeat(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::repeat(1.0f); + Error += glm::epsilonEqual(C, 0.0f, 0.00001f) ? 0 : 1; + + float D = glm::repeat(-0.5f); + Error += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1; + + float E = glm::repeat(1.5f); + Error += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1; + + float F = glm::repeat(0.9f); + Error += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace repeat + +namespace mirrorRepeat +{ + int test() + { + int Error(0); + + float A = glm::mirrorRepeat(0.5f); + Error += glm::epsilonEqual(A, 0.5f, 0.00001f) ? 0 : 1; + + float B = glm::mirrorRepeat(0.0f); + Error += glm::epsilonEqual(B, 0.0f, 0.00001f) ? 0 : 1; + + float C = glm::mirrorRepeat(1.0f); + Error += glm::epsilonEqual(C, 1.0f, 0.00001f) ? 0 : 1; + + float D = glm::mirrorRepeat(-0.5f); + Error += glm::epsilonEqual(D, 0.5f, 0.00001f) ? 0 : 1; + + float E = glm::mirrorRepeat(1.5f); + Error += glm::epsilonEqual(E, 0.5f, 0.00001f) ? 0 : 1; + + float F = glm::mirrorRepeat(0.9f); + Error += glm::epsilonEqual(F, 0.9f, 0.00001f) ? 0 : 1; + + float G = glm::mirrorRepeat(3.0f); + Error += glm::epsilonEqual(G, 1.0f, 0.00001f) ? 0 : 1; + + float H = glm::mirrorRepeat(-3.0f); + Error += glm::epsilonEqual(H, 1.0f, 0.00001f) ? 0 : 1; + + float I = glm::mirrorRepeat(-1.0f); + Error += glm::epsilonEqual(I, 1.0f, 0.00001f) ? 0 : 1; + + return Error; + } +}//namespace mirrorRepeat + +int main() +{ + int Error(0); + + Error += clamp::test(); + Error += repeat::test(); + Error += mirrorRepeat::test(); + + return Error; +}