|
|
@ -28,8 +28,8 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y); |
|
|
|
detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y); |
|
|
|
genUType Result = genUType(Value64 % (1 << 32)); |
|
|
|
genUType Result = genUType(Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))); |
|
|
|
Carry = (Value64 % (1 << 32)) > 1 : 1 : 0; |
|
|
|
Carry = (Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))) > 1 ? 1 : 0; |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -88,7 +88,7 @@ namespace glm |
|
|
|
if(x > y) |
|
|
|
if(x > y) |
|
|
|
return genUType(detail::highp_int_t(x) - detail::highp_int_t(y)); |
|
|
|
return genUType(detail::highp_int_t(x) - detail::highp_int_t(y)); |
|
|
|
else |
|
|
|
else |
|
|
|
return genUType(detail::highp_int_t(1 << 32) + detail::highp_int_t(x) - detail::highp_int_t(y)); |
|
|
|
return genUType(detail::highp_int_t(1) << detail::highp_int_t(32) + detail::highp_int_t(x) - detail::highp_int_t(y)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -146,8 +146,8 @@ namespace glm |
|
|
|
detail::highp_uint_t ValueX64 = x; |
|
|
|
detail::highp_uint_t ValueX64 = x; |
|
|
|
detail::highp_uint_t ValueY64 = y; |
|
|
|
detail::highp_uint_t ValueY64 = y; |
|
|
|
detail::highp_uint_t Value64 = ValueX64 * ValueY64; |
|
|
|
detail::highp_uint_t Value64 = ValueX64 * ValueY64; |
|
|
|
msb = *(genUType*)&(Value64 & ((1 << 32) - 1)); |
|
|
|
msb = *(genUType*)&(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); |
|
|
|
lsb = *(genUType*)&(Value64 >> 32); |
|
|
|
lsb = *(genUType*)&(Value64 >> detail::highp_uint_t(32)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -208,8 +208,8 @@ namespace glm |
|
|
|
detail::highp_int_t ValueX64 = x; |
|
|
|
detail::highp_int_t ValueX64 = x; |
|
|
|
detail::highp_int_t ValueY64 = y; |
|
|
|
detail::highp_int_t ValueY64 = y; |
|
|
|
detail::highp_int_t Value64 = ValueX64 * ValueY64; |
|
|
|
detail::highp_int_t Value64 = ValueX64 * ValueY64; |
|
|
|
msb = *(genIType*)&(Value64 & ((1 << 32) - 1)); |
|
|
|
msb = *(genIType*)&(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); |
|
|
|
lsb = *(genIType*)&(Value64 >> 32); |
|
|
|
lsb = *(genIType*)&(Value64 >> detail::highp_uint_t(32)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -267,7 +267,7 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
GLM_STATIC_ASSERT(Offset + Bits <= sizeof(genIUType)); |
|
|
|
assert(Offset + Bits <= sizeof(genIUType)); |
|
|
|
|
|
|
|
|
|
|
|
genIUType Result = 0; |
|
|
|
genIUType Result = 0; |
|
|
|
if(std::numeric_limits<genIUType>::is_signed) |
|
|
|
if(std::numeric_limits<genIUType>::is_signed) |
|
|
@ -289,8 +289,8 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return detail::tvec2<T>( |
|
|
|
return detail::tvec2<T>( |
|
|
|
bitfieldExtract(value[0]), |
|
|
|
bitfieldExtract(Value[0]), |
|
|
|
bitfieldExtract(value[1])); |
|
|
|
bitfieldExtract(Value[1])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -302,9 +302,9 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return detail::tvec3<T>( |
|
|
|
return detail::tvec3<T>( |
|
|
|
bitfieldExtract(value[0]), |
|
|
|
bitfieldExtract(Value[0]), |
|
|
|
bitfieldExtract(value[1]), |
|
|
|
bitfieldExtract(Value[1]), |
|
|
|
bitfieldExtract(value[2])); |
|
|
|
bitfieldExtract(Value[2])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -316,10 +316,10 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return detail::tvec4<T>( |
|
|
|
return detail::tvec4<T>( |
|
|
|
bitfieldExtract(value[0]), |
|
|
|
bitfieldExtract(Value[0]), |
|
|
|
bitfieldExtract(value[1]), |
|
|
|
bitfieldExtract(Value[1]), |
|
|
|
bitfieldExtract(value[2]), |
|
|
|
bitfieldExtract(Value[2]), |
|
|
|
bitfieldExtract(value[3])); |
|
|
|
bitfieldExtract(Value[3])); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// bitfieldInsert |
|
|
|
// bitfieldInsert |
|
|
@ -333,7 +333,7 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
GLM_STATIC_ASSERT(Offset + Bits <= sizeof(genIUType)); |
|
|
|
assert(Offset + Bits <= sizeof(genIUType)); |
|
|
|
|
|
|
|
|
|
|
|
if(Bits == 0) |
|
|
|
if(Bits == 0) |
|
|
|
return Base; |
|
|
|
return Base; |
|
|
@ -355,8 +355,8 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return detail::tvec2<T>( |
|
|
|
return detail::tvec2<T>( |
|
|
|
bitfieldInsert(value[0]), |
|
|
|
bitfieldInsert(Base[0], Insert[0], Offset, Bits), |
|
|
|
bitfieldInsert(value[1])); |
|
|
|
bitfieldInsert(Base[1], Insert[1], Offset, Bits)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -369,9 +369,9 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return detail::tvec3<T>( |
|
|
|
return detail::tvec3<T>( |
|
|
|
bitfieldInsert(value[0]), |
|
|
|
bitfieldInsert(Base[0], Insert[0], Offset, Bits), |
|
|
|
bitfieldInsert(value[1]), |
|
|
|
bitfieldInsert(Base[1], Insert[1], Offset, Bits), |
|
|
|
bitfieldInsert(value[2])); |
|
|
|
bitfieldInsert(Base[2], Insert[2], Offset, Bits)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
template <typename T> |
|
|
@ -384,10 +384,10 @@ namespace glm |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return detail::tvec4<T>( |
|
|
|
return detail::tvec4<T>( |
|
|
|
bitfieldInsert(value[0]), |
|
|
|
bitfieldInsert(Base[0], Insert[0], Offset, Bits), |
|
|
|
bitfieldInsert(value[1]), |
|
|
|
bitfieldInsert(Base[1], Insert[1], Offset, Bits), |
|
|
|
bitfieldInsert(value[2]), |
|
|
|
bitfieldInsert(Base[2], Insert[2], Offset, Bits), |
|
|
|
bitfieldInsert(value[3])); |
|
|
|
bitfieldInsert(Base[3], Insert[3], Offset, Bits)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// bitfieldReverse |
|
|
|
// bitfieldReverse |
|
|
@ -399,7 +399,7 @@ namespace glm |
|
|
|
genIUType Result = 0; |
|
|
|
genIUType Result = 0; |
|
|
|
for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i) |
|
|
|
for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i) |
|
|
|
if(Value & (1 << i)) |
|
|
|
if(Value & (1 << i)) |
|
|
|
Result |= (1 << (sizeof(genIUType) * std::size_t(8)) - 1 - i); |
|
|
|
Result |= (genIUType(1) << (sizeof(genIUType) * std::size_t(8)) - genIUType(1) - i); |
|
|
|
return Result; |
|
|
|
return Result; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -491,18 +491,18 @@ namespace glm |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// findLSB |
|
|
|
// findLSB |
|
|
|
template <typename genType> |
|
|
|
template <typename genIUType> |
|
|
|
inline int findLSB |
|
|
|
inline int findLSB |
|
|
|
( |
|
|
|
( |
|
|
|
genType const & Value |
|
|
|
genIUType const & Value |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
if(Value == 0) |
|
|
|
if(Value == 0) |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|
genType Bit; |
|
|
|
genIUType Bit; |
|
|
|
for(Bit = genType(0); !(Value & (1 << Bit)); ++Bit){} |
|
|
|
for(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){} |
|
|
|
return Bit; |
|
|
|
return Bit; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -543,18 +543,18 @@ namespace glm |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// findMSB |
|
|
|
// findMSB |
|
|
|
template <typename genType> |
|
|
|
template <typename genIUType> |
|
|
|
inline int findMSB |
|
|
|
inline int findMSB |
|
|
|
( |
|
|
|
( |
|
|
|
genType const & value |
|
|
|
genIUType const & Value |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer); |
|
|
|
if(Value == 0) |
|
|
|
if(Value == 0) |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
|
|
genType bit = genType(-1); |
|
|
|
genIUType bit = genIUType(-1); |
|
|
|
for(genType tmp = value; tmp; tmp >>= 1, ++bit){} |
|
|
|
for(genIUType tmp = Value; tmp; tmp >>= 1, ++bit){} |
|
|
|
return bit; |
|
|
|
return bit; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|