|
|
|
@ -13,66 +13,111 @@ |
|
|
|
|
namespace glm{ |
|
|
|
|
namespace detail |
|
|
|
|
{ |
|
|
|
|
template <bool Signed> |
|
|
|
|
struct higherMultiple |
|
|
|
|
template <bool is_float, bool is_signed> |
|
|
|
|
struct compute_higherMultiple{}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct compute_higherMultiple<true, true> |
|
|
|
|
{ |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple) |
|
|
|
|
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
if(Source > genType(0)) |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source - genType(1); |
|
|
|
|
return Tmp + (Multiple - (Tmp % Multiple)); |
|
|
|
|
return Tmp + (Multiple - std::fmod(Tmp, Multiple)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
return Source + (-Source % Multiple); |
|
|
|
|
return Source + std::fmod(-Source, Multiple); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct higherMultiple<false> |
|
|
|
|
struct compute_higherMultiple<false, false> |
|
|
|
|
{ |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType operator()(genType Source, genType Multiple) |
|
|
|
|
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source - genType(1); |
|
|
|
|
return Tmp + (Multiple - (Tmp % Multiple)); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
}//namespace detail |
|
|
|
|
|
|
|
|
|
////////////////////// |
|
|
|
|
// higherMultiple |
|
|
|
|
template <> |
|
|
|
|
struct compute_higherMultiple<false, true> |
|
|
|
|
{ |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
if(Source > genType(0)) |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source - genType(1); |
|
|
|
|
return Tmp + (Multiple - (Tmp % Multiple)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
return Source + (-Source % Multiple); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple) |
|
|
|
|
template <bool is_float, bool is_signed> |
|
|
|
|
struct compute_lowerMultiple{}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct compute_lowerMultiple<true, true> |
|
|
|
|
{ |
|
|
|
|
detail::higherMultiple<std::numeric_limits<genType>::is_signed> Compute; |
|
|
|
|
return Compute(Source, Multiple); |
|
|
|
|
} |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
if(Source >= genType(0)) |
|
|
|
|
return Source - std::fmod(Source, Multiple); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source + genType(1); |
|
|
|
|
return Tmp - std::fmod(Tmp, Multiple) - Multiple; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
GLM_FUNC_QUALIFIER float higherMultiple(float Source, float Multiple) |
|
|
|
|
struct compute_lowerMultiple<false, false> |
|
|
|
|
{ |
|
|
|
|
if(Source > float(0)) |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
float Tmp = Source - float(1); |
|
|
|
|
return Tmp + (Multiple - std::fmod(Tmp, Multiple)); |
|
|
|
|
if(Source >= genType(0)) |
|
|
|
|
return Source - Source % Multiple; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source + genType(1); |
|
|
|
|
return Tmp - Tmp % Multiple - Multiple; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
return Source + std::fmod(-Source, Multiple); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
GLM_FUNC_QUALIFIER double higherMultiple(double Source, double Multiple) |
|
|
|
|
struct compute_lowerMultiple<false, true> |
|
|
|
|
{ |
|
|
|
|
if(Source > double(0)) |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
double Tmp = Source - double(1); |
|
|
|
|
return Tmp + (Multiple - std::fmod(Tmp, Multiple)); |
|
|
|
|
if(Source >= genType(0)) |
|
|
|
|
return Source - Source % Multiple; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source + genType(1); |
|
|
|
|
return Tmp - Tmp % Multiple - Multiple; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
return Source + std::fmod(-Source, Multiple); |
|
|
|
|
}; |
|
|
|
|
}//namespace detail |
|
|
|
|
|
|
|
|
|
////////////////////// |
|
|
|
|
// higherMultiple |
|
|
|
|
|
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType higherMultiple(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
return detail::compute_higherMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
@ -87,37 +132,7 @@ namespace detail |
|
|
|
|
template <typename genType> |
|
|
|
|
GLM_FUNC_QUALIFIER genType lowerMultiple(genType Source, genType Multiple) |
|
|
|
|
{ |
|
|
|
|
if(Source >= genType(0)) |
|
|
|
|
return Source - Source % Multiple; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
genType Tmp = Source + genType(1); |
|
|
|
|
return Tmp - Tmp % Multiple - Multiple; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
GLM_FUNC_QUALIFIER float lowerMultiple(float Source, float Multiple) |
|
|
|
|
{ |
|
|
|
|
if(Source >= float(0)) |
|
|
|
|
return Source - std::fmod(Source, Multiple); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
float Tmp = Source + float(1); |
|
|
|
|
return Tmp - std::fmod(Tmp, Multiple) - Multiple; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
GLM_FUNC_QUALIFIER double lowerMultiple(double Source, double Multiple) |
|
|
|
|
{ |
|
|
|
|
if (Source >= double(0)) |
|
|
|
|
return Source - std::fmod(Source, Multiple); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
double Tmp = Source + double(1); |
|
|
|
|
return Tmp - std::fmod(Tmp, Multiple) - Multiple; |
|
|
|
|
} |
|
|
|
|
return detail::compute_lowerMultiple<std::numeric_limits<genType>::is_iec559, std::numeric_limits<genType>::is_signed>::call(Source, Multiple); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P, template <typename, precision> class vecType> |
|
|
|
|