diff --git a/glm/core/func_common.inl b/glm/core/func_common.inl index 04561844..6f5752e9 100644 --- a/glm/core/func_common.inl +++ b/glm/core/func_common.inl @@ -268,7 +268,7 @@ namespace detail round(x.z), round(x.w)); } - +/* // roundEven template GLM_FUNC_QUALIFIER genType roundEven(genType const& x) @@ -277,7 +277,22 @@ namespace detail return genType(int(x + genType(int(x) % 2))); } - +*/ + // roundEven + template + GLM_FUNC_QUALIFIER genType roundEven(genType const& x) + { + GLM_STATIC_ASSERT(detail::type::is_float, "'roundEven' only accept floating-point inputs"); + + genType RoundValue(0.5); + if(fract(x) == genType(0.5) && int(x) % 2) + RoundValue = genType(-0.5); + + if(x < genType(0.0)) + return genType(int(x - RoundValue)); + return genType(int(x + RoundValue)); + } + template GLM_FUNC_QUALIFIER detail::tvec2 roundEven(detail::tvec2 const& x) { diff --git a/test/core/core_func_common.cpp b/test/core/core_func_common.cpp index e13000cc..41dfaa1c 100644 --- a/test/core/core_func_common.cpp +++ b/test/core/core_func_common.cpp @@ -167,55 +167,71 @@ int test_roundEven() int Error = 0; { - float A = glm::roundEven(0.0f); + float A = glm::round(0.0f); Error += A == 0.0f ? 0 : 1; - float B = glm::roundEven(0.5f); + float B = glm::round(0.5f); Error += B == 0.0f ? 0 : 1; - float C = glm::roundEven(1.0f); - Error += C == 2.0f ? 0 : 1; - float D = glm::roundEven(0.1f); + float C = glm::round(1.0f); + Error += C == 1.0f ? 0 : 1; + float D = glm::round(0.1f); Error += D == 0.0f ? 0 : 1; - float E = glm::roundEven(0.9f); - Error += E == 0.0f ? 0 : 1; - float F = glm::roundEven(1.9f); + float E = glm::round(0.9f); + Error += E == 1.0f ? 0 : 1; + float F = glm::round(1.5f); Error += F == 2.0f ? 0 : 1; - float G = glm::roundEven(2.5f); + float G = glm::round(1.9f); Error += G == 2.0f ? 0 : 1; - float H = glm::roundEven(2.9f); - Error += H == 2.0f ? 0 : 1; - float I = glm::roundEven(3.2f); - Error += I == 4.0f ? 0 : 1; - float J = glm::roundEven(3.5f); - Error += J == 4.0f ? 0 : 1; - float K = glm::roundEven(3.9f); - Error += K == 4.0f ? 0 : 1; - float L = glm::roundEven(4.1f); - Error += L == 4.0f ? 0 : 1; } { - float A = glm::roundEven(-0.0f); - Error += A == 0.0f ? 0 : 1; - float B = glm::roundEven(-0.5f); - Error += B == -2.0f ? 0 : 1; - float C = glm::roundEven(-1.0f); - Error += C == -2.0f ? 0 : 1; - float D = glm::roundEven(-0.1f); + float A = glm::round(-0.0f); + Error += A == 0.0f ? 0 : 1; + float B = glm::round(-0.5f); + Error += B == -0.0f ? 0 : 1; + float C = glm::round(-1.0f); + Error += C == -1.0f ? 0 : 1; + float D = glm::round(-0.1f); Error += D == 0.0f ? 0 : 1; - float E = glm::roundEven(-0.9f); - Error += E == -2.0f ? 0 : 1; - float F = glm::roundEven(-1.9f); + float E = glm::round(-0.9f); + Error += E == -1.0f ? 0 : 1; + float F = glm::round(-1.5f); Error += F == -2.0f ? 0 : 1; - float G = glm::roundEven(-2.5f); + float G = glm::round(-1.9f); Error += G == -2.0f ? 0 : 1; - float H = glm::roundEven(-2.9f); - Error += H == -2.0f ? 0 : 1; - float I = glm::roundEven(-3.2f); - Error += I == -4.0f ? 0 : 1; - float J = glm::roundEven(-3.5f); - Error += J == -4.0f ? 0 : 1; - float K = glm::roundEven(-3.9f); - Error += K == -4.0f ? 0 : 1; + } + + { + float A = glm::round(1.5f); + Error += A == 2.0f ? 0 : 1; + float B = glm::round(2.5f); + Error += B == 2.0f ? 0 : 1; + float C = glm::round(3.5f); + Error += C == 4.0f ? 0 : 1; + float D = glm::round(4.5f); + Error += D == 4.0f ? 0 : 1; + float E = glm::round(5.5f); + Error += E == 6.0f ? 0 : 1; + float F = glm::round(6.5f); + Error += F == 6.0f ? 0 : 1; + float G = glm::round(7.5f); + Error += G == 8.0f ? 0 : 1; + } + + { + float A = glm::round(-1.5f); + Error += A == -2.0f ? 0 : 1; + float B = glm::round(-2.5f); + Error += B == -2.0f ? 0 : 1; + float C = glm::round(-3.5f); + Error += C == -4.0f ? 0 : 1; + float D = glm::round(-4.5f); + Error += D == -4.0f ? 0 : 1; + float E = glm::round(-5.5f); + Error += E == -6.0f ? 0 : 1; + float F = glm::round(-6.5f); + Error += F == -6.0f ? 0 : 1; + float G = glm::round(-7.5f); + Error += G == -8.0f ? 0 : 1; } return Error; diff --git a/test/core/core_setup_message.cpp b/test/core/core_setup_message.cpp index 724aa168..a1bb420d 100644 --- a/test/core/core_setup_message.cpp +++ b/test/core/core_setup_message.cpp @@ -11,75 +11,6 @@ #include #include -/* -#define GLM_COMPILER_UNKNOWN 0x00000000 - -// Visual C++ defines -#define GLM_COMPILER_VC 0x01000000 -#define GLM_COMPILER_VC2 0x01000010 -#define GLM_COMPILER_VC4 0x01000020 -#define GLM_COMPILER_VC5 0x01000030 -#define GLM_COMPILER_VC6 0x01000040 -#define GLM_COMPILER_VC2002 0x01000050 -#define GLM_COMPILER_VC2003 0x01000060 -#define GLM_COMPILER_VC2005 0x01000070 -#define GLM_COMPILER_VC2008 0x01000080 -#define GLM_COMPILER_VC2010 0x01000090 -#define GLM_COMPILER_VC2011 0x010000A0 - -// GCC defines -#define GLM_COMPILER_GCC 0x02000000 -#define GLM_COMPILER_GCC_LLVM 0x02000001 -#define GLM_COMPILER_GCC_CLANG 0x02000002 -#define GLM_COMPILER_GCC30 0x02000010 -#define GLM_COMPILER_GCC31 0x02000020 -#define GLM_COMPILER_GCC32 0x02000030 -#define GLM_COMPILER_GCC33 0x02000040 -#define GLM_COMPILER_GCC34 0x02000050 -#define GLM_COMPILER_GCC35 0x02000060 -#define GLM_COMPILER_GCC40 0x02000070 -#define GLM_COMPILER_GCC41 0x02000080 -#define GLM_COMPILER_GCC42 0x02000090 -#define GLM_COMPILER_GCC43 0x020000A0 -#define GLM_COMPILER_GCC44 0x020000B0 -#define GLM_COMPILER_GCC45 0x020000C0 -#define GLM_COMPILER_GCC46 0x020000D0 -#define GLM_COMPILER_GCC47 0x020000E0 -#define GLM_COMPILER_GCC48 0x020000F0 -#define GLM_COMPILER_GCC49 0x02000100 -#define GLM_COMPILER_GCC50 0x02000200 - -// G++ command line to display defined -// echo "" | g++ -E -dM -x c++ - | sort - -// Borland C++ defines. How to identify BC? -#define GLM_COMPILER_BC 0x04000000 -#define GLM_COMPILER_BCB4 0x04000100 -#define GLM_COMPILER_BCB5 0x04000200 -#define GLM_COMPILER_BCB6 0x04000300 -//#define GLM_COMPILER_BCBX 0x04000400 // What's the version value? -#define GLM_COMPILER_BCB2009 0x04000500 - -// CodeWarrior -#define GLM_COMPILER_CODEWARRIOR 0x08000000 - -// CUDA -#define GLM_COMPILER_CUDA 0x10000000 -#define GLM_COMPILER_CUDA30 0x10000010 -#define GLM_COMPILER_CUDA31 0x10000020 -#define GLM_COMPILER_CUDA32 0x10000030 -#define GLM_COMPILER_CUDA40 0x10000040 - -// Clang -#define GLM_COMPILER_CLANG 0x20000000 -#define GLM_COMPILER_CLANG26 0x20000010 -#define GLM_COMPILER_CLANG27 0x20000020 -#define GLM_COMPILER_CLANG28 0x20000030 -#define GLM_COMPILER_CLANG29 0x20000040 - -// LLVM GCC -#define GLM_COMPILER_LLVM_GCC 0x40000000 -*/ int test_compiler() { int Error = 0; @@ -89,12 +20,98 @@ int test_compiler() case GLM_COMPILER_VC: std::cout << "GLM_COMPILER_VC" << std::endl; break; + case GLM_COMPILER_VC2: + std::cout << "GLM_COMPILER_VC2" << std::endl; + break; + case GLM_COMPILER_VC4: + std::cout << "GLM_COMPILER_VC4" << std::endl; + break; + case GLM_COMPILER_VC5: + std::cout << "GLM_COMPILER_VC5" << std::endl; + break; + case GLM_COMPILER_VC6: + std::cout << "GLM_COMPILER_VC6" << std::endl; + break; + case GLM_COMPILER_VC2002: + std::cout << "GLM_COMPILER_VC2002" << std::endl; + break; + case GLM_COMPILER_VC2003: + std::cout << "GLM_COMPILER_VC2003" << std::endl; + break; + case GLM_COMPILER_VC2005: + std::cout << "GLM_COMPILER_VC2005" << std::endl; + break; + case GLM_COMPILER_VC2008: + std::cout << "GLM_COMPILER_VC2008" << std::endl; + break; + case GLM_COMPILER_VC2010: + std::cout << "GLM_COMPILER_VC2010" << std::endl; + break; + case GLM_COMPILER_VC2011: + std::cout << "GLM_COMPILER_VC2011" << std::endl; + break; + case GLM_COMPILER_GCC: std::cout << "GLM_COMPILER_GCC" << std::endl; break; + case GLM_COMPILER_GCC30: + std::cout << "GLM_COMPILER_GCC30" << std::endl; + break; + case GLM_COMPILER_GCC31: + std::cout << "GLM_COMPILER_GCC31" << std::endl; + break; + case GLM_COMPILER_GCC32: + std::cout << "GLM_COMPILER_GCC32" << std::endl; + break; + case GLM_COMPILER_GCC33: + std::cout << "GLM_COMPILER_GCC33" << std::endl; + break; + case GLM_COMPILER_GCC34: + std::cout << "GLM_COMPILER_GCC34" << std::endl; + break; + case GLM_COMPILER_GCC35: + std::cout << "GLM_COMPILER_GCC35" << std::endl; + break; + case GLM_COMPILER_GCC40: + std::cout << "GLM_COMPILER_GCC40" << std::endl; + break; + case GLM_COMPILER_GCC41: + std::cout << "GLM_COMPILER_GCC41" << std::endl; + break; + case GLM_COMPILER_GCC42: + std::cout << "GLM_COMPILER_GCC42" << std::endl; + break; + case GLM_COMPILER_GCC43: + std::cout << "GLM_COMPILER_GCC43" << std::endl; + break; + case GLM_COMPILER_GCC44: + std::cout << "GLM_COMPILER_GCC44" << std::endl; + break; + case GLM_COMPILER_GCC45: + std::cout << "GLM_COMPILER_GCC45" << std::endl; + break; + case GLM_COMPILER_GCC46: + std::cout << "GLM_COMPILER_GCC46" << std::endl; + break; + case GLM_COMPILER_GCC47: + std::cout << "GLM_COMPILER_GCC47" << std::endl; + break; + case GLM_COMPILER_BC: std::cout << "GLM_COMPILER_BC" << std::endl; break; + case GLM_COMPILER_BCB4: + std::cout << "GLM_COMPILER_BCB4" << std::endl; + break; + case GLM_COMPILER_BCB5: + std::cout << "GLM_COMPILER_BCB5" << std::endl; + break; + case GLM_COMPILER_BCB6: + std::cout << "GLM_COMPILER_BCB6" << std::endl; + break; + case GLM_COMPILER_BCB2009: + std::cout << "GLM_COMPILER_BCB2009" << std::endl; + break; case GLM_COMPILER_CODEWARRIOR: std::cout << "GLM_COMPILER_CODEWARRIOR" << std::endl; break; @@ -104,12 +121,24 @@ int test_compiler() case GLM_COMPILER_CLANG: std::cout << "GLM_COMPILER_CLANG" << std::endl; break; + case GLM_COMPILER_CLANG26: + std::cout << "GLM_COMPILER_CLANG26" << std::endl; + break; + case GLM_COMPILER_CLANG27: + std::cout << "GLM_COMPILER_CLANG27" << std::endl; + break; + case GLM_COMPILER_CLANG28: + std::cout << "GLM_COMPILER_CLANG28" << std::endl; + break; + case GLM_COMPILER_CLANG29: + std::cout << "GLM_COMPILER_CLANG29" << std::endl; + break; case GLM_COMPILER_LLVM_GCC: std::cout << "GLM_COMPILER_LLVM_GCC" << std::endl; break; default: std::cout << "Undetected compiler" << std::endl; - break; + Error += 1; } return Error; @@ -121,6 +150,11 @@ int test_model() Error += ((sizeof(void*) == 4) && (GLM_MODEL == GLM_MODEL_32)) || ((sizeof(void*) == 8) && (GLM_MODEL == GLM_MODEL_64)) ? 0 : 1; + if(GLM_MODEL == GLM_MODEL_32) + std::cout << "GLM_MODEL_32" << std::endl; + else if(GLM_MODEL == GLM_MODEL_64) + std::cout << "GLM_MODEL_64" << std::endl; + return Error; }