| /// @ref gtx_integer |
| /// @file glm/gtx/integer.inl |
| |
| namespace glm |
| { |
| // pow |
| GLM_FUNC_QUALIFIER int pow(int x, int y) |
| { |
| if(y == 0) |
| return 1; |
| int result = x; |
| for(int i = 1; i < y; ++i) |
| result *= x; |
| return result; |
| } |
| |
| // sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387 |
| GLM_FUNC_QUALIFIER int sqrt(int x) |
| { |
| if(x <= 1) return x; |
| |
| int NextTrial = x >> 1; |
| int CurrentAnswer; |
| |
| do |
| { |
| CurrentAnswer = NextTrial; |
| NextTrial = (NextTrial + x / NextTrial) >> 1; |
| } while(NextTrial < CurrentAnswer); |
| |
| return CurrentAnswer; |
| } |
| |
| // Henry Gordon Dietz: http://aggregate.org/MAGIC/ |
| namespace detail |
| { |
| GLM_FUNC_QUALIFIER unsigned int ones32(unsigned int x) |
| { |
| /* 32-bit recursive reduction using SWAR... |
| but first step is mapping 2-bit values |
| into sum of 2 1-bit values in sneaky way |
| */ |
| x -= ((x >> 1) & 0x55555555); |
| x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); |
| x = (((x >> 4) + x) & 0x0f0f0f0f); |
| x += (x >> 8); |
| x += (x >> 16); |
| return(x & 0x0000003f); |
| } |
| }//namespace detail |
| |
| // Henry Gordon Dietz: http://aggregate.org/MAGIC/ |
| /* |
| GLM_FUNC_QUALIFIER unsigned int floor_log2(unsigned int x) |
| { |
| x |= (x >> 1); |
| x |= (x >> 2); |
| x |= (x >> 4); |
| x |= (x >> 8); |
| x |= (x >> 16); |
| |
| return _detail::ones32(x) >> 1; |
| } |
| */ |
| // mod |
| GLM_FUNC_QUALIFIER int mod(int x, int y) |
| { |
| return x - y * (x / y); |
| } |
| |
| // factorial (!12 max, integer only) |
| template <typename genType> |
| GLM_FUNC_QUALIFIER genType factorial(genType const & x) |
| { |
| genType Temp = x; |
| genType Result; |
| for(Result = 1; Temp > 1; --Temp) |
| Result *= Temp; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER tvec2<T, P> factorial( |
| tvec2<T, P> const & x) |
| { |
| return tvec2<T, P>( |
| factorial(x.x), |
| factorial(x.y)); |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER tvec3<T, P> factorial( |
| tvec3<T, P> const & x) |
| { |
| return tvec3<T, P>( |
| factorial(x.x), |
| factorial(x.y), |
| factorial(x.z)); |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER tvec4<T, P> factorial( |
| tvec4<T, P> const & x) |
| { |
| return tvec4<T, P>( |
| factorial(x.x), |
| factorial(x.y), |
| factorial(x.z), |
| factorial(x.w)); |
| } |
| |
| GLM_FUNC_QUALIFIER uint pow(uint x, uint y) |
| { |
| uint result = x; |
| for(uint i = 1; i < y; ++i) |
| result *= x; |
| return result; |
| } |
| |
| GLM_FUNC_QUALIFIER uint sqrt(uint x) |
| { |
| if(x <= 1) return x; |
| |
| uint NextTrial = x >> 1; |
| uint CurrentAnswer; |
| |
| do |
| { |
| CurrentAnswer = NextTrial; |
| NextTrial = (NextTrial + x / NextTrial) >> 1; |
| } while(NextTrial < CurrentAnswer); |
| |
| return CurrentAnswer; |
| } |
| |
| GLM_FUNC_QUALIFIER uint mod(uint x, uint y) |
| { |
| return x - y * (x / y); |
| } |
| |
| #if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) |
| |
| GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) |
| { |
| return 31u - findMSB(x); |
| } |
| |
| #else |
| |
| // Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt |
| GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) |
| { |
| int y, m, n; |
| |
| y = -int(x >> 16); // If left half of x is 0, |
| m = (y >> 16) & 16; // set n = 16. If left half |
| n = 16 - m; // is nonzero, set n = 0 and |
| x = x >> m; // shift x right 16. |
| // Now x is of the form 0000xxxx. |
| y = x - 0x100; // If positions 8-15 are 0, |
| m = (y >> 16) & 8; // add 8 to n and shift x left 8. |
| n = n + m; |
| x = x << m; |
| |
| y = x - 0x1000; // If positions 12-15 are 0, |
| m = (y >> 16) & 4; // add 4 to n and shift x left 4. |
| n = n + m; |
| x = x << m; |
| |
| y = x - 0x4000; // If positions 14-15 are 0, |
| m = (y >> 16) & 2; // add 2 to n and shift x left 2. |
| n = n + m; |
| x = x << m; |
| |
| y = x >> 14; // Set y = 0, 1, 2, or 3. |
| m = y & ~(y >> 1); // Set m = 0, 1, 2, or 2 resp. |
| return unsigned(n + 2 - m); |
| } |
| |
| #endif//(GLM_COMPILER) |
| |
| }//namespace glm |