From c004d95bdf123e38d22f4a47690ac050f6925a03 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Thu, 13 Oct 2011 18:59:25 +0100 Subject: [PATCH 1/2] Added log2 meta programming implementation --- glm/core/func_exponential.inl | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/glm/core/func_exponential.inl b/glm/core/func_exponential.inl index c8c385f7..c1ffee92 100644 --- a/glm/core/func_exponential.inl +++ b/glm/core/func_exponential.inl @@ -224,6 +224,30 @@ namespace glm exp2(x.w)); } +namespace detail +{ + template + struct compute_log2 + { + template + T operator() (T const & Value) const + { + static_assert(0, "'log2' parameter has an invalid template parameter type"); + return Value; + } + }; + + template <> + struct compute_log2 + { + template + T operator() (T const & Value) const + { + return ::std::log(Value) / T(0.69314718055994530941723212145818); + } + }; +}//namespace detail + // log2, ln2 = 0.69314718055994530941723212145818f template GLM_FUNC_QUALIFIER genType log2 @@ -231,9 +255,7 @@ namespace glm genType const & x ) { - GLM_STATIC_ASSERT(detail::type::is_float, "'log2' only accept floating-point input"); - - return ::std::log(x) / genType(0.69314718055994530941723212145818); + return detail::compute_log2::ID>()(x); } template From 742013f6d3ad8ad0af80d4e7ca49274a465b5517 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Thu, 13 Oct 2011 19:07:54 +0100 Subject: [PATCH 2/2] Added integer log2 implementation with compute_log2 class --- glm/gtx/integer.hpp | 3 ++- glm/gtx/integer.inl | 24 +++++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/glm/gtx/integer.hpp b/glm/gtx/integer.hpp index b33d7ea6..e0f10dcf 100644 --- a/glm/gtx/integer.hpp +++ b/glm/gtx/integer.hpp @@ -60,7 +60,8 @@ namespace glm //! Returns the log2 of x. Can be reliably using to compute mipmap count from the texture size. //! From GLM_GTX_integer extension. - unsigned int log2(unsigned int x); + template + genType log2(genType const & x); //! Returns the floor log2 of x. //! From GLM_GTX_integer extension. diff --git a/glm/gtx/integer.inl b/glm/gtx/integer.inl index e8be0e41..ecb4ac9c 100644 --- a/glm/gtx/integer.inl +++ b/glm/gtx/integer.inl @@ -53,23 +53,21 @@ namespace detail x += (x >> 16); return(x & 0x0000003f); } -}//namespace detail + template <> + struct compute_log2 + { + template + T operator() (T const & Value) const + { #if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) - -GLM_FUNC_QUALIFIER unsigned int log2(unsigned int x) -{ - return x <= 1 ? 0 : unsigned(32) - nlz(x - 1u); -} - + return Value <= T(1) ? T(0) : T(32) - nlz(Value - T(1)); #else - -GLM_FUNC_QUALIFIER unsigned int log2(unsigned int x) -{ - return unsigned(32) - nlz(x - 1u); -} - + return T(32) - nlz(Value - T(1)); #endif + } + }; +}//namespace detail // Henry Gordon Dietz: http://aggregate.org/MAGIC/ unsigned int floor_log2(unsigned int x)